Skip to content

Commit b0adaa8

Browse files
Function to use AllColumns or AllTableColumns Expression (#1350)
* Fix a trivial MERGE error from Commit 4797a8d * Function use AllColumns or AllTableColumns Fixes #1346 * Remove one useless PMD rule
1 parent f353ec8 commit b0adaa8

File tree

10 files changed

+93
-23
lines changed

10 files changed

+93
-23
lines changed

ruleset.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,5 +113,5 @@ under the License.
113113
<rule ref="category/java/performance.xml/BooleanInstantiation" />
114114

115115
<!-- for Codazy -->
116-
<rule ref="category/java/documentation.xml/UncommentedEmptyMethodBody" />
116+
<!-- <rule ref="category/java/documentation.xml/UncommentedEmptyMethodBody" /> -->
117117
</ruleset>

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import net.sf.jsqlparser.expression.operators.conditional.XorExpression;
1616
import net.sf.jsqlparser.expression.operators.relational.*;
1717
import net.sf.jsqlparser.schema.Column;
18+
import net.sf.jsqlparser.statement.select.AllColumns;
19+
import net.sf.jsqlparser.statement.select.AllTableColumns;
1820
import net.sf.jsqlparser.statement.select.SubSelect;
1921

2022
public interface ExpressionVisitor {
@@ -174,5 +176,10 @@ public interface ExpressionVisitor {
174176
void visit(JsonFunction aThis);
175177

176178
void visit(ConnectByRootOperator aThis);
179+
177180
void visit(OracleNamedFunctionParameter aThis);
181+
182+
void visit(AllColumns allColumns);
183+
184+
void visit(AllTableColumns allTableColumns);
178185
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,12 +489,12 @@ public void visit(UnPivot unpivot) {
489489

490490
@Override
491491
public void visit(AllColumns allColumns) {
492-
492+
allColumns.accept((ExpressionVisitor) this);
493493
}
494494

495495
@Override
496496
public void visit(AllTableColumns allTableColumns) {
497-
497+
allTableColumns.accept((ExpressionVisitor) this);
498498
}
499499

500500
@Override

src/main/java/net/sf/jsqlparser/expression/Function.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,6 @@ public String toString() {
207207
} else {
208208
params = namedParameters.toString();
209209
}
210-
} else if (isAllColumns()) {
211-
params = "(*)";
212210
} else {
213211
params = "()";
214212
}

src/main/java/net/sf/jsqlparser/statement/select/AllColumns.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.expression.ExpressionVisitor;
1214
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1315

14-
public class AllColumns extends ASTNodeAccessImpl implements SelectItem {
16+
public class AllColumns extends ASTNodeAccessImpl implements SelectItem, Expression {
1517

1618
@Override
1719
public void accept(SelectItemVisitor selectItemVisitor) {
@@ -23,4 +25,8 @@ public String toString() {
2325
return "*";
2426
}
2527

28+
@Override
29+
public void accept(ExpressionVisitor expressionVisitor) {
30+
expressionVisitor.visit(this);
31+
}
2632
}

src/main/java/net/sf/jsqlparser/statement/select/AllTableColumns.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12+
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.expression.ExpressionVisitor;
1214
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1315
import net.sf.jsqlparser.schema.*;
1416

15-
public class AllTableColumns extends ASTNodeAccessImpl implements SelectItem {
17+
public class AllTableColumns extends ASTNodeAccessImpl implements SelectItem, Expression {
1618

1719
private Table table;
1820

@@ -45,4 +47,9 @@ public AllTableColumns withTable(Table table) {
4547
this.setTable(table);
4648
return this;
4749
}
50+
51+
@Override
52+
public void accept(ExpressionVisitor expressionVisitor) {
53+
expressionVisitor.visit(this);
54+
}
4855
}

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

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,7 @@
104104
import net.sf.jsqlparser.schema.Column;
105105
import net.sf.jsqlparser.schema.Table;
106106
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
107-
import net.sf.jsqlparser.statement.select.OrderByElement;
108-
import net.sf.jsqlparser.statement.select.PlainSelect;
109-
import net.sf.jsqlparser.statement.select.SelectVisitor;
110-
import net.sf.jsqlparser.statement.select.SubSelect;
111-
import net.sf.jsqlparser.statement.select.WithItem;
107+
import net.sf.jsqlparser.statement.select.*;
112108

113109
@SuppressWarnings({"PMD.CyclomaticComplexity"})
114110
public class ExpressionDeParser extends AbstractDeParser<Expression>
@@ -486,9 +482,7 @@ public void visit(Function function) {
486482
}
487483

488484
buffer.append(function.getName());
489-
if (function.isAllColumns() && function.getParameters() == null) {
490-
buffer.append("(*)");
491-
} else if (function.getParameters() == null && function.getNamedParameters() == null) {
485+
if (function.getParameters() == null && function.getNamedParameters() == null) {
492486
buffer.append("()");
493487
} else {
494488
buffer.append("(");
@@ -1034,4 +1028,14 @@ public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
10341028

10351029
oracleNamedFunctionParameter.getExpression().accept(this);
10361030
}
1031+
1032+
@Override
1033+
public void visit(AllColumns allColumns) {
1034+
buffer.append(allColumns.toString());
1035+
}
1036+
1037+
@Override
1038+
public void visit(AllTableColumns allTableColumns) {
1039+
buffer.append(allTableColumns.toString());
1040+
}
10371041
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@
9898
import net.sf.jsqlparser.parser.feature.Feature;
9999
import net.sf.jsqlparser.schema.Column;
100100
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
101+
import net.sf.jsqlparser.statement.select.AllColumns;
102+
import net.sf.jsqlparser.statement.select.AllTableColumns;
101103
import net.sf.jsqlparser.statement.select.SubSelect;
102104
import net.sf.jsqlparser.util.validation.ValidationCapability;
103105
import net.sf.jsqlparser.util.validation.metadata.NamedObject;
@@ -610,4 +612,12 @@ public void visit(OracleNamedFunctionParameter oracleNamedFunctionParameter) {
610612
oracleNamedFunctionParameter.getExpression().accept(this);
611613
}
612614

615+
@Override
616+
public void visit(AllColumns allColumns) {
617+
}
618+
619+
@Override
620+
public void visit(AllTableColumns allTableColumns) {
621+
}
622+
613623
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1642,6 +1642,8 @@ String RelObjectNameWithoutValue() :
16421642
| tk=<K_LOG> | tk=<K_DUMP> | tk=<K_FLUSH> | tk=<K_ACTIVE> | tk=<K_RESUME> | tk=<K_SWITCH> | tk=<K_SUSPEND>
16431643
| tk=<K_ARCHIVE> | tk=<K_QUIESCE> | tk=<K_HISTORY> | tk=<K_SHUTDOWN> | tk=<K_REGISTER> | tk=<K_UNQIESCE>
16441644
| tk=<K_RESTRICTED> | tk=<K_CHECKPOINT> | tk=<K_DISCONNECT>
1645+
1646+
| tk=<K_TABLESPACE>
16451647
)
16461648

16471649
{ return tk.image; }
@@ -4522,7 +4524,9 @@ Function InternalFunction(Function retval) :
45224524

45234525
"(" [ [ LOOKAHEAD(2)(<K_DISTINCT> { retval.setDistinct(true); } | <K_ALL> { retval.setAllColumns(true); } | <K_UNIQUE> { retval.setUnique(true); }) ]
45244526
( LOOKAHEAD(4)
4525-
"*" { retval.setAllColumns(true); }
4527+
"*" { expr1 = new AllColumns(); expressionList = new ExpressionList(expr1).withUsingBrackets(false); }
4528+
|
4529+
LOOKAHEAD(AllTableColumns()) expr1=AllTableColumns() { expressionList = new ExpressionList(expr1).withUsingBrackets(false); }
45264530
|
45274531
LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) (expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);} [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
45284532
|

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

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,9 +1119,8 @@ public void testFunctions() throws JSQLParserException {
11191119
assertEquals("MAX", fun.getName());
11201120
assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)).
11211121
getFullyQualifiedName());
1122-
assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).
1123-
getExpression())
1124-
.isAllColumns());
1122+
assertTrue( ((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).
1123+
getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns);
11251124
assertStatementCanBeDeparsedAs(select, statement);
11261125

11271126
statement = "SELECT {fn MAX(a, b, c)}, COUNT(*), D FROM tab1 GROUP BY D";
@@ -1133,9 +1132,8 @@ public void testFunctions() throws JSQLParserException {
11331132
assertEquals("MAX", fun.getName());
11341133
assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)).
11351134
getFullyQualifiedName());
1136-
assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).
1137-
getExpression())
1138-
.isAllColumns());
1135+
assertTrue( ((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).
1136+
getExpression()).getParameters().getExpressions().get(0) instanceof AllColumns);
11391137
assertStatementCanBeDeparsedAs(select, statement);
11401138

