Merge pull request #1025 from wenshao/master

bug fixed for mysql parser alter column
This commit is contained in:
wenshao
2016-01-09 18:28:50 +08:00
8 changed files with 188 additions and 26 deletions
@@ -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;
}
}
@@ -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")) {
@@ -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);
} //
@@ -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) {
}
} //
@@ -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) {
}
} //
@@ -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
}
}
@@ -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);
}
}
@@ -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);
}
}