From 3e68ac41611db3155c0753fb2e2b22653b35cd47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sat, 2 Jun 2012 19:43:11 +0800 Subject: [PATCH] sql parser support create database --- .../java/com/alibaba/druid/sql/SQLUtils.java | 8 +- .../statement/SQLCreateDatabaseStatement.java | 51 ++++++ .../MySqlCreateDatabaseStatement.java | 6 + .../sql/dialect/mysql/parser/MySqlLexer.java | 86 ++-------- .../mysql/parser/MySqlStatementParser.java | 22 +++ .../alibaba/druid/sql/parser/Keywords.java | 153 ++++++++++-------- .../druid/sql/parser/SQLStatementParser.java | 15 ++ .../com/alibaba/druid/sql/parser/Token.java | 1 + .../sql/visitor/SQLASTOutputVisitor.java | 8 + .../druid/sql/visitor/SQLASTVisitor.java | 13 +- .../sql/visitor/SQLASTVisitorAdapter.java | 11 ++ .../druid/bvt/sql/CreateDatabaseTest.java | 29 ++++ .../alibaba/druid/sql/KeywordsMySqlTest.java | 27 ++++ .../com/alibaba/druid/sql/KeywordsTest.java | 31 ++++ 14 files changed, 312 insertions(+), 149 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateDatabaseStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/CreateDatabaseTest.java create mode 100644 src/test/java/com/alibaba/druid/sql/KeywordsMySqlTest.java create mode 100644 src/test/java/com/alibaba/druid/sql/KeywordsTest.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index e4ec8c620a..66e48c48e0 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -101,14 +101,18 @@ public class SQLUtils { return expr; } + + public static List toStatementList(String sql, String dbType) { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + return parser.parseStatementList(); + } public static SQLExpr toSQLExpr(String sql) { return toSQLExpr(sql, null); } public static String format(String sql, String dbType) { - SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); - List statementList = parser.parseStatementList(); + List statementList = toStatementList(sql, dbType); StringBuilder out = new StringBuilder(); SQLASTOutputVisitor visitor = createFormatOutputVisitor(out, statementList, dbType); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java new file mode 100644 index 0000000000..516231b841 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLCreateDatabaseStatement extends SQLStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private String characterSet; + private String collate; + + public SQLCreateDatabaseStatement(){ + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public String getCharacterSet() { + return characterSet; + } + + public void setCharacterSet(String characterSet) { + this.characterSet = characterSet; + } + + public String getCollate() { + return collate; + } + + public void setCollate(String collate) { + this.collate = collate; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateDatabaseStatement.java new file mode 100644 index 0000000000..a0793a4dd9 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateDatabaseStatement.java @@ -0,0 +1,6 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + + +public class MySqlCreateDatabaseStatement { + +} 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 c0acc9f5d3..f4e3c300e0 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 @@ -35,84 +35,18 @@ public class MySqlLexer extends Lexer { static { Map map = new HashMap(); - map.put("EXISTS", Token.EXISTS); - map.put("THEN", Token.THEN); - map.put("AS", Token.AS); - map.put("GROUP", Token.GROUP); - map.put("BY", Token.BY); - map.put("HAVING", Token.HAVING); - map.put("DELETE", Token.DELETE); - map.put("ORDER", Token.ORDER); - map.put("INDEX", Token.INDEX); - map.put("FOR", Token.FOR); - map.put("SCHEMA", Token.SCHEMA); - map.put("FOREIGN", Token.FOREIGN); - map.put("REFERENCES", Token.REFERENCES); - map.put("CHECK", Token.CHECK); - map.put("PRIMARY", Token.PRIMARY); - map.put("KEY", Token.KEY); - map.put("CONSTRAINT", Token.CONSTRAINT); - map.put("DEFAULT", Token.DEFAULT); - map.put("VIEW", Token.VIEW); - map.put("CREATE", Token.CREATE); - map.put("VALUES", Token.VALUES); - map.put("ALTER", Token.ALTER); - map.put("TABLE", Token.TABLE); - map.put("DROP", Token.DROP); - map.put("SET", Token.SET); - map.put("INTO", Token.INTO); - map.put("UPDATE", Token.UPDATE); - map.put("NULL", Token.NULL); - map.put("IS", Token.IS); - map.put("NOT", Token.NOT); - map.put("SELECT", Token.SELECT); - map.put("INSERT", Token.INSERT); - map.put("FROM", Token.FROM); - map.put("WHERE", Token.WHERE); - map.put("AND", Token.AND); - map.put("OR", Token.OR); - map.put("XOR", Token.XOR); - map.put("DISTINCT", Token.DISTINCT); - map.put("UNIQUE", Token.UNIQUE); - map.put("ALL", Token.ALL); - map.put("UNION", Token.UNION); - map.put("INTERSECT", Token.INTERSECT); - map.put("MINUS", Token.MINUS); - map.put("INNER", Token.INNER); - map.put("LEFT", Token.LEFT); - map.put("RIGHT", Token.RIGHT); - map.put("FULL", Token.FULL); - map.put("ON", Token.ON); - map.put("OUTER", Token.OUTER); - map.put("JOIN", Token.JOIN); - map.put("NEW", Token.NEW); - map.put("CASE", Token.CASE); - map.put("WHEN", Token.WHEN); - map.put("END", Token.END); - map.put("WHEN", Token.WHEN); - map.put("ELSE", Token.ELSE); - map.put("EXISTS", Token.EXISTS); - map.put("CAST", Token.CAST); - map.put("IN", Token.IN); - map.put("ASC", Token.ASC); - map.put("DESC", Token.DESC); - map.put("LIKE", Token.LIKE); - map.put("ESCAPE", Token.ESCAPE); - map.put("BETWEEN", Token.BETWEEN); - map.put("INTERVAL", Token.INTERVAL); - map.put("LOCK", Token.LOCK); - map.put("SOME", Token.SOME); - map.put("ANY", Token.ANY); - map.put("TRUNCATE", Token.TRUNCATE); - map.put("IF", Token.IF); - - map.put("TRUE", Token.TRUE); - map.put("FALSE", Token.FALSE); - map.put("LIMIT", Token.LIMIT); - map.put("KILL", Token.KILL); - map.put("IDENTIFIED", Token.IDENTIFIED); + + map.putAll(Keywords.DEFAULT_KEYWORDS.getKeywords()); + map.put("DUAL", Token.DUAL); + map.put("FALSE", Token.FALSE); + map.put("IDENTIFIED", Token.IDENTIFIED); + map.put("IF", Token.IF); + map.put("KILL", Token.KILL); + map.put("LIMIT", Token.LIMIT); + map.put("TRUE", Token.TRUE); + DEFAULT_MYSQL_KEYWORDS = new Keywords(map); } 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 3a5f223045..dbaf6592ec 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 @@ -28,6 +28,7 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; @@ -274,6 +275,10 @@ public class MySqlStatementParser extends SQLStatementParser { stmt.setHints(hints); return stmt; } + + if (lexer.token() == Token.DATABASE) { + return parseCreateDatabase(); + } if (lexer.token() == Token.UNIQUE || lexer.token() == Token.INDEX || identifierEquals("FULLTEXT") || identifierEquals("SPATIAL")) { @@ -2277,4 +2282,21 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } + + public SQLStatement parseCreateDatabase() { + if (lexer.token() == Token.CREATE) { + lexer.nextToken(); + } + + accept(Token.DATABASE); + + SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(); + stmt.setName(this.exprParser.name()); + + if (lexer.token() == Token.DEFAULT) { + lexer.nextToken(); + } + + return stmt; + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java index 916235722f..6c9fff7ea2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Keywords.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Keywords.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.parser; import java.util.HashMap; import java.util.Map; +import java.util.Set; /** * @author wenshao @@ -29,78 +30,92 @@ public class Keywords { static { Map map = new HashMap(); - map.put("EXISTS", Token.EXISTS); - map.put("THEN", Token.THEN); - map.put("AS", Token.AS); - map.put("GROUP", Token.GROUP); - map.put("BY", Token.BY); - map.put("HAVING", Token.HAVING); - map.put("DELETE", Token.DELETE); - map.put("ORDER", Token.ORDER); - map.put("INDEX", Token.INDEX); - map.put("FOR", Token.FOR); - map.put("SCHEMA", Token.SCHEMA); - map.put("FOREIGN", Token.FOREIGN); - map.put("REFERENCES", Token.REFERENCES); - map.put("CHECK", Token.CHECK); - map.put("PRIMARY", Token.PRIMARY); - map.put("KEY", Token.KEY); - map.put("CONSTRAINT", Token.CONSTRAINT); - map.put("DEFAULT", Token.DEFAULT); - map.put("VIEW", Token.VIEW); - map.put("CREATE", Token.CREATE); - map.put("VALUES", Token.VALUES); - map.put("ALTER", Token.ALTER); - map.put("TABLE", Token.TABLE); - map.put("DROP", Token.DROP); - map.put("SET", Token.SET); - map.put("INTO", Token.INTO); - map.put("UPDATE", Token.UPDATE); - map.put("NULL", Token.NULL); - map.put("IS", Token.IS); - map.put("NOT", Token.NOT); - map.put("SELECT", Token.SELECT); - map.put("INSERT", Token.INSERT); - map.put("FROM", Token.FROM); - map.put("WHERE", Token.WHERE); - map.put("AND", Token.AND); - map.put("OR", Token.OR); - map.put("XOR", Token.XOR); - map.put("DISTINCT", Token.DISTINCT); - map.put("UNIQUE", Token.UNIQUE); + map.put("ALL", Token.ALL); - map.put("UNION", Token.UNION); - map.put("INTERSECT", Token.INTERSECT); - map.put("MINUS", Token.MINUS); - map.put("INNER", Token.INNER); - map.put("LEFT", Token.LEFT); - map.put("RIGHT", Token.RIGHT); - map.put("FULL", Token.FULL); - map.put("ON", Token.ON); - map.put("OUTER", Token.OUTER); - map.put("JOIN", Token.JOIN); - map.put("NEW", Token.NEW); - map.put("CASE", Token.CASE); - map.put("WHEN", Token.WHEN); - map.put("END", Token.END); - map.put("WHEN", Token.WHEN); - map.put("ELSE", Token.ELSE); - map.put("EXISTS", Token.EXISTS); - map.put("CAST", Token.CAST); - map.put("IN", Token.IN); - map.put("ASC", Token.ASC); - map.put("DESC", Token.DESC); - map.put("LIKE", Token.LIKE); - map.put("ESCAPE", Token.ESCAPE); - map.put("BETWEEN", Token.BETWEEN); - map.put("INTERVAL", Token.INTERVAL); - map.put("LOCK", Token.LOCK); - map.put("SOME", Token.SOME); + map.put("ALTER", Token.ALTER); + map.put("AND", Token.AND); map.put("ANY", Token.ANY); + map.put("AS", Token.AS); + + map.put("ASC", Token.ASC); + map.put("BETWEEN", Token.BETWEEN); + map.put("BY", Token.BY); + map.put("CASE", Token.CASE); + map.put("CAST", Token.CAST); + + map.put("CHECK", Token.CHECK); + map.put("CONSTRAINT", Token.CONSTRAINT); + map.put("CREATE", Token.CREATE); + map.put("DATABASE", Token.DATABASE); map.put("DEFAULT", Token.DEFAULT); + + map.put("DELETE", Token.DELETE); + map.put("DESC", Token.DESC); + map.put("DISTINCT", Token.DISTINCT); + map.put("DROP", Token.DROP); + map.put("ELSE", Token.ELSE); + + map.put("END", Token.END); + map.put("ESCAPE", Token.ESCAPE); + map.put("EXISTS", Token.EXISTS); + map.put("FOR", Token.FOR); + map.put("FOREIGN", Token.FOREIGN); + + map.put("FROM", Token.FROM); + map.put("FULL", Token.FULL); + map.put("GROUP", Token.GROUP); + map.put("HAVING", Token.HAVING); + map.put("IN", Token.IN); + + map.put("INDEX", Token.INDEX); + map.put("INNER", Token.INNER); + map.put("INSERT", Token.INSERT); + map.put("INTERSECT", Token.INTERSECT); + map.put("INTERVAL", Token.INTERVAL); + + map.put("INTO", Token.INTO); + map.put("IS", Token.IS); + map.put("JOIN", Token.JOIN); + map.put("KEY", Token.KEY); + map.put("LEFT", Token.LEFT); + + map.put("LIKE", Token.LIKE); + map.put("LOCK", Token.LOCK); + map.put("MINUS", Token.MINUS); + map.put("NEW", Token.NEW); + map.put("NOT", Token.NOT); + + map.put("NULL", Token.NULL); + map.put("ON", Token.ON); + map.put("OR", Token.OR); + map.put("ORDER", Token.ORDER); + map.put("OUTER", Token.OUTER); + + map.put("PRIMARY", Token.PRIMARY); + map.put("REFERENCES", Token.REFERENCES); + map.put("RIGHT", Token.RIGHT); + map.put("SCHEMA", Token.SCHEMA); + map.put("SELECT", Token.SELECT); + + map.put("SET", Token.SET); + map.put("SOME", Token.SOME); + map.put("TABLE", Token.TABLE); + map.put("THEN", Token.THEN); + map.put("TRUNCATE", Token.TRUNCATE); + + map.put("UNION", Token.UNION); + map.put("UNIQUE", Token.UNIQUE); + map.put("UPDATE", Token.UPDATE); + map.put("VALUES", Token.VALUES); + map.put("VIEW", Token.VIEW); + + map.put("WHEN", Token.WHEN); + map.put("WHERE", Token.WHERE); + map.put("XOR", Token.XOR); + DEFAULT_KEYWORDS = new Keywords(map); } - + public boolean containsValue(Token token) { return this.keywords.containsValue(token); } @@ -114,4 +129,8 @@ public class Keywords { return keywords.get(key); } + public Map getKeywords() { + return keywords; + } + } 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 d215bbf3a3..68b0431ebd 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; @@ -478,10 +479,24 @@ public class SQLStatementParser extends SQLParser { // lexer.reset(mark_bp, mark_ch, Token.CREATE); throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (token == Token.DATABASE) { + return parseCreateDatabase(); } throw new ParserException("TODO " + lexer.token()); } + + public SQLStatement parseCreateDatabase() { + if (lexer.token() == Token.CREATE) { + lexer.nextToken(); + } + + accept(Token.DATABASE); + + SQLCreateDatabaseStatement stmt = new SQLCreateDatabaseStatement(); + stmt.setName(this.exprParser.name()); + return stmt; + } public SQLStatement parseCreateProcedure() { throw new ParserException("TODO " + lexer.token()); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 1569f27b38..72ba03b817 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -69,6 +69,7 @@ public enum Token { CAST("CAST"), COLUMN("COLUMN"), USE("USE"), + DATABASE("DATABASE"), AND("AND"), OR("OR"), 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 596d72b8ac..7686462365 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -74,6 +74,7 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement; @@ -1116,4 +1117,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print("*/"); return false; } + + @Override + public boolean visit(SQLCreateDatabaseStatement x) { + print("CREATE DATABASE "); + x.getName().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 e5dfec2937..94b6e6cec4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -58,6 +58,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; @@ -367,12 +368,16 @@ public interface SQLASTVisitor { boolean visit(SQLRollbackStatement x); void endVisit(SQLRollbackStatement x); - + boolean visit(SQLReleaseSavePointStatement x); - + void endVisit(SQLReleaseSavePointStatement x); - + void endVisit(SQLCommentHint x); - + boolean visit(SQLCommentHint x); + + void endVisit(SQLCreateDatabaseStatement x); + + boolean visit(SQLCreateDatabaseStatement 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 e20060cc09..d55bd44709 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -58,6 +58,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; @@ -671,4 +672,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLCommentHint x) { } + + @Override + public void endVisit(SQLCreateDatabaseStatement x) { + + } + + @Override + public boolean visit(SQLCreateDatabaseStatement x) { + return true; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/CreateDatabaseTest.java b/src/test/java/com/alibaba/druid/bvt/sql/CreateDatabaseTest.java new file mode 100644 index 0000000000..5752ca63d9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/CreateDatabaseTest.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.bvt.sql; + +import java.util.List; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.util.JdbcUtils; + + +public class CreateDatabaseTest extends TestCase { + public void test_0 () throws Exception { + String sql = "CREATE DATABASE mydb"; + List stmtList = SQLUtils.toStatementList(sql, null); + SQLStatement stmt = stmtList.get(0); + + Assert.assertEquals("CREATE DATABASE mydb", SQLUtils.toSQLString(stmt, null)); + } + + public void test_mysql () throws Exception { + String sql = "CREATE DATABASE mydb"; + List stmtList = SQLUtils.toStatementList(sql, JdbcUtils.MYSQL); + SQLStatement stmt = stmtList.get(0); + + Assert.assertEquals("CREATE DATABASE mydb", SQLUtils.toSQLString(stmt, JdbcUtils.MYSQL)); + } +} diff --git a/src/test/java/com/alibaba/druid/sql/KeywordsMySqlTest.java b/src/test/java/com/alibaba/druid/sql/KeywordsMySqlTest.java new file mode 100644 index 0000000000..8af77f082e --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/KeywordsMySqlTest.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.parser.Keywords; + +public class KeywordsMySqlTest extends TestCase { + + public void test_sort() throws Exception { + List list = new ArrayList(Keywords.DEFAULT_KEYWORDS.getKeywords().keySet()); + + Collections.sort(list); + + for (int i = 0; i < list.size(); ++i) { + if (i % 5 == 0) { + System.out.println(); + } + String item = list.get(i); + System.out.println("map.put(\"" + item + "\", Token." + item + ");"); + // map.put("AS", Token.AS); + } + } +} diff --git a/src/test/java/com/alibaba/druid/sql/KeywordsTest.java b/src/test/java/com/alibaba/druid/sql/KeywordsTest.java new file mode 100644 index 0000000000..e1ccada64e --- /dev/null +++ b/src/test/java/com/alibaba/druid/sql/KeywordsTest.java @@ -0,0 +1,31 @@ +package com.alibaba.druid.sql; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlLexer; +import com.alibaba.druid.sql.parser.Keywords; + +public class KeywordsTest extends TestCase { + + public void test_sort() throws Exception { + List list = new ArrayList(MySqlLexer.DEFAULT_MYSQL_KEYWORDS.getKeywords().keySet()); + + Collections.sort(list); + + int i = 0; + for (String item : list) { + if (Keywords.DEFAULT_KEYWORDS.getKeywords().containsKey(item)) { + continue; + } + if (i % 5 == 0) { + System.out.println(); + } + System.out.println("map.put(\"" + item + "\", Token." + item + ");"); + ++i; + } + } +}