From ec0f96efdce931d2c81fb4db7cc240f7cfbd772f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Fri, 18 May 2012 10:56:47 +0800 Subject: [PATCH] refactor --- .../OracleHint.java => ast/SQLCommentHint.java} | 10 ++++------ .../statement/MySqlCreateTableStatement.java | 17 +++++++++++++++++ .../mysql/parser/MySqlCreateTableParser.java | 2 +- .../dialect/mysql/parser/MySqlExprParser.java | 10 ---------- .../mysql/parser/MySqlStatementParser.java | 8 +++++++- .../oracle/ast/stmt/OracleSelectQueryBlock.java | 6 +++--- .../oracle/visitor/OracleASTVisitor.java | 1 - .../oracle/visitor/OracleOutputVisitor.java | 4 ++-- .../alibaba/druid/sql/parser/SQLExprParser.java | 16 ++++++++++++---- .../druid/sql/visitor/SQLASTOutputVisitor.java | 4 ++-- .../druid/sql/visitor/SQLASTVisitor.java | 6 +++--- .../druid/sql/visitor/SQLASTVisitorAdapter.java | 6 +++--- 12 files changed, 54 insertions(+), 36 deletions(-) rename src/main/java/com/alibaba/druid/sql/{dialect/oracle/ast/OracleHint.java => ast/SQLCommentHint.java} (76%) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleHint.java b/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java similarity index 76% rename from src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleHint.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java index 442b8864e4..473ecdeac7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleHint.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java @@ -13,23 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.oracle.ast; +package com.alibaba.druid.sql.ast; -import com.alibaba.druid.sql.ast.SQLHint; -import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class OracleHint extends SQLObjectImpl implements SQLHint { +public class SQLCommentHint extends SQLObjectImpl implements SQLHint { private static final long serialVersionUID = 1L; private String text; - public OracleHint(){ + public SQLCommentHint(){ } - public OracleHint(String text){ + public SQLCommentHint(String text){ this.text = text; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index fba504ae44..b8ab93d3c2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -15,9 +15,12 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLPartitioningClause; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; @@ -37,6 +40,20 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement { } + private List hints = new ArrayList(); + + public List getHints() { + return hints; + } + + public void setHints(List hints) { + this.hints = hints; + } + + public void setTableOptions(Map tableOptions) { + this.tableOptions = tableOptions; + } + public SQLPartitioningClause getPartitioning() { return partitioning; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 6b7b970a43..4772c9f797 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -46,7 +46,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { return parseCrateTable(true); } - public SQLCreateTableStatement parseCrateTable(boolean acceptCreate) throws ParserException { + public MySqlCreateTableStatement parseCrateTable(boolean acceptCreate) throws ParserException { if (acceptCreate) { accept(Token.CREATE); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 1f170f2684..5b883c9b54 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -15,10 +15,7 @@ */ package com.alibaba.druid.sql.dialect.mysql.parser; -import java.util.List; - import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; @@ -43,7 +40,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinition; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -611,10 +607,4 @@ public class MySqlExprParser extends SQLExprParser { return null; } - public void parseHints(List hints) { - if (lexer.token() == Token.HINT) { - hints.add(new OracleHint(lexer.stringVal())); - lexer.nextToken(); - } - } } 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 68b1970be8..ef61a4258d 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 @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.mysql.parser; import java.util.List; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; @@ -48,6 +49,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatemen 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.MySqlCreateIndexStatement; +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.MySqlDescribeStatement; @@ -265,9 +267,13 @@ public class MySqlStatementParser extends SQLStatementParser { public SQLStatement parseCreate() throws ParserException { accept(Token.CREATE); + List hints = this.exprParser.parseHints(); + if (lexer.token() == Token.TABLE || identifierEquals("TEMPORARY")) { MySqlCreateTableParser parser = new MySqlCreateTableParser(lexer); - return parser.parseCrateTable(false); + MySqlCreateTableStatement stmt = parser.parseCrateTable(false); + stmt.setHints(hints); + return stmt; } if (lexer.token() == Token.UNIQUE || lexer.token() == Token.INDEX || identifierEquals("FULLTEXT") diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index 3c24b2e9b6..8641801335 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -18,7 +18,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLHint; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; @@ -30,7 +30,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { private static final long serialVersionUID = 1L; - private final List hints = new ArrayList(1); + private final List hints = new ArrayList(1); private OracleSelectHierachicalQueryClause hierachicalQueryClause; private ModelClause modelClause; @@ -55,7 +55,7 @@ public class OracleSelectQueryBlock extends SQLSelectQueryBlock { this.hierachicalQueryClause = hierachicalQueryClause; } - public List getHints() { + public List getHints() { return this.hints; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index 0b4b9cbc86..b0b6f519a3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index b3f57149d8..0391cded3e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; import java.util.List; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLHint; @@ -38,7 +39,6 @@ import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; @@ -907,7 +907,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public void endVisit(OracleHint x) { + public void endVisit(SQLCommentHint x) { } 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 6c1605953f..201be488f0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -16,13 +16,14 @@ package com.alibaba.druid.sql.parser; import java.math.BigInteger; +import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; @@ -63,7 +64,6 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; public class SQLExprParser extends SQLParser { @@ -1199,9 +1199,17 @@ public class SQLExprParser extends SQLParser { return item; } - public void parseHints(List hints) { + public List parseHints() { + List hints = new ArrayList(); + parseHints(hints); + return hints; + } + + + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void parseHints(List hints) { if (lexer.token() == Token.HINT) { - hints.add(new OracleHint(lexer.stringVal())); + hints.add(new SQLCommentHint(lexer.stringVal())); lexer.nextToken(); } } 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 56d0078022..62eff614b3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.visitor; import java.io.IOException; import java.util.List; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; @@ -90,7 +91,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { @@ -1091,7 +1091,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { return false; } - public boolean visit(OracleHint x) { + public boolean visit(SQLCommentHint x) { print(x.getText()); 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 211a656be5..e5dfec2937 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.visitor; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; @@ -84,7 +85,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; public interface SQLASTVisitor { @@ -372,7 +372,7 @@ public interface SQLASTVisitor { void endVisit(SQLReleaseSavePointStatement x); - void endVisit(OracleHint x); + void endVisit(SQLCommentHint x); - boolean visit(OracleHint x); + boolean visit(SQLCommentHint 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 2525d8832c..e20060cc09 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.visitor; +import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; @@ -85,7 +86,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.statement.SQLUseStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; public class SQLASTVisitorAdapter implements SQLASTVisitor { @@ -663,12 +663,12 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { } @Override - public boolean visit(OracleHint x) { + public boolean visit(SQLCommentHint x) { return true; } @Override - public void endVisit(OracleHint x) { + public void endVisit(SQLCommentHint x) { } }