From 09be39c32638e7aefeba30402c1881c074c5faa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sun, 18 Mar 2012 01:46:15 +0800 Subject: [PATCH] sql server parser --- .../sqlserver/ast/SQLServerStatement.java | 7 +++++ .../sqlserver/ast/SQLServerUseStatement.java | 27 +++++++++++++++++++ .../sqlserver/parser/SQLServerLexer.java | 1 + .../visitor/SQLServerASTVisitor.java | 5 ++++ .../visitor/SQLServerASTVisitorAdapter.java | 11 ++++++++ .../visitor/SQLServerOutputVisitor.java | 13 +++++++++ .../visitor/SQLServerSchemaStatVisitor.java | 11 ++++++++ .../druid/sql/parser/SQLStatementParser.java | 10 +++++++ .../com/alibaba/druid/sql/parser/Token.java | 1 + .../sql/sqlserver/SQLServerSelectTest.java | 26 ++++++++++++++++++ 10 files changed, 112 insertions(+) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerStatement.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerUseStatement.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerStatement.java new file mode 100644 index 0000000000..41b66d4496 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerStatement.java @@ -0,0 +1,7 @@ +package com.alibaba.druid.sql.dialect.sqlserver.ast; + +import com.alibaba.druid.sql.ast.SQLStatement; + +public interface SQLServerStatement extends SQLStatement { + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerUseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerUseStatement.java new file mode 100644 index 0000000000..c1a5d60692 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerUseStatement.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql.dialect.sqlserver.ast; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; + +public class SQLServerUseStatement extends SQLServerObjectImpl implements SQLServerStatement { + + private static final long serialVersionUID = 1L; + private SQLName database; + + public SQLName getDatabase() { + return database; + } + + public void setDatabase(SQLName database) { + this.database = database; + } + + @Override + public void accept0(SQLServerASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, database); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java index db9824da82..b7cf9167e6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerLexer.java @@ -86,6 +86,7 @@ public class SQLServerLexer extends Lexer { map.put("WITH", Token.WITH); map.put("CURSOR", Token.CURSOR); map.put("TOP", Token.TOP); + map.put("USE", Token.USE); DEFAULT_SQL_SERVER_KEYWORDS = new Keywords(map); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java index 30133fe68c..73c86dd34e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java @@ -1,6 +1,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerUseStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -13,4 +14,8 @@ public interface SQLServerASTVisitor extends SQLASTVisitor { boolean visit(Top x); void endVisit(Top x); + + boolean visit(SQLServerUseStatement x); + + void endVisit(SQLServerUseStatement x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java index 9eff67f70d..34a8407010 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -1,6 +1,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerUseStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; @@ -26,4 +27,14 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements } + @Override + public boolean visit(SQLServerUseStatement x) { + return true; + } + + @Override + public void endVisit(SQLServerUseStatement x) { + + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index 5d38004f23..34dc5fa18a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerUseStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; @@ -67,4 +68,16 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe } + @Override + public boolean visit(SQLServerUseStatement x) { + print("USE "); + x.getDatabase().accept(this); + return false; + } + + @Override + public void endVisit(SQLServerUseStatement x) { + + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index 27a9f0d011..9ec19d6507 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -2,6 +2,7 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerUseStatement; import com.alibaba.druid.sql.dialect.sqlserver.ast.Top; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; @@ -28,4 +29,14 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL } + @Override + public boolean visit(SQLServerUseStatement x) { + return false; + } + + @Override + public void endVisit(SQLServerUseStatement x) { + + } + } 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 52116a1226..fd8341cd69 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -134,6 +134,12 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } + + if (lexer.token() == Token.USE) { + SQLStatement stmt = parseUse(); + statementList.add(stmt); + continue; + } if (identifierEquals("CALL")) { SQLCallStatement stmt = parseCall(); @@ -148,6 +154,10 @@ public class SQLStatementParser extends SQLParser { throw new ParserException("TODO " + lexer.token()); } } + + public SQLStatement parseUse() { + throw new ParserException("TODO " + lexer.token()); + } protected SQLDropTableStatement parseDropTable(boolean acceptDrop) { if (acceptDrop) { 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 b893f250dd..a2fd78af7f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -70,6 +70,7 @@ public enum Token { CAST("CAST"), USER("USER"), COLUMN("COLUMN"), + USE("USE"), AND("AND"), OR("OR"), diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest.java new file mode 100644 index 0000000000..58397f5430 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.bvt.sql.sqlserver; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.test.TestUtils; + +public class SQLServerSelectTest extends TestCase { + + public void test_isEmpty() throws Exception { + String sql = "USE AdventureWorks2008R2;"; + + String expect = "USE AdventureWorks2008R2;"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLSelectStatement stmt = (SQLSelectStatement) parser.parseStatementList().get(0); + + String text = TestUtils.outputSqlServer(stmt); + + Assert.assertEquals(expect, text); + + System.out.println(text); + } +}