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 new file mode 100644 index 0000000000..4bfcd03958 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddIndex.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.sql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private List items = new ArrayList(); + + private String type; + + @Override + protected void accept0(SQLASTVisitor visitor) { + + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java new file mode 100644 index 0000000000..9d588555ad --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLIndexDefinition.java @@ -0,0 +1,6 @@ +package com.alibaba.druid.sql.ast.statement; + + +public class SQLIndexDefinition { + +} 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 new file mode 100644 index 0000000000..b9b242454a --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddIndex.java @@ -0,0 +1,40 @@ +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 static final long serialVersionUID = 1L; + + 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/MySqlAlterTableChangeColumn.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java new file mode 100644 index 0000000000..b889d01e22 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableChangeColumn.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName columnName; + + private SQLColumnDefinition newColumnDefinition; + + private Boolean first; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, columnName); + acceptChild(visitor, newColumnDefinition); + } + } + + public SQLName getColumnName() { + return columnName; + } + + public void setColumnName(SQLName columnName) { + this.columnName = columnName; + } + + public SQLColumnDefinition getNewColumnDefinition() { + return newColumnDefinition; + } + + public void setNewColumnDefinition(SQLColumnDefinition newColumnDefinition) { + this.newColumnDefinition = newColumnDefinition; + } + + public Boolean getFirst() { + return first; + } + + public void setFirst(Boolean first) { + this.first = first; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableCharacter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableCharacter.java new file mode 100644 index 0000000000..8d0e9cc765 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableCharacter.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlAlterTableCharacter extends MySqlObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLExpr characterSet; + private SQLExpr collate; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, characterSet); + acceptChild(visitor, collate); + } + visitor.endVisit(this); + } + + public SQLExpr getCharacterSet() { + return characterSet; + } + + public void setCharacterSet(SQLExpr characterSet) { + this.characterSet = characterSet; + } + + public SQLExpr getCollate() { + return collate; + } + + public void setCollate(SQLExpr collate) { + this.collate = collate; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableOption.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableOption.java new file mode 100644 index 0000000000..ccc1d4b104 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableOption.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlAlterTableOption extends MySqlObjectImpl implements SQLAlterTableItem { + + private static final long serialVersionUID = 1L; + + private String name; + private String value; + + public MySqlAlterTableOption(String name, String value){ + this.name = name; + this.value = value; + } + + public MySqlAlterTableOption(){ + } + + @Override + public void accept0(MySqlASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + +} 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 257d6438fd..fba504ae44 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,7 +15,7 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import com.alibaba.druid.sql.ast.SQLPartitioningClause; @@ -27,7 +27,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement { private boolean ifNotExiists = false; - private Map tableOptions = new HashMap(); + private Map tableOptions = new LinkedHashMap(); protected SQLSelect query; 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 e464ce8938..68b1970be8 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 @@ -40,6 +40,10 @@ 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.MySqlAlterTableChangeColumn; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; @@ -2045,6 +2049,25 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); item.setAfter(this.exprParser.name()); } + stmt.getItems().add(item); + } else if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex(); + 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); + stmt.getItems().add(item); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); @@ -2052,7 +2075,21 @@ public class MySqlStatementParser extends SQLStatementParser { } else if (identifierEquals("ALTER")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("CHANGE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + lexer.nextToken(); + if (identifierEquals("COLUMN")) { + lexer.nextToken(); + } + MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn(); + item.setColumnName(this.exprParser.name()); + item.setNewColumnDefinition(this.exprParser.parseColumn()); + if (identifierEquals("FIRST")) { + lexer.nextToken(); + item.setFirst(true); + } else if (identifierEquals("AFTER")) { + lexer.nextToken(); + item.setFirst(false); + } + stmt.getItems().add(item); } else if (identifierEquals("MODIFY")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (lexer.token() == Token.DROP) { @@ -2102,6 +2139,47 @@ public class MySqlStatementParser extends SQLStatementParser { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } else if (identifierEquals("REMOVE")) { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("ENGINE")) { + lexer.nextToken(); + accept(Token.EQ); + stmt.getItems().add(new MySqlAlterTableOption("ENGINE", lexer.stringVal())); + lexer.nextToken(); + } else if (identifierEquals("COLLATE")) { + lexer.nextToken(); + accept(Token.EQ); + stmt.getItems().add(new MySqlAlterTableOption("COLLATE", lexer.stringVal())); + lexer.nextToken(); + } else if (identifierEquals("PACK_KEYS")) { + lexer.nextToken(); + accept(Token.EQ); + if (identifierEquals("PACK")) { + lexer.nextToken(); + accept(Token.ALL); + stmt.getItems().add(new MySqlAlterTableOption("PACK_KEYS", "PACK ALL")); + } else { + stmt.getItems().add(new MySqlAlterTableOption("PACK_KEYS", lexer.stringVal())); + lexer.nextToken(); + } + } else if (identifierEquals("CHARACTER")) { + lexer.nextToken(); + accept(Token.SET); + accept(Token.EQ); + MySqlAlterTableCharacter item = new MySqlAlterTableCharacter(); + item.setCharacterSet(this.exprParser.primary()); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + acceptIdentifier("COLLATE"); + accept(Token.EQ); + item.setCollate(this.exprParser.primary()); + } + stmt.getItems().add(item); + } else { + break; + } + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; } else { break; } 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 5de98d2d75..101802a554 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 @@ -29,6 +29,10 @@ 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.MySqlAlterTableChangeColumn; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; @@ -475,4 +479,20 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlForceIndexHint x); void endVisit(MySqlForceIndexHint x); + + boolean visit(MySqlAlterTableChangeColumn x); + + void endVisit(MySqlAlterTableChangeColumn x); + + boolean visit(MySqlAlterTableCharacter x); + + void endVisit(MySqlAlterTableCharacter x); + + boolean visit(MySqlAlterTableAddIndex x); + + void endVisit(MySqlAlterTableAddIndex x); + + boolean visit(MySqlAlterTableOption x); + + void endVisit(MySqlAlterTableOption 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 d983e73600..59564c039f 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 @@ -14,6 +14,10 @@ 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.MySqlAlterTableChangeColumn; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; @@ -1035,4 +1039,44 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements public void endVisit(MySqlForceIndexHint x) { } + + @Override + public boolean visit(MySqlAlterTableChangeColumn x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableChangeColumn x) { + + } + + @Override + public boolean visit(MySqlAlterTableCharacter x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableCharacter x) { + + } + + @Override + public boolean visit(MySqlAlterTableAddIndex x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableAddIndex x) { + + } + + @Override + public boolean visit(MySqlAlterTableOption x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableOption 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 088e91d3f7..32e359870d 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 @@ -46,6 +46,10 @@ 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.MySqlAlterTableChangeColumn; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; @@ -2228,7 +2232,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } x.getName().accept(this); incrementIndent(); - for (SQLAlterTableItem item : x.getItems()) { + for (int i = 0; i < x.getItems().size(); ++i) { + SQLAlterTableItem item = x.getItems().get(i); + if (i != 0) { + print(','); + } println(); item.accept(this); } @@ -2458,7 +2466,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlLockTableStatement x) { - + } @Override @@ -2469,7 +2477,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlUnlockTablesStatement x) { - + } @Override @@ -2488,6 +2496,86 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public void endVisit(MySqlForceIndexHint x) { + + } + + @Override + public boolean visit(MySqlAlterTableChangeColumn x) { + print("CHANGE COLUMN "); + x.getColumnName().accept(this); + print(' '); + x.getNewColumnDefinition().accept(this); + if (x.getFirst() != null) { + if (x.getFirst().booleanValue()) { + print(" FIRST"); + } else { + print(" AFTER"); + } + } + + return false; + } + + @Override + public void endVisit(MySqlAlterTableChangeColumn x) { + + } + + @Override + public boolean visit(MySqlAlterTableCharacter x) { + print("CHARACTER SET = "); + x.getCharacterSet().accept(this); + + if (x.getCollate() != null) { + print(", COLLATE = "); + x.getCollate().accept(this); + } + + return false; + } + + @Override + public void endVisit(MySqlAlterTableCharacter x) { + + } + + @Override + public boolean visit(MySqlAlterTableAddIndex x) { + print("ADD "); + if (x.getType() != null) { + print(x.getType()); + print(" "); + } + + print("INDEX "); + + x.getName().accept(this); + 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(MySqlAlterTableOption x) { + print(x.getName()); + print(" = "); + print(x.getValue()); + return false; + } + + @Override + public void endVisit(MySqlAlterTableOption 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 20c67bb9b2..d261bb4e99 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 @@ -24,6 +24,10 @@ 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.MySqlAlterTableChangeColumn; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; @@ -1099,4 +1103,44 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlForceIndexHint x) { } + + @Override + public boolean visit(MySqlAlterTableChangeColumn x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableChangeColumn x) { + + } + + @Override + public boolean visit(MySqlAlterTableCharacter x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableCharacter x) { + + } + + @Override + public boolean visit(MySqlAlterTableAddIndex x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableAddIndex x) { + + } + + @Override + public boolean visit(MySqlAlterTableOption x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableOption x) { + + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest.java new file mode 100644 index 0000000000..994c798fb1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest.java @@ -0,0 +1,58 @@ +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 MySqlAlterTableTest extends TestCase { + public void test_alter_0() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` CHANGE COLUMN `fname` `fname1` VARCHAR(45) NULL DEFAULT NULL ;"; + 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 `fname` `fname1` VARCHAR(45) NULL", output); + } + + public void test_alter_1() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` CHARACTER SET = utf8 , COLLATE = utf8_general_ci ;"; + 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\tCHARACTER SET = utf8, COLLATE = utf8_general_ci", output); + } + + public void test_alter_2() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ADD INDEX `f` (`fname` 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 `f` (`fname` ASC)", output); + } + + public void test_alter_3() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` ENGINE = InnoDB ;"; + 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\tENGINE = InnoDB", output); + } + + public void test_alter_4() throws Exception { + String sql = "ALTER TABLE `test`.`tb1` COLLATE = utf8_general_ci , PACK_KEYS = Pack All , ENGINE = InnoDB ;"; + 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\tCOLLATE = utf8_general_ci,\n\tPACK_KEYS = PACK ALL,\n\tENGINE = InnoDB", output); + } + +}