diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java index 39fd99f64e..de74074987 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java @@ -26,7 +26,7 @@ public class SQLDropTableStatement extends SQLStatementImpl { private static final long serialVersionUID = 1L; - private List tableNames = new ArrayList(); + protected List tableNames = new ArrayList(); public SQLDropTableStatement(){ @@ -48,7 +48,6 @@ public class SQLDropTableStatement extends SQLStatementImpl { tableNames.add(name); } - @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java new file mode 100644 index 0000000000..11eeaef1d7 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDropTableStatement.java @@ -0,0 +1,37 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class MySqlDropTableStatement extends SQLDropTableStatement implements MySqlStatement { + + private static final long serialVersionUID = 1L; + + private boolean ifExists = false; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, tableNames); + } + visitor.endVisit(this); + } + + public boolean isIfExists() { + return ifExists; + } + + public void setIfExists(boolean ifExists) { + this.ifExists = ifExists; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatement.java new file mode 100644 index 0000000000..452fae52fd --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatement.java @@ -0,0 +1,8 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; + +public interface MySqlStatement extends SQLStatement, MySqlObject { + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java index 023690f5e3..930041b9b3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java @@ -19,7 +19,7 @@ import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public abstract class MySqlStatementImpl extends SQLStatementImpl { +public abstract class MySqlStatementImpl extends SQLStatementImpl implements MySqlStatement { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index a7535038a9..6ae16dedd3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -105,6 +105,7 @@ public class MySqlLexer extends Lexer { map.put("ANY", Token.ANY); map.put("TRUNCATE", Token.TRUNCATE); map.put("USER", Token.USER); + map.put("IF", Token.IF); map.put("TRUE", Token.TRUE); map.put("FALSE", Token.FALSE); 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 560aa82d60..e086be60b9 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 @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; +import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; @@ -36,6 +37,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -986,4 +988,30 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } + + protected SQLDropTableStatement parseDropTable(boolean acceptDrop) { + if (acceptDrop) { + accept(Token.DROP); + } + accept(Token.TABLE); + + MySqlDropTableStatement stmt = new MySqlDropTableStatement(); + + if (lexer.token() == Token.IF) { + lexer.nextToken(); + accept(Token.EXISTS); + stmt.setIfExists(true); + } + + for (;;) { + SQLName name = this.exprParser.name(); + stmt.getTableNames().add(name); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + return stmt; + } } 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 6a70e82064..5ceafd41eb 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 @@ -27,6 +27,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -50,131 +51,135 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public interface MySqlASTVisitor extends SQLASTVisitor { - boolean visit(MySqlBooleanExpr x); + boolean visit(MySqlBooleanExpr x); - void endVisit(MySqlBooleanExpr x); + void endVisit(MySqlBooleanExpr x); - boolean visit(MySqlSelectQueryBlock.Limit x); + boolean visit(MySqlSelectQueryBlock.Limit x); - void endVisit(MySqlSelectQueryBlock.Limit x); + void endVisit(MySqlSelectQueryBlock.Limit x); - boolean visit(MySqlTableIndex x); + boolean visit(MySqlTableIndex x); - void endVisit(MySqlTableIndex x); + void endVisit(MySqlTableIndex x); - boolean visit(MySqlKey x); + boolean visit(MySqlKey x); - void endVisit(MySqlKey x); + void endVisit(MySqlKey x); - boolean visit(MySqlPrimaryKey x); + boolean visit(MySqlPrimaryKey x); - void endVisit(MySqlPrimaryKey x); + void endVisit(MySqlPrimaryKey x); - void endVisit(MySqlIntervalExpr x); + void endVisit(MySqlIntervalExpr x); - boolean visit(MySqlIntervalExpr x); + boolean visit(MySqlIntervalExpr x); - void endVisit(MySqlExtractExpr x); + void endVisit(MySqlExtractExpr x); - boolean visit(MySqlExtractExpr x); + boolean visit(MySqlExtractExpr x); - void endVisit(MySqlMatchAgainstExpr x); + void endVisit(MySqlMatchAgainstExpr x); - boolean visit(MySqlMatchAgainstExpr x); + boolean visit(MySqlMatchAgainstExpr x); - void endVisit(MySqlBinaryExpr x); + void endVisit(MySqlBinaryExpr x); - boolean visit(MySqlBinaryExpr x); + boolean visit(MySqlBinaryExpr x); - void endVisit(MySqlPrepareStatement x); + void endVisit(MySqlPrepareStatement x); - boolean visit(MySqlPrepareStatement x); + boolean visit(MySqlPrepareStatement x); - void endVisit(MySqlExecuteStatement x); + void endVisit(MySqlExecuteStatement x); - boolean visit(MySqlExecuteStatement x); + boolean visit(MySqlExecuteStatement x); - void endVisit(MySqlDeleteStatement x); + void endVisit(MySqlDeleteStatement x); - boolean visit(MySqlDeleteStatement x); + boolean visit(MySqlDeleteStatement x); - void endVisit(MySqlInsertStatement x); + void endVisit(MySqlInsertStatement x); - boolean visit(MySqlInsertStatement x); + boolean visit(MySqlInsertStatement x); - void endVisit(MySqlLoadDataInFileStatement x); + void endVisit(MySqlLoadDataInFileStatement x); - boolean visit(MySqlLoadDataInFileStatement x); + boolean visit(MySqlLoadDataInFileStatement x); - void endVisit(MySqlLoadXmlStatement x); + void endVisit(MySqlLoadXmlStatement x); - boolean visit(MySqlLoadXmlStatement x); + boolean visit(MySqlLoadXmlStatement x); - void endVisit(MySqlReplicateStatement x); + void endVisit(MySqlReplicateStatement x); - boolean visit(MySqlReplicateStatement x); + boolean visit(MySqlReplicateStatement x); - void endVisit(MySqlSelectGroupBy x); + void endVisit(MySqlSelectGroupBy x); - boolean visit(MySqlSelectGroupBy x); + boolean visit(MySqlSelectGroupBy x); - void endVisit(MySqlStartTransactionStatement x); + void endVisit(MySqlStartTransactionStatement x); - boolean visit(MySqlStartTransactionStatement x); + boolean visit(MySqlStartTransactionStatement x); - void endVisit(MySqlCommitStatement x); + void endVisit(MySqlCommitStatement x); - boolean visit(MySqlCommitStatement x); + boolean visit(MySqlCommitStatement x); - void endVisit(MySqlRollbackStatement x); + void endVisit(MySqlRollbackStatement x); - boolean visit(MySqlRollbackStatement x); + boolean visit(MySqlRollbackStatement x); - void endVisit(MySqlShowColumnsStatement x); + void endVisit(MySqlShowColumnsStatement x); - boolean visit(MySqlShowColumnsStatement x); + boolean visit(MySqlShowColumnsStatement x); - void endVisit(MySqlShowTablesStatement x); + void endVisit(MySqlShowTablesStatement x); - boolean visit(MySqlShowTablesStatement x); + boolean visit(MySqlShowTablesStatement x); - void endVisit(MySqlShowDatabasesStatement x); + void endVisit(MySqlShowDatabasesStatement x); - boolean visit(MySqlShowDatabasesStatement x); + boolean visit(MySqlShowDatabasesStatement x); - void endVisit(MySqlShowWarningsStatement x); + void endVisit(MySqlShowWarningsStatement x); - boolean visit(MySqlShowWarningsStatement x); + boolean visit(MySqlShowWarningsStatement x); - void endVisit(MySqlShowStatusStatement x); + void endVisit(MySqlShowStatusStatement x); - boolean visit(MySqlShowStatusStatement x); + boolean visit(MySqlShowStatusStatement x); - void endVisit(CobarShowStatus x); + void endVisit(CobarShowStatus x); - boolean visit(CobarShowStatus x); + boolean visit(CobarShowStatus x); - void endVisit(MySqlKillStatement x); + void endVisit(MySqlKillStatement x); - boolean visit(MySqlKillStatement x); + boolean visit(MySqlKillStatement x); - void endVisit(MySqlBinlogStatement x); + void endVisit(MySqlBinlogStatement x); - boolean visit(MySqlBinlogStatement x); - - void endVisit(MySqlResetStatement x); - - boolean visit(MySqlResetStatement x); - - void endVisit(MySqlDropUser x); - - boolean visit(MySqlDropUser x); - - void endVisit(MySqlCreateUserStatement x); - - boolean visit(MySqlCreateUserStatement x); - - void endVisit(MySqlCreateUserStatement.UserSpecification x); - - boolean visit(MySqlCreateUserStatement.UserSpecification x); + boolean visit(MySqlBinlogStatement x); + + void endVisit(MySqlResetStatement x); + + boolean visit(MySqlResetStatement x); + + void endVisit(MySqlDropUser x); + + boolean visit(MySqlDropUser x); + + void endVisit(MySqlCreateUserStatement x); + + boolean visit(MySqlCreateUserStatement x); + + void endVisit(MySqlCreateUserStatement.UserSpecification x); + + boolean visit(MySqlCreateUserStatement.UserSpecification x); + + void endVisit(MySqlDropTableStatement x); + + boolean visit(MySqlDropTableStatement 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 76cd785638..8ff08a901d 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 @@ -13,6 +13,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -377,5 +378,15 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements public boolean visit(MySqlDropUser x) { return true; } + + @Override + public void endVisit(MySqlDropTableStatement x) { + + } + + @Override + public boolean visit(MySqlDropTableStatement x) { + return true; + } } 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 9da51a6d8c..c76540d658 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 @@ -42,6 +42,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -1307,4 +1308,20 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV printAndAccept(x.getUsers(), ", "); return false; } + + @Override + public void endVisit(MySqlDropTableStatement x) { + + } + + @Override + public boolean visit(MySqlDropTableStatement x) { + print("DROP TABLE "); + if (x.isIfExists()) { + print("IF EXISTS "); + } + + printAndAccept(x.getTableNames(), ", "); + return false; + } } 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 913520f18e..fb366ad4f3 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 @@ -4,6 +4,7 @@ import java.util.Map; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; +import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; @@ -18,6 +19,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement.UserSpecification; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlExecuteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -433,4 +435,12 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public boolean visit(MySqlDropUser x) { return true; } + @Override + public void endVisit(MySqlDropTableStatement x) { + + } + @Override + public boolean visit(MySqlDropTableStatement x) { + return visit((SQLDropTableStatement) x); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 05d471b1b7..126215eee4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -115,8 +115,7 @@ public class OracleExprParser extends SQLExprParser { } SQLDataType dataType = new SQLDataTypeImpl(typeName); - parseDataTypeRest(dataType); - return dataType; + return parseDataTypeRest(dataType); } public boolean isAggreateFunction(String word) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 60c1009173..121a27aab3 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1056,50 +1056,53 @@ public class SQLExprParser extends SQLParser { String typeName = typeExpr.toString(); SQLDataType dataType = new SQLDataTypeImpl(typeName); - parseDataTypeRest(dataType); - return dataType; + return parseDataTypeRest(dataType); } - protected void parseDataTypeRest(SQLDataType dataType) { + protected SQLDataType parseDataTypeRest(SQLDataType dataType) { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); exprList(dataType.getArguments()); accept(Token.RPAREN); + + return parseCharTypeRest(dataType); } + + return dataType; } - protected SQLDataType parseCharType() throws ParserException { - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException(); + protected boolean isCharType(SQLDataType dataType) { + String dataTypeName = dataType.getName(); + + return "char".equalsIgnoreCase(dataTypeName) // + || "varchar".equalsIgnoreCase(dataTypeName) + || "nchar".equalsIgnoreCase(dataTypeName) + || "nvarchar".equalsIgnoreCase(dataTypeName) + // + ; + } + + protected SQLDataType parseCharTypeRest(SQLDataType dataType) { + if (!isCharType(dataType)) { + return dataType; } - String typeName = lexer.stringVal(); + SQLCharactorDataType charType = new SQLCharactorDataType(dataType.getName()); + charType.getArguments().addAll(dataType.getArguments()); - lexer.nextToken(); - SQLCharactorDataType dataType = new SQLCharactorDataType(typeName); - if (lexer.token() == (Token.LPAREN)) { + if (lexer.token() != Token.IDENTIFIER) { + throw new ParserException("syntax error " + lexer.token() + " " + lexer.stringVal()); + } + + if (identifierEquals("CHARACTER")) { lexer.nextToken(); - exprList(dataType.getArguments()); - accept(Token.RPAREN); - } - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException(); - } - - if (lexer.stringVal().equalsIgnoreCase("CHARACTER")) { - if (lexer.token() != Token.IDENTIFIER) { - throw new ParserException(); - } - - if (!lexer.stringVal().equalsIgnoreCase("SET")) { - throw new ParserException(); - } + accept(Token.SET); if (lexer.token() != Token.IDENTIFIER) { throw new ParserException(); } - dataType.setCharSetName(lexer.stringVal()); + charType.setCharSetName(lexer.stringVal()); lexer.nextToken(); if (lexer.token() == Token.IDENTIFIER) { @@ -1109,12 +1112,12 @@ public class SQLExprParser extends SQLParser { if (lexer.token() != Token.IDENTIFIER) { throw new ParserException(); } - dataType.setCollate(lexer.stringVal()); + charType.setCollate(lexer.stringVal()); lexer.nextToken(); } } } - return dataType; + return charType; } public void accept(Token token) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java new file mode 100644 index 0000000000..226d0f589a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class MySqlCreateTableTest extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDropTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDropTableTest.java new file mode 100644 index 0000000000..9760a53312 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDropTableTest.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.mysql; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlDropTableTest extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DROP TABLE IF EXISTS B,C,A;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(3, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("A"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("B"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("C"))); + +// Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "last_name"))); + } +}