diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 8598ec1240..df50903727 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -341,7 +341,7 @@ public class PagerUtils { if (option == SQLSetQuantifier.DISTINCT && queryBlock.getSelectList().size() == 1) { SQLSelectItem firstItem = queryBlock.getSelectList().get(0); SQLAggregateExpr exp = new SQLAggregateExpr("COUNT", SQLAggregateOption.DISTINCT); - exp.getArguments().add(firstItem.getExpr()); + exp.addArgument(firstItem.getExpr()); firstItem.setExpr(exp); queryBlock.setDistionOption(0); } else { @@ -407,7 +407,7 @@ public class PagerUtils { private static SQLSelectItem createCountItem(String dbType) { SQLAggregateExpr countExpr = new SQLAggregateExpr("COUNT"); - countExpr.getArguments().add(new SQLAllColumnExpr()); + countExpr.addArgument(new SQLAllColumnExpr()); SQLSelectItem countItem = new SQLSelectItem(countExpr); return countItem; diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java index 817a8cb0a8..8c09492add 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java @@ -54,6 +54,13 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { public List getArguments() { return this.arguments; } + + public void addArgument(SQLExpr argument) { + if (argument != null) { + argument.setParent(this); + } + this.arguments.add(argument); + } @Override public int hashCode() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java index 73595e52bd..aa9d3817ab 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java @@ -76,6 +76,13 @@ public class SQLPartition extends SQLObjectImpl { public List getSubPartitions() { return subPartitions; } + + public void addSubPartition(SQLSubPartition partition) { + if (partition != null) { + partition.setParent(this); + } + this.subPartitions.add(partition); + } public SQLExpr getIndexDirectory() { return indexDirectory; diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java index a3872793d6..0f4426702b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java @@ -33,6 +33,13 @@ public abstract class SQLPartitionBy extends SQLObjectImpl { public List getPartitions() { return partitions; } + + public void addPartition(SQLPartition partition) { + if (partition != null) { + partition.setParent(this); + } + this.partitions.add(partition); + } public SQLSubPartitionBy getSubPartitionBy() { return subPartitionBy; diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java index 0445294a88..b937c65b85 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java @@ -53,4 +53,10 @@ public class SQLPartitionByList extends SQLPartitionBy { return columns; } + public void addColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java index 0bef4844ae..ecc415d369 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java @@ -32,9 +32,12 @@ public class SQLPartitionByRange extends SQLPartitionBy { public List getColumns() { return columns; } - - public void setColumns(List columns) { - this.columns = columns; + + public void addColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); } public SQLExpr getInterval() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java index cecef5c3f3..863ab3b8bd 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java @@ -33,6 +33,13 @@ public class SQLPartitionValue extends SQLObjectImpl { public List getItems() { return items; } + + public void addItem(SQLExpr item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } public Operator getOperator() { return operator; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index 7b64a012b0..bc20904ee8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -75,6 +75,13 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { public List getArguments() { return this.arguments; } + + public void addArgument(SQLExpr argument) { + if (argument != null) { + argument.setParent(this); + } + this.arguments.add(argument); + } public SQLOver getOver() { return over; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java index 10e03ebc11..7260f58b4d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java @@ -29,6 +29,13 @@ public class SQLGroupingSetExpr extends SQLExprImpl { public List getParameters() { return parameters; } + + public void addParameter(SQLExpr parameter) { + if (parameter != null) { + parameter.setParent(this); + } + this.parameters.add(parameter); + } @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java index eca9a28958..0829513123 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java @@ -29,6 +29,13 @@ public class SQLListExpr extends SQLExprImpl { public List getItems() { return items; } + + public void addItem(SQLExpr item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java new file mode 100644 index 0000000000..c6b04b8581 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterDatabaseStatement extends SQLStatementImpl { + + private SQLName name; + + private boolean upgradeDataDirectoryName; + + public SQLAlterDatabaseStatement() { + + } + + public SQLAlterDatabaseStatement(String dbType) { + this.setDbType(dbType); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + if (name != null) { + name.setParent(this); + } + this.name = name; + } + + public boolean isUpgradeDataDirectoryName() { + return upgradeDataDirectoryName; + } + + public void setUpgradeDataDirectoryName(boolean upgradeDataDirectoryName) { + this.upgradeDataDirectoryName = upgradeDataDirectoryName; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddColumn.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddColumn.java index 64a39b66fd..d8ef20f1b1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddColumn.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddColumn.java @@ -44,6 +44,13 @@ public class SQLAlterTableAddColumn extends SQLObjectImpl implements SQLAlterTab public List getColumns() { return columns; } + + public void addColumn(SQLColumnDefinition column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public SQLName getFirstColumn() { return firstColumn; 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 2c0ddd6a7d..332fa4af94 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 @@ -57,6 +57,13 @@ public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTabl public List getItems() { return items; } + + public void addItem(SQLSelectOrderByItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } public SQLName getName() { return name; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableConvertCharSet.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableConvertCharSet.java new file mode 100644 index 0000000000..91fadea830 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableConvertCharSet.java @@ -0,0 +1,62 @@ +/* + * 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.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableConvertCharSet extends SQLObjectImpl implements SQLAlterTableItem { + + private SQLExpr charset; + private SQLExpr collate; + + public SQLAlterTableConvertCharSet() { + + } + + public SQLExpr getCharset() { + return charset; + } + + public void setCharset(SQLExpr charset) { + if (charset != null) { + charset.setParent(this); + } + this.charset = charset; + } + + public SQLExpr getCollate() { + return collate; + } + + public void setCollate(SQLExpr collate) { + if (collate != null) { + collate.setParent(this); + } + this.collate = collate; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, charset); + acceptChild(visitor, collate); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java index a8ef57bd4e..fc7fd00687 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java @@ -43,6 +43,13 @@ public class SQLAlterTableDropColumnItem extends SQLObjectImpl implements SQLAlt public List getColumns() { return columns; } + + public void addColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public boolean isCascade() { return cascade; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java index 07942a864b..b4a293ee52 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java @@ -25,22 +25,55 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLStatement { private SQLExprTableSource tableSource; - private List items = new ArrayList(); - - public SQLAlterTableStatement() { - + private List items = new ArrayList(); + + // for mysql + private boolean ignore = false; + + private boolean updateGlobalIndexes = false; + private boolean invalidateGlobalIndexes = false; + + public SQLAlterTableStatement(){ + } - - public SQLAlterTableStatement(String dbType) { - super (dbType); + + public SQLAlterTableStatement(String dbType){ + super(dbType); + } + + public boolean isIgnore() { + return ignore; + } + + public void setIgnore(boolean ignore) { + this.ignore = ignore; + } + + public boolean isUpdateGlobalIndexes() { + return updateGlobalIndexes; + } + + public void setUpdateGlobalIndexes(boolean updateGlobalIndexes) { + this.updateGlobalIndexes = updateGlobalIndexes; + } + + public boolean isInvalidateGlobalIndexes() { + return invalidateGlobalIndexes; + } + + public void setInvalidateGlobalIndexes(boolean invalidateGlobalIndexes) { + this.invalidateGlobalIndexes = invalidateGlobalIndexes; } public List getItems() { return items; } - public void setItems(List items) { - this.items = items; + public void addItem(SQLAlterTableItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public SQLExprTableSource getTableSource() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index d85dcfddde..0ea5e59dec 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -99,6 +99,13 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen public List getConstraints() { return constraints; } + + public void addConstraint(SQLColumnConstraint constraint) { + if (constraint != null) { + constraint.setParent(this); + } + this.constraints.add(constraint); + } @Override public void output(StringBuffer buf) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java index 304fb66f0e..af7c4104db 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java @@ -59,8 +59,11 @@ public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLDDLS return items; } - public void setItems(List items) { - this.items = items; + public void addItem(SQLSelectOrderByItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public SQLName getName() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java index 8f1d6f8b21..8baa8d8830 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java @@ -82,6 +82,13 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLDDLSt public List getColumns() { return columns; } + + public void addColumn(Column column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public boolean isIfNotExists() { return ifNotExists; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java index cf601d809b..b3188ed3be 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java @@ -61,9 +61,12 @@ public class SQLDropTableStatement extends SQLStatementImpl implements SQLDDLSta public List getTableSources() { return tableSources; } - - public void setTableSources(List tableSources) { - this.tableSources = tableSources; + + public void addPartition(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSources.add(tableSource); } public void setName(SQLName name) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java index 1758876aa3..689460c7b5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java @@ -38,8 +38,11 @@ public class SQLDropUserStatement extends SQLStatementImpl implements SQLDDLStat return users; } - public void setUsers(List users) { - this.users = users; + public void addUser(SQLExpr user) { + if (user != null) { + user.setParent(this); + } + this.users.add(user); } protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java index 0bdf3dc3ca..e2e9b8edb9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java @@ -49,9 +49,12 @@ public class SQLDropViewStatement extends SQLStatementImpl implements SQLDDLStat public List getTableSources() { return tableSources; } - - public void setTableSources(List tableSources) { - this.tableSources = tableSources; + + public void addPartition(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSources.add(tableSource); } public void setName(SQLName name) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java index 4c3c3ff6a2..756aed6cf9 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertInto.java @@ -77,6 +77,13 @@ public abstract class SQLInsertInto extends SQLObjectImpl { public List getColumns() { return columns; } + + public void addColumn(SQLExpr column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public ValuesClause getValues() { return values; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index 5c3a8c15e4..ff5f1d81ca 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java index 22a3b60c10..9ad83c6406 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnique.java @@ -32,6 +32,13 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, public List getColumns() { return columns; } + + public void addColumn(SQLExpr column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java index 0b70357a91..e721895fbe 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWithSubqueryClause.java @@ -31,6 +31,13 @@ public class SQLWithSubqueryClause extends SQLObjectImpl { public List getEntries() { return entries; } + + public void addEntry(Entry entrie) { + if (entrie != null) { + entrie.setParent(this); + } + this.entries.add(entrie); + } public Boolean getRecursive() { return recursive; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableStatement.java deleted file mode 100644 index bce86de88a..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableStatement.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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.sql.dialect.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.JdbcConstants; - -public class MySqlAlterTableStatement extends SQLAlterTableStatement { - - private boolean ignore = false; - - public MySqlAlterTableStatement() { - super (JdbcConstants.MYSQL); - } - - @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, getTableSource()); - acceptChild(visitor, getItems()); - } - visitor.endVisit(this); - } - - public boolean isIgnore() { - return ignore; - } - - public void setIgnore(boolean ignore) { - this.ignore = ignore; - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterUserStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterUserStatement.java index 52a46edb8d..e776f33af0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterUserStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterUserStatement.java @@ -36,4 +36,10 @@ public class MySqlAlterUserStatement extends MySqlStatementImpl { return users; } + public void addUser(SQLExpr user) { + if (user != null) { + user.setParent(this); + } + this.users.add(user); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAnalyzeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAnalyzeStatement.java index 18925bf96c..595df93c7e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAnalyzeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAnalyzeStatement.java @@ -55,4 +55,10 @@ public class MySqlAnalyzeStatement extends MySqlStatementImpl { return tableSources; } + public void addTableSource(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSources.add(tableSource); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java index d20a55429d..aaca062a35 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateUserStatement.java @@ -30,8 +30,11 @@ public class MySqlCreateUserStatement extends MySqlStatementImpl { return users; } - public void setUsers(List users) { - this.users = users; + public void addUser(UserSpecification user) { + if (user != null) { + user.setParent(this); + } + this.users.add(user); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java index febd74b649..f9a1506a42 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlOptimizeStatement.java @@ -55,4 +55,10 @@ public class MySqlOptimizeStatement extends MySqlStatementImpl { return tableSources; } + public void addTableSource(SQLExprTableSource tableSource) { + if (tableSource != null) { + tableSource.setParent(this); + } + this.tableSources.add(tableSource); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java index 9df5924298..ae5c5e3d8b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java @@ -51,9 +51,12 @@ public class MySqlPartitionByKey extends SQLPartitionBy implements MySqlObject { public List getColumns() { return columns; } - - public void setColumns(List columns) { - this.columns = columns; + + public void addColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlRenameTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlRenameTableStatement.java index c0b736ed43..e35e222234 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlRenameTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlRenameTableStatement.java @@ -30,8 +30,11 @@ public class MySqlRenameTableStatement extends MySqlStatementImpl { return items; } - public void setItems(List items) { - this.items = items; + public void addItem(Item item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public void accept0(MySqlASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java index e6aa4763c5..0353d63c99 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlReplaceStatement.java @@ -61,6 +61,13 @@ public class MySqlReplaceStatement extends MySqlStatementImpl { public List getColumns() { return columns; } + + public void addColumn(SQLExpr column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public boolean isLowPriority() { return lowPriority; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowProfileStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowProfileStatement.java index 1490471c69..05bbbf2433 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowProfileStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowProfileStatement.java @@ -39,10 +39,6 @@ public class MySqlShowProfileStatement extends MySqlStatementImpl implements MyS return types; } - public void setTypes(List types) { - this.types = types; - } - public SQLExpr getForQuery() { return forQuery; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java index 0b3bc2a8dc..b7a1143ad0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java @@ -50,8 +50,11 @@ public class MySqlSubPartitionByKey extends SQLSubPartitionBy implements MySqlOb return columns; } - public void setColumns(List columns) { - this.columns = columns; + public void addColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java index ab306f5721..385ebf33b2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java @@ -65,8 +65,11 @@ public class MySqlSubPartitionByList extends SQLSubPartitionBy implements MySqlO return columns; } - public void setColumns(List columns) { - this.columns = columns; + public void addColumn(SQLColumnDefinition column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java index 6e889e77ca..04f7f522d3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlTableIndex.java @@ -53,6 +53,13 @@ public class MySqlTableIndex extends MySqlObjectImpl implements SQLTableElement public List getColumns() { return columns; } + + public void addColumn(SQLExpr column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { 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 ae12008649..19a181c353 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 @@ -136,7 +136,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { accept(Token.LPAREN); for (;;) { - idx.getColumns().add(this.exprParser.expr()); + idx.addColumn(this.exprParser.expr()); if (!(lexer.token() == (Token.COMMA))) { break; } else { @@ -428,7 +428,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { accept(Token.LPAREN); for (;;) { - clause.getColumns().add(this.exprParser.name()); + clause.addColumn(this.exprParser.name()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -478,7 +478,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { acceptIdentifier("COLUMNS"); accept(Token.LPAREN); for (;;) { - clause.getColumns().add(this.exprParser.name()); + clause.addColumn(this.exprParser.name()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -571,7 +571,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } } - partitionClause.getPartitions().add(partitionDef); + partitionClause.addPartition(partitionDef); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -623,7 +623,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { acceptIdentifier("COLUMNS"); accept(Token.LPAREN); for (;;) { - clause.getColumns().add(this.exprParser.name()); + clause.addColumn(this.exprParser.name()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -678,7 +678,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { accept(Token.LPAREN); for (;;) { - subPartitionKey.getColumns().add(this.exprParser.name()); + subPartitionKey.addColumn(this.exprParser.name()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -722,7 +722,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { SQLColumnDefinition column = this.exprParser.createColumnDefinition(); column.setName((SQLIdentifierExpr) expr); column.setDataType(new SQLDataTypeImpl(dataType)); - subPartitionList.getColumns().add(column); + subPartitionList.addColumn(column); subPartitionList.putAttribute("ads.subPartitionList", Boolean.TRUE); } else { @@ -733,7 +733,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { acceptIdentifier("COLUMNS"); accept(Token.LPAREN); for (;;) { - subPartitionList.getColumns().add(this.exprParser.parseColumn()); + subPartitionList.addColumn(this.exprParser.parseColumn()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -847,7 +847,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { expr = new MySqlOrderingExpr(expr, SQLOrderingSpecification.DESC); } - key.getColumns().add(expr); + key.addColumn(expr); if (!(lexer.token() == (Token.COMMA))) { break; } else { 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 9d73826a26..0821ac80a1 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 @@ -741,7 +741,7 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.LPAREN); for (;;) { - primaryKey.getColumns().add(this.expr()); + primaryKey.addColumn(this.expr()); if (!(lexer.token() == (Token.COMMA))) { break; } else { @@ -780,7 +780,7 @@ public class MySqlExprParser extends SQLExprParser { accept(Token.LPAREN); for (;;) { - unique.getColumns().add(this.expr()); + unique.addColumn(this.expr()); if (!(lexer.token() == (Token.COMMA))) { break; } else { 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 ccf82e2f3c..4ac153081b 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,9 +35,11 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; @@ -87,7 +89,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; @@ -420,8 +421,7 @@ public class MySqlStatementParser extends SQLStatementParser { for (;;) { SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); - item.setParent(stmt); - stmt.getItems().add(item); + stmt.addItem(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -484,7 +484,7 @@ public class MySqlStatementParser extends SQLStatementParser { } } - stmt.getUsers().add(userSpec); + stmt.addUser(userSpec); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -538,7 +538,7 @@ public class MySqlStatementParser extends SQLStatementParser { this.exprParser.names(names, stmt); for (SQLName name : names) { - stmt.getTableSources().add(new SQLExprTableSource(name)); + stmt.addTableSource(new SQLExprTableSource(name)); } return stmt; } @@ -552,7 +552,7 @@ public class MySqlStatementParser extends SQLStatementParser { this.exprParser.names(names, stmt); for (SQLName name : names) { - stmt.getTableSources().add(new SQLExprTableSource(name)); + stmt.addTableSource(new SQLExprTableSource(name)); } return stmt; } @@ -1668,13 +1668,13 @@ public class MySqlStatementParser extends SQLStatementParser { SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause(); stmt.getValuesList().add(values); for (;;) { - stmt.getColumns().add(this.exprParser.name()); + stmt.addColumn(this.exprParser.name()); if (lexer.token() == Token.COLONEQ) { lexer.nextToken(); } else { accept(Token.EQ); } - values.getValues().add(this.exprParser.expr()); + values.addValue(this.exprParser.expr()); if (lexer.token() == (Token.COMMA)) { lexer.nextToken(); @@ -1995,13 +1995,13 @@ public class MySqlStatementParser extends SQLStatementParser { for (;;) { SQLName name = this.exprParser.name(); - insertStatement.getColumns().add(name); + insertStatement.addColumn(name); if (lexer.token() == Token.EQ) { lexer.nextToken(); } else { accept(Token.COLONEQ); } - values.getValues().add(this.exprParser.expr()); + values.addValue(this.exprParser.expr()); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -2280,276 +2280,301 @@ public class MySqlStatementParser extends SQLStatementParser { } if (lexer.token() == Token.TABLE) { - lexer.nextToken(); - - MySqlAlterTableStatement stmt = new MySqlAlterTableStatement(); - stmt.setIgnore(ignore); - stmt.setName(this.exprParser.name()); - - for (;;) { - if (lexer.token() == Token.DROP) { - parseAlterDrop(stmt); - } else if (identifierEquals("ADD")) { - lexer.nextToken(); - - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - parseAlterTableAddColumn(stmt); - } else if (lexer.token() == Token.INDEX) { - SQLAlterTableAddIndex item = parseAlterTableAddIndex(); - item.setParent(stmt); - stmt.getItems().add(item); - } else if (lexer.token() == Token.UNIQUE) { - SQLAlterTableAddIndex item = parseAlterTableAddIndex(); - item.setParent(stmt); - stmt.getItems().add(item); - } else if (lexer.token() == Token.PRIMARY) { - SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); - SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); - stmt.getItems().add(item); - } else if (lexer.token() == Token.KEY) { - // throw new ParserException("TODO " + lexer.token() + - // " " + lexer.stringVal()); - SQLAlterTableAddIndex item = parseAlterTableAddIndex(); - item.setParent(stmt); - stmt.getItems().add(item); - } else if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLName constraintName = this.exprParser.name(); - - if (lexer.token() == Token.PRIMARY) { - SQLPrimaryKey primaryKey = ((MySqlExprParser) this.exprParser).parsePrimaryKey(); - - primaryKey.setName(constraintName); - - SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); - item.setParent(stmt); - - stmt.getItems().add(item); - } else if (lexer.token() == Token.FOREIGN) { - MysqlForeignKey fk = this.getExprParser().parseForeignKey(); - fk.setName(constraintName); - fk.setHasConstraint(true); - - SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(fk); - - item.setParent(stmt); - - stmt.getItems().add(item); - } else { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } - } else if (identifierEquals(FULLTEXT)) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals(SPATIAL)) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else { - parseAlterTableAddColumn(stmt); - } - } else if (lexer.token() == Token.ALTER) { - lexer.nextToken(); - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - } - - 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")) { - lexer.nextToken(); - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - } - MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn(); - item.setColumnName(this.exprParser.name()); - item.setNewColumnDefinition(this.exprParser.parseColumn()); - if (identifierEquals("AFTER")) { - lexer.nextToken(); - 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 (identifierEquals("MODIFY")) { - lexer.nextToken(); - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - } - MySqlAlterTableModifyColumn item = new MySqlAlterTableModifyColumn(); - item.setNewColumnDefinition(this.exprParser.parseColumn()); - if (identifierEquals("AFTER")) { - lexer.nextToken(); - 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.DISABLE) { - lexer.nextToken(); - - if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); - item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - acceptIdentifier("KEYS"); - SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); - stmt.getItems().add(item); - } - } else if (lexer.token() == Token.ENABLE) { - lexer.nextToken(); - if (lexer.token() == Token.CONSTRAINT) { - lexer.nextToken(); - SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); - item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); - } else { - acceptIdentifier("KEYS"); - SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); - stmt.getItems().add(item); - } - } else if (identifierEquals("RENAME")) { - lexer.nextToken(); - if (lexer.token() == Token.TO || lexer.token() == Token.AS) { - lexer.nextToken(); - } - MySqlRenameTableStatement renameStmt = new MySqlRenameTableStatement(); - MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item(); - item.setName(stmt.getTableSource().getExpr()); - item.setTo(this.exprParser.name()); - renameStmt.getItems().add(item); - - return renameStmt; - } else if (lexer.token() == Token.ORDER) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("CONVERT")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (lexer.token() == Token.DEFAULT) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("DISCARD")) { - lexer.nextToken(); - accept(Token.TABLESPACE); - MySqlAlterTableDiscardTablespace item = new MySqlAlterTableDiscardTablespace(); - stmt.getItems().add(item); - } else if (identifierEquals("IMPORT")) { - lexer.nextToken(); - accept(Token.TABLESPACE); - MySqlAlterTableImportTablespace item = new MySqlAlterTableImportTablespace(); - stmt.getItems().add(item); - } else if (identifierEquals("FORCE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("TRUNCATE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("COALESCE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("REORGANIZE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("EXCHANGE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("ANALYZE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("CHECK")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (lexer.token() == Token.OPTIMIZE) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("REBUILD")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("REPAIR")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("REMOVE")) { - throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); - } else if (identifierEquals("ALGORITHM")) { - lexer.nextToken(); - accept(Token.EQ); - stmt.getItems().add(new MySqlAlterTableOption("ALGORITHM", lexer.stringVal())); - lexer.nextToken(); - } else if (identifierEquals(ENGINE)) { - lexer.nextToken(); - accept(Token.EQ); - stmt.getItems().add(new MySqlAlterTableOption(ENGINE, lexer.stringVal())); - lexer.nextToken(); - } else if (identifierEquals(AUTO_INCREMENT)) { - lexer.nextToken(); - accept(Token.EQ); - stmt.getItems().add(new MySqlAlterTableOption(AUTO_INCREMENT, lexer.integerValue())); - lexer.nextToken(); - } else if (identifierEquals(COLLATE2)) { - lexer.nextToken(); - accept(Token.EQ); - stmt.getItems().add(new MySqlAlterTableOption(COLLATE2, 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(COLLATE2); - accept(Token.EQ); - item.setCollate(this.exprParser.primary()); - } - stmt.getItems().add(item); - } else if (lexer.token() == Token.COMMENT) { - lexer.nextToken(); - if (lexer.token() == Token.EQ) { - accept(Token.EQ); - } - stmt.getItems().add(new MySqlAlterTableOption("COMMENT", '\'' + lexer.stringVal() + '\'')); - lexer.nextToken(); - } else { - break; - } - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } else { - break; - } - } - - return stmt; + return parseAlterTable(ignore); } + + + if (lexer.token() == Token.DATABASE) { + return parseAlterDatabase(); + } + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } - protected void parseAlterTableAddColumn(MySqlAlterTableStatement stmt) { + protected SQLStatement parseAlterTable(boolean ignore) { + lexer.nextToken(); + + SQLAlterTableStatement stmt = new SQLAlterTableStatement(getDbType()); + stmt.setIgnore(ignore); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (lexer.token() == Token.DROP) { + parseAlterDrop(stmt); + } else if (identifierEquals("ADD")) { + lexer.nextToken(); + + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + parseAlterTableAddColumn(stmt); + } else if (lexer.token() == Token.INDEX) { + SQLAlterTableAddIndex item = parseAlterTableAddIndex(); + item.setParent(stmt); + stmt.addItem(item); + } else if (lexer.token() == Token.UNIQUE) { + SQLAlterTableAddIndex item = parseAlterTableAddIndex(); + item.setParent(stmt); + stmt.addItem(item); + } else if (lexer.token() == Token.PRIMARY) { + SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); + stmt.addItem(item); + } else if (lexer.token() == Token.KEY) { + // throw new ParserException("TODO " + lexer.token() + + // " " + lexer.stringVal()); + SQLAlterTableAddIndex item = parseAlterTableAddIndex(); + item.setParent(stmt); + stmt.addItem(item); + } else if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLName constraintName = this.exprParser.name(); + + if (lexer.token() == Token.PRIMARY) { + SQLPrimaryKey primaryKey = ((MySqlExprParser) this.exprParser).parsePrimaryKey(); + + primaryKey.setName(constraintName); + + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); + item.setParent(stmt); + + stmt.addItem(item); + } else if (lexer.token() == Token.FOREIGN) { + MysqlForeignKey fk = this.getExprParser().parseForeignKey(); + fk.setName(constraintName); + fk.setHasConstraint(true); + + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(fk); + + item.setParent(stmt); + + stmt.addItem(item); + } else { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + } else if (identifierEquals(FULLTEXT)) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals(SPATIAL)) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else { + parseAlterTableAddColumn(stmt); + } + } else if (lexer.token() == Token.ALTER) { + lexer.nextToken(); + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + } + + 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.addItem(alterColumn); + } else if (identifierEquals("CHANGE")) { + lexer.nextToken(); + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + } + MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn(); + item.setColumnName(this.exprParser.name()); + item.setNewColumnDefinition(this.exprParser.parseColumn()); + if (identifierEquals("AFTER")) { + lexer.nextToken(); + 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.addItem(item); + } else if (identifierEquals("MODIFY")) { + lexer.nextToken(); + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + } + MySqlAlterTableModifyColumn item = new MySqlAlterTableModifyColumn(); + item.setNewColumnDefinition(this.exprParser.parseColumn()); + if (identifierEquals("AFTER")) { + lexer.nextToken(); + 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.addItem(item); + } else if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.addItem(item); + } else { + acceptIdentifier("KEYS"); + SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); + stmt.addItem(item); + } + } else if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.addItem(item); + } else { + acceptIdentifier("KEYS"); + SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); + stmt.addItem(item); + } + } else if (identifierEquals("RENAME")) { + lexer.nextToken(); + if (lexer.token() == Token.TO || lexer.token() == Token.AS) { + lexer.nextToken(); + } + MySqlRenameTableStatement renameStmt = new MySqlRenameTableStatement(); + MySqlRenameTableStatement.Item item = new MySqlRenameTableStatement.Item(); + item.setName(stmt.getTableSource().getExpr()); + item.setTo(this.exprParser.name()); + renameStmt.addItem(item); + + return renameStmt; + } else if (lexer.token() == Token.ORDER) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("CONVERT")) { + lexer.nextToken(); + accept(Token.TO); + acceptIdentifier("CHARACTER"); + accept(Token.SET); + + SQLAlterTableConvertCharSet item = new SQLAlterTableConvertCharSet(); + SQLExpr charset = this.exprParser.primary(); + item.setCharset(charset); + + if (identifierEquals("COLLATE")) { + lexer.nextToken(); + SQLExpr collate = this.exprParser.primary(); + item.setCollate(collate); + } + + stmt.addItem(item); + } else if (lexer.token() == Token.DEFAULT) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("DISCARD")) { + lexer.nextToken(); + accept(Token.TABLESPACE); + MySqlAlterTableDiscardTablespace item = new MySqlAlterTableDiscardTablespace(); + stmt.addItem(item); + } else if (identifierEquals("IMPORT")) { + lexer.nextToken(); + accept(Token.TABLESPACE); + MySqlAlterTableImportTablespace item = new MySqlAlterTableImportTablespace(); + stmt.addItem(item); + } else if (identifierEquals("FORCE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("TRUNCATE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("COALESCE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("REORGANIZE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("EXCHANGE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("ANALYZE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("CHECK")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (lexer.token() == Token.OPTIMIZE) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("REBUILD")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("REPAIR")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("REMOVE")) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("ALGORITHM")) { + lexer.nextToken(); + accept(Token.EQ); + stmt.addItem(new MySqlAlterTableOption("ALGORITHM", lexer.stringVal())); + lexer.nextToken(); + } else if (identifierEquals(ENGINE)) { + lexer.nextToken(); + accept(Token.EQ); + stmt.addItem(new MySqlAlterTableOption(ENGINE, lexer.stringVal())); + lexer.nextToken(); + } else if (identifierEquals(AUTO_INCREMENT)) { + lexer.nextToken(); + accept(Token.EQ); + stmt.addItem(new MySqlAlterTableOption(AUTO_INCREMENT, lexer.integerValue())); + lexer.nextToken(); + } else if (identifierEquals(COLLATE2)) { + lexer.nextToken(); + accept(Token.EQ); + stmt.addItem(new MySqlAlterTableOption(COLLATE2, lexer.stringVal())); + lexer.nextToken(); + } else if (identifierEquals("PACK_KEYS")) { + lexer.nextToken(); + accept(Token.EQ); + if (identifierEquals("PACK")) { + lexer.nextToken(); + accept(Token.ALL); + stmt.addItem(new MySqlAlterTableOption("PACK_KEYS", "PACK ALL")); + } else { + stmt.addItem(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(COLLATE2); + accept(Token.EQ); + item.setCollate(this.exprParser.primary()); + } + stmt.addItem(item); + } else if (lexer.token() == Token.COMMENT) { + lexer.nextToken(); + if (lexer.token() == Token.EQ) { + accept(Token.EQ); + } + stmt.addItem(new MySqlAlterTableOption("COMMENT", '\'' + lexer.stringVal() + '\'')); + lexer.nextToken(); + } else { + break; + } + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } + } + + return stmt; + } + + protected void parseAlterTableAddColumn(SQLAlterTableStatement stmt) { boolean parenFlag = false; if (lexer.token() == Token.LPAREN) { lexer.nextToken(); @@ -2560,7 +2585,7 @@ public class MySqlStatementParser extends SQLStatementParser { for (;;) { SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); + item.addColumn(columnDef); if (identifierEquals("AFTER")) { lexer.nextToken(); item.setAfterColumn(this.exprParser.name()); @@ -2581,7 +2606,7 @@ public class MySqlStatementParser extends SQLStatementParser { break; } - stmt.getItems().add(item); + stmt.addItem(item); if (parenFlag) { accept(Token.RPAREN); @@ -2595,37 +2620,37 @@ public class MySqlStatementParser extends SQLStatementParser { SQLName indexName = this.exprParser.name(); SQLAlterTableDropIndex item = new SQLAlterTableDropIndex(); item.setIndexName(indexName); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.FOREIGN) { lexer.nextToken(); accept(Token.KEY); SQLName indexName = this.exprParser.name(); SQLAlterTableDropForeignKey item = new SQLAlterTableDropForeignKey(); item.setIndexName(indexName); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.KEY) { lexer.nextToken(); SQLName keyName = this.exprParser.name(); SQLAlterTableDropKey item = new SQLAlterTableDropKey(); item.setKeyName(keyName); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.PRIMARY) { lexer.nextToken(); accept(Token.KEY); SQLAlterTableDropPrimaryKey item = new SQLAlterTableDropPrimaryKey(); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.CONSTRAINT) { lexer.nextToken(); SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.COLUMN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); SQLName name = exprParser.name(); name.setParent(item); - item.getColumns().add(name); + item.addColumn(name); while (lexer.token() == Token.COMMA) { lexer.mark(); @@ -2644,11 +2669,11 @@ public class MySqlStatementParser extends SQLStatementParser { } } - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.IDENTIFIER) { SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); - stmt.getItems().add(item); + stmt.addItem(item); } else { super.parseAlterDrop(stmt); } @@ -2667,7 +2692,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.TO); item.setTo(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -2738,6 +2763,25 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); } } + + public SQLStatement parseAlterDatabase() { + accept(Token.DATABASE); + + SQLAlterDatabaseStatement stmt = new SQLAlterDatabaseStatement(); + + SQLName name = this.exprParser.name(); + stmt.setName(name); + + if (identifierEquals("UPGRADE")) { + lexer.nextToken(); + acceptIdentifier("DATA"); + acceptIdentifier("DIRECTORY"); + acceptIdentifier("NAME"); + stmt.setUpgradeDataDirectoryName(true); + } + + return stmt; + } public MySqlAlterUserStatement parseAlterUser() { accept(Token.USER); @@ -2747,7 +2791,7 @@ public class MySqlStatementParser extends SQLStatementParser { SQLExpr user = this.exprParser.expr(); acceptIdentifier("PASSWORD"); acceptIdentifier("EXPIRE"); - stmt.getUsers().add(user); + stmt.addUser(user); if (lexer.token() == Token.COMMA) { lexer.nextToken(); 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 6d3b15aeeb..21949ddef0 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,7 +46,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; @@ -432,10 +431,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlShowVariantsStatement x); - boolean visit(MySqlAlterTableStatement x); - - void endVisit(MySqlAlterTableStatement x); - boolean visit(MySqlRenameTableStatement.Item x); void endVisit(MySqlRenameTableStatement.Item 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 6afc9d8ec9..7304092830 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,7 +46,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; @@ -889,16 +888,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } - @Override - public boolean visit(MySqlAlterTableStatement x) { - return true; - } - - @Override - public void endVisit(MySqlAlterTableStatement x) { - - } - @Override public boolean visit(MySqlRenameTableStatement.Item x) { return true; 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 53f5ca6a2b..a84993c67a 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 @@ -34,6 +34,7 @@ import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLBlockStatement; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; @@ -77,7 +78,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; @@ -2391,7 +2391,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } @Override - public boolean visit(MySqlAlterTableStatement x) { + public boolean visit(SQLAlterTableStatement x) { if (x.isIgnore()) { print0(ucase ? "ALTER IGNORE TABLE " : "alter ignore table "); } else { @@ -2411,11 +2411,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - @Override - public void endVisit(MySqlAlterTableStatement x) { - - } - @Override public boolean visit(SQLAlterTableAddColumn x) { print0(ucase ? "ADD COLUMN " : "add column "); 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 44163b27b8..13e336b291 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 @@ -60,7 +60,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlAlterUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAnalyzeStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; @@ -969,16 +968,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public boolean visit(MySqlAlterTableStatement x) { - return visit((SQLAlterTableStatement) x); - } - - @Override - public void endVisit(MySqlAlterTableStatement x) { - - } - @Override public boolean visit(MySqlRenameTableStatement.Item x) { return false; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java index d3cacd87c6..2fa3aee4f8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCreateTableStatement.java @@ -64,6 +64,13 @@ public class OdpsCreateTableStatement extends SQLCreateTableStatement { public List getPartitionColumns() { return partitionColumns; } + + public void addPartitionColumn(SQLColumnDefinition column) { + if (column != null) { + column.setParent(this); + } + this.partitionColumns.add(column); + } public SQLExpr getLifecycle() { return lifecycle; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsert.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsert.java index 73dc8ff3ff..956a2d7d89 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsert.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsert.java @@ -45,6 +45,13 @@ public class OdpsInsert extends SQLObjectImpl { public List getPartitions() { return partitions; } + + public void addPartition(SQLAssignItem partition) { + if (partition != null) { + partition.setParent(this); + } + this.partitions.add(partition); + } public void setPartitions(List partitions) { this.partitions = partitions; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java index 402476ac3c..5e20446289 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsInsertStatement.java @@ -46,6 +46,13 @@ public class OdpsInsertStatement extends SQLStatementImpl implements SQLStatemen public List getItems() { return items; } + + public void addItem(OdpsInsert item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java index fdaf11531a..f34f9fccab 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java @@ -118,7 +118,7 @@ public class OdpsCreateTableParser extends SQLCreateTableParser { } SQLColumnDefinition column = this.exprParser.parseColumn(); - stmt.getPartitionColumns().add(column); + stmt.addPartitionColumn(column); if (lexer.isKeepComments() && lexer.hasComment()) { column.addAfterComment(lexer.readAndResetComments()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index 277cfb3ce1..b0b6f34d49 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -243,7 +243,7 @@ public class OdpsStatementParser extends SQLStatementParser { for (;;) { OdpsInsert insert = parseOdpsInsert(); - stmt.getItems().add(insert); + stmt.addItem(insert); if (lexer.token() != Token.INSERT) { break; @@ -285,7 +285,7 @@ public class OdpsStatementParser extends SQLStatementParser { SQLExpr ptValue = this.exprParser.expr(); ptExpr.setValue(ptValue); } - insert.getPartitions().add(ptExpr); + insert.addPartition(ptExpr); if (!(lexer.token() == (Token.COMMA))) { break; } else { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleReturningClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleReturningClause.java index d92c74493e..521255380f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleReturningClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleReturningClause.java @@ -31,16 +31,22 @@ public class OracleReturningClause extends OracleSQLObjectImpl { return items; } - public void setItems(List items) { - this.items = items; + public void addItem(SQLExpr item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public List getValues() { return values; } - public void setValues(List values) { - this.values = values; + public void addValue(SQLExpr value) { + if (value != null) { + value.setParent(this); + } + this.values.add(value); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SearchClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SearchClause.java index 2b62b67b01..f4aa315837 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SearchClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SearchClause.java @@ -46,6 +46,13 @@ public class SearchClause extends OracleSQLObjectImpl { public List getItems() { return items; } + + public void addItem(SQLSelectOrderByItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } public SQLIdentifierExpr getOrderingColumn() { return orderingColumn; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java index 42eea6460b..af43d2206e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java @@ -37,8 +37,11 @@ public class OracleAlterTableModify extends OracleAlterTableItem { return columns; } - public void setColumns(List columns) { - this.columns = columns; + public void addColumn(SQLColumnDefinition column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java deleted file mode 100644 index d2545aa8d4..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.sql.dialect.oracle.ast.stmt; - -import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import com.alibaba.druid.util.JdbcConstants; - -public class OracleAlterTableStatement extends SQLAlterTableStatement implements OracleDDLStatement { - - private boolean updateGlobalIndexes = false; - private boolean invalidateGlobalIndexes = false; - - public OracleAlterTableStatement() { - super (JdbcConstants.ORACLE); - } - - protected void accept0(SQLASTVisitor visitor) { - accept0((OracleASTVisitor) visitor); - } - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, getTableSource()); - acceptChild(visitor, getItems()); - } - visitor.endVisit(this); - } - - public boolean isUpdateGlobalIndexes() { - return updateGlobalIndexes; - } - - public void setUpdateGlobalIndexes(boolean updateGlobalIndexes) { - this.updateGlobalIndexes = updateGlobalIndexes; - } - - public boolean isInvalidateGlobalIndexes() { - return invalidateGlobalIndexes; - } - - public void setInvalidateGlobalIndexes(boolean invalidateGlobalIndexes) { - this.invalidateGlobalIndexes = invalidateGlobalIndexes; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExceptionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExceptionStatement.java index accc5a13e8..cf7a221c0a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExceptionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExceptionStatement.java @@ -31,8 +31,12 @@ public class OracleExceptionStatement extends OracleStatementImpl implements Ora return items; } - public void setItems(List items) { - this.items = items; + public void addItem(Item item) { + if (item != null) { + item.setParent(this); + } + + this.items.add(item); } public static class Item extends OracleSQLObjectImpl { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMergeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMergeStatement.java index 265b1054ac..b79be4d5e0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMergeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMergeStatement.java @@ -121,8 +121,11 @@ public class OracleMergeStatement extends OracleStatementImpl { return items; } - public void setItems(List items) { - this.items = items; + public void addItem(SQLUpdateSetItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public SQLExpr getWhere() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java index a5e52de29d..d1d9b1d439 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMultiInsertStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLHint; +import com.alibaba.druid.sql.ast.SQLPartition; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; @@ -52,8 +53,11 @@ public class OracleMultiInsertStatement extends OracleStatementImpl { return entries; } - public void setEntries(List entries) { - this.entries = entries; + public void addEntry(Entry entry) { + if (entry != null) { + entry.setParent(this); + } + this.entries.add(entry); } public Option getOption() { @@ -102,8 +106,11 @@ public class OracleMultiInsertStatement extends OracleStatementImpl { return items; } - public void setItems(List items) { - this.items = items; + public void addItem(ConditionalInsertClauseItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java index f1503fe5d8..4e39542ba8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivot.java @@ -58,6 +58,13 @@ public class OracleSelectPivot extends OracleSelectPivotBase { public List getItems() { return this.items; } + + public void addItem(Item item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } public void setXml(boolean xml) { this.xml = xml; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectUnPivot.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectUnPivot.java index b669211e76..32771bd4a1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectUnPivot.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectUnPivot.java @@ -48,6 +48,13 @@ public class OracleSelectUnPivot extends OracleSelectPivotBase { public List getItems() { return this.items; } + + public void addItem(SQLExpr item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); + } public NullsIncludeType getNullsIncludeType() { return this.nullsIncludeType; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java index a814d5102e..0f71fd71bc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -213,7 +213,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser { SQLPartitionByRange clause = new SQLPartitionByRange(); for (;;) { SQLName column = this.exprParser.name(); - clause.getColumns().add(column); + clause.addColumn(column); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -278,7 +278,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser { for (;;) { SQLSubPartition subPartition = parseSubPartition(); - range.getSubPartitions().add(subPartition); + range.addSubPartition(subPartition); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -295,7 +295,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser { range.setSubPartitionsCount(subPartitionsCount); } - clause.getPartitions().add(range); + clause.addPartition(range); if (lexer.token() == Token.COMMA) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 0a34185b90..7312d85f40 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -175,7 +175,7 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - interval.getArguments().add(this.expr()); + interval.addArgument(this.expr()); accept(Token.RPAREN); } @@ -188,7 +188,7 @@ public class OracleExprParser extends SQLExprParser { OracleDataTypeIntervalDay interval = new OracleDataTypeIntervalDay(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - interval.getArguments().add(this.expr()); + interval.addArgument(this.expr()); accept(Token.RPAREN); } @@ -220,7 +220,7 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - timestamp.getArguments().add(this.expr()); + timestamp.addArgument(this.expr()); accept(Token.RPAREN); } @@ -247,7 +247,7 @@ public class OracleExprParser extends SQLExprParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - charType.getArguments().add(this.expr()); + charType.addArgument(this.expr()); if (identifierEquals("CHAR")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index ded1599dd5..c87ebdca0f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -187,11 +187,11 @@ public class OracleSelectParser extends SQLSelectParser { acceptIdentifier("FIRST"); accept(Token.BY); - searchClause.getItems().add(exprParser.parseSelectOrderByItem()); + searchClause.addItem(exprParser.parseSelectOrderByItem()); while (lexer.token() == (Token.COMMA)) { lexer.nextToken(); - searchClause.getItems().add(exprParser.parseSelectOrderByItem()); + searchClause.addItem(exprParser.parseSelectOrderByItem()); } accept(Token.SET); @@ -214,7 +214,7 @@ public class OracleSelectParser extends SQLSelectParser { entry.setCycleClause(cycleClause); } - subqueryFactoringClause.getEntries().add(entry); + subqueryFactoringClause.addEntry(entry); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -915,7 +915,7 @@ public class OracleSelectParser extends SQLSelectParser { item = new OracleSelectPivot.Item(); item.setExpr((SQLAggregateExpr) this.exprParser.expr()); item.setAlias(as()); - pivot.getItems().add(item); + pivot.addItem(item); if (!(lexer.token() == (Token.COMMA))) { break; @@ -992,7 +992,7 @@ public class OracleSelectParser extends SQLSelectParser { this.exprParser.exprList(unPivot.getItems(), unPivot); accept(Token.RPAREN); } else { - unPivot.getItems().add(this.exprParser.expr()); + unPivot.addItem(this.exprParser.expr()); } accept(Token.FOR); @@ -1055,10 +1055,10 @@ public class OracleSelectParser extends SQLSelectParser { return; } SQLListExpr list = new SQLListExpr(); - list.getItems().add(expr); + list.addItem(expr); while (lexer.token() == Token.COMMA) { lexer.nextToken(); - list.getItems().add(expr()); + list.addItem(expr()); } x.setInto(list); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index bbd2404308..e9262eeca8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -67,7 +67,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -573,7 +572,7 @@ public class OracleStatementParser extends SQLStatementParser { return stmt; } - public OracleStatement parserAlter() { + public SQLStatement parserAlter() { accept(Token.ALTER); if (lexer.token() == Token.SESSION) { lexer.nextToken(); @@ -775,9 +774,9 @@ public class OracleStatementParser extends SQLStatementParser { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } - private OracleStatement parseAlterTable() { + private SQLStatement parseAlterTable() { lexer.nextToken(); - OracleAlterTableStatement stmt = new OracleAlterTableStatement(); + SQLAlterTableStatement stmt = new SQLAlterTableStatement(getDbType()); stmt.setName(this.exprParser.name()); for (;;) { @@ -789,7 +788,7 @@ public class OracleStatementParser extends SQLStatementParser { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - stmt.getItems().add(item); + stmt.addItem(item); accept(Token.RPAREN); } else if (lexer.token() == Token.CONSTRAINT) { @@ -798,10 +797,10 @@ public class OracleStatementParser extends SQLStatementParser { constraint.setParent(item); item.setParent(stmt); item.setConstraint(constraint); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -816,12 +815,12 @@ public class OracleStatementParser extends SQLStatementParser { OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace(); item.setName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } } else if (identifierEquals("RENAME")) { - stmt.getItems().add(parseAlterTableRename()); + stmt.addItem(parseAlterTableRename()); } else if (identifierEquals("MODIFY")) { lexer.nextToken(); @@ -831,7 +830,7 @@ public class OracleStatementParser extends SQLStatementParser { for (;;) { SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); + item.addColumn(columnDef); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -842,10 +841,10 @@ public class OracleStatementParser extends SQLStatementParser { } else { SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); + item.addColumn(columnDef); } - stmt.getItems().add(item); + stmt.addItem(item); continue; } else if (identifierEquals("SPLIT")) { parseAlterTableSplit(stmt); @@ -856,7 +855,7 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); OracleAlterTableTruncatePartition item = new OracleAlterTableTruncatePartition(); item.setName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -870,7 +869,7 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -880,7 +879,7 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -910,29 +909,29 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.LPAREN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); - stmt.getItems().add(item); + stmt.addItem(item); accept(Token.RPAREN); } else if (lexer.token() == Token.COLUMN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (identifierEquals("PARTITION")) { lexer.nextToken(); OracleAlterTableDropPartition item = new OracleAlterTableDropPartition(); item.setName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } } - private void parseAlterTableSplit(OracleAlterTableStatement stmt) { + private void parseAlterTableSplit(SQLAlterTableStatement stmt) { lexer.nextToken(); if (identifierEquals("PARTITION")) { lexer.nextToken(); @@ -1002,7 +1001,7 @@ public class OracleStatementParser extends SQLStatementParser { UpdateIndexesClause updateIndexes = new UpdateIndexesClause(); item.setUpdateIndexes(updateIndexes); } - stmt.getItems().add(item); + stmt.addItem(item); } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } @@ -1132,7 +1131,7 @@ public class OracleStatementParser extends SQLStatementParser { for (;;) { SQLUpdateSetItem item = this.exprParser.parseUpdateSetItem(); - updateClause.getItems().add(item); + updateClause.addItem(item); item.setParent(updateClause); if (lexer.token() == (Token.COMMA)) { @@ -1256,7 +1255,7 @@ public class OracleStatementParser extends SQLStatementParser { clause.setReturning(parseReturningClause()); clause.setErrorLogging(parseErrorLoggingClause()); - stmt.getEntries().add(clause); + stmt.addEntry(clause); } if (lexer.token() == Token.WHEN) { @@ -1273,7 +1272,7 @@ public class OracleStatementParser extends SQLStatementParser { parseInsert0(insertInto); item.setThen(insertInto); - clause.getItems().add(item); + clause.addItem(item); } if (lexer.token() == Token.ELSE) { @@ -1283,7 +1282,7 @@ public class OracleStatementParser extends SQLStatementParser { parseInsert0(insertInto, false); clause.setElseItem(insertInto); } - stmt.getEntries().add(clause); + stmt.addEntry(clause); } SQLSelect subQuery = this.createSQLSelectParser().select(); @@ -1303,7 +1302,7 @@ public class OracleStatementParser extends SQLStatementParser { accept(Token.THEN); parseStatementList(item.getStatements()); - stmt.getItems().add(item); + stmt.addItem(item); if (lexer.token() != Token.WHEN) { break; @@ -1349,7 +1348,7 @@ public class OracleStatementParser extends SQLStatementParser { for (;;) { SQLExpr item = exprParser.expr(); - clause.getItems().add(item); + clause.addItem(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1359,7 +1358,7 @@ public class OracleStatementParser extends SQLStatementParser { accept(Token.INTO); for (;;) { SQLExpr item = exprParser.expr(); - clause.getValues().add(item); + clause.addValue(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1524,7 +1523,7 @@ public class OracleStatementParser extends SQLStatementParser { for (;;) { SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); - stmt.getItems().add(item); + stmt.addItem(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index 9a1e16913c..2db65b9bc7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -55,7 +55,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartiti import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -366,10 +365,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleAlterTableTruncatePartition x); - boolean visit(OracleAlterTableStatement x); - - void endVisit(OracleAlterTableStatement x); - boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x); void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 4859f0a3d0..2844ced0db 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -63,7 +63,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartiti import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -793,16 +792,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleAlterTableStatement x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableStatement x) { - - } - @Override public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index a39ff01d61..0e757e460f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLBlockStatement; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; import com.alibaba.druid.sql.ast.statement.SQLCheck; @@ -100,7 +101,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -1871,7 +1871,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public boolean visit(OracleAlterTableStatement x) { + public boolean visit(SQLAlterTableStatement x) { print0(ucase ? "ALTER TABLE " : "alter table "); x.getName().accept(this); incrementIndent(); @@ -1887,11 +1887,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - @Override - public void endVisit(OracleAlterTableStatement x) { - - } - @Override public boolean visit(OracleAlterTableTruncatePartition x) { print0(ucase ? "TRUNCATE PARTITION " : "truncate partition "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 7fd8330cc5..b3e7708640 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; @@ -85,7 +86,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartiti import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -1151,23 +1151,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } @Override - public boolean visit(OracleAlterTableStatement x) { - String tableName = x.getName().toString(); - TableStat stat = getTableStat(tableName); - stat.incrementAlterCount(); - - setCurrentTable(x, tableName); - - for (SQLObject item : x.getItems()) { - item.setParent(x); - item.accept(this); - } - - return false; - } - - @Override - public void endVisit(OracleAlterTableStatement x) { + public void endVisit(SQLAlterTableStatement x) { restoreCurrentTable(x); } @@ -1213,7 +1197,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleAlterTableModify x) { - OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent(); + SQLAlterTableStatement stmt = (SQLAlterTableStatement) x.getParent(); String table = stmt.getName().toString(); for (SQLColumnDefinition column : x.getColumns()) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGWithQuery.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGWithQuery.java index 12254c834c..fc8fd72bc9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGWithQuery.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/PGWithQuery.java @@ -48,6 +48,13 @@ public class PGWithQuery extends PGSQLObjectImpl { return columns; } + public void addColumn(SQLExpr column) { + if (column != null) { + column.setParent(this); + } + this.columns.add(column); + } + @Override public void accept0(PGASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 5854fa78ca..7f13a269fa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -254,7 +254,7 @@ public class PGSQLStatementParser extends SQLStatementParser { for (;;) { SQLExpr expr = this.exprParser.expr(); - withQuery.getColumns().add(expr); + withQuery.addColumn(expr); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java index d979b82481..33e967d813 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/stmt/SQLServerDeclareStatement.java @@ -41,8 +41,11 @@ public class SQLServerDeclareStatement extends SQLServerObjectImpl implements SQ return items; } - public void setItems(List items) { - this.items = items; + public void addItem(SQLDeclareItem item) { + if (item != null) { + item.setParent(this); + } + this.items.add(item); } public String getDbType() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java index 356c492824..ce8bb542ad 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerStatementParser.java @@ -168,7 +168,7 @@ public class SQLServerStatementParser extends SQLStatementParser { for (;;) { SQLDeclareItem item = new SQLDeclareItem(); - declareStatement.getItems().add(item); + declareStatement.addItem(item); item.setName(this.exprParser.name()); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index 8578498a4b..46a579feb6 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -154,7 +154,7 @@ public class SQLCreateTableParser extends SQLDDLParser { SQLIdentifierExpr maxValue = new SQLIdentifierExpr(lexer.stringVal()); lexer.nextToken(); maxValue.setParent(values); - values.getItems().add(maxValue); + values.addItem(maxValue); } else { accept(Token.LPAREN); this.exprParser.exprList(values.getItems(), values); 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 e8a01f1993..f2c43f4de3 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -203,10 +203,10 @@ public class SQLExprParser extends SQLParser { sqlExpr = expr(); if (lexer.token() == Token.COMMA) { SQLListExpr listExpr = new SQLListExpr(); - listExpr.getItems().add(sqlExpr); + listExpr.addItem(sqlExpr); do { lexer.nextToken(); - listExpr.getItems().add(expr()); + listExpr.addItem(expr()); } while (lexer.token() == Token.COMMA); sqlExpr = listExpr; @@ -358,7 +358,7 @@ public class SQLExprParser extends SQLParser { accept(Token.THEN); valueExpr = expr(); caseItem = new SQLCaseExpr.Item(testExpr, valueExpr); - caseExpr.getItems().add(caseItem); + caseExpr.addItem(caseItem); } if (lexer.token() == Token.ELSE) { @@ -701,7 +701,7 @@ public class SQLExprParser extends SQLParser { } item.setParent(groupingSets); - groupingSets.getParameters().add(item); + groupingSets.addParameter(item); if (lexer.token() == Token.RPAREN) { break; @@ -1502,7 +1502,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); SQLExpr arg = this.expr(); arg.setParent(charType); - charType.getArguments().add(arg); + charType.addArgument(arg); accept(Token.RPAREN); } @@ -1610,7 +1610,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == Token.NOT) { lexer.nextToken(); accept(Token.NULL); - column.getConstraints().add(new NotNullConstraint()); + column.addConstraint(new NotNullConstraint()); return parseColumnRest(column); } @@ -1623,7 +1623,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.PRIMARY) { lexer.nextToken(); accept(Token.KEY); - column.getConstraints().add(new SQLColumnPrimaryKey()); + column.addConstraint(new SQLColumnPrimaryKey()); return parseColumnRest(column); } @@ -1632,7 +1632,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == Token.KEY) { lexer.nextToken(); } - column.getConstraints().add(new SQLColumnUniqueKey()); + column.addConstraint(new SQLColumnUniqueKey()); return parseColumnRest(column); } @@ -1646,7 +1646,7 @@ public class SQLExprParser extends SQLParser { accept(Token.KEY); SQLColumnPrimaryKey pk = new SQLColumnPrimaryKey(); pk.setName(name); - column.getConstraints().add(pk); + column.addConstraint(pk); return parseColumnRest(column); } @@ -1654,7 +1654,7 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); SQLColumnUniqueKey uk = new SQLColumnUniqueKey(); uk.setName(name); - column.getConstraints().add(uk); + column.addConstraint(uk); return parseColumnRest(column); } @@ -1666,7 +1666,7 @@ public class SQLExprParser extends SQLParser { accept(Token.LPAREN); this.names(ref.getColumns(), ref); accept(Token.RPAREN); - column.getConstraints().add(ref); + column.addConstraint(ref); return parseColumnRest(column); } @@ -1675,7 +1675,7 @@ public class SQLExprParser extends SQLParser { accept(Token.NULL); NotNullConstraint notNull = new NotNullConstraint(); notNull.setName(name); - column.getConstraints().add(notNull); + column.addConstraint(notNull); return parseColumnRest(column); } @@ -1683,7 +1683,7 @@ public class SQLExprParser extends SQLParser { SQLColumnCheck check = parseColumnCheck(); check.setName(name); check.setParent(column); - column.getConstraints().add(check); + column.addConstraint(check); return parseColumnRest(column); } @@ -1699,7 +1699,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.CHECK) { SQLColumnCheck check = parseColumnCheck(); - column.getConstraints().add(check); + column.addConstraint(check); return parseColumnRest(column); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java index ec4591ec61..a26f247948 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectParser.java @@ -222,7 +222,7 @@ public class SQLSelectParser extends SQLParser { entry.setSubQuery(select()); accept(Token.RPAREN); - withQueryClause.getEntries().add(entry); + withQueryClause.addEntry(entry); if (lexer.token() == Token.COMMA) { lexer.nextToken(); 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 daf3f5a83c..02c4f7d96e 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -813,7 +813,7 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.TABLE) { lexer.nextToken(); - SQLAlterTableStatement stmt = new SQLAlterTableStatement(); + SQLAlterTableStatement stmt = new SQLAlterTableStatement(getDbType()); stmt.setName(this.exprParser.name()); for (;;) { @@ -834,26 +834,26 @@ public class SQLStatementParser extends SQLParser { if (lexer.token() == Token.PRIMARY) { SQLPrimaryKey primaryKey = this.exprParser.parsePrimaryKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(primaryKey); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.COLUMN) { lexer.nextToken(); SQLAlterTableAddColumn item = parseAlterTableAddColumn(); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.CHECK) { SQLCheck check = this.exprParser.parseCheck(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.CONSTRAINT) { SQLConstraint constraint = this.exprParser.parseConstaint(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.FOREIGN) { SQLConstraint constraint = this.exprParser.parseForeignKey(); SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.PARTITION) { lexer.nextToken(); SQLAlterTableAddPartition addPartition = new SQLAlterTableAddPartition(); @@ -866,7 +866,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); - stmt.getItems().add(addPartition); + stmt.addItem(addPartition); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -877,15 +877,15 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (identifierEquals("LIFECYCLE")) { lexer.nextToken(); SQLAlterTableDisableLifecycle item = new SQLAlterTableDisableLifecycle(); - stmt.getItems().add(item); + stmt.addItem(item); } else { acceptIdentifier("KEYS"); SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); - stmt.getItems().add(item); + stmt.addItem(item); } } else if (lexer.token() == Token.ENABLE) { lexer.nextToken(); @@ -893,24 +893,24 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (identifierEquals("LIFECYCLE")) { lexer.nextToken(); SQLAlterTableEnableLifecycle item = new SQLAlterTableEnableLifecycle(); - stmt.getItems().add(item); + stmt.addItem(item); } else { acceptIdentifier("KEYS"); SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); - stmt.getItems().add(item); + stmt.addItem(item); } } else if (lexer.token() == Token.ALTER) { lexer.nextToken(); if (lexer.token() == Token.COLUMN) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); - stmt.getItems().add(alterColumn); + stmt.addItem(alterColumn); } else if (lexer.token() == Token.LITERAL_ALIAS) { SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); - stmt.getItems().add(alterColumn); + stmt.addItem(alterColumn); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -923,9 +923,9 @@ public class SQLStatementParser extends SQLParser { SQLAlterTableAddConstraint addCheck = new SQLAlterTableAddConstraint(); addCheck.setWithNoCheck(true); addCheck.setConstraint(check); - stmt.getItems().add(addCheck); + stmt.addItem(addCheck); } else if (identifierEquals("RENAME")) { - stmt.getItems().add(parseAlterTableRename()); + stmt.addItem(parseAlterTableRename()); } else if (lexer.token() == Token.SET) { lexer.nextToken(); @@ -933,12 +933,12 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableSetComment setComment = new SQLAlterTableSetComment(); setComment.setComment(this.exprParser.primary()); - stmt.getItems().add(setComment); + stmt.addItem(setComment); } else if (identifierEquals("LIFECYCLE")) { lexer.nextToken(); SQLAlterTableSetLifecycle setLifecycle = new SQLAlterTableSetLifecycle(); setLifecycle.setLifecycle(this.exprParser.primary()); - stmt.getItems().add(setLifecycle); + stmt.addItem(setLifecycle); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -964,7 +964,7 @@ public class SQLStatementParser extends SQLParser { enableLifeCycle.getPartition().add(condition); condition.setParent(enableLifeCycle); } - stmt.getItems().add(enableLifeCycle); + stmt.addItem(enableLifeCycle); continue; } @@ -980,7 +980,7 @@ public class SQLStatementParser extends SQLParser { disableLifeCycle.getPartition().add(condition); condition.setParent(disableLifeCycle); } - stmt.getItems().add(disableLifeCycle); + stmt.addItem(disableLifeCycle); continue; } @@ -995,7 +995,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); - stmt.getItems().add(renamePartition); + stmt.addItem(renamePartition); } else if(identifierEquals("TOUCH")) { lexer.nextToken(); SQLAlterTableTouch item = new SQLAlterTableTouch(); @@ -1008,7 +1008,7 @@ public class SQLStatementParser extends SQLParser { accept(Token.RPAREN); } - stmt.getItems().add(item); + stmt.addItem(item); } else { break; } @@ -1084,7 +1084,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableDropConstraint item = new SQLAlterTableDropConstraint(); item.setConstraintName(this.exprParser.name()); - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.COLUMN) { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); @@ -1095,7 +1095,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); } - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.LITERAL_ALIAS) { SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); @@ -1105,7 +1105,7 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); } - stmt.getItems().add(item); + stmt.addItem(item); } else if (lexer.token() == Token.PARTITION) { lexer.nextToken(); SQLAlterTableDropPartition dropPartition = new SQLAlterTableDropPartition(); @@ -1123,7 +1123,7 @@ public class SQLStatementParser extends SQLParser { dropPartition.setPurge(true); } - stmt.getItems().add(dropPartition); + stmt.addItem(dropPartition); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -1155,7 +1155,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableSources().add(new SQLExprTableSource(name)); + stmt.addPartition(new SQLExprTableSource(name)); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1238,7 +1238,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLName name = this.exprParser.name(); - stmt.getTableSources().add(new SQLExprTableSource(name)); + stmt.addPartition(new SQLExprTableSource(name)); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1483,7 +1483,7 @@ public class SQLStatementParser extends SQLParser { SQLDropUserStatement stmt = new SQLDropUserStatement(getDbType()); for (;;) { SQLExpr expr = this.exprParser.expr(); - stmt.getUsers().add(expr); + stmt.addUser(expr); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1738,7 +1738,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); item.setParent(stmt); - stmt.getItems().add(item); + stmt.addItem(item); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; @@ -1874,7 +1874,7 @@ public class SQLStatementParser extends SQLParser { } column.setParent(createView); - createView.getColumns().add(column); + createView.addColumn(column); if (lexer.token() == Token.COMMA) { lexer.nextToken(); @@ -1925,7 +1925,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - item.getColumns().add(columnDef); + item.addColumn(columnDef); if (lexer.token() == Token.COMMA) { lexer.nextToken(); if (identifierEquals("ADD")) { @@ -1999,7 +1999,7 @@ public class SQLStatementParser extends SQLParser { for (;;) { SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem(); - item.getItems().add(column); + item.addItem(column); if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; 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 b90a5c7015..1b923c7cea 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -80,11 +80,13 @@ import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; 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.SQLAlterDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; @@ -2997,4 +2999,26 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + + @Override + public boolean visit(SQLAlterDatabaseStatement x) { + print0(ucase ? "ALTER DATABASE " : "alter database "); + x.getName().accept(this); + if (x.isUpgradeDataDirectoryName()) { + print0(ucase ? " UPGRADE DATA DIRECTORY NAME" : " upgrade data directory name"); + } + return false; + } + + @Override + public boolean visit(SQLAlterTableConvertCharSet x) { + print0(ucase ? "CONVERT TO CHARACTER SET " : "convert to character set "); + x.getCharset().accept(this); + + if (x.getCollate() != null) { + print0(ucase ? "COLLATE " : "collate "); + x.getCollate().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 aadb16a3e3..9dc0a22c78 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -64,11 +64,13 @@ import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; 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.SQLAlterDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; @@ -730,4 +732,12 @@ public interface SQLASTVisitor { boolean visit(SQLSubPartitionByList x); void endVisit(SQLSubPartitionByList x); + + boolean visit(SQLAlterDatabaseStatement x); + + void endVisit(SQLAlterDatabaseStatement x); + + boolean visit(SQLAlterTableConvertCharSet x); + + void endVisit(SQLAlterTableConvertCharSet 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 f6c61e33a1..c459f424a9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -65,11 +65,13 @@ import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; 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.SQLAlterDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddPartition; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableLifecycle; @@ -1470,5 +1472,25 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLSubPartitionByList x) { } + + @Override + public boolean visit(SQLAlterDatabaseStatement x) { + return true; + } + + @Override + public void endVisit(SQLAlterDatabaseStatement x) { + + } + + @Override + public boolean visit(SQLAlterTableConvertCharSet x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableConvertCharSet x) { + + } } 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 0a6de9ea32..72f399ab71 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -48,8 +48,10 @@ import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; 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.SQLAlterDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableConvertCharSet; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; @@ -1502,4 +1504,14 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLPartitionValue x) { return false; } + + @Override + public boolean visit(SQLAlterDatabaseStatement x) { + return true; + } + + @Override + public boolean visit(SQLAlterTableConvertCharSet x) { + return false; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java index a2b8f62e23..aa3b5a5a1e 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java @@ -45,7 +45,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; @@ -412,12 +411,6 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi return true; } - @Override - public boolean visit(MySqlAlterTableStatement x) { - WallVisitorUtils.check(this, x); - return true; - } - public boolean visit(SQLDropTableStatement x) { WallVisitorUtils.check(this, x); return true; diff --git a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java index 44a6bda325..f2ec287286 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java @@ -15,6 +15,9 @@ */ package com.alibaba.druid.wall.spi; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; @@ -38,7 +41,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; @@ -56,9 +58,6 @@ import com.alibaba.druid.wall.WallVisitor; import com.alibaba.druid.wall.violation.ErrorCode; import com.alibaba.druid.wall.violation.IllegalSQLObjectViolation; -import java.util.ArrayList; -import java.util.List; - public class OracleWallVisitor extends OracleASTVisitorAdapter implements WallVisitor { private final WallConfig config; @@ -322,12 +321,6 @@ public class OracleWallVisitor extends OracleASTVisitorAdapter implements WallVi return true; } - @Override - public boolean visit(OracleAlterTableStatement x) { - WallVisitorUtils.check(this, x); - return true; - } - @Override public boolean visit(SQLDropTableStatement x) { WallVisitorUtils.check(this, x); diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index 8cb648538c..b27b1342c5 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -635,7 +635,7 @@ public class WallVisitorUtils { updateSetItem.setColumn(item); updateSetItem.setValue(value); - x.getItems().add(updateSetItem); + x.addItem(updateSetItem); visitor.setSqlModified(true); } 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 0c93eacadf..daf98d69ee 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 @@ -19,7 +19,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableDiscardT import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableImportTablespace; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableModifyColumn; 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.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; @@ -160,7 +159,6 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlShowSlaveStatusStatement().accept(adapter); new MySqlShowTableStatusStatement().accept(adapter); new MySqlShowTriggersStatement().accept(adapter); - new MySqlAlterTableStatement().accept(adapter); new MySqlRenameTableStatement().accept(adapter); new MySqlUnionQuery().accept(adapter); new MySqlUseIndexHint().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterDbTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterDbTest0.java new file mode 100644 index 0000000000..47e30c7619 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterDbTest0.java @@ -0,0 +1,38 @@ +/* + * 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 MySqlAlterDbTest0 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME", output); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest21.java new file mode 100644 index 0000000000..b039ea29d2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest21.java @@ -0,0 +1,38 @@ +/* + * 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 MySqlAlterTableTest21 extends TestCase { + + public void test_alter_add_key() throws Exception { + String sql = "ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE tbl_name" + + "\n\tCONVERT TO CHARACTER SET charset_name", output); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index c841839fb5..b2d21fb46e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -54,7 +54,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartiti import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceStatement; @@ -185,7 +184,6 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OracleAlterProcedureStatement().accept(adapter); new OracleAlterTableDropPartition().accept(adapter); new OracleAlterTableTruncatePartition().accept(adapter); - new OracleAlterTableStatement().accept(adapter); new OracleAlterTableSplitPartition.TableSpaceItem().accept(adapter); new OracleAlterTableSplitPartition.UpdateIndexesClause().accept(adapter); new OracleAlterTableSplitPartition.NestedTablePartitionSpec().accept(adapter);