From 544da04ee4de45f880397b11b84ea48e930a7b94 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 1 Aug 2017 19:05:31 +0800 Subject: [PATCH] improved sql parser. --- .../alibaba/druid/sql/ast/SQLPartition.java | 50 ++++++++++++++++++- .../alibaba/druid/sql/ast/SQLPartitionBy.java | 22 ++++++++ .../druid/sql/ast/SQLPartitionByHash.java | 11 ++++ .../druid/sql/ast/SQLPartitionByList.java | 16 ++++++ .../druid/sql/ast/SQLPartitionByRange.java | 19 +++++++ .../druid/sql/ast/SQLPartitionValue.java | 12 +++++ .../druid/sql/ast/SQLSubPartition.java | 17 +++++++ .../druid/sql/ast/SQLSubPartitionBy.java | 19 +++++++ .../druid/sql/ast/SQLSubPartitionByHash.java | 9 ++++ .../druid/sql/ast/SQLSubPartitionByList.java | 7 +++ .../druid/sql/ast/SQLSubPartitionByRange.java | 12 +++++ .../sql/ast/statement/SQLAssignItem.java | 11 ++++ .../druid/sql/ast/statement/SQLCheck.java | 6 +++ .../statement/SQLCreateTableStatement.java | 25 ++++++++++ .../sql/ast/statement/SQLPrimaryKeyImpl.java | 6 +++ .../sql/ast/statement/SQLTableElement.java | 2 +- .../druid/sql/ast/statement/SQLUnique.java | 6 +++ .../druid/sql/dialect/mysql/ast/MySqlKey.java | 12 ++++- .../dialect/mysql/ast/MySqlPrimaryKey.java | 6 +++ .../sql/dialect/mysql/ast/MySqlUnique.java | 6 +++ .../statement/MySqlCreateTableStatement.java | 34 +++++++++++++ .../ast/statement/MySqlPartitionByKey.java | 14 ++++++ .../ast/statement/MySqlSubPartitionByKey.java | 14 ++++++ .../statement/MySqlSubPartitionByList.java | 18 +++++++ .../mysql/ast/statement/MySqlTableIndex.java | 15 ++++++ .../ast/OracleSegmentAttributesImpl.java | 24 +++++++++ .../oracle/ast/stmt/OraclePrimaryKey.java | 18 +++++++ .../ast/stmt/OracleSupplementalIdKey.java | 10 ++++ .../ast/stmt/OracleSupplementalLogGrp.java | 15 ++++++ .../ast/stmt/OracleUsingIndexClause.java | 22 ++++++++ .../alibaba/druid/sql/repository/Schema.java | 10 ++++ ...eateTable_showColumns_repository_test.java | 25 +++++++++- 32 files changed, 489 insertions(+), 4 deletions(-) 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 19169341cc..831f02362b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java @@ -48,7 +48,6 @@ public class SQLPartition extends OracleSegmentAttributesImpl implements OracleS private SQLObject lobStorage; - public SQLName getName() { return name; } @@ -202,4 +201,53 @@ public class SQLPartition extends OracleSegmentAttributesImpl implements OracleS public void setSegmentCreationDeferred(boolean segmentCreationDeferred) { this.segmentCreationDeferred = segmentCreationDeferred; } + + public SQLPartition clone() { + SQLPartition x = new SQLPartition(); + + if (name != null) { + x.setName(name.clone()); + } + + if (subPartitionsCount != null) { + x.setSubPartitionsCount(subPartitionsCount.clone()); + } + + for (SQLSubPartition p : subPartitions) { + SQLSubPartition p2 = p.clone(); + p2.setParent(x); + x.subPartitions.add(p2); + } + + if (values != null) { + x.setValues(values.clone()); + } + + if (dataDirectory != null) { + x.setDataDirectory(dataDirectory.clone()); + } + if (indexDirectory != null) { + x.setDataDirectory(indexDirectory.clone()); + } + if (maxRows != null) { + x.setDataDirectory(maxRows.clone()); + } + if (minRows != null) { + x.setDataDirectory(minRows.clone()); + } + if (engine != null) { + x.setDataDirectory(engine.clone()); + } + if (comment != null) { + x.setDataDirectory(comment.clone()); + } + x.segmentCreationImmediate = segmentCreationImmediate; + x.segmentCreationDeferred = segmentCreationDeferred; + + if (lobStorage != null) { + x.setLobStorage(lobStorage.clone()); + } + + return x; + } } 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 9fa87320ef..200933c5bb 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java @@ -74,4 +74,26 @@ public abstract class SQLPartitionBy extends SQLObjectImpl { public List getStoreIn() { return storeIn; } + + public void cloneTo(SQLPartitionBy x) { + if (subPartitionBy != null) { + x.setSubPartitionBy(subPartitionBy.clone()); + } + if (partitionsCount != null) { + x.setPartitionsCount(partitionsCount.clone()); + } + x.linear = linear; + for (SQLPartition p : partitions) { + SQLPartition p2 = p.clone(); + p2.setParent(x); + x.partitions.add(p2); + } + for (SQLName name : storeIn) { + SQLName name2 = name.clone(); + name2.setParent(x); + x.storeIn.add(name2); + } + } + + public abstract SQLPartitionBy clone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java index 5e0f3339c5..2e72ab5ca3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java @@ -54,4 +54,15 @@ public class SQLPartitionByHash extends SQLPartitionBy { visitor.endVisit(this); } + public SQLPartitionByHash clone() { + SQLPartitionByHash x = new SQLPartitionByHash(); + + if (expr != null) { + x.setExpr(expr.clone()); + } + + x.key = key; + + return x; + } } 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 ded5bfa03f..d71f00d7e5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java @@ -59,4 +59,20 @@ public class SQLPartitionByList extends SQLPartitionBy { } this.columns.add(column); } + + public SQLPartitionByList clone() { + SQLPartitionByList x = new SQLPartitionByList(); + + if (expr != null) { + x.setExpr(expr.clone()); + } + + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + + return x; + } } 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 ebf50e5acb..ce5043d8f7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java @@ -79,4 +79,23 @@ public class SQLPartitionByRange extends SQLPartitionBy { visitor.endVisit(this); } + public SQLPartitionByRange clone() { + SQLPartitionByRange x = new SQLPartitionByRange(); + + if (expr != null) { + x.setExpr(expr.clone()); + } + + if (interval != null) { + x.setInterval(interval.clone()); + } + + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + + return x; + } } 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 0b017bbf99..0b71563136 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java @@ -58,4 +58,16 @@ public class SQLPartitionValue extends SQLObjectImpl { } visitor.endVisit(this); } + + public SQLPartitionValue clone() { + SQLPartitionValue x = new SQLPartitionValue(operator); + + for (SQLExpr item : items) { + SQLExpr item2 = item.clone(); + item2.setParent(x); + x.items.add(item2); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java index 2596732e4f..7846073126 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java @@ -68,4 +68,21 @@ public class SQLSubPartition extends SQLObjectImpl { visitor.endVisit(this); } + public SQLSubPartition clone() { + SQLSubPartition x = new SQLSubPartition(); + + if (name != null) { + x.setName(name.clone()); + } + + if (values != null) { + x.setValues(values.clone()); + } + + if (tableSpace != null) { + x.setTableSpace(tableSpace.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java index c1a9e6b226..6866fc1ffd 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java @@ -57,4 +57,23 @@ public abstract class SQLSubPartitionBy extends SQLObjectImpl { return subPartitionTemplate; } + public void cloneTo(SQLSubPartitionBy x) { + if (subPartitionsCount != null) { + x.setSubPartitionsCount(subPartitionsCount.clone()); + } + x.linear = linear; + for (SQLAssignItem option : options) { + SQLAssignItem option2 = option.clone(); + option2.setParent(x); + x.options.add(option2); + } + + for (SQLSubPartition p : subPartitionTemplate) { + SQLSubPartition p2 = p.clone(); + p2.setParent(x); + x.subPartitionTemplate.add(p2); + } + } + + public abstract SQLSubPartitionBy clone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java index ed1f0b09b8..6012382b5e 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java @@ -52,4 +52,13 @@ public class SQLSubPartitionByHash extends SQLSubPartitionBy { this.key = key; } + public SQLSubPartitionByHash clone() { + SQLSubPartitionByHash x = new SQLSubPartitionByHash(); + if (expr != null) { + x.setExpr(expr.clone()); + } + x.key = key; + return x; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java index 053ea61ca9..432b747c5c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java @@ -41,4 +41,11 @@ public class SQLSubPartitionByList extends SQLSubPartitionBy { this.column = column; } + public SQLSubPartitionByList clone() { + SQLSubPartitionByList x = new SQLSubPartitionByList(); + if (column != null) { + x.setColumn(column.clone()); + } + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java index 44a903f8c5..c3cbf0d7df 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java @@ -31,4 +31,16 @@ public class SQLSubPartitionByRange extends SQLSubPartitionBy { protected void accept0(SQLASTVisitor visitor) { } + + public SQLSubPartitionByRange clone() { + SQLSubPartitionByRange x = new SQLSubPartitionByRange(); + + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAssignItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAssignItem.java index 95d632acc9..6c4e5990f4 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAssignItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAssignItem.java @@ -33,6 +33,17 @@ public class SQLAssignItem extends SQLObjectImpl implements SQLReplaceable { setValue(value); } + public SQLAssignItem clone() { + SQLAssignItem x = new SQLAssignItem(); + if (target != null) { + x.setTarget(target.clone()); + } + if (value != null) { + x.setValue(value.clone()); + } + return x; + } + public SQLExpr getTarget() { return target; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java index 28340a3002..7856c11871 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCheck.java @@ -57,4 +57,10 @@ public class SQLCheck extends SQLConstraintImpl implements SQLTableElement { expr = expr.clone(); } } + + public SQLCheck clone() { + SQLCheck x = new SQLCheck(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 6ea42fb5a5..856e1b1563 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -737,4 +737,29 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return -1; } + + public void cloneTo(SQLCreateTableStatement x) { + x.ifNotExiists = ifNotExiists; + x.type = type; + if (tableSource != null) { + x.setTableSource(tableSource.clone()); + } + for (SQLTableElement e : tableElementList) { + SQLTableElement e2 = e.clone(); + e2.setParent(x); + x.tableElementList.add(e2); + } + if (inherits != null) { + x.setInherits(inherits.clone()); + } + if (select != null) { + x.setSelect(select.clone()); + } + } + + public SQLCreateTableStatement clone() { + SQLCreateTableStatement x = new SQLCreateTableStatement(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKeyImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKeyImpl.java index 06be6766dd..1c0c3b934a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKeyImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKeyImpl.java @@ -27,4 +27,10 @@ public class SQLPrimaryKeyImpl extends SQLUnique implements SQLPrimaryKey { } visitor.endVisit(this); } + + public SQLPrimaryKeyImpl clone() { + SQLPrimaryKeyImpl x = new SQLPrimaryKeyImpl(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableElement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableElement.java index 48d9d356c0..514bc2dbe7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableElement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableElement.java @@ -18,5 +18,5 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLObject; public interface SQLTableElement extends SQLObject { - + SQLTableElement clone(); } 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 089bb5f033..1bb0a11044 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 @@ -72,6 +72,12 @@ public class SQLUnique extends SQLConstraintImpl implements SQLUniqueConstraint, } } + public SQLUnique clone() { + SQLUnique x = new SQLUnique(); + cloneTo(x); + return x; + } + public void simplify() { super.simplify(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlKey.java index 4a39b861b4..fc6e7caec8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlKey.java @@ -25,7 +25,6 @@ import com.alibaba.druid.util.JdbcConstants; public class MySqlKey extends SQLUnique implements SQLUniqueConstraint, SQLTableConstraint { - private String indexType; private boolean hasConstaint; @@ -66,4 +65,15 @@ public class MySqlKey extends SQLUnique implements SQLUniqueConstraint, SQLTable this.hasConstaint = hasConstaint; } + public void cloneTo(MySqlKey x) { + super.cloneTo(x); + x.indexType = indexType; + x.hasConstaint = hasConstaint; + } + + public MySqlKey clone() { + MySqlKey x = new MySqlKey(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java index c3c1e21d8d..03975863b8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlPrimaryKey.java @@ -32,4 +32,10 @@ public class MySqlPrimaryKey extends MySqlKey implements SQLPrimaryKey { } visitor.endVisit(this); } + + public MySqlPrimaryKey clone() { + MySqlPrimaryKey x = new MySqlPrimaryKey(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlUnique.java index 5bf3de6633..7e60bc7933 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlUnique.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlUnique.java @@ -31,4 +31,10 @@ public class MySqlUnique extends MySqlKey { } visitor.endVisit(this); } + + public MySqlUnique clone() { + MySqlUnique x = new MySqlUnique(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index d0a5356697..08c805d9b4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -342,4 +342,38 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement public void output(StringBuffer buf) { this.accept(new MySqlOutputVisitor(buf)); } + + public void cloneTo(MySqlCreateTableStatement x) { + super.cloneTo(x); + for (Map.Entry entry : tableOptions.entrySet()) { + SQLObject obj = entry.getValue().clone(); + obj.setParent(x); + x.tableOptions.put(entry.getKey(), obj); + } + if (partitioning != null) { + x.setPartitioning(partitioning.clone()); + } + for (SQLCommentHint hint : hints) { + SQLCommentHint h2 = hint.clone(); + h2.setParent(x); + x.hints.add(h2); + } + for (SQLCommentHint hint : optionHints) { + SQLCommentHint h2 = hint.clone(); + h2.setParent(x); + x.optionHints.add(h2); + } + if (like != null) { + x.setLike(like.clone()); + } + if (tableGroup != null) { + x.setTableGroup(tableGroup.clone()); + } + } + + public MySqlCreateTableStatement clone() { + MySqlCreateTableStatement x = new MySqlCreateTableStatement(); + cloneTo(x); + return x; + } } 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 725b428f59..247f0efcb8 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 @@ -59,4 +59,18 @@ public class MySqlPartitionByKey extends SQLPartitionBy implements MySqlObject { this.columns.add(column); } + public void cloneTo(MySqlPartitionByKey x) { + super.cloneTo(x); + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + } + + public MySqlPartitionByKey clone() { + MySqlPartitionByKey x = new MySqlPartitionByKey(); + cloneTo(x); + return x; + } } 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 ab0b34bec6..9d7734f988 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 @@ -57,4 +57,18 @@ public class MySqlSubPartitionByKey extends SQLSubPartitionBy implements MySqlOb this.columns.add(column); } + public void cloneTo(MySqlSubPartitionByKey x) { + super.cloneTo(x); + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + } + + public MySqlSubPartitionByKey clone() { + MySqlSubPartitionByKey x = new MySqlSubPartitionByKey(); + cloneTo(x); + return x; + } } 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 f5a3153fa0..c701302786 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 @@ -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.SQLSubPartitionBy; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; @@ -72,4 +73,21 @@ public class MySqlSubPartitionByList extends SQLSubPartitionBy implements MySqlO this.columns.add(column); } + public void cloneTo(MySqlSubPartitionByList x) { + super.cloneTo(x); + if (expr != null) { + x.setExpr(expr.clone()); + } + for (SQLColumnDefinition column : columns) { + SQLColumnDefinition c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + } + + public MySqlSubPartitionByList clone() { + MySqlSubPartitionByList x = new MySqlSubPartitionByList(); + cloneTo(x); + return x; + } } 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 ef576083a3..3c9f70714d 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 @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; @@ -69,4 +70,18 @@ public class MySqlTableIndex extends MySqlObjectImpl implements SQLTableElement } visitor.endVisit(this); } + + public MySqlTableIndex clone() { + MySqlTableIndex x = new MySqlTableIndex(); + if (name != null) { + x.setName(name.clone()); + } + x.indexType = indexType; + for (SQLSelectOrderByItem column : columns) { + SQLSelectOrderByItem c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSegmentAttributesImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSegmentAttributesImpl.java index 08328db941..02d1cd2987 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSegmentAttributesImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSegmentAttributesImpl.java @@ -146,4 +146,28 @@ public abstract class OracleSegmentAttributesImpl extends SQLObjectImpl implemen public void setCompressForOltp(boolean compressForOltp) { this.compressForOltp = compressForOltp; } + + public void cloneTo(OracleSegmentAttributesImpl x) { + x.pctfree = pctfree; + x.pctused = pctused; + x.initrans = initrans; + + x.maxtrans = maxtrans; + x.pctincrease = pctincrease; + x.freeLists = freeLists; + x.compress = compress; + x.compressLevel = compressLevel; + x.compressForOltp = compressForOltp; + x.pctthreshold = pctthreshold; + + x.logging = logging; + + if (tablespace != null) { + x.setTablespace(tablespace.clone()); + } + + if (storage != null) { + x.setStorage(storage.clone()); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java index fab1f3b127..1db958d398 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java @@ -96,4 +96,22 @@ public class OraclePrimaryKey extends SQLPrimaryKeyImpl implements OracleConstra this.initially = initially; } + public void cloneTo(OraclePrimaryKey x) { + super.cloneTo(x); + if (using != null) { + x.setUsing(using.clone()); + } + if (exceptionsInto != null) { + x.setExceptionsInto(exceptionsInto.clone()); + } + x.enable = enable; + x.initially = initially; + x.deferrable = deferrable; + } + + public OraclePrimaryKey clone() { + OraclePrimaryKey x = new OraclePrimaryKey(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalIdKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalIdKey.java index 8acc62d165..108ede3384 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalIdKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalIdKey.java @@ -75,4 +75,14 @@ public class OracleSupplementalIdKey extends OracleSQLObjectImpl implements SQLT public void setUniqueIndex(boolean uniqueIndex) { this.uniqueIndex = uniqueIndex; } + + public OracleSupplementalIdKey clone() { + OracleSupplementalIdKey x = new OracleSupplementalIdKey(); + x.all = all; + x.primaryKey = primaryKey; + x.unique = unique; + x.uniqueIndex = uniqueIndex; + x.foreignKey = foreignKey; + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalLogGrp.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalLogGrp.java index ccddb62d1d..c9a838c88e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalLogGrp.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSupplementalLogGrp.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -69,4 +70,18 @@ public class OracleSupplementalLogGrp extends OracleSQLObjectImpl implements SQL public void setAlways(boolean always) { this.always = always; } + + public OracleSupplementalLogGrp clone() { + OracleSupplementalLogGrp x = new OracleSupplementalLogGrp(); + if (group != null) { + x.setGroup(group.clone()); + } + for (SQLName column : columns) { + SQLName c2 = column.clone(); + c2.setParent(x); + x.columns.add(c2); + } + x.always = always; + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUsingIndexClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUsingIndexClause.java index 3c75ecbf91..a6fe90d9e9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUsingIndexClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUsingIndexClause.java @@ -92,4 +92,26 @@ public class OracleUsingIndexClause extends OracleSegmentAttributesImpl implemen public List getLocalPartitionIndex() { return localPartitionIndex; } + + public void cloneTo(OracleUsingIndexClause x) { + super.cloneTo(x); + if (index != null) { + x.setIndex(index.clone()); + } + x.enable = enable; + x.computeStatistics = computeStatistics; + x.reverse = reverse; + + for (SQLPartition p : localPartitionIndex) { + SQLPartition p2 = p.clone(); + p2.setParent(x); + x.localPartitionIndex.add(p2); + } + } + + public OracleUsingIndexClause clone() { + OracleUsingIndexClause x = new OracleUsingIndexClause(); + cloneTo(x); + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/repository/Schema.java b/src/main/java/com/alibaba/druid/sql/repository/Schema.java index d9693d7a7b..91e6078a8e 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/Schema.java +++ b/src/main/java/com/alibaba/druid/sql/repository/Schema.java @@ -214,6 +214,16 @@ public class Schema { } public boolean visit(MySqlCreateTableStatement x) { + SQLExprTableSource like = x.getLike(); + if (like != null) { + SchemaObject table = repository.findTable((SQLName) like.getExpr()); + if (table != null) { + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement) table.getStatement(); + MySqlCreateTableStatement stmtCloned = stmt.clone(); + stmtCloned.setName(x.getName().clone()); + return visit((SQLCreateTableStatement) stmtCloned); + } + } visit((SQLCreateTableStatement) x); return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java index cdbe851a2b..75d929fb2a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlCreateTable_showColumns_repository_test.java @@ -276,7 +276,7 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" + "\t`c_longblob` longblob COMMENT 'longblob',\n" + "\tKEY `k_c` (`c_tinyint`, `c_int`)\n" + - ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'", createTableStmt.toString()); + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'", repository.console("show create table test1")); assertEquals("+--------------+--------------+------+-----+---------------------+-----------------------------+\n" + "| Field | Type | Null | Key | Default | Extra |\n" + @@ -299,5 +299,28 @@ public class MySqlCreateTable_showColumns_repository_test extends MysqlTest { "| c_mediumtext | mediumtext | NO | | NULL | |\n" + "| c_longblob | longblob | NO | | NULL | |\n" + "+--------------+--------------+------+-----+---------------------+-----------------------------+\n", repository.console("show columns from test1")); + + repository.console("CREATE TABLE test2 like test1"); + + assertEquals("CREATE TABLE test2 (\n" + + "\tc_decimal_1 INT(11) NOT NULL DEFAULT NULL,\n" + + "\t`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',\n" + + "\t`c_tinyint` tinyint(4) DEFAULT '1' COMMENT 'tinyint',\n" + + "\t`c_smallint` smallint(6) DEFAULT 0 COMMENT 'smallint',\n" + + "\t`c_mediumint` mediumint(9) DEFAULT NULL COMMENT 'mediumint',\n" + + "\t`c_int` int(11) DEFAULT NULL COMMENT 'int',\n" + + "\t`c_bigint` bigint(20) DEFAULT NULL COMMENT 'bigint',\n" + + "\t`c_date` date DEFAULT '0000-00-00' COMMENT 'date',\n" + + "\t`c_datetime` datetime DEFAULT '0000-00-00 00:00:00' COMMENT 'datetime',\n" + + "\t`c_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'timestamp',\n" + + "\t`c_time` time DEFAULT NULL COMMENT 'time',\n" + + "\t`c_char` char(10) DEFAULT NULL COMMENT 'char',\n" + + "\t`c_varchar` varchar(10) DEFAULT 'hello' COMMENT 'varchar',\n" + + "\t`c_blob` blob COMMENT 'blob',\n" + + "\t`c_text` text COMMENT 'text',\n" + + "\t`c_mediumtext` mediumtext COMMENT 'mediumtext',\n" + + "\t`c_longblob` longblob COMMENT 'longblob',\n" + + "\tKEY `k_c` (`c_tinyint`, `c_int`)\n" + + ") ENGINE = InnoDB AUTO_INCREMENT = 1769503 CHARSET = utf8mb4 COMMENT = '10000000'", repository.console("show create table test2")); } }