11411139
statement = "SELECT ab.MAX(a, b, c), cd.COUNT(*), D FROM tab1 GROUP BY D";
@@ -1149,7 +1147,7 @@ public void testFunctions() throws JSQLParserException {
11491147
fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).
11501148
getExpression();
11511149
assertEquals("cd.COUNT", fun.getName());
1152-
assertTrue(fun.isAllColumns());
1150+
assertTrue(fun.getParameters().getExpressions().get(0) instanceof AllColumns);
11531151
assertStatementCanBeDeparsedAs(select, statement);
11541152
}
11551153

@@ -4822,4 +4820,40 @@ public void testReservedKeywordsMSSQLUseIndexIssue1325() throws JSQLParserExcept
48224820
assertSqlCanBeParsedAndDeparsed(
48234821
"SELECT col FROM table USE INDEX(primary)", true);
48244822
}
4823+
4824+
@Test
4825+
public void testTableSpaceKeyword() throws JSQLParserException {
4826+
// without extra brackets
4827+
assertSqlCanBeParsedAndDeparsed(
4828+
"SELECT DDF.tablespace TABLESPACE_NAME\n" +
4829+
" , maxtotal / 1024 / 1024 \"MAX_MB\"\n" +
4830+
" , ( total - free ) / 1024 / 1024 \"USED_MB\"\n" +
4831+
" , ( maxtotal - ( total - free ) ) / 1024 / 1024 \"AVAILABLE_MB\"\n" +
4832+
" , total / 1024 / 1024 \"ALLOCATED_MB\"\n" +
4833+
" , free / 1024 / 1024 \"ALLOCATED_FREE_MB\"\n" +
4834+
" , ( ( total - free ) / maxtotal * 100 ) \"USED_PERC\"\n" +
4835+
" , cnt \"FILE_COUNT\"\n" +
4836+
" FROM (SELECT tablespace_name TABLESPACE\n" +
4837+
" , SUM(bytes) TOTAL\n" +
4838+
" , SUM(Greatest(maxbytes, bytes)) MAXTOTAL\n" +
4839+
" , Count(*) CNT\n" +
4840+
" FROM dba_data_files\n" +
4841+
" GROUP BY tablespace_name) DDF\n" +
4842+
" , (SELECT tablespace_name TABLESPACE\n" +
4843+
" , SUM(bytes) FREE\n" +
4844+
" , Max(bytes) MAXF\n" +
4845+
" FROM dba_free_space\n" +
4846+
" GROUP BY tablespace_name) DFS\n" +
4847+
" WHERE DDF.tablespace = DFS.tablespace\n" +
4848+
" ORDER BY 1 DESC", true);
4849+
}
4850+
4851+
@Test
4852+
public void testTableSpecificAllColumnsIssue1346() throws JSQLParserException {
4853+
assertSqlCanBeParsedAndDeparsed(
4854+
"SELECT count(*) from a", true);
4855+
4856+
assertSqlCanBeParsedAndDeparsed(
4857+
"SELECT count(a.*) from a", true);
4858+
}
48254859
}

0 commit comments

Comments
 (0)