diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPrimaryKey.java new file mode 100644 index 0000000000..5e36d0b775 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddPrimaryKey.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableAddPrimaryKey extends SQLObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + private SQLPrimaryKey primaryKey; + + public SQLPrimaryKey getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(SQLPrimaryKey primaryKey) { + this.primaryKey = primaryKey; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, primaryKey); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropIndex.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropIndex.java new file mode 100644 index 0000000000..1162715f9a --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropIndex.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableDropIndex extends SQLObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName indexName; + + public SQLName getIndexName() { + return indexName; + } + + public void setIndexName(SQLName indexName) { + this.indexName = indexName; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, indexName); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java index c5ee08447e..bb93a39fc6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.mysql.ast; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; @SuppressWarnings("serial") public class MySqlPrimaryKey extends MySqlKey implements SQLPrimaryKey { @@ -24,4 +25,11 @@ public class MySqlPrimaryKey extends MySqlKey implements SQLPrimaryKey { } + protected void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + acceptChild(visitor, this.getColumns()); + } + visitor.endVisit(this); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddColumn.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddColumn.java index 0c3f901f2c..d191bc9411 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddColumn.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddColumn.java @@ -25,14 +25,33 @@ public class MySqlAlterTableAddColumn extends SQLAlterTableAddColumn implements private static final long serialVersionUID = 1L; - private SQLName after; + private SQLName firstColumn; + private SQLName afterColumn; - public SQLName getAfter() { - return after; + private boolean first; + + public SQLName getFirstColumn() { + return firstColumn; } - public void setAfter(SQLName after) { - this.after = after; + public void setFirstColumn(SQLName first) { + this.firstColumn = first; + } + + public boolean isFirst() { + return first; + } + + public void setFirst(boolean first) { + this.first = first; + } + + public SQLName getAfterColumn() { + return afterColumn; + } + + public void setAfterColumn(SQLName after) { + this.afterColumn = after; } @Override @@ -47,6 +66,9 @@ public class MySqlAlterTableAddColumn extends SQLAlterTableAddColumn implements public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, getColumns()); + + acceptChild(visitor, firstColumn); + acceptChild(visitor, afterColumn); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java index 29b0c4b069..3947ce73da 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -29,16 +30,38 @@ public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLA private SQLColumnDefinition newColumnDefinition; - private Boolean first; + private boolean first; + + private SQLExpr firstColumn; + private SQLExpr afterColumn; @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, columnName); acceptChild(visitor, newColumnDefinition); + + acceptChild(visitor, firstColumn); + acceptChild(visitor, afterColumn); } } + public SQLExpr getFirstColumn() { + return firstColumn; + } + + public void setFirstColumn(SQLExpr firstColumn) { + this.firstColumn = firstColumn; + } + + public SQLExpr getAfterColumn() { + return afterColumn; + } + + public void setAfterColumn(SQLExpr afterColumn) { + this.afterColumn = afterColumn; + } + public SQLName getColumnName() { return columnName; } @@ -55,11 +78,11 @@ public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLA this.newColumnDefinition = newColumnDefinition; } - public Boolean getFirst() { + public boolean isFirst() { return first; } - public void setFirst(Boolean first) { + public void setFirst(boolean first) { this.first = first; } 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 0c70d275c3..3e69e18332 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 @@ -21,7 +21,6 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLTableConstaint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -218,31 +217,11 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } if (lexer.token() == (Token.PRIMARY)) { - lexer.nextToken(); - accept(Token.KEY); - - MySqlPrimaryKey primaryKey = new MySqlPrimaryKey(); - - if (identifierEquals("USING")) { - lexer.nextToken(); - primaryKey.setIndexType(lexer.stringVal()); - lexer.nextToken(); - } - - accept(Token.LPAREN); - for (;;) { - primaryKey.getColumns().add(this.exprParser.expr()); - if (!(lexer.token() == (Token.COMMA))) { - break; - } else { - lexer.nextToken(); - } - } - accept(Token.RPAREN); - - return primaryKey; + return (SQLTableConstaint) this.exprParser.parsePrimaryKey(); } throw new ParserException("TODO"); } + + } 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 4eecb8a673..05b54905b5 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 @@ -27,6 +27,8 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -606,5 +608,31 @@ public class MySqlExprParser extends SQLExprParser { return null; } - + + @Override + public SQLPrimaryKey parsePrimaryKey() { + accept(Token.PRIMARY); + accept(Token.KEY); + + MySqlPrimaryKey primaryKey = new MySqlPrimaryKey(); + + if (identifierEquals("USING")) { + lexer.nextToken(); + primaryKey.setIndexType(lexer.stringVal()); + lexer.nextToken(); + } + + accept(Token.LPAREN); + for (;;) { + primaryKey.getColumns().add(this.expr()); + if (!(lexer.token() == (Token.COMMA))) { + break; + } else { + lexer.nextToken(); + } + } + accept(Token.RPAREN); + + return primaryKey; + } } 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 03fddc5806..90e1e13111 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 @@ -26,13 +26,16 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; 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.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; 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; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; +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.ast.statement.SQLSelectStatement; @@ -2095,7 +2098,14 @@ public class MySqlStatementParser extends SQLStatementParser { item.getColumns().add(columnDef); if (identifierEquals("AFTER")) { lexer.nextToken(); - item.setAfter(this.exprParser.name()); + item.setAfterColumn(this.exprParser.name()); + } else if (identifierEquals("FIRST")) { + lexer.nextToken(); + if (lexer.token() == Token.IDENTIFIER) { + item.setFirstColumn(this.exprParser.name()); + } else { + item.setFirst(true); + } } stmt.getItems().add(item); } else if (lexer.token() == Token.INDEX) { @@ -2123,6 +2133,11 @@ public class MySqlStatementParser extends SQLStatementParser { 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) { @@ -2143,6 +2158,11 @@ public class MySqlStatementParser extends SQLStatementParser { } accept(Token.RPAREN); + stmt.getItems().add(item); + } else if (lexer.token() == Token.PRIMARY) { + SQLPrimaryKey primaryKey = ((MySqlExprParser) this.exprParser).parsePrimaryKey(); + SQLAlterTableAddPrimaryKey item = new SQLAlterTableAddPrimaryKey(); + item.setPrimaryKey(primaryKey); stmt.getItems().add(item); } else if (lexer.token() == Token.KEY) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); @@ -2158,7 +2178,7 @@ public class MySqlStatementParser extends SQLStatementParser { item.getColumns().add(columnDef); if (identifierEquals("AFTER")) { lexer.nextToken(); - item.setAfter(this.exprParser.name()); + item.setAfterColumn(this.exprParser.name()); } stmt.getItems().add(item); } @@ -2172,24 +2192,36 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn(); item.setColumnName(this.exprParser.name()); item.setNewColumnDefinition(this.exprParser.parseColumn()); - if (identifierEquals("FIRST")) { + if (identifierEquals("AFTER")) { lexer.nextToken(); - item.setFirst(true); - } else if (identifierEquals("AFTER")) { + item.setAfterColumn(this.exprParser.name()); + } else if (identifierEquals("FIRST")) { lexer.nextToken(); - item.setFirst(false); + if (lexer.token() == Token.IDENTIFIER) { + item.setFirstColumn(this.exprParser.name()); + } else { + item.setFirst(true); + } } stmt.getItems().add(item); } else if (identifierEquals("MODIFY")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.DROP) { lexer.nextToken(); - if (identifierEquals("COLUMN")) { + if (lexer.token() == Token.INDEX) { lexer.nextToken(); + SQLName indexName = this.exprParser.name(); + SQLAlterTableDropIndex item = new SQLAlterTableDropIndex(); + item.setIndexName(indexName); + stmt.getItems().add(item); + } else { + if (identifierEquals("COLUMN")) { + lexer.nextToken(); + } + SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); + item.setColumnName(this.exprParser.name()); + stmt.getItems().add(item); } - SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); - item.setColumnName(this.exprParser.name()); - stmt.getItems().add(item); } else if (identifierEquals("DISABLE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("ENABLE")) { 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 20821add4f..58227c65e6 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 @@ -2264,9 +2264,14 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public boolean visit(MySqlAlterTableAddColumn x) { print("ADD COLUMN "); printAndAccept(x.getColumns(), ", "); - if (x.getAfter() != null) { + if (x.getFirstColumn() != null) { + print(" FIRST "); + x.getFirstColumn().accept(this); + } else if (x.getAfterColumn() != null) { print(" AFTER "); - x.getAfter().accept(this); + x.getAfterColumn().accept(this); + } else if (x.isFirst()) { + print(" FIRST"); } return false; } @@ -2516,12 +2521,14 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV x.getColumnName().accept(this); print(' '); x.getNewColumnDefinition().accept(this); - if (x.getFirst() != null) { - if (x.getFirst().booleanValue()) { - print(" FIRST"); - } else { - print(" AFTER"); - } + if (x.getFirstColumn() != null) { + print(" FIRST "); + x.getFirstColumn().accept(this); + } else if (x.getAfterColumn() != null) { + print(" AFTER "); + x.getAfterColumn().accept(this); + } else if (x.isFirst()) { + print(" FIRST"); } return false; 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 589a532b49..6bea9cafd4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1144,7 +1144,7 @@ public class SQLExprParser extends SQLParser { accept(Token.SET); - if (lexer.token() != Token.IDENTIFIER) { + if (lexer.token() != Token.IDENTIFIER && lexer.token() != Token.LITERAL_CHARS) { throw new ParserException(); } charType.setCharSetName(lexer.stringVal()); 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 38ce1f2b70..e510f8bde8 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,8 @@ 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.SQLAlterTableAddPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; @@ -1145,4 +1147,18 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getName().accept(this); return false; } + + @Override + public boolean visit(SQLAlterTableDropIndex x) { + print("DROP INDEX "); + x.getIndexName().accept(this); + return false; + } + + @Override + public boolean visit(SQLAlterTableAddPrimaryKey x) { + print("ADD "); + x.getPrimaryKey().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 94b6e6cec4..20061a4566 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -53,7 +53,9 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; 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.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -352,6 +354,14 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableDropColumnItem x); void endVisit(SQLAlterTableDropColumnItem x); + + boolean visit(SQLAlterTableDropIndex x); + + void endVisit(SQLAlterTableDropIndex x); + + boolean visit(SQLAlterTableAddPrimaryKey x); + + void endVisit(SQLAlterTableAddPrimaryKey x); boolean visit(SQLDropIndexStatement 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 d55bd44709..7bd9b7f950 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -53,7 +53,9 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; 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.SQLAlterTableAddPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -682,4 +684,24 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLCreateDatabaseStatement x) { return true; } + + @Override + public boolean visit(SQLAlterTableDropIndex x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableDropIndex x) { + + } + + @Override + public boolean visit(SQLAlterTableAddPrimaryKey x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableAddPrimaryKey x) { + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_0.java new file mode 100644 index 0000000000..849444a387 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_0.java @@ -0,0 +1,38 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableAddIndex_0 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ADD INDEX `ix` (`f2` ASC) ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tADD INDEX `ix` (`f2` ASC)", output); + } + +} 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 new file mode 100644 index 0000000000..ee5201daa7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddIndex_1.java @@ -0,0 +1,38 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableAddIndex_1 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ADD UNIQUE INDEX `ix2` (`fid` ASC) ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tADD UNIQUE `ix2` (`fid` ASC)", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddPrimaryKey.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddPrimaryKey.java new file mode 100644 index 0000000000..c268d4961d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAddPrimaryKey.java @@ -0,0 +1,39 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableAddPrimaryKey extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` CHANGE COLUMN `fid` `fid` INT(11) NOT NULL DEFAULT NULL, ADD PRIMARY KEY (`fid`) ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tCHANGE COLUMN `fid` `fid` INT(11) NULL NOT NULL,\n\t" + // + "ADD PRIAMRY KEY (`fid`)", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_0.java new file mode 100644 index 0000000000..18d4f8c0cb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_0.java @@ -0,0 +1,38 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableDropIndex_0 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` DROP INDEX `ix` ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`," + // + "\n\tDROP `ix`", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_1.java new file mode 100644 index 0000000000..de8da297bd --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableDropIndex_1.java @@ -0,0 +1,39 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableDropIndex_1 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` DROP INDEX `ix`, DROP INDEX `ix2` ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tDROP INDEX `ix`," + // + "\n\tDROP INDEX `ix2`", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest2.java new file mode 100644 index 0000000000..ef4f9f0958 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest2.java @@ -0,0 +1,48 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableTest2 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ADD COLUMN `f2` VARCHAR(45) NULL FIRST ;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`\n\tADD COLUMN `f2` VARCHAR(45) NULL FIRST", output); + } + + public void test_alter_add_column() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ADD COLUMN `f2` VARCHAR(45) NULL AFTER `fid` , ADD COLUMN `f3` VARCHAR(45) NULL FIRST `f2`"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tADD COLUMN `f2` VARCHAR(45) NULL AFTER `fid`," + // + "\n\tADD COLUMN `f3` VARCHAR(45) NULL FIRST `f2`", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest3.java new file mode 100644 index 0000000000..7550a40047 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest3.java @@ -0,0 +1,40 @@ +/* + * 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.bvt.sql.mysql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.Token; + +import junit.framework.Assert; +import junit.framework.TestCase; + +public class MySqlAlterTableTest3 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` DROP COLUMN `f3` , CHANGE COLUMN `fname` `fname` VARCHAR(45) CHARACTER SET 'latin1' NULL DEFAULT NULL AFTER `fid`"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE `test`.`tb1`" + // + "\n\tDROP COLUMN `f3`," + // + "\n\tCHANGE COLUMN `fname` `fname` VARCHAR(45) CHARACTER SET latin1 NULL AFTER `fid`", + output); + } + +}