Skip to content

Commit 313a4b4

Browse files
feat: [MySQL] Support TABLE STATEMENT (#1921)
* feat: Support `TABLE STATEMENT` * feat: Support `TABLE STATEMENT` * fmt code * Fix
1 parent a35fbe7 commit 313a4b4

File tree

18 files changed

+412
-85
lines changed

18 files changed

+412
-85
lines changed

src/main/java/net/sf/jsqlparser/parser/feature/Feature.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,11 @@ public enum Feature {
306306
*/
307307
values,
308308

309+
/**
310+
* SQL "TABLE table_name [ORDER BY column_name] [LIMIT number [OFFSET number]]“
311+
*/
312+
tableStatement,
313+
309314
/**
310315
* SQL "UPDATE" statement is allowed
311316
*

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ public interface SelectVisitor {
2222
void visit(Values aThis);
2323

2424
void visit(LateralSubSelect lateralSubSelect);
25+
26+
void visit(TableStatement tableStatement);
2527
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,9 @@ public void visit(Values aThis) {
4141
public void visit(LateralSubSelect lateralSubSelect) {
4242

4343
}
44+
45+
@Override
46+
public void visit(TableStatement tableStatement) {
47+
48+
}
4449
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.select;
11+
12+
import net.sf.jsqlparser.schema.Table;
13+
14+
/**
15+
* @see <a href="https://dev.mysql.com/doc/refman/8.2/en/table.html"></a> `TABLE table_name [ORDER
16+
* BY column_name] [LIMIT number [OFFSET number]]` Union not currently supported
17+
*
18+
* @author jxnu-liguobin
19+
*/
20+
public class TableStatement extends Select {
21+
22+
private Table table;
23+
24+
public Table getTable() {
25+
return table;
26+
}
27+
28+
public void setTable(Table table) {
29+
this.table = table;
30+
}
31+
32+
@Override
33+
public StringBuilder appendSelectBodyTo(StringBuilder builder) {
34+
builder.append("TABLE ").append(table.getName());
35+
return builder;
36+
}
37+
38+
@SuppressWarnings({"PMD.CyclomaticComplexity"})
39+
@Override
40+
public StringBuilder appendTo(StringBuilder builder) {
41+
42+
appendSelectBodyTo(builder);
43+
44+
builder.append(orderByToString(false, orderByElements));
45+
46+
if (limit != null) {
47+
builder.append(limit);
48+
}
49+
if (offset != null) {
50+
builder.append(offset);
51+
}
52+
return builder;
53+
}
54+
55+
@Override
56+
public void accept(SelectVisitor selectVisitor) {
57+
selectVisitor.visit(this);
58+
}
59+
}

src/main/java/net/sf/jsqlparser/util/AddAliasesVisitor.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
package net.sf.jsqlparser.util;
1111

12+
import java.util.LinkedList;
13+
import java.util.List;
1214
import net.sf.jsqlparser.expression.Alias;
1315
import net.sf.jsqlparser.statement.select.LateralSubSelect;
1416
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
@@ -18,12 +20,10 @@
1820
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
1921
import net.sf.jsqlparser.statement.select.SelectVisitor;
2022
import net.sf.jsqlparser.statement.select.SetOperationList;
23+
import net.sf.jsqlparser.statement.select.TableStatement;
2124
import net.sf.jsqlparser.statement.select.Values;
2225
import net.sf.jsqlparser.statement.select.WithItem;
2326

24-
import java.util.LinkedList;
25-
import java.util.List;
26-
2727
/**
2828
* Add aliases to every column and expression selected by a select - statement. Existing aliases are
2929
* recognized and preserved. This class standard uses a prefix of A and a counter to generate new
@@ -112,4 +112,9 @@ public void visit(Values aThis) {
112112
public void visit(LateralSubSelect lateralSubSelect) {
113113
lateralSubSelect.getSelect().accept(this);
114114
}
115+
116+
@Override
117+
public void visit(TableStatement tableStatement) {
118+
throw new UnsupportedOperationException("Not supported yet.");
119+
}
115120
}

src/main/java/net/sf/jsqlparser/util/ConnectExpressionsVisitor.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
package net.sf.jsqlparser.util;
1111

12+
import java.util.LinkedList;
13+
import java.util.List;
1214
import net.sf.jsqlparser.expression.Alias;
1315
import net.sf.jsqlparser.expression.BinaryExpression;
1416
import net.sf.jsqlparser.statement.select.LateralSubSelect;
@@ -19,12 +21,10 @@
1921
import net.sf.jsqlparser.statement.select.SelectItemVisitor;
2022
import net.sf.jsqlparser.statement.select.SelectVisitor;
2123
import net.sf.jsqlparser.statement.select.SetOperationList;
24+
import net.sf.jsqlparser.statement.select.TableStatement;
2225
import net.sf.jsqlparser.statement.select.Values;
2326
import net.sf.jsqlparser.statement.select.WithItem;
2427

25-
import java.util.LinkedList;
26-
import java.util.List;
27-
2828
/**
2929
* Connect all selected expressions with a binary expression. Out of select a,b from table one gets
3030
* select a || b as expr from table. The type of binary expression is set by overwriting this class
@@ -103,4 +103,8 @@ public void visit(Values aThis) {
103103
throw new UnsupportedOperationException("Not supported yet.");
104104
}
105105

106+
@Override
107+
public void visit(TableStatement tableStatement) {
108+
throw new UnsupportedOperationException("Not supported yet.");
109+
}
106110
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@
167167
import net.sf.jsqlparser.statement.select.SelectVisitor;
168168
import net.sf.jsqlparser.statement.select.SetOperationList;
169169
import net.sf.jsqlparser.statement.select.TableFunction;
170+
import net.sf.jsqlparser.statement.select.TableStatement;
170171
import net.sf.jsqlparser.statement.select.Values;
171172
import net.sf.jsqlparser.statement.select.WithItem;
172173
import net.sf.jsqlparser.statement.show.ShowIndexStatement;
@@ -691,6 +692,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
691692
lateralSubSelect.getSelect().accept((SelectVisitor) this);
692693
}
693694

695+
@Override
696+
public void visit(TableStatement tableStatement) {
697+
tableStatement.getTable().accept(this);
698+
}
699+
694700
/**
695701
* Initializes table names collector. Important is the usage of Column instances to find table
696702
* names. This is only allowed for expression parsing, where a better place for tablenames could

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

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

12+
import static java.util.stream.Collectors.joining;
13+
14+
import java.util.Iterator;
15+
import java.util.List;
1216
import net.sf.jsqlparser.expression.Alias;
1317
import net.sf.jsqlparser.expression.Expression;
1418
import net.sf.jsqlparser.expression.ExpressionVisitor;
@@ -40,16 +44,12 @@
4044
import net.sf.jsqlparser.statement.select.SetOperationList;
4145
import net.sf.jsqlparser.statement.select.Skip;
4246
import net.sf.jsqlparser.statement.select.TableFunction;
47+
import net.sf.jsqlparser.statement.select.TableStatement;
4348
import net.sf.jsqlparser.statement.select.Top;
4449
import net.sf.jsqlparser.statement.select.UnPivot;
4550
import net.sf.jsqlparser.statement.select.Values;
4651
import net.sf.jsqlparser.statement.select.WithItem;
4752

48-
import java.util.Iterator;
49-
import java.util.List;
50-
51-
import static java.util.stream.Collectors.joining;
52-
5353
@SuppressWarnings({"PMD.CyclomaticComplexity", "PMD.NPathComplexity"})
5454
public class SelectDeParser extends AbstractDeParser<PlainSelect> implements SelectVisitor,
5555
SelectItemVisitor, FromItemVisitor, PivotVisitor {
@@ -589,6 +589,11 @@ public void visit(LateralSubSelect lateralSubSelect) {
589589
visit((ParenthesedSelect) lateralSubSelect);
590590
}
591591

592+
@Override
593+
public void visit(TableStatement tableStatement) {
594+
new TableStatementDeParser(expressionVisitor, buffer).deParse(tableStatement);
595+
}
596+
592597
@Override
593598
public void visit(TableFunction tableFunction) {
594599
buffer.append(tableFunction.toString());
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.util.deparser;
11+
12+
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;
22+
23+
/**
24+
* @author jxnu-liguobin
25+
*/
26+
public class TableStatementDeParser extends AbstractDeParser<TableStatement>
27+
implements SelectVisitor {
28+
29+
private final ExpressionVisitor expressionVisitor;
30+
31+
public TableStatementDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
32+
super(buffer);
33+
this.expressionVisitor = expressionVisitor;
34+
}
35+
36+
@Override
37+
public void deParse(TableStatement tableStatement) {
38+
tableStatement.accept(this);
39+
}
40+
41+
public void visit(Offset offset) {
42+
buffer.append(" OFFSET ");
43+
offset.getOffset().accept(expressionVisitor);
44+
if (offset.getOffsetParam() != null) {
45+
buffer.append(" ").append(offset.getOffsetParam());
46+
}
47+
48+
}
49+
50+
@Override
51+
public void visit(ParenthesedSelect parenthesedSelect) {
52+
53+
}
54+
55+
@Override
56+
public void visit(PlainSelect plainSelect) {
57+
58+
}
59+
60+
@Override
61+
public void visit(SetOperationList setOpList) {
62+
63+
}
64+
65+
@Override
66+
public void visit(WithItem withItem) {
67+
68+
}
69+
70+
@Override
71+
public void visit(Values aThis) {
72+
73+
}
74+
75+
@Override
76+
public void visit(LateralSubSelect lateralSubSelect) {
77+
78+
}
79+
80+
@Override
81+
public void visit(TableStatement tableStatement) {
82+
buffer.append("TABLE ");
83+
buffer.append(tableStatement.getTable());
84+
if (tableStatement.getOrderByElements() != null) {
85+
new OrderByDeParser(expressionVisitor, buffer)
86+
.deParse(tableStatement.getOrderByElements());
87+
}
88+
89+
if (tableStatement.getLimit() != null) {
90+
new LimitDeparser(expressionVisitor, buffer).deParse(tableStatement.getLimit());
91+
}
92+
if (tableStatement.getOffset() != null) {
93+
visit(tableStatement.getOffset());
94+
}
95+
96+
// TODO UNION
97+
}
98+
}

0 commit comments

Comments
 (0)