diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java new file mode 100644 index 0000000000..806a723827 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAlterColumn.java @@ -0,0 +1,49 @@ +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.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlAlterTableAlterColumn extends MySqlObjectImpl implements SQLAlterTableItem { + + private SQLName column; + + private boolean dropDefault = false; + private SQLExpr defaultExpr; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + acceptChild(visitor, defaultExpr); + } + visitor.endVisit(this); + } + + public boolean isDropDefault() { + return dropDefault; + } + + public void setDropDefault(boolean dropDefault) { + this.dropDefault = dropDefault; + } + + public SQLExpr getDefaultExpr() { + return defaultExpr; + } + + public void setDefaultExpr(SQLExpr defaultExpr) { + this.defaultExpr = defaultExpr; + } + + public SQLName getColumn() { + return column; + } + + public void setColumn(SQLName column) { + this.column = column; + } + +} 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 c096f330b5..586a058d11 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 @@ -35,7 +35,6 @@ import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; @@ -79,6 +78,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlWhileStatement; 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.MySqlAlterTableAlterColumn; 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; @@ -2353,9 +2353,19 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); } - SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn(); - SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - alterColumn.setColumn(columnDef); + MySqlAlterTableAlterColumn alterColumn = new MySqlAlterTableAlterColumn(); + alterColumn.setColumn(this.exprParser.name()); + + if (lexer.token() == Token.SET) { + lexer.nextToken(); + accept(Token.DEFAULT); + + alterColumn.setDefaultExpr(this.exprParser.expr()); + } else { + accept(Token.DROP); + accept(Token.DEFAULT); + alterColumn.setDropDefault(true); + } stmt.getItems().add(alterColumn); } else if (identifierEquals("CHANGE")) { 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 af0db39424..06d47742a1 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 @@ -46,6 +46,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlSelectGroupByExpr; 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.MySqlAlterTableAlterColumn; 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; @@ -650,5 +651,9 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlUpdateTableSource x); void endVisit(MySqlUpdateTableSource x); + + boolean visit(MySqlAlterTableAlterColumn x); + + void endVisit(MySqlAlterTableAlterColumn 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 ae2fa2271d..428d9ced5a 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 @@ -46,6 +46,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlSelectGroupByExpr; 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.MySqlAlterTableAlterColumn; 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; @@ -1466,4 +1467,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } + @Override + public boolean visit(MySqlAlterTableAlterColumn x) { + return true; + } + + @Override + public void endVisit(MySqlAlterTableAlterColumn 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 e94bad1af3..27d42f4163 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 @@ -72,6 +72,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlSelectGroupByExpr; 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.MySqlAlterTableAlterColumn; 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; @@ -3606,4 +3607,22 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public void endVisit(MySqlUpdateTableSource x) { } + + @Override + public boolean visit(MySqlAlterTableAlterColumn x) { + print0(ucase ? "ALTER COLUMN " : "alter column "); + x.getColumn().accept(this); + if (x.getDefaultExpr() != null) { + print0(ucase ? " SET DEFAULT " : " set default "); + x.getDefaultExpr().accept(this); + } else if (x.isDropDefault()) { + print0(ucase ? " DROP DEFAULT" : " drop default"); + } + return false; + } + + @Override + public void endVisit(MySqlAlterTableAlterColumn 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 3d7d296933..c7132f8771 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 @@ -61,6 +61,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlSelectGroupByExpr; 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.MySqlAlterTableAlterColumn; 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; @@ -1369,6 +1370,16 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlBlockStatement x) { + } + + @Override + public boolean visit(MySqlAlterTableAlterColumn x) { + return false; + } + + @Override + public void endVisit(MySqlAlterTableAlterColumn x) { + } /** @@ -1376,7 +1387,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS */ @Override public boolean visit(MySqlCreateProcedureStatement x) { - // TODO Auto-generated method stub String name = x.getName().toString(); this.variants.put(name, x); accept(x.getBlock()); @@ -1385,19 +1395,16 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlCreateProcedureStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlParameter x) { - // TODO Auto-generated method stub return true; } @Override public void endVisit(MySqlParameter x) { - // TODO Auto-generated method stub } @@ -1409,7 +1416,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlWhileStatement x) { - // TODO Auto-generated method stub } @@ -1423,7 +1429,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlIfStatement x) { - // TODO Auto-generated method stub } @@ -1435,7 +1440,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlElseIfStatement x) { - // TODO Auto-generated method stub } @@ -1447,7 +1451,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlElseStatement x) { - // TODO Auto-generated method stub } @@ -1459,31 +1462,26 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlCaseStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlDeclareStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlDeclareStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlSelectIntoStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlSelectIntoStatement x) { - // TODO Auto-generated method stub } @@ -1495,7 +1493,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlWhenStatement x) { - // TODO Auto-generated method stub } @@ -1507,44 +1504,37 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlLoopStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlLeaveStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlLeaveStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlIterateStatement x) { - // TODO Auto-generated method stub return false; } @Override public void endVisit(MySqlIterateStatement x) { - // TODO Auto-generated method stub } @Override public boolean visit(MySqlRepeatStatement x) { - // TODO Auto-generated method stub accept(x.getStatements()); return false; } @Override public void endVisit(MySqlRepeatStatement x) { - // TODO Auto-generated method stub } @@ -1556,7 +1546,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlCursorDeclareStatement x) { - // TODO Auto-generated method stub } @@ -1573,4 +1562,5 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnDropDefaultTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnDropDefaultTest.java new file mode 100644 index 0000000000..f052e0a695 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnDropDefaultTest.java @@ -0,0 +1,39 @@ +/* + * Copyright 1999-2101 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 junit.framework.TestCase; + +import org.junit.Assert; + +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; + +public class MySqlAlterTableAlterColumnDropDefaultTest extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "alter table tabelname alter column operateVersion drop default"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE tabelname" + // + "\n\tALTER COLUMN operateVersion DROP DEFAULT", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnSetDefaultTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnSetDefaultTest.java new file mode 100644 index 0000000000..c23fad5b37 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableAlterColumnSetDefaultTest.java @@ -0,0 +1,39 @@ +/* + * Copyright 1999-2101 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 junit.framework.TestCase; + +import org.junit.Assert; + +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; + +public class MySqlAlterTableAlterColumnSetDefaultTest extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "alter table tabelname alter column operateVersion set default 0"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE tabelname" + // + "\n\tALTER COLUMN operateVersion SET DEFAULT 0", output); + } + +}