Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit30cf5d7

Browse files
authored
feat: add support SELECT all columns from function result (#2207)
PostgreSQL supports composite type expansion using .*,for example below query is valid in PostgreSQL:SELECT (pg_stat_file('postgresql.conf')).*
1 parent1c7c343 commit30cf5d7

File tree

8 files changed

+127
-0
lines changed

8 files changed

+127
-0
lines changed

‎src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
importnet.sf.jsqlparser.statement.piped.FromQuery;
6161
importnet.sf.jsqlparser.statement.select.AllColumns;
6262
importnet.sf.jsqlparser.statement.select.AllTableColumns;
63+
importnet.sf.jsqlparser.statement.select.FunctionAllColumns;
6364
importnet.sf.jsqlparser.statement.select.ParenthesedSelect;
6465
importnet.sf.jsqlparser.statement.select.Select;
6566

@@ -585,6 +586,8 @@ default void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
585586

586587
<S>Tvisit(AllColumnsallColumns,Scontext);
587588

589+
<S>Tvisit(FunctionAllColumnsfunctionColumns,Scontext);
590+
588591
defaultvoidvisit(AllColumnsallColumns) {
589592
this.visit(allColumns,null);
590593
}

‎src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
importnet.sf.jsqlparser.statement.piped.FromQuery;
6161
importnet.sf.jsqlparser.statement.select.AllColumns;
6262
importnet.sf.jsqlparser.statement.select.AllTableColumns;
63+
importnet.sf.jsqlparser.statement.select.FunctionAllColumns;
6364
importnet.sf.jsqlparser.statement.select.OrderByElement;
6465
importnet.sf.jsqlparser.statement.select.ParenthesedSelect;
6566
importnet.sf.jsqlparser.statement.select.Pivot;
@@ -599,6 +600,11 @@ public <S> T visit(AllTableColumns allTableColumns, S context) {
599600
returnvisitExpression(allTableColumns,context);
600601
}
601602

603+
@Override
604+
public <S>Tvisit(FunctionAllColumnsfunctionAllColumns,Scontext) {
605+
returnvisitExpression(functionAllColumns,context);
606+
}
607+
602608
@Override
603609
public <S>Tvisit(AllValueallValue,Scontext) {
604610
returnvisitExpression(allValue,context);
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2025 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
packagenet.sf.jsqlparser.statement.select;
11+
12+
importnet.sf.jsqlparser.expression.ExpressionVisitor;
13+
importnet.sf.jsqlparser.expression.Function;
14+
15+
16+
publicclassFunctionAllColumnsextendsAllColumns {
17+
privateFunctionfunction;
18+
19+
publicFunctionAllColumns(Functionfunction) {
20+
super(null,null,null);
21+
this.function =function;
22+
}
23+
24+
publicFunctiongetFunction() {
25+
returnfunction;
26+
}
27+
28+
publicFunctionAllColumnssetFunction(Functionfunction) {
29+
this.function =function;
30+
returnthis;
31+
}
32+
33+
publicStringBuilderappendTo(StringBuilderbuilder) {
34+
builder.append("(");
35+
builder.append(function);
36+
builder.append(").*");
37+
returnbuilder;
38+
}
39+
40+
@Override
41+
publicStringtoString() {
42+
returnappendTo(newStringBuilder()).toString();
43+
}
44+
45+
@Override
46+
public <T,S>Taccept(ExpressionVisitor<T>expressionVisitor,Scontext) {
47+
returnexpressionVisitor.visit(this,context);
48+
}
49+
}

‎src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@
165165
importnet.sf.jsqlparser.statement.select.AllColumns;
166166
importnet.sf.jsqlparser.statement.select.AllTableColumns;
167167
importnet.sf.jsqlparser.statement.select.FromItemVisitor;
168+
importnet.sf.jsqlparser.statement.select.FunctionAllColumns;
168169
importnet.sf.jsqlparser.statement.select.Join;
169170
importnet.sf.jsqlparser.statement.select.LateralSubSelect;
170171
importnet.sf.jsqlparser.statement.select.OrderByElement;
@@ -948,6 +949,12 @@ public <S> Void visit(AllTableColumns allTableColumns, S context) {
948949
returnnull;
949950
}
950951

952+
@Override
953+
public <S>Voidvisit(FunctionAllColumnsfunctionAllColumns,Scontext) {
954+
955+
returnnull;
956+
}
957+
951958
@Override
952959
public <S>Voidvisit(AllValueallValue,Scontext) {
953960

‎src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
importnet.sf.jsqlparser.statement.piped.FromQuery;
124124
importnet.sf.jsqlparser.statement.select.AllColumns;
125125
importnet.sf.jsqlparser.statement.select.AllTableColumns;
126+
importnet.sf.jsqlparser.statement.select.FunctionAllColumns;
126127
importnet.sf.jsqlparser.statement.select.OrderByElement;
127128
importnet.sf.jsqlparser.statement.select.ParenthesedSelect;
128129
importnet.sf.jsqlparser.statement.select.Select;
@@ -1652,6 +1653,12 @@ public <S> StringBuilder visit(AllTableColumns allTableColumns, S context) {
16521653
returnbuilder;
16531654
}
16541655

1656+
@Override
1657+
public <S>StringBuildervisit(FunctionAllColumnsfunctionAllColumns,Scontext) {
1658+
builder.append(functionAllColumns.toString());
1659+
returnbuilder;
1660+
}
1661+
16551662
@Override
16561663
public <S>StringBuildervisit(AllValueallValue,Scontext) {
16571664
builder.append(allValue);

‎src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@
123123
importnet.sf.jsqlparser.statement.piped.FromQuery;
124124
importnet.sf.jsqlparser.statement.select.AllColumns;
125125
importnet.sf.jsqlparser.statement.select.AllTableColumns;
126+
importnet.sf.jsqlparser.statement.select.FunctionAllColumns;
126127
importnet.sf.jsqlparser.statement.select.ParenthesedSelect;
127128
importnet.sf.jsqlparser.statement.select.PlainSelect;
128129
importnet.sf.jsqlparser.statement.select.Select;
@@ -1060,6 +1061,11 @@ public <S> Void visit(AllTableColumns allTableColumns, S context) {
10601061
returnnull;
10611062
}
10621063

1064+
@Override
1065+
public <S>Voidvisit(FunctionAllColumnsfunctionColumns,Scontext) {
1066+
returnnull;
1067+
}
1068+
10631069
@Override
10641070
public <S>Voidvisit(AllValueallValue,Scontext) {
10651071
returnnull;

‎src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3273,6 +3273,16 @@ List<SelectItem<?>> SelectItemsList():
32733273
{ return selectItemsList; }
32743274
}
32753275

3276+
FunctionAllColumns FunctionAllColumns() #FunctionAllColumns:
3277+
{
3278+
Function function;
3279+
}
3280+
{
3281+
"(" ( "(" )* function=Function() ")" ( ")" )* "." "*"
3282+
{
3283+
return new FunctionAllColumns(function);
3284+
}
3285+
}
32763286

32773287
SelectItem<?> SelectItem() #SelectItem:
32783288
{
@@ -5332,6 +5342,8 @@ Expression PrimaryExpression() #PrimaryExpression:
53325342

53335343
| LOOKAHEAD(AllTableColumns()) retval=AllTableColumns()
53345344

5345+
| LOOKAHEAD(FunctionAllColumns()) retval=FunctionAllColumns()
5346+
53355347
// support timestamp expressions
53365348
| LOOKAHEAD(2, {!interrupted}) (token=<K_TIME_KEY_EXPR> | token=<K_CURRENT>) { retval = new TimeKeyExpression(token.image); }
53375349

‎src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6173,4 +6173,41 @@ public void testSelectWithSkylineKeywords() throws JSQLParserException {
61736173
select.getPlainSelect().getSelectItems().toString());
61746174
}
61756175

6176+
@Test
6177+
publicvoidtestSelectAllColumnsFromFunctionReturn()throwsJSQLParserException {
6178+
Stringsql ="SELECT (pg_stat_file('postgresql.conf')).*";
6179+
Statementstatement =CCJSqlParserUtil.parse(sql);
6180+
assertNotNull(statement);
6181+
assertTrue(statementinstanceofSelect);
6182+
6183+
// Ensure the function is recognized correctly
6184+
Selectselect = (Select)statement;
6185+
PlainSelectplainSelect = (PlainSelect)select.getSelectBody();
6186+
assertNotNull(plainSelect);
6187+
assertEquals(1,plainSelect.getSelectItems().size());
6188+
assertTrue(plainSelect.getSelectItems().get(0)
6189+
.getExpression()instanceofFunctionAllColumns);
6190+
assertEquals("(pg_stat_file('postgresql.conf')).*",
6191+
plainSelect.getSelectItems().get(0).toString());
6192+
}
6193+
6194+
@Test
6195+
publicvoidtestSelectAllColumnsFromFunctionReturnWithMultipleParentheses()
6196+
throwsJSQLParserException {
6197+
Stringsql ="SELECT ( ( ( pg_stat_file('postgresql.conf') ) )) . *";
6198+
Statementstatement =CCJSqlParserUtil.parse(sql);
6199+
assertNotNull(statement);
6200+
assertTrue(statementinstanceofSelect);
6201+
6202+
// Ensure the function is recognized correctly
6203+
Selectselect = (Select)statement;
6204+
PlainSelectplainSelect = (PlainSelect)select.getSelectBody();
6205+
assertNotNull(plainSelect);
6206+
assertEquals(1,plainSelect.getSelectItems().size());
6207+
assertTrue(plainSelect.getSelectItems().get(0)
6208+
.getExpression()instanceofFunctionAllColumns);
6209+
assertEquals("(pg_stat_file('postgresql.conf')).*",
6210+
plainSelect.getSelectItems().get(0).toString());
6211+
}
6212+
61766213
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp