diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLShowTablesStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLShowTablesStatement.java new file mode 100644 index 0000000000..9af85c89bb --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLShowTablesStatement.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLShowTablesStatement extends SQLStatementImpl { + + protected SQLName database; + protected SQLExpr like; + + public SQLName getDatabase() { + return database; + } + + public void setDatabase(SQLName database) { + if (database != null) { + database.setParent(this); + } + + this.database = database; + } + + public SQLExpr getLike() { + return like; + } + + public void setLike(SQLExpr like) { + if (like != null) { + like.setParent(this); + } + + this.like = like; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, database); + acceptChild(visitor, like); + } + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowStatement.java index 8989fe4a93..275160a6df 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowStatement.java @@ -15,6 +15,6 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; -public interface MySqlShowStatement { +public interface MySqlShowStatement extends MySqlStatement { } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowTablesStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowTablesStatement.java index 2f90640c77..4888a7d6cf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowTablesStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowTablesStatement.java @@ -16,15 +16,14 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlShowTablesStatement extends MySqlStatementImpl implements MySqlShowStatement { +public class MySqlShowTablesStatement extends SQLShowTablesStatement implements MySqlShowStatement { private boolean full; - private SQLName database; - private SQLExpr like; private SQLExpr where; public boolean isFull() { @@ -35,22 +34,6 @@ public class MySqlShowTablesStatement extends MySqlStatementImpl implements MySq this.full = full; } - public SQLName getDatabase() { - return database; - } - - public void setDatabase(SQLName database) { - this.database = database; - } - - public SQLExpr getLike() { - return like; - } - - public void setLike(SQLExpr like) { - this.like = like; - } - public SQLExpr getWhere() { return where; } @@ -67,4 +50,13 @@ public class MySqlShowTablesStatement extends MySqlStatementImpl implements MySq } visitor.endVisit(this); } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index b477de0075..01541245b2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; +import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsert; import com.alibaba.druid.sql.dialect.odps.ast.OdpsInsertStatement; @@ -172,6 +173,25 @@ public class OdpsStatementParser extends SQLStatementParser { return stmt; } + + if (identifierEquals("TABLES")) { + lexer.nextToken(); + + SQLShowTablesStatement stmt = new SQLShowTablesStatement(); + + if (lexer.token() == Token.FROM) { + lexer.nextToken(); + stmt.setDatabase(this.exprParser.name()); + } + + if (lexer.token() == Token.LIKE) { + lexer.nextToken(); + stmt.setLike(this.exprParser.expr()); + } + + return stmt; + } + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -211,4 +231,5 @@ public class OdpsStatementParser extends SQLStatementParser { } } + } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 7ecf1eb47a..831e722208 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -354,7 +354,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseShow() { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } - + public SQLUseStatement parseUse() { accept(Token.USE); SQLUseStatement stmt = new SQLUseStatement(getDbType()); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 3644c6bf4b..94b4121534 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -136,6 +136,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; +import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; @@ -2166,4 +2167,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab x.getTo().accept(this); return false; } + + @Override + public boolean visit(SQLShowTablesStatement x) { + print("SHOW TABLES"); + if (x.getDatabase() != null) { + print(" FROM "); + x.getDatabase().accept(this); + } + + if (x.getLike() != null) { + print(" LIKE "); + x.getLike().accept(this); + } + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 0a15b8f3ef..ab0b3fe040 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -113,6 +113,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; +import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; @@ -569,4 +570,8 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableRename x); + void endVisit(SQLShowTablesStatement x); + + boolean visit(SQLShowTablesStatement x); + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index c6741084c1..77c3b3d1c8 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -115,6 +115,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; +import com.alibaba.druid.sql.ast.statement.SQLShowTablesStatement; import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; @@ -1115,4 +1116,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { return true; } + @Override + public void endVisit(SQLShowTablesStatement x) { + + } + + @Override + public boolean visit(SQLShowTablesStatement x) { + return true; + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowTablesTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowTablesTest0.java new file mode 100644 index 0000000000..fcf425f9ec --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsShowTablesTest0.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.bvt.sql.odps; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.odps.parser.OdpsStatementParser; +import com.alibaba.druid.sql.parser.Token; + +public class OdpsShowTablesTest0 extends TestCase { + + public void test_0() throws Exception { + String sql = "show tables"; + OdpsStatementParser parser = new OdpsStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toOdpsString(stmt); + Assert.assertEquals("SHOW TABLES", output); + } + + public void test_from() throws Exception { + String sql = "show tables from xx"; + OdpsStatementParser parser = new OdpsStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toOdpsString(stmt); + Assert.assertEquals("SHOW TABLES FROM xx", output); + } + + public void test_from_like() throws Exception { + String sql = "show tables from xx like '*'"; + OdpsStatementParser parser = new OdpsStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toOdpsString(stmt); + Assert.assertEquals("SHOW TABLES FROM xx LIKE '*'", output); + } +}