Skip to content

Commit c03733b

Browse files
AnEmortalKidJan Monterrubio
andauthored
Add show tables support (#1015)
* visual * implement show tables Co-authored-by: Jan Monterrubio <Jan.Monterrubio@Cerner.com>
1 parent 2b7909c commit c03733b

File tree

8 files changed

+248
-6
lines changed

8 files changed

+248
-6
lines changed

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import net.sf.jsqlparser.statement.merge.Merge;
2727
import net.sf.jsqlparser.statement.replace.Replace;
2828
import net.sf.jsqlparser.statement.select.Select;
29+
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
2930
import net.sf.jsqlparser.statement.truncate.Truncate;
3031
import net.sf.jsqlparser.statement.update.Update;
3132
import net.sf.jsqlparser.statement.upsert.Upsert;
@@ -69,6 +70,8 @@ public interface StatementVisitor {
6970

7071
void visit(ShowColumnsStatement set);
7172

73+
void visit(ShowTablesStatement showTables);
74+
7275
void visit(Merge merge);
7376

7477
void visit(Select select);

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import net.sf.jsqlparser.statement.merge.Merge;
2727
import net.sf.jsqlparser.statement.replace.Replace;
2828
import net.sf.jsqlparser.statement.select.Select;
29+
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
2930
import net.sf.jsqlparser.statement.truncate.Truncate;
3031
import net.sf.jsqlparser.statement.update.Update;
3132
import net.sf.jsqlparser.statement.upsert.Upsert;
@@ -119,10 +120,6 @@ public void visit(SetStatement set) {
119120

120121
}
121122

122-
@Override
123-
public void visit(ShowColumnsStatement set) {
124-
}
125-
126123
@Override
127124
public void visit(Merge merge) {
128125

@@ -160,6 +157,14 @@ public void visit(ExplainStatement aThis) {
160157
public void visit(ShowStatement aThis) {
161158
}
162159

160+
@Override
161+
public void visit(ShowColumnsStatement set) {
162+
}
163+
164+
@Override
165+
public void visit(ShowTablesStatement showTables) {
166+
}
167+
163168
@Override
164169
public void visit(DeclareStatement aThis) {
165170
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.show;
11+
12+
import net.sf.jsqlparser.expression.Expression;
13+
import net.sf.jsqlparser.statement.Statement;
14+
import net.sf.jsqlparser.statement.StatementVisitor;
15+
16+
import java.util.EnumSet;
17+
18+
/**
19+
* A {@code SHOW TABLES} statement
20+
* @see <a href="https://dev.mysql.com/doc/refman/8.0/en/show-tables.html">MySQL show tables</a>
21+
*/
22+
public class ShowTablesStatement implements Statement {
23+
24+
private EnumSet<Modifiers> modifiers;
25+
private SelectionMode selectionMode;
26+
private String dbName;
27+
private Expression likeExpression;
28+
private Expression whereCondition;
29+
30+
public EnumSet<Modifiers> getModifiers() {
31+
return modifiers;
32+
}
33+
34+
public void setModifiers(EnumSet<Modifiers> modifiers) {
35+
this.modifiers = modifiers;
36+
}
37+
38+
public SelectionMode getSelectionMode() {
39+
return selectionMode;
40+
}
41+
42+
public void setSelectionMode(SelectionMode selectionMode) {
43+
this.selectionMode = selectionMode;
44+
}
45+
46+
public String getDbName() {
47+
return dbName;
48+
}
49+
50+
public void setDbName(String dbName) {
51+
this.dbName = dbName;
52+
}
53+
54+
public Expression getLikeExpression() {
55+
return likeExpression;
56+
}
57+
58+
public void setLikeExpression(Expression likeExpression) {
59+
this.likeExpression = likeExpression;
60+
}
61+
62+
public Expression getWhereCondition() {
63+
return whereCondition;
64+
}
65+
66+
public void setWhereCondition(Expression whereCondition) {
67+
this.whereCondition = whereCondition;
68+
}
69+
70+
@Override
71+
public String toString() {
72+
StringBuilder builder = new StringBuilder();
73+
builder.append("SHOW");
74+
75+
if (modifiers.contains(Modifiers.EXTENDED)) {
76+
builder.append(" EXTENDED");
77+
}
78+
if (modifiers.contains(Modifiers.FULL)) {
79+
builder.append(" FULL");
80+
}
81+
82+
builder.append(" TABLES");
83+
84+
if (dbName != null) {
85+
builder.append(" ").append(selectionMode.name()).append(" ").append(dbName);
86+
}
87+
88+
if (likeExpression != null) {
89+
builder.append(" ").append("LIKE").append(" ").append(likeExpression);
90+
}
91+
92+
if (whereCondition != null) {
93+
builder.append(" ").append("WHERE").append(" ").append(whereCondition);
94+
}
95+
96+
return builder.toString();
97+
}
98+
99+
@Override
100+
public void accept(StatementVisitor statementVisitor) {
101+
statementVisitor.visit(this);
102+
}
103+
104+
public enum SelectionMode {
105+
FROM, IN
106+
}
107+
108+
public enum Modifiers {
109+
EXTENDED, FULL
110+
}
111+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
import net.sf.jsqlparser.statement.select.TableFunction;
9393
import net.sf.jsqlparser.statement.select.ValuesList;
9494
import net.sf.jsqlparser.statement.select.WithItem;
95+
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
9596
import net.sf.jsqlparser.statement.truncate.Truncate;
9697
import net.sf.jsqlparser.statement.update.Update;
9798
import net.sf.jsqlparser.statement.upsert.Upsert;
@@ -879,4 +880,9 @@ public void visit(AlterSequence alterSequence) {
879880
public void visit(CreateFunctionalStatement createFunctionalStatement) {
880881
throw new UnsupportedOperationException("Finding tables from CreateFunctionalStatement is not supported");
881882
}
883+
884+
@Override
885+
public void visit(ShowTablesStatement showTables) {
886+
throw new UnsupportedOperationException("Finding tables from ShowTablesStatement is not supported");
887+
}
882888
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 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.statement.show.ShowTablesStatement;
13+
14+
public class ShowTablesStatementDeparser extends AbstractDeParser<ShowTablesStatement> {
15+
16+
public ShowTablesStatementDeparser(StringBuilder buffer) {
17+
super(buffer);
18+
}
19+
20+
@Override
21+
void deParse(ShowTablesStatement statement) {
22+
buffer.append(statement);
23+
}
24+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import net.sf.jsqlparser.statement.replace.Replace;
4444
import net.sf.jsqlparser.statement.select.Select;
4545
import net.sf.jsqlparser.statement.select.WithItem;
46+
import net.sf.jsqlparser.statement.show.ShowTablesStatement;
4647
import net.sf.jsqlparser.statement.truncate.Truncate;
4748
import net.sf.jsqlparser.statement.update.Update;
4849
import net.sf.jsqlparser.statement.upsert.Upsert;
@@ -227,6 +228,11 @@ public void visit(ShowColumnsStatement show) {
227228
new ShowColumnsStatementDeParser(buffer).deParse(show);
228229
}
229230

231+
@Override
232+
public void visit(ShowTablesStatement showTables) {
233+
new ShowTablesStatementDeparser(buffer).deParse(showTables);
234+
}
235+
230236
@Override
231237
public void visit(Block block) {
232238
buffer.append("BEGIN\n");

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

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import net.sf.jsqlparser.statement.insert.*;
5252
import net.sf.jsqlparser.statement.replace.*;
5353
import net.sf.jsqlparser.statement.execute.*;
5454
import net.sf.jsqlparser.statement.select.*;
55+
import net.sf.jsqlparser.statement.show.*;
5556
import net.sf.jsqlparser.statement.truncate.*;
5657
import net.sf.jsqlparser.statement.update.*;
5758
import net.sf.jsqlparser.statement.upsert.*;
@@ -188,6 +189,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
188189
| <K_EXECUTE: "EXECUTE">
189190
| <K_EXISTS:"EXISTS">
190191
| <K_EXPLAIN:"EXPLAIN">
192+
| <K_EXTENDED:"EXTENDED">
191193
| <K_EXTRACT:"EXTRACT">
192194
| <K_FETCH:"FETCH">
193195
| <K_FILTER: "FILTER">
@@ -313,6 +315,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
313315
| <K_SOME:"SOME">
314316
| <K_START:"START">
315317
| <K_TABLE:"TABLE">
318+
| <K_TABLES:"TABLES">
316319
| <K_TABLESPACE : "TABLESPACE">
317320
| <K_THEN:"THEN">
318321
| <K_TEMP:"TEMP">
@@ -494,7 +497,11 @@ Statement SingleStatement() :
494497
|
495498
stm = Set()
496499
|
497-
LOOKAHEAD(2) stm = ShowColumns()
500+
LOOKAHEAD(ShowColumns())
501+
stm = ShowColumns()
502+
|
503+
LOOKAHEAD(ShowTables())
504+
stm = ShowTables()
498505
|
499506
stm = Show()
500507
|
@@ -773,6 +780,39 @@ ShowColumnsStatement ShowColumns(): {
773780
}
774781
}
775782

783+
// https://dev.mysql.com/doc/refman/8.0/en/show-tables.html
784+
ShowTablesStatement ShowTables(): {
785+
ShowTablesStatement showTablesStatement;
786+
EnumSet<ShowTablesStatement.Modifiers> modifiers = EnumSet.noneOf(ShowTablesStatement.Modifiers.class);
787+
ShowTablesStatement.SelectionMode selectionMode = null;
788+
String dbName = null;
789+
Expression likeExpression = null;
790+
Expression whereCondition = null;
791+
}
792+
{
793+
<K_SHOW>
794+
[ <K_EXTENDED> { modifiers.add(ShowTablesStatement.Modifiers.EXTENDED); } ]
795+
[ <K_FULL> { modifiers.add(ShowTablesStatement.Modifiers.FULL); } ]
796+
<K_TABLES>
797+
[
798+
(
799+
<K_FROM> {selectionMode = ShowTablesStatement.SelectionMode.FROM; }
800+
| <K_IN> { selectionMode = ShowTablesStatement.SelectionMode.IN; }
801+
)
802+
dbName = RelObjectNameExt()
803+
]
804+
[ (<K_LIKE> likeExpression = SimpleExpression() | <K_WHERE> whereCondition = Expression()) ]
805+
{
806+
showTablesStatement = new ShowTablesStatement();
807+
showTablesStatement.setModifiers(modifiers);
808+
showTablesStatement.setSelectionMode(selectionMode);
809+
showTablesStatement.setDbName(dbName);
810+
showTablesStatement.setLikeExpression(likeExpression);
811+
showTablesStatement.setWhereCondition(whereCondition);
812+
return showTablesStatement;
813+
}
814+
}
815+
776816
ShowStatement Show(): {
777817
String name;
778818
}
@@ -1299,7 +1339,7 @@ String RelObjectName() :
12991339
{ Token tk = null; String result = null; }
13001340
{
13011341
(result = RelObjectNameWithoutValue()
1302-
| tk=<K_GROUP> | tk=<K_INTERVAL> | tk=<K_ON> | tk=<K_ORDER> | tk=<K_START> | tk=<K_TOP> | tk=<K_VALUE> | tk=<K_VALUES> | tk=<K_CREATE> )
1342+
| tk=<K_GROUP> | tk=<K_INTERVAL> | tk=<K_ON> | tk=<K_ORDER> | tk=<K_START> | tk=<K_TOP> | tk=<K_VALUE> | tk=<K_VALUES> | tk=<K_CREATE> | tk=<K_TABLES> )
13031343

13041344
{
13051345
if (tk!=null) result=tk.image;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2020 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.show;
11+
12+
import org.junit.Test;
13+
14+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
15+
16+
public class ShowTablesStatementTest {
17+
18+
@Test
19+
public void showTables() throws Exception {
20+
assertSqlCanBeParsedAndDeparsed("SHOW TABLES");
21+
}
22+
23+
@Test
24+
public void showTablesModifiers() throws Exception {
25+
assertSqlCanBeParsedAndDeparsed("SHOW EXTENDED FULL TABLES");
26+
}
27+
28+
@Test
29+
public void showTablesFromDbName() throws Exception {
30+
assertSqlCanBeParsedAndDeparsed("SHOW EXTENDED TABLES FROM db_name");
31+
}
32+
33+
@Test
34+
public void showTablesInDbName() throws Exception {
35+
assertSqlCanBeParsedAndDeparsed("SHOW FULL TABLES IN db_name");
36+
}
37+
38+
@Test
39+
public void showTablesLikeExpression() throws Exception {
40+
assertSqlCanBeParsedAndDeparsed("SHOW TABLES LIKE '%FOO%'");
41+
}
42+
43+
@Test
44+
public void showTablesWhereExpression() throws Exception {
45+
assertSqlCanBeParsedAndDeparsed("SHOW TABLES WHERE table_name = 'FOO'");
46+
}
47+
}

0 commit comments

Comments
 (0)