Skip to content

Commit 60f4d74

Browse files
ssteinhauserStefan Steinhauser
and
Stefan Steinhauser
authored
Unparenthesized SubSelect as FromItem (#2073)
* feat: Implement FromItem in Select Implement FromItem interface in Select to allow Select being an unparenthesized FromItem Refs: #2071 * feat: Implement grammar to support Select as FromItem Refs: #2071 * style: Run gradle :spotlessApply * style: Run gradle :spotlessApply --------- Co-authored-by: Stefan Steinhauser <stefan.steinhauser@arz.at>
1 parent 59593fa commit 60f4d74

22 files changed

+184
-44
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,26 @@ default FromItem withUnPivot(UnPivot unpivot) {
4747
return this;
4848
}
4949

50+
default StringBuilder appendTo(StringBuilder builder, Alias alias) {
51+
return appendTo(builder, alias, null, null);
52+
}
53+
54+
default StringBuilder appendTo(StringBuilder builder, Alias alias, Pivot pivot,
55+
UnPivot unPivot) {
56+
if (alias != null) {
57+
builder.append(alias);
58+
}
59+
60+
if (pivot != null) {
61+
builder.append(" ").append(pivot);
62+
}
63+
64+
if (unPivot != null) {
65+
builder.append(" ").append(unPivot);
66+
}
67+
68+
return builder;
69+
}
70+
5071

5172
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,22 @@ default void visit(ParenthesedFromItem parenthesedFromItem) {
4848
default void visit(Values values) {
4949
this.visit(values, null);
5050
}
51+
52+
<S> T visit(PlainSelect plainSelect, S context);
53+
54+
default void visit(PlainSelect plainSelect) {
55+
this.visit(plainSelect, null);
56+
}
57+
58+
<S> T visit(SetOperationList setOperationList, S context);
59+
60+
default void visit(SetOperationList setOperationList) {
61+
this.visit(setOperationList, null);
62+
}
63+
64+
<S> T visit(TableStatement tableStatement, S context);
65+
66+
default void visit(TableStatement tableStatement) {
67+
this.visit(tableStatement, null);
68+
}
5169
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,22 @@ public <S> T visit(Values values, S context) {
4949

5050
return null;
5151
}
52+
53+
@Override
54+
public <S> T visit(PlainSelect plainSelect, S context) {
55+
56+
return null;
57+
}
58+
59+
@Override
60+
public <S> T visit(SetOperationList setOperationList, S context) {
61+
62+
return null;
63+
}
64+
65+
@Override
66+
public <S> T visit(TableStatement tableStatement, S context) {
67+
68+
return null;
69+
}
5270
}

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,15 +160,7 @@ public <T, S> T accept(StatementVisitor<T> statementVisitor, S context) {
160160

161161
public StringBuilder appendSelectBodyTo(StringBuilder builder) {
162162
builder.append("(").append(select).append(")");
163-
if (alias != null) {
164-
builder.append(alias);
165-
}
166-
if (pivot != null) {
167-
builder.append(" ").append(pivot);
168-
}
169-
if (unPivot != null) {
170-
builder.append(" ").append(unPivot);
171-
}
163+
appendTo(builder, alias, pivot, unPivot);
172164
return builder;
173165
}
174166
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,11 @@ public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
317317
return selectVisitor.visit(this, context);
318318
}
319319

320+
@Override
321+
public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
322+
return fromItemVisitor.visit(this, context);
323+
}
324+
320325
public OptimizeFor getOptimizeFor() {
321326
return optimizeFor;
322327
}

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

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

12+
import net.sf.jsqlparser.expression.Alias;
1213
import net.sf.jsqlparser.expression.Expression;
1314
import net.sf.jsqlparser.expression.ExpressionVisitor;
1415
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
@@ -23,7 +24,7 @@
2324
import java.util.List;
2425
import java.util.Optional;
2526

26-
public abstract class Select extends ASTNodeAccessImpl implements Statement, Expression {
27+
public abstract class Select extends ASTNodeAccessImpl implements Statement, Expression, FromItem {
2728
protected Table forUpdateTable = null;
2829
List<WithItem<?>> withItemsList;
2930
Limit limitBy;
@@ -40,6 +41,9 @@ public abstract class Select extends ASTNodeAccessImpl implements Statement, Exp
4041
private boolean skipLocked;
4142
private Wait wait;
4243
private boolean noWait = false;
44+
Alias alias;
45+
Pivot pivot;
46+
UnPivot unPivot;
4347

4448
public static String orderByToString(List<OrderByElement> orderByElements) {
4549
return orderByToString(false, orderByElements);
@@ -322,6 +326,39 @@ public void setSkipLocked(boolean skipLocked) {
322326
this.skipLocked = skipLocked;
323327
}
324328

329+
@Override
330+
public Alias getAlias() {
331+
return alias;
332+
}
333+
334+
@Override
335+
public void setAlias(Alias alias) {
336+
this.alias = alias;
337+
}
338+
339+
public Select withAlias(Alias alias) {
340+
this.setAlias(alias);
341+
return this;
342+
}
343+
344+
@Override
345+
public Pivot getPivot() {
346+
return pivot;
347+
}
348+
349+
@Override
350+
public void setPivot(Pivot pivot) {
351+
this.pivot = pivot;
352+
}
353+
354+
public UnPivot getUnPivot() {
355+
return unPivot;
356+
}
357+
358+
public void setUnPivot(UnPivot unPivot) {
359+
this.unPivot = unPivot;
360+
}
361+
325362
public abstract StringBuilder appendSelectBodyTo(StringBuilder builder);
326363

327364
@SuppressWarnings({"PMD.CyclomaticComplexity"})
@@ -381,6 +418,8 @@ public StringBuilder appendTo(StringBuilder builder) {
381418
}
382419
}
383420

421+
appendTo(builder, alias, pivot, unPivot);
422+
384423
return builder;
385424
}
386425

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
2727
return selectVisitor.visit(this, context);
2828
}
2929

30+
@Override
31+
public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
32+
return fromItemVisitor.visit(this, context);
33+
}
34+
3035
public List<OrderByElement> getOrderByElements() {
3136
return orderByElements;
3237
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ public StringBuilder appendTo(StringBuilder builder) {
5555
public <T, S> T accept(SelectVisitor<T> selectVisitor, S context) {
5656
return selectVisitor.visit(this, context);
5757
}
58+
59+
@Override
60+
public <T, S> T accept(FromItemVisitor<T> fromItemVisitor, S context) {
61+
return fromItemVisitor.visit(this, context);
62+
}
5863
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ public void setExpressions(ExpressionList<Expression> expressions) {
4848
public StringBuilder appendSelectBodyTo(StringBuilder builder) {
4949
builder.append("VALUES ");
5050
builder.append(expressions.toString());
51-
if (alias != null) {
52-
builder.append(" ").append(alias);
53-
}
51+
appendTo(builder, alias);
5452
return builder;
5553
}
5654

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

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public <S> StringBuilder visit(ParenthesedSelect select, S context) {
103103
}
104104

105105
buffer.append("(");
106-
select.getSelect().accept(this, context);
106+
select.getSelect().accept((SelectVisitor<StringBuilder>) this, context);
107107
buffer.append(")");
108108

109109
if (select.getOrderByElements() != null) {
@@ -330,6 +330,20 @@ public <S> StringBuilder visit(PlainSelect plainSelect, S context) {
330330
if (plainSelect.isUseWithNoLog()) {
331331
buffer.append(" WITH NO LOG");
332332
}
333+
334+
Alias alias = plainSelect.getAlias();
335+
if (alias != null) {
336+
buffer.append(alias);
337+
}
338+
Pivot pivot = plainSelect.getPivot();
339+
if (pivot != null) {
340+
pivot.accept(this, context);
341+
}
342+
UnPivot unpivot = plainSelect.getUnPivot();
343+
if (unpivot != null) {
344+
unpivot.accept(this, context);
345+
}
346+
333347
return buffer;
334348
}
335349

@@ -618,7 +632,7 @@ public <S> StringBuilder visit(SetOperationList list, S context) {
618632
if (i != 0) {
619633
buffer.append(' ').append(list.getOperations().get(i - 1)).append(' ');
620634
}
621-
list.getSelects().get(i).accept(this, context);
635+
list.getSelects().get(i).accept((SelectVisitor<StringBuilder>) this, context);
622636
}
623637
if (list.getOrderByElements() != null) {
624638
new OrderByDeParser(expressionVisitor, buffer).deParse(list.getOrderByElements());
@@ -636,6 +650,20 @@ public <S> StringBuilder visit(SetOperationList list, S context) {
636650
if (list.getIsolation() != null) {
637651
buffer.append(list.getIsolation().toString());
638652
}
653+
654+
Alias alias = list.getAlias();
655+
if (alias != null) {
656+
buffer.append(alias);
657+
}
658+
Pivot pivot = list.getPivot();
659+
if (pivot != null) {
660+
pivot.accept(this, context);
661+
}
662+
UnPivot unpivot = list.getUnPivot();
663+
if (unpivot != null) {
664+
unpivot.accept(this, context);
665+
}
666+
639667
return buffer;
640668
}
641669

@@ -779,7 +807,7 @@ private void deparseOptimizeFor(OptimizeFor optimizeFor) {
779807

780808
@Override
781809
void deParse(PlainSelect statement) {
782-
statement.accept(this, null);
810+
statement.accept((SelectVisitor<StringBuilder>) this, null);
783811
}
784812

785813
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private <S> StringBuilder addWithItemsToBuffer(List<WithItem<?>> withItemsList,
214214

215215
@Override
216216
public <S> StringBuilder visit(Select select, S context) {
217-
select.accept(selectDeParser, context);
217+
select.accept((SelectVisitor<StringBuilder>) selectDeParser, context);
218218
return buffer;
219219
}
220220

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,7 @@
1010
package net.sf.jsqlparser.util.deparser;
1111

1212
import net.sf.jsqlparser.expression.ExpressionVisitor;
13-
import net.sf.jsqlparser.statement.select.LateralSubSelect;
14-
import net.sf.jsqlparser.statement.select.Offset;
15-
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
16-
import net.sf.jsqlparser.statement.select.PlainSelect;
17-
import net.sf.jsqlparser.statement.select.SelectVisitor;
18-
import net.sf.jsqlparser.statement.select.SetOperationList;
19-
import net.sf.jsqlparser.statement.select.TableStatement;
20-
import net.sf.jsqlparser.statement.select.Values;
21-
import net.sf.jsqlparser.statement.select.WithItem;
13+
import net.sf.jsqlparser.statement.select.*;
2214

2315
/**
2416
* @author jxnu-liguobin
@@ -101,6 +93,10 @@ public <S> StringBuilder visit(TableStatement tableStatement, S context) {
10193
}
10294

10395
// TODO UNION
96+
97+
tableStatement.appendTo(buffer, tableStatement.getAlias(), tableStatement.getPivot(),
98+
tableStatement.getUnPivot());
99+
104100
return buffer;
105101
}
106102
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void deParse(Upsert upsert) {
7575

7676
if (upsert.getSelect() != null) {
7777
buffer.append(" ");
78-
upsert.getSelect().accept(selectVisitor, null);
78+
upsert.getSelect().accept((SelectVisitor<StringBuilder>) selectVisitor, null);
7979
}
8080

8181
if (upsert.getDuplicateUpdateSets() != null) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import net.sf.jsqlparser.parser.feature.Feature;
1313
import net.sf.jsqlparser.statement.create.view.AlterView;
14+
import net.sf.jsqlparser.statement.select.SelectVisitor;
1415
import net.sf.jsqlparser.util.validation.ValidationCapability;
1516
import net.sf.jsqlparser.util.validation.metadata.NamedObject;
1617

@@ -27,7 +28,8 @@ public void validate(AlterView alterView) {
2728
validateName(c, NamedObject.view, alterView.getView().getFullyQualifiedName());
2829
validateOptionalColumnNames(c, alterView.getColumnNames());
2930
}
30-
alterView.getSelect().accept(getValidator(SelectValidator.class), null);
31+
alterView.getSelect().accept((SelectVisitor<Void>) getValidator(SelectValidator.class),
32+
null);
3133
}
3234

3335
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import net.sf.jsqlparser.statement.create.view.ForceOption;
1515
import net.sf.jsqlparser.statement.create.view.TemporaryOption;
1616
import net.sf.jsqlparser.statement.select.Select;
17+
import net.sf.jsqlparser.statement.select.SelectVisitor;
1718
import net.sf.jsqlparser.util.validation.ValidationCapability;
1819
import net.sf.jsqlparser.util.validation.metadata.NamedObject;
1920

@@ -38,7 +39,7 @@ public void validate(CreateView createView) {
3839
}
3940
SelectValidator v = getValidator(SelectValidator.class);
4041
Select select = createView.getSelect();
41-
select.accept(v, null);
42+
select.accept((SelectVisitor<Void>) v, null);
4243
}
4344

4445
}

0 commit comments

Comments
 (0)