From 192f7322c4a057503d6db978280e8f6d4a4b9696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Sun, 18 Mar 2012 21:02:41 +0800 Subject: [PATCH] refactor --- .../mysql/parser/MySqlStatementParser.java | 37 ++++----- .../oracle/parser/OracleStatementParser.java | 26 +++--- .../oracle/parser/OracleUpdateParser.java | 10 +-- .../parser/PGSQLStatementParser.java | 8 +- .../sqlserver/ast/expr/SQLServerExpr.java | 8 ++ .../expr/SQLServerObjectReferenceExpr.java | 83 +++++++++++++++++++ .../sqlserver/parser/SQLServerExprParser.java | 18 ++++ .../parser/SQLServerStatementParser.java | 1 + .../druid/sql/parser/SQLStatementParser.java | 10 +-- .../bvt/sql/mysql/MySqlDescribteTest.java | 1 - 10 files changed, 154 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerExpr.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java 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 7d6fc7b9e6..904de5f75e 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 @@ -57,7 +57,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLSelectParser; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.parser.Token; @@ -67,16 +66,12 @@ public class MySqlStatementParser extends SQLStatementParser { public MySqlStatementParser(String sql) throws ParserException{ this(new MySqlLexer(sql)); this.lexer.nextToken(); - this.exprParser = this.createExprParser(); + this.exprParser = new MySqlExprParser(lexer); } public MySqlStatementParser(Lexer lexer){ super(lexer); - this.exprParser = this.createExprParser(); - } - - protected SQLExprParser createExprParser() { - return new MySqlExprParser(lexer); + this.exprParser = new MySqlExprParser(lexer); } public SQLCreateTableStatement parseCreateTable() throws ParserException { @@ -179,11 +174,11 @@ public class MySqlStatementParser extends SQLStatementParser { for (;;) { MySqlCreateUserStatement.UserSpecification userSpec = new MySqlCreateUserStatement.UserSpecification(); - SQLCharExpr expr = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr expr = (SQLCharExpr) exprParser.expr(); String user = expr.toString(); if (lexer.token() == Token.VARIANT) { lexer.nextToken(); - SQLCharExpr expr2 = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr expr2 = (SQLCharExpr) exprParser.expr(); user += '@'; user += expr2.toString(); } @@ -198,12 +193,12 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); } - SQLCharExpr password = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr password = (SQLCharExpr) this.exprParser.expr(); userSpec.setPassword(password); } else if (lexer.token() == Token.WITH) { lexer.nextToken(); - SQLCharExpr text = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr text = (SQLCharExpr) this.exprParser.expr(); userSpec.setAuthPlugin(text); } } @@ -346,7 +341,7 @@ public class MySqlStatementParser extends SQLStatementParser { statementList.add(stmt); return true; } - + if (identifierEquals("DESCRIBE")) { SQLStatement stmt = parseDescribe(); statementList.add(stmt); @@ -355,13 +350,13 @@ public class MySqlStatementParser extends SQLStatementParser { return false; } - + public SQLStatement parseDescribe() throws ParserException { acceptIdentifier("DESCRIBE"); - + MySqlDescribeStatement stmt = new MySqlDescribeStatement(); stmt.setObject(this.exprParser.name()); - + return stmt; } @@ -487,15 +482,15 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlSelectQueryBlock.Limit limit = new MySqlSelectQueryBlock.Limit(); - SQLExpr temp = this.createExprParser().expr(); + SQLExpr temp = this.exprParser.expr(); if (lexer.token() == (Token.COMMA)) { limit.setOffset(temp); lexer.nextToken(); - limit.setRowCount(createExprParser().expr()); + limit.setRowCount(exprParser.expr()); } else if (identifierEquals("OFFSET")) { limit.setRowCount(temp); lexer.nextToken(); - limit.setOffset(createExprParser().expr()); + limit.setOffset(exprParser.expr()); } else { limit.setRowCount(temp); } @@ -991,11 +986,11 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlDropUser stmt = new MySqlDropUser(); for (;;) { - SQLCharExpr expr = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr expr = (SQLCharExpr) this.exprParser.expr(); String user = expr.toString(); if (lexer.token() == Token.VARIANT) { lexer.nextToken(); - SQLCharExpr expr2 = (SQLCharExpr) this.createExprParser().expr(); + SQLCharExpr expr2 = (SQLCharExpr) this.exprParser.expr(); user += '@'; user += expr2.toString(); } @@ -1035,7 +1030,7 @@ public class MySqlStatementParser extends SQLStatementParser { } return stmt; } - + public SQLSelectParser createSQLSelectParser() { return new MySqlSelectParser(this.lexer); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 57dbe2e6b0..38effee89c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -102,16 +102,21 @@ public class OracleStatementParser extends SQLStatementParser { public OracleStatementParser(String sql){ super(new OracleLexer(sql)); this.lexer.nextToken(); - this.exprParser = createExprParser(); + this.exprParser = new OracleExprParser(lexer); } public OracleStatementParser(Lexer lexer){ super(lexer); - this.exprParser = createExprParser(); + this.exprParser = new OracleExprParser(lexer); } - protected OracleExprParser createExprParser() { - return new OracleExprParser(lexer); + @Override + public OracleExprParser getExprParser() { + return (OracleExprParser) exprParser; + } + + public void parseHints(List hints) { + this.getExprParser().parseHints(hints); } public OracleCreateTableParser getSQLCreateTableParser() { @@ -121,10 +126,10 @@ public class OracleStatementParser extends SQLStatementParser { protected void parseInsert0_hinits(SQLInsertInto insertStatement) { if (insertStatement instanceof OracleInsertStatement) { OracleInsertStatement stmt = (OracleInsertStatement) insertStatement; - this.createExprParser().parseHints(stmt.getHints()); + this.getExprParser().parseHints(stmt.getHints()); } else { List hints = new ArrayList(); - this.createExprParser().parseHints(hints); + this.getExprParser().parseHints(hints); } } @@ -1124,8 +1129,7 @@ public class OracleStatementParser extends SQLStatementParser { OracleMergeStatement stmt = new OracleMergeStatement(); - OracleExprParser exprParser = this.createExprParser(); - exprParser.parseHints(stmt.getHints()); + parseHints(stmt.getHints()); accept(Token.INTO); stmt.setInto(exprParser.name()); @@ -1241,7 +1245,7 @@ public class OracleStatementParser extends SQLStatementParser { List hints = new ArrayList(); - this.createExprParser().parseHints(hints); + parseHints(hints); if (lexer.token() == Token.INTO) { OracleInsertStatement stmt = new OracleInsertStatement(); @@ -1290,7 +1294,7 @@ public class OracleStatementParser extends SQLStatementParser { OracleMultiInsertStatement.ConditionalInsertClauseItem item = new OracleMultiInsertStatement.ConditionalInsertClauseItem(); - item.setWhen(this.createExprParser().expr()); + item.setWhen(this.exprParser.expr()); accept(Token.THEN); OracleMultiInsertStatement.InsertIntoClause insertInto = new OracleMultiInsertStatement.InsertIntoClause(); parseInsert0(insertInto); @@ -1430,7 +1434,7 @@ public class OracleStatementParser extends SQLStatementParser { if (lexer.token() == Token.DELETE) { lexer.nextToken(); - this.createExprParser().parseHints(deleteStatement.getHints()); + parseHints(deleteStatement.getHints()); if (lexer.token() == (Token.FROM)) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java index 9c7d998ab9..3710accd1f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java @@ -22,18 +22,20 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLExprParser; import com.alibaba.druid.sql.parser.SQLStatementParser; import com.alibaba.druid.sql.parser.Token; public class OracleUpdateParser extends SQLStatementParser { public OracleUpdateParser(String sql) throws ParserException{ - super(sql); + super(new OracleLexer(sql)); + this.lexer.nextToken(); + this.exprParser = new OracleExprParser(lexer); } public OracleUpdateParser(Lexer lexer){ super(lexer); + this.exprParser = new OracleExprParser(lexer); } public OracleUpdateStatement parseUpdateStatement() throws ParserException { @@ -142,8 +144,4 @@ public class OracleUpdateParser extends SQLStatementParser { lexer.nextToken(); } } - - protected SQLExprParser createExprParser() { - return new OracleExprParser(lexer); - } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index df650ddb94..9c058446cb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -124,7 +124,7 @@ public class PGSQLStatementParser extends SQLStatementParser { break; } } else if (lexer.token() == (Token.SELECT)) { - SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr(); + SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); stmt.setQuery(queryExpr.getSubQuery()); } @@ -155,7 +155,7 @@ public class PGSQLStatementParser extends SQLStatementParser { if (lexer.token() == Token.USING) { lexer.nextToken(); for (;;) { - SQLName name = this.createExprParser().name(); + SQLName name = this.exprParser.name(); deleteStatement.getUsing().add(name); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -271,13 +271,13 @@ public class PGSQLStatementParser extends SQLStatementParser { private PGWithQuery withQuery() { PGWithQuery withQuery = new PGWithQuery(); - withQuery.setName(this.createExprParser().expr()); + withQuery.setName(this.exprParser.expr()); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); for (;;) { - SQLExpr expr = this.createExprParser().expr(); + SQLExpr expr = this.exprParser.expr(); withQuery.getColumns().add(expr); if (lexer.token() == Token.COMMA) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerExpr.java new file mode 100644 index 0000000000..9811450707 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerExpr.java @@ -0,0 +1,8 @@ +package com.alibaba.druid.sql.dialect.sqlserver.ast.expr; + +import com.alibaba.druid.sql.ast.SQLExpr; + + +public interface SQLServerExpr extends SQLExpr { + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java new file mode 100644 index 0000000000..c2d6de348b --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java @@ -0,0 +1,83 @@ +package com.alibaba.druid.sql.dialect.sqlserver.ast.expr; + +import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; + +public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements SQLServerExpr { + + private static final long serialVersionUID = 1L; + + private String server; + private String database; + private String schema; + private String object; + + @Override + public void accept0(SQLServerASTVisitor visitor) { + + } + + public void output(StringBuffer buf) { + boolean flag = false; + if (server != null) { + buf.append(server); + buf.append('.'); + flag = true; + } + + if (database != null) { + buf.append(database); + buf.append('.'); + flag = true; + } else { + if (flag) { + buf.append('.'); + } + } + + if (schema != null) { + buf.append(schema); + buf.append('.'); + flag = true; + } else { + if (flag) { + buf.append('.'); + } + } + + buf.append(object); + } + + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } + + public String getDatabase() { + return database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getSchema() { + return schema; + } + + public void setSchema(String schema) { + this.schema = schema; + } + + public String getObject() { + return object; + } + + public void setObject(String object) { + this.object = object; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java new file mode 100644 index 0000000000..cc955706f2 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -0,0 +1,18 @@ +package com.alibaba.druid.sql.dialect.sqlserver.parser; + +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.ParserException; +import com.alibaba.druid.sql.parser.SQLExprParser; + +public class SQLServerExprParser extends SQLExprParser { + + public SQLServerExprParser(Lexer lexer){ + super(lexer); + } + + public SQLServerExprParser(String sql) throws ParserException{ + super(new SQLServerLexer(sql)); + this.lexer.nextToken(); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index a3b5689092..d71b78dfc0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -24,6 +24,7 @@ public class SQLServerStatementParser extends SQLStatementParser { public SQLServerStatementParser(String sql){ super(new SQLServerLexer(sql)); this.lexer.nextToken(); + this.exprParser = new SQLServerExprParser(lexer); } public SQLSelectParser createSQLSelectParser() { 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 ce9f5e210c..4cf7f019f2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -47,16 +47,16 @@ public class SQLStatementParser extends SQLParser { public SQLStatementParser(String sql){ super(sql); - this.exprParser = createExprParser(); + this.exprParser = new SQLExprParser(lexer); } public SQLStatementParser(Lexer lexer){ super(lexer); - this.exprParser = createExprParser(); + this.exprParser = new SQLExprParser(lexer); } - protected SQLExprParser createExprParser() { - return new SQLExprParser(lexer); + public SQLExprParser getExprParser() { + return exprParser; } public List parseStatementList() throws ParserException { @@ -255,7 +255,7 @@ public class SQLStatementParser extends SQLParser { insertStatement.setValues(values); accept(Token.RPAREN); } else if (acceptSubQuery && (lexer.token() == Token.SELECT || lexer.token() == Token.LPAREN)) { - SQLQueryExpr queryExpr = (SQLQueryExpr) this.createExprParser().expr(); + SQLQueryExpr queryExpr = (SQLQueryExpr) this.exprParser.expr(); insertStatement.setQuery(queryExpr.getSubQuery()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java index 524168520b..d5f60ce338 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDescribteTest.java @@ -9,7 +9,6 @@ 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 MySqlDescribteTest extends MysqlTest {