From 17707f5440e692348a92dac09d663fa9cbeb82cd Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 4 Aug 2013 23:25:41 +0800 Subject: [PATCH] refactor sql parser --- .../ast/statement/SQLAlterTableAddIndex.java | 34 +++++-- .../statement/MySqlAlterTableAddIndex.java | 53 ----------- .../statement/MySqlAlterTableAddUnique.java | 53 ----------- .../MySqlAlterTableDiscardTablespace.java | 4 +- .../MySqlAlterTableImportTablespace.java | 4 +- .../mysql/parser/MySqlStatementParser.java | 70 +++------------ .../mysql/visitor/MySqlASTVisitor.java | 22 ++--- .../mysql/visitor/MySqlASTVisitorAdapter.java | 40 ++------- .../mysql/visitor/MySqlOutputVisitor.java | 88 +++---------------- .../mysql/visitor/MySqlSchemaStatVisitor.java | 36 ++------ .../druid/sql/parser/SQLStatementParser.java | 40 ++++++++- .../sql/visitor/SQLASTOutputVisitor.java | 30 +++++++ .../druid/sql/visitor/SQLASTVisitor.java | 5 ++ .../sql/visitor/SQLASTVisitorAdapter.java | 11 +++ .../druid/sql/visitor/SchemaStatVisitor.java | 9 ++ .../sql/mysql/MySqlASTVisitorAdapterTest.java | 4 - .../sql/mysql/MySqlAlterTableAddIndex_1.java | 2 +- .../bvt/sql/mysql/MySqlAlterTableTest1.java | 2 +- .../sql/mysql/MySqlAlterTableTest_addFk.java | 2 +- 19 files changed, 174 insertions(+), 335 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddIndex.java delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java index f3253d8a54..b14e64a473 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java @@ -24,25 +24,37 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTableItem { - private SQLName name; + private boolean unique; - private List items = new ArrayList(); + private SQLName name; - private String type; + private final List items = new ArrayList(); + + private String type; + + private String using; @Override protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, getName()); + acceptChild(visitor, getItems()); + } + visitor.endVisit(this); + } + public boolean isUnique() { + return unique; + } + + public void setUnique(boolean unique) { + this.unique = unique; } public List getItems() { return items; } - public void setItems(List items) { - this.items = items; - } - public SQLName getName() { return name; } @@ -59,4 +71,12 @@ public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTabl this.type = type; } + public String getUsing() { + return using; + } + + public void setUsing(String using) { + this.using = using; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddIndex.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddIndex.java deleted file mode 100644 index 4825a7c321..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddIndex.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class MySqlAlterTableAddIndex extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject { - - private String using; - - public String getUsing() { - return using; - } - - public void setUsing(String using) { - this.using = using; - } - - @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)) { - acceptChild(visitor, getName()); - acceptChild(visitor, getItems()); - } - visitor.endVisit(this); - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java deleted file mode 100644 index 7cfcf253a7..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class MySqlAlterTableAddUnique extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject { - - private String using; - - public String getUsing() { - return using; - } - - public void setUsing(String using) { - this.using = using; - } - - @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)) { - acceptChild(visitor, getName()); - acceptChild(visitor, getItems()); - } - visitor.endVisit(this); - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableDiscardTablespace.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableDiscardTablespace.java index 36e6e014ba..fc35ee7f29 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableDiscardTablespace.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableDiscardTablespace.java @@ -15,13 +15,13 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlAlterTableDiscardTablespace extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject { +public class MySqlAlterTableDiscardTablespace extends MySqlObjectImpl implements SQLAlterTableItem, MySqlObject { @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableImportTablespace.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableImportTablespace.java index f3e86fa764..e25de1cfa1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableImportTablespace.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableImportTablespace.java @@ -15,13 +15,13 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlAlterTableImportTablespace extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject { +public class MySqlAlterTableImportTablespace extends MySqlObjectImpl implements SQLAlterTableItem, MySqlObject { @Override protected void accept0(SQLASTVisitor visitor) { 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 87e7454c56..f3be7b3ed2 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 @@ -30,6 +30,7 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddForeignKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; @@ -59,8 +60,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -507,15 +506,15 @@ public class MySqlStatementParser extends SQLStatementParser { } return stmt; } - + public MySqlOptimizeStatement parseOptimize() { accept(Token.OPTIMIZE); accept(Token.TABLE); - + MySqlOptimizeStatement stmt = new MySqlOptimizeStatement(); List names = new ArrayList(); this.exprParser.names(names, stmt); - + for (SQLName name : names) { stmt.getTableSources().add(new SQLExprTableSource(name)); } @@ -609,7 +608,7 @@ public class MySqlStatementParser extends SQLStatementParser { statementList.add(stmt); return true; } - + if (lexer.token() == Token.OPTIMIZE) { SQLStatement stmt = parseOptimize(); statementList.add(stmt); @@ -2108,7 +2107,7 @@ public class MySqlStatementParser extends SQLStatementParser { public SQLStatement parseAlter() { accept(Token.ALTER); - + if (lexer.token() == Token.USER) { return parseAlterUser(); } @@ -2151,55 +2150,12 @@ public class MySqlStatementParser extends SQLStatementParser { } stmt.getItems().add(item); } else if (lexer.token() == Token.INDEX) { - lexer.nextToken(); - MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - } else { - item.setName(this.exprParser.name()); - accept(Token.LPAREN); - } - - for (;;) { - SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); - item.getItems().add(column); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.RPAREN); - + SQLAlterTableAddIndex item = parseAlterTableAddIndex(); + item.setParent(stmt); stmt.getItems().add(item); } else if (lexer.token() == Token.UNIQUE) { - lexer.nextToken(); - - if (lexer.token() == Token.INDEX) { - lexer.nextToken(); - } - - MySqlAlterTableAddUnique item = new MySqlAlterTableAddUnique(); - - if (lexer.token() == Token.LPAREN) { - lexer.nextToken(); - } else { - item.setName(this.exprParser.name()); - accept(Token.LPAREN); - } - - for (;;) { - SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); - item.getItems().add(column); - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - break; - } - accept(Token.RPAREN); - + SQLAlterTableAddIndex item = parseAlterTableAddIndex(); + item.setParent(stmt); stmt.getItems().add(item); } else if (lexer.token() == Token.PRIMARY) { SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); @@ -2563,19 +2519,19 @@ public class MySqlStatementParser extends SQLStatementParser { public MySqlAlterUserStatement parseAlterUser() { accept(Token.USER); - + MySqlAlterUserStatement stmt = new MySqlAlterUserStatement(); for (;;) { SQLExpr user = this.exprParser.expr(); acceptIdentifier("PASSWORD"); acceptIdentifier("EXPIRE"); stmt.getUsers().add(user); - + 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 86eb0f0622..d6e36b278b 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 @@ -31,8 +31,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -492,10 +490,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlAlterTableCharacter x); - boolean visit(MySqlAlterTableAddIndex x); - - void endVisit(MySqlAlterTableAddIndex x); - boolean visit(MySqlAlterTableOption x); void endVisit(MySqlAlterTableOption x); @@ -512,10 +506,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlCharExpr x); - boolean visit(MySqlAlterTableAddUnique x); - - void endVisit(MySqlAlterTableAddUnique x); - boolean visit(MySqlAlterTableModifyColumn x); void endVisit(MySqlAlterTableModifyColumn x); @@ -555,16 +545,16 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlPartitioningDef.InValues x); void endVisit(MySqlPartitioningDef.InValues x); - + boolean visit(MySqlAnalyzeStatement x); - + void endVisit(MySqlAnalyzeStatement x); - + boolean visit(MySqlAlterUserStatement x); - + void endVisit(MySqlAlterUserStatement x); - + boolean visit(MySqlOptimizeStatement x); - + void endVisit(MySqlOptimizeStatement 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 ea383b6be7..cd3d0de112 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 @@ -31,8 +31,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -1059,16 +1057,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } - @Override - public boolean visit(MySqlAlterTableAddIndex x) { - return true; - } - - @Override - public void endVisit(MySqlAlterTableAddIndex x) { - - } - @Override public boolean visit(MySqlAlterTableOption x) { return true; @@ -1109,16 +1097,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } - @Override - public boolean visit(MySqlAlterTableAddUnique x) { - return true; - } - - @Override - public void endVisit(MySqlAlterTableAddUnique x) { - - } - @Override public boolean visit(MySqlUnique x) { return true; @@ -1228,34 +1206,34 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq public void endVisit(MySqlPartitionByList x) { } - + @Override public boolean visit(MySqlAnalyzeStatement x) { return true; } - + @Override public void endVisit(MySqlAnalyzeStatement x) { - + } - + @Override public boolean visit(MySqlAlterUserStatement x) { return true; } - + @Override public void endVisit(MySqlAlterUserStatement x) { - + } - + @Override public boolean visit(MySqlOptimizeStatement x) { return true; } - + @Override public void endVisit(MySqlOptimizeStatement x) { - + } } // 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 c3b0649920..951581c69d 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 @@ -53,8 +53,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -2750,66 +2748,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } - @Override - public boolean visit(MySqlAlterTableAddIndex x) { - print("ADD "); - if (x.getType() != null) { - print(x.getType()); - print(" "); - } - - print("INDEX "); - - if (x.getName() != null) { - x.getName().accept(this); - print(' '); - } - print("("); - printAndAccept(x.getItems(), ", "); - print(")"); - - if (x.getUsing() != null) { - print(" USING "); - print(x.getUsing()); - } - return false; - } - - @Override - public void endVisit(MySqlAlterTableAddIndex x) { - - } - - @Override - public boolean visit(MySqlAlterTableAddUnique x) { - print("ADD "); - if (x.getType() != null) { - print(x.getType()); - print(" "); - } - - print("UNIQUE "); - - if (x.getName() != null) { - x.getName().accept(this); - print(' '); - } - print("("); - printAndAccept(x.getItems(), ", "); - print(")"); - - if (x.getUsing() != null) { - print(" USING "); - print(x.getUsing()); - } - return false; - } - - @Override - public void endVisit(MySqlAlterTableAddUnique x) { - - } - @Override public boolean visit(MySqlAlterTableOption x) { print(x.getName()); @@ -3007,44 +2945,44 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV if (x.isNoWriteToBinlog()) { print("NO_WRITE_TO_BINLOG "); } - + if (x.isLocal()) { print("LOCAL "); } - + print("TABLE "); - + printAndAccept(x.getTableSources(), ", "); return false; } @Override public void endVisit(MySqlAnalyzeStatement x) { - + } - + @Override public boolean visit(MySqlOptimizeStatement x) { print("OPTIMIZE "); if (x.isNoWriteToBinlog()) { print("NO_WRITE_TO_BINLOG "); } - + if (x.isLocal()) { print("LOCAL "); } - + print("TABLE "); - + printAndAccept(x.getTableSources(), ", "); return false; } - + @Override public void endVisit(MySqlOptimizeStatement x) { - + } - + @Override public boolean visit(MySqlAlterUserStatement x) { print("ALTER USER"); @@ -3055,10 +2993,10 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } return false; } - + @Override public void endVisit(MySqlAlterUserStatement x) { - + } } // 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 d075e1e2aa..585fb20bb7 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 @@ -44,8 +44,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -1152,16 +1150,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public boolean visit(MySqlAlterTableAddIndex x) { - return false; - } - - @Override - public void endVisit(MySqlAlterTableAddIndex x) { - - } - @Override public boolean visit(MySqlAlterTableOption x) { return false; @@ -1202,16 +1190,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public boolean visit(MySqlAlterTableAddUnique x) { - return false; - } - - @Override - public void endVisit(MySqlAlterTableAddUnique x) { - - } - @Override public boolean visit(MySqlUnique x) { return false; @@ -1319,27 +1297,27 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlAnalyzeStatement x) { - + } - + @Override public boolean visit(MySqlAlterUserStatement x) { return true; } - + @Override public void endVisit(MySqlAlterUserStatement x) { - + } - + @Override public boolean visit(MySqlOptimizeStatement x) { return true; } - + @Override public void endVisit(MySqlOptimizeStatement 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 bf3fdfd6d7..e2110ae262 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.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLListExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; @@ -1011,9 +1012,9 @@ public class SQLStatementParser extends SQLParser { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); return createTableParser.parseCrateTable(false); } else if (token == Token.INDEX // - || token == Token.UNIQUE // - || identifierEquals("NONCLUSTERED") // sql server - ) { + || token == Token.UNIQUE // + || identifierEquals("NONCLUSTERED") // sql server + ) { return parseCreateIndex(false); } else if (lexer.token() == Token.SEQUENCE) { return parseCreateSequence(false); @@ -1304,4 +1305,37 @@ public class SQLStatementParser extends SQLParser { return explain; } + + protected SQLAlterTableAddIndex parseAlterTableAddIndex() { + SQLAlterTableAddIndex item = new SQLAlterTableAddIndex(); + + if (lexer.token() == Token.UNIQUE) { + item.setUnique(true); + lexer.nextToken(); + if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + } + } else { + accept(Token.INDEX); + } + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + } else { + item.setName(this.exprParser.name()); + accept(Token.LPAREN); + } + + for (;;) { + SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); + item.getItems().add(column); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + return item; + } } 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 7794d8490f..32ea7c8320 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -66,6 +66,7 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddForeignKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; @@ -1798,4 +1799,33 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + + @Override + public boolean visit(SQLAlterTableAddIndex x) { + print("ADD "); + if (x.getType() != null) { + print(x.getType()); + print(" "); + } + + if (x.isUnique()) { + print("UNIQUE "); + } + + print("INDEX "); + + if (x.getName() != null) { + x.getName().accept(this); + print(' '); + } + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + + if (x.getUsing() != null) { + print(" USING "); + print(x.getUsing()); + } + 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 da5e139a27..0c5b26c07c 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -51,6 +51,7 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddForeignKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; @@ -514,4 +515,8 @@ public interface SQLASTVisitor { void endVisit(SQLDropDatabaseStatement x); boolean visit(SQLDropDatabaseStatement x); + + void endVisit(SQLAlterTableAddIndex x); + + boolean visit(SQLAlterTableAddIndex 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 1ce9ec8336..9deee49ca6 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -52,6 +52,7 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddForeignKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; @@ -997,4 +998,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLDropDatabaseStatement x) { return true; } + + @Override + public void endVisit(SQLAlterTableAddIndex x) { + + } + + @Override + public boolean visit(SQLAlterTableAddIndex x) { + return true; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index c46e9fb09a..c415c7793f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeinKey; @@ -1272,4 +1273,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropDatabaseStatement x) { return false; } + + @Override + public boolean visit(SQLAlterTableAddIndex x) { + for (SQLSelectOrderByItem item : x.getItems()) { + item.accept(this); + } + return false; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index 06605c2bc7..0ecb814c19 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -15,8 +15,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardTablespace; @@ -182,11 +180,9 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlForceIndexHint().accept(adapter); new MySqlAlterTableChangeColumn().accept(adapter); new MySqlAlterTableCharacter().accept(adapter); - new MySqlAlterTableAddIndex().accept(adapter); new MySqlAlterTableOption().accept(adapter); new MySqlCreateTableStatement().accept(adapter); new MySqlCharExpr().accept(adapter); - new MySqlAlterTableAddUnique().accept(adapter); new MySqlUnique().accept(adapter); new MySqlAlterTableModifyColumn().accept(adapter); new MySqlAlterTableDiscardTablespace().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_1.java index a92db8983f..ba11181c71 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_1.java @@ -32,7 +32,7 @@ public class MySqlAlterTableAddIndex_1 extends TestCase { parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // - "\n\tADD UNIQUE `ix2` (`fid` ASC)", output); + "\n\tADD UNIQUE INDEX `ix2` (`fid` ASC)", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java index 9eb8fa3d50..7b1bc6160a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java @@ -50,7 +50,7 @@ public class MySqlAlterTableTest1 extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("ALTER TABLE t2\n\tADD INDEX (d),\n\tADD UNIQUE (a)", output); + Assert.assertEquals("ALTER TABLE t2\n\tADD INDEX (d),\n\tADD UNIQUE INDEX (a)", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java index 7c78e5c0a0..9dbbe04c15 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java @@ -48,6 +48,6 @@ public class MySqlAlterTableTest_addFk extends TestCase { "\n\tADD CONSTRAINT FK4CF5DC0F5DD7C31 FOREIGN KEY (name) REFERENCES Test1 (name)", output); Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(3, visitor.getColumns().size()); } }