diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateDatabaseStatement.java new file mode 100644 index 0000000000..3192f48100 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateDatabaseStatement.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlShowCreateDatabaseStatement extends MySqlStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr database; + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, database); + } + visitor.endVisit(this); + } + + public SQLExpr getDatabase() { + return database; + } + + public void setDatabase(SQLExpr database) { + this.database = database; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateEventStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateEventStatement.java new file mode 100644 index 0000000000..d196fd9d38 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateEventStatement.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlShowCreateEventStatement extends MySqlStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr eventName; + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, eventName); + } + visitor.endVisit(this); + } + + public SQLExpr getEventName() { + return eventName; + } + + public void setEventName(SQLExpr eventName) { + this.eventName = eventName; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateFunctionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateFunctionStatement.java new file mode 100644 index 0000000000..ae178beccc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCreateFunctionStatement.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlShowCreateFunctionStatement extends MySqlStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr functionName; + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, functionName); + } + visitor.endVisit(this); + } + + public SQLExpr getFunctionName() { + return functionName; + } + + public void setFunctionName(SQLExpr functionName) { + this.functionName = functionName; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 61f15d5136..ce49f28d07 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -62,6 +62,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; @@ -596,6 +599,36 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); return new MySqlShowContributorsStatement(); } + + if (lexer.token() == Token.CREATE) { + lexer.nextToken(); + + if (identifierEquals("DATABASE")) { + lexer.nextToken(); + + MySqlShowCreateDatabaseStatement stmt = new MySqlShowCreateDatabaseStatement(); + stmt.setDatabase(this.exprParser.name()); + return stmt; + } + + if (identifierEquals("EVENT")) { + lexer.nextToken(); + + MySqlShowCreateEventStatement stmt = new MySqlShowCreateEventStatement(); + stmt.setEventName(this.exprParser.name()); + return stmt; + } + + if (identifierEquals("FUNCTION")) { + lexer.nextToken(); + + MySqlShowCreateFunctionStatement stmt = new MySqlShowCreateFunctionStatement(); + stmt.setFunctionName(this.exprParser.name()); + return stmt; + } + + throw new ParserException("TODO " + lexer.stringVal()); + } throw new ParserException("TODO " + lexer.stringVal()); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index 7585e8f102..e170039bc4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -53,6 +53,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; @@ -256,4 +259,16 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlShowContributorsStatement x); void endVisit(MySqlShowContributorsStatement x); + + boolean visit(MySqlShowCreateDatabaseStatement x); + + void endVisit(MySqlShowCreateDatabaseStatement x); + + boolean visit(MySqlShowCreateEventStatement x); + + void endVisit(MySqlShowCreateEventStatement x); + + boolean visit(MySqlShowCreateFunctionStatement x); + + void endVisit(MySqlShowCreateFunctionStatement x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index 87d05b0a11..f604d081ee 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -40,6 +40,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; @@ -553,4 +556,34 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements public void endVisit(MySqlShowContributorsStatement x) { } + + @Override + public boolean visit(MySqlShowCreateDatabaseStatement x) { + return true; + } + + @Override + public void endVisit(MySqlShowCreateDatabaseStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateEventStatement x) { + return true; + } + + @Override + public void endVisit(MySqlShowCreateEventStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateFunctionStatement x) { + return true; + } + + @Override + public void endVisit(MySqlShowCreateFunctionStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 16a99ad9e0..2408f99b32 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -72,6 +72,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; @@ -1586,4 +1589,40 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public void endVisit(MySqlShowContributorsStatement x) { } + + @Override + public boolean visit(MySqlShowCreateDatabaseStatement x) { + print("SHOW CREATE DATABASE "); + x.getDatabase().accept(this); + return false; + } + + @Override + public void endVisit(MySqlShowCreateDatabaseStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateEventStatement x) { + print("SHOW CREATE EVENT "); + x.getEventName().accept(this); + return false; + } + + @Override + public void endVisit(MySqlShowCreateEventStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateFunctionStatement x) { + print("SHOW CREATE FUNCTION "); + x.getFunctionName().accept(this); + return false; + } + + @Override + public void endVisit(MySqlShowCreateFunctionStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 1b2732bbd1..d6f4951a43 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -49,6 +49,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowDatabasesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowStatusStatement; @@ -615,4 +618,34 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlShowContributorsStatement x) { } + + @Override + public boolean visit(MySqlShowCreateDatabaseStatement x) { + return false; + } + + @Override + public void endVisit(MySqlShowCreateDatabaseStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateEventStatement x) { + return false; + } + + @Override + public void endVisit(MySqlShowCreateEventStatement x) { + + } + + @Override + public boolean visit(MySqlShowCreateFunctionStatement x) { + return false; + } + + @Override + public void endVisit(MySqlShowCreateFunctionStatement x) { + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java index 740d6b8fbd..9d44cf8dcc 100755 --- a/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/cobar/DALParserTest.java @@ -19,6 +19,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCharacterSetSt import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCollationStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowColumnsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowContributorsStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateDatabaseStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateEventStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateFunctionStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowMasterLogsStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.parser.Token; @@ -337,32 +340,36 @@ public class DALParserTest extends TestCase { Assert.assertEquals("SHOW CONTRIBUTORS", output); } + public void test_show_create_database() throws Exception { + String sql = "SHOW CREATE DATABASE db_name"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + MySqlShowCreateDatabaseStatement show = (MySqlShowCreateDatabaseStatement) parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(show); + Assert.assertEquals("SHOW CREATE DATABASE db_name", output); + } + + public void test_show_create_event() throws Exception { + String sql = "SHOW CREATE event db_name"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + MySqlShowCreateEventStatement show = (MySqlShowCreateEventStatement) parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(show); + Assert.assertEquals("SHOW CREATE EVENT db_name", output); + } + + public void test_show_create_function() throws Exception { + String sql = "SHOW CREATE function x"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + MySqlShowCreateFunctionStatement show = (MySqlShowCreateFunctionStatement) parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(show); + Assert.assertEquals("SHOW CREATE FUNCTION x", output); + } + // // public void testShow() throws Exception { // -// sql = "SHOW CREATE DATABASE db_name "; -// lexer = new SQLLexer(sql); -// parser = new DALParser(lexer, new SQLExprParser(lexer)); -// show = (DALShowStatement) parser.show(); -// parser.match(Token.EOF); -// output = output2MySQL(show, sql); -// Assert.assertEquals("SHOW CREATE DATABASE db_name", output); -// -// sql = "SHOW create event expr "; -// lexer = new SQLLexer(sql); -// parser = new DALParser(lexer, new SQLExprParser(lexer)); -// show = (DALShowStatement) parser.show(); -// parser.match(Token.EOF); -// output = output2MySQL(show, sql); -// Assert.assertEquals("SHOW CREATE EVENT expr", output); -// -// sql = "SHOW create function func "; -// lexer = new SQLLexer(sql); -// parser = new DALParser(lexer, new SQLExprParser(lexer)); -// show = (DALShowStatement) parser.show(); -// parser.match(Token.EOF); -// output = output2MySQL(show, sql); -// Assert.assertEquals("SHOW CREATE FUNCTION func", output); // // sql = "SHOW create procedure pro "; // lexer = new SQLLexer(sql);