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 05d3b5d761..801502f049 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 @@ -33,10 +33,20 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen private final List constaints = new ArrayList(0); private String comment; + private Boolean enable; + public SQLColumnDefinition(){ } + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + public SQLName getName() { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKey.java index 85c8ddfd09..5664a5a466 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLPrimaryKey.java @@ -15,6 +15,6 @@ */ package com.alibaba.druid.sql.ast.statement; -public interface SQLPrimaryKey extends SQLUniqueConstraint { +public interface SQLPrimaryKey extends SQLUniqueConstraint, SQLTableElement { } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java index 05d931b156..b013dfdca6 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java @@ -25,5 +25,6 @@ public class SQLTruncateStatement extends SQLStatementImpl { if (visitor.visit(this)) { acceptChild(visitor, tableNames); } + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java index 2a1200ee69..491a732ab5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java @@ -77,4 +77,27 @@ public abstract class FlashbackQueryClause extends OracleSQLObjectImpl { visitor.endVisit(this); } } + + public static class AsOfSnapshotClause extends FlashbackQueryClause { + + private static final long serialVersionUID = 1L; + + private SQLExpr expr; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + this.expr = expr; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + } + visitor.endVisit(this); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java new file mode 100644 index 0000000000..74b7abbbcf --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleStorageClause.java @@ -0,0 +1,60 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.clause; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleStorageClause extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr initial; + private SQLExpr freeLists; + private SQLExpr freeListGroups; + private SQLExpr bufferPool; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, initial); + acceptChild(visitor, freeLists); + acceptChild(visitor, freeListGroups); + acceptChild(visitor, bufferPool); + } + visitor.endVisit(this); + } + + public SQLExpr getInitial() { + return initial; + } + + public void setInitial(SQLExpr initial) { + this.initial = initial; + } + + public SQLExpr getFreeLists() { + return freeLists; + } + + public void setFreeLists(SQLExpr freeLists) { + this.freeLists = freeLists; + } + + public SQLExpr getFreeListGroups() { + return freeListGroups; + } + + public void setFreeListGroups(SQLExpr freeListGroups) { + this.freeListGroups = freeListGroups; + } + + public SQLExpr getBufferPool() { + return bufferPool; + } + + public void setBufferPool(SQLExpr bufferPool) { + this.bufferPool = bufferPool; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java new file mode 100644 index 0000000000..b5b5692cc9 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java @@ -0,0 +1,51 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.expr; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleSizeExpr extends OracleSQLObjectImpl implements OracleExpr { + + private static final long serialVersionUID = 1L; + + private SQLExpr value; + private Unit unit; + + public OracleSizeExpr(){ + + } + + public OracleSizeExpr(SQLExpr value, Unit unit){ + super(); + this.value = value; + this.unit = unit; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, value); + } + visitor.endVisit(this); + } + + public SQLExpr getValue() { + return value; + } + + public void setValue(SQLExpr value) { + this.value = value; + } + + public Unit getUnit() { + return unit; + } + + public void setUnit(Unit unit) { + this.unit = unit; + } + + public static enum Unit { + K, M, G, T, P, E + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterIndexStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterIndexStatement.java index e86c5a0fc6..40977f26b7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterIndexStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterIndexStatement.java @@ -12,6 +12,8 @@ public class OracleAlterIndexStatement extends OracleStatementImpl { private SQLName name; + private SQLName renameTo; + private boolean compile; private Boolean enable; @@ -26,12 +28,21 @@ public class OracleAlterIndexStatement extends OracleStatementImpl { public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, name); + acceptChild(visitor, renameTo); acceptChild(visitor, rebuild); acceptChild(visitor, parallel); } visitor.endVisit(this); } + public SQLName getRenameTo() { + return renameTo; + } + + public void setRenameTo(SQLName renameTo) { + this.renameTo = renameTo; + } + public SQLExpr getParallel() { return parallel; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterSynonymStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterSynonymStatement.java new file mode 100644 index 0000000000..ba2f016918 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterSynonymStatement.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterSynonymStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private Boolean enable; + + private boolean compile; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public boolean isCompile() { + return compile; + } + + public void setCompile(boolean compile) { + this.compile = compile; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddColumn.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddColumn.java index 4db1ab694c..6dce9bbbe3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddColumn.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddColumn.java @@ -1,28 +1,31 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleAlterTableAddColumn extends OracleAlterTableItem { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private SQLColumnDefinition column; + private List columns = new ArrayList(); @Override public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, column); + acceptChild(visitor, columns); } visitor.endVisit(this); } - public SQLColumnDefinition getColumn() { - return column; + public List getColumns() { + return columns; } - public void setColumn(SQLColumnDefinition column) { - this.column = column; + public void setColumns(List columns) { + this.columns = columns; } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableMoveTablespace.java similarity index 54% rename from src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java rename to src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableMoveTablespace.java index 95e774c000..cb88604c53 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableMoveTablespace.java @@ -1,15 +1,21 @@ -package com.alibaba.druid.sql.dialect.oracle.ast.clause; +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; -import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -public class StorageItem extends OracleSQLObjectImpl { +public class OracleAlterTableMoveTablespace extends OracleAlterTableItem { private static final long serialVersionUID = 1L; + private SQLName name; - private SQLExpr value; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } public SQLName getName() { return name; @@ -19,21 +25,4 @@ public class StorageItem extends OracleSQLObjectImpl { this.name = name; } - public SQLExpr getValue() { - return value; - } - - public void setValue(SQLExpr value) { - this.value = value; - } - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, name); - acceptChild(visitor, value); - } - visitor.endVisit(this); - } - } 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 index b5c5bc3ba7..fc121a21ae 100644 --- 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 @@ -8,9 +8,12 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleAlterTableStatement extends OracleStatementImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; private SQLName name; - private List items = new ArrayList(); + private List items = new ArrayList(); + + private boolean updateGlobalIndexes = false; + private boolean invalidateGlobalIndexes = false; @Override public void accept0(OracleASTVisitor visitor) { @@ -21,6 +24,22 @@ public class OracleAlterTableStatement extends OracleStatementImpl { 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; + } + public SQLName getName() { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceAddDataFile.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceAddDataFile.java new file mode 100644 index 0000000000..3d116cbf6e --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceAddDataFile.java @@ -0,0 +1,31 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTablespaceAddDataFile extends OracleSQLObjectImpl implements OracleAlterTablespaceItem { + + private static final long serialVersionUID = 1L; + + private List files = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, files); + } + visitor.endVisit(this); + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceItem.java new file mode 100644 index 0000000000..fc87073035 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceItem.java @@ -0,0 +1,8 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; + + +public interface OracleAlterTablespaceItem extends OracleSQLObject { + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceStatement.java new file mode 100644 index 0000000000..1ce1e9fcd2 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTablespaceStatement.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTablespaceStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + private OracleAlterTablespaceItem item; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, item); + } + visitor.endVisit(this); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public OracleAlterTablespaceItem getItem() { + return item; + } + + public void setItem(OracleAlterTablespaceItem item) { + this.item = item; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTriggerStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTriggerStatement.java new file mode 100644 index 0000000000..ca52fdd51b --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTriggerStatement.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTriggerStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private Boolean enable; + + private boolean compile; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + public boolean isCompile() { + return compile; + } + + public void setCompile(boolean compile) { + this.compile = compile; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterViewStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterViewStatement.java new file mode 100644 index 0000000000..f7348bce11 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterViewStatement.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterViewStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private Boolean enable; + + private boolean compile; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public boolean isCompile() { + return compile; + } + + public void setCompile(boolean compile) { + this.compile = compile; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateIndexStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateIndexStatement.java index 01f2f3208e..2bddbeb7a5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateIndexStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateIndexStatement.java @@ -3,25 +3,48 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; 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.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleCreateIndexStatement extends OracleStatementImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; private SQLName name; private SQLName table; - private List items = new ArrayList(); + private List items = new ArrayList(); private SQLName tablespace; private Type type; - private boolean online = false; + private boolean online = false; + + private boolean indexOnlyTopLevel = false; + + private boolean noParallel; + + private SQLExpr parallel; + + public SQLExpr getParallel() { + return parallel; + } + + public void setParallel(SQLExpr parallel) { + this.parallel = parallel; + } + + public boolean isNoParallel() { + return noParallel; + } + + public void setNoParallel(boolean noParallel) { + this.noParallel = noParallel; + } public Type getType() { return type; @@ -31,6 +54,14 @@ public class OracleCreateIndexStatement extends OracleStatementImpl { this.type = type; } + public boolean isIndexOnlyTopLevel() { + return indexOnlyTopLevel; + } + + public void setIndexOnlyTopLevel(boolean indexOnlyTopLevel) { + this.indexOnlyTopLevel = indexOnlyTopLevel; + } + @Override public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { @@ -38,6 +69,7 @@ public class OracleCreateIndexStatement extends OracleStatementImpl { acceptChild(visitor, table); acceptChild(visitor, items); acceptChild(visitor, tablespace); + acceptChild(visitor, parallel); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index 169d142ec7..0726b5c3bc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -3,29 +3,114 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; 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.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class OracleCreateTableStatement extends SQLCreateTableStatement implements OracleStatement { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private SQLName tablespace; + private SQLName tablespace; - private SQLSelect select; + private SQLSelect select; - private boolean inMemoryMetadata; + private boolean inMemoryMetadata; - private boolean cursorSpecificSegment; + private boolean cursorSpecificSegment; // NOPARALLEL - private Boolean parallel; + private Boolean parallel; - private List storage = new ArrayList(); + private OracleStorageClause storage; + + private boolean organizationIndex = false; + + private SQLExpr ptcfree; + private SQLExpr pctused; + private SQLExpr initrans; + private SQLExpr maxtrans; + + private Boolean logging; + private Boolean compress; + private boolean onCommit; + private boolean preserveRows; + + public boolean isOnCommit() { + return onCommit; + } + + public void setOnCommit(boolean onCommit) { + this.onCommit = onCommit; + } + + public boolean isPreserveRows() { + return preserveRows; + } + + public void setPreserveRows(boolean preserveRows) { + this.preserveRows = preserveRows; + } + + public Boolean getLogging() { + return logging; + } + + public void setLogging(Boolean logging) { + this.logging = logging; + } + + public Boolean getCompress() { + return compress; + } + + public void setCompress(Boolean compress) { + this.compress = compress; + } + + public SQLExpr getPtcfree() { + return ptcfree; + } + + public void setPtcfree(SQLExpr ptcfree) { + this.ptcfree = ptcfree; + } + + public SQLExpr getPctused() { + return pctused; + } + + public void setPctused(SQLExpr pctused) { + this.pctused = pctused; + } + + public SQLExpr getInitrans() { + return initrans; + } + + public void setInitrans(SQLExpr initrans) { + this.initrans = initrans; + } + + public SQLExpr getMaxtrans() { + return maxtrans; + } + + public void setMaxtrans(SQLExpr maxtrans) { + this.maxtrans = maxtrans; + } + + public boolean isOrganizationIndex() { + return organizationIndex; + } + + public void setOrganizationIndex(boolean organizationIndex) { + this.organizationIndex = organizationIndex; + } public Boolean getParallel() { return parallel; @@ -71,11 +156,11 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen accept0((OracleASTVisitor) visitor); } - public List getStorage() { + public OracleStorageClause getStorage() { return storage; } - public void setStorage(List storage) { + public void setStorage(OracleStorageClause storage) { this.storage = storage; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleFileSpecification.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleFileSpecification.java new file mode 100644 index 0000000000..b9d94ca930 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleFileSpecification.java @@ -0,0 +1,64 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleFileSpecification extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + + private List fileNames = new ArrayList(); + + private SQLExpr size; + + private boolean autoExtendOff = false; + + private SQLExpr autoExtendOn; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, fileNames); + acceptChild(visitor, size); + acceptChild(visitor, autoExtendOn); + } + visitor.endVisit(this); + } + + public SQLExpr getAutoExtendOn() { + return autoExtendOn; + } + + public void setAutoExtendOn(SQLExpr autoExtendOn) { + this.autoExtendOn = autoExtendOn; + } + + public SQLExpr getSize() { + return size; + } + + public void setSize(SQLExpr size) { + this.size = size; + } + + public boolean isAutoExtendOff() { + return autoExtendOff; + } + + public void setAutoExtendOff(boolean autoExtendOff) { + this.autoExtendOff = autoExtendOff; + } + + public List getFileNames() { + return fileNames; + } + + public void setFileNames(List fileNames) { + this.fileNames = fileNames; + } + +} 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 fe1dd1ec10..028eff1b52 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 @@ -6,10 +6,11 @@ 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.SQLPrimaryKey; +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; -public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey { +public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey, SQLTableElement { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java index 7a319ee4f8..7552609285 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleTruncateStatement.java @@ -8,11 +8,26 @@ public class OracleTruncateStatement extends SQLTruncateStatement implements Ora private static final long serialVersionUID = 1L; + private boolean purgeSnapshotLog = false; + @Override protected void accept0(SQLASTVisitor visitor) { this.accept0((OracleASTVisitor) visitor); } - public void accept0(OracleASTVisitor visitor) { + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, tableNames); + } + visitor.endVisit(this); } + + public boolean isPurgeSnapshotLog() { + return purgeSnapshotLog; + } + + public void setPurgeSnapshotLog(boolean purgeSnapshotLog) { + this.purgeSnapshotLog = purgeSnapshotLog; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateStatement.java index 80dbf0702b..46d147bbc0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUpdateStatement.java @@ -33,10 +33,29 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS private String alias; private SQLExpr where; + private List returning = new ArrayList(); + private List returningInto = new ArrayList(); + public OracleUpdateStatement(){ } + public List getReturning() { + return returning; + } + + public void setReturning(List returning) { + this.returning = returning; + } + + public List getReturningInto() { + return returningInto; + } + + public void setReturningInto(List returningInto) { + this.returningInto = returningInto; + } + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor instanceof OracleASTVisitor) { @@ -53,6 +72,8 @@ public class OracleUpdateStatement extends SQLUpdateStatement implements OracleS acceptChild(visitor, tableSource); acceptChild(visitor, items); acceptChild(visitor, where); + acceptChild(visitor, returning); + acceptChild(visitor, returningInto); } visitor.endVisit(this); 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 dee5e835c9..a04aba09cb 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 @@ -1,6 +1,6 @@ package com.alibaba.druid.sql.dialect.oracle.parser; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.parser.Lexer; @@ -31,6 +31,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser { if (identifierEquals("TABLESPACE")) { lexer.nextToken(); stmt.setTablespace(this.exprParser.name()); + continue; } else if (identifierEquals("IN_MEMORY_METADATA")) { lexer.nextToken(); stmt.setInMemoryMetadata(true); @@ -43,21 +44,74 @@ public class OracleCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); stmt.setParallel(false); continue; + } else if (identifierEquals("LOGGING")) { + lexer.nextToken(); + stmt.setLogging(Boolean.TRUE); + continue; + } else if (identifierEquals("NOCOMPRESS")) { + lexer.nextToken(); + stmt.setCompress(Boolean.FALSE); + continue; + } else if (lexer.token() == Token.ON) { + lexer.nextToken(); + accept(Token.COMMIT); + stmt.setOnCommit(true); + continue; + } else if (identifierEquals("PRESERVE")) { + lexer.nextToken(); + acceptIdentifier("ROWS"); + stmt.setPreserveRows(true); + continue; } else if (identifierEquals("STORAGE")) { lexer.nextToken(); accept(Token.LPAREN); + OracleStorageClause storage = new OracleStorageClause(); for (;;) { - if (lexer.token() == Token.IDENTIFIER) { - StorageItem item = new StorageItem(); - item.setName(this.exprParser.name()); - item.setValue(this.exprParser.expr()); - stmt.getStorage().add(item); - } else { - break; + if (identifierEquals("INITIAL")) { + lexer.nextToken(); + storage.setInitial(this.exprParser.expr()); + continue; + } else if (identifierEquals("FREELISTS")) { + lexer.nextToken(); + storage.setFreeLists(this.exprParser.expr()); + continue; + } else if (identifierEquals("FREELIST")) { + lexer.nextToken(); + acceptIdentifier("GROUPS"); + storage.setFreeListGroups(this.exprParser.expr()); + continue; + } else if (identifierEquals("BUFFER_POOL")) { + lexer.nextToken(); + storage.setBufferPool(this.exprParser.expr()); + continue; } + + break; } accept(Token.RPAREN); + stmt.setStorage(storage); + continue; + } else if (identifierEquals("organization")) { + lexer.nextToken(); + accept(Token.INDEX); + stmt.setOrganizationIndex(true); + continue; + } else if (identifierEquals("PCTFREE")) { + lexer.nextToken(); + stmt.setPtcfree(this.exprParser.expr()); + continue; + } else if (identifierEquals("PCTUSED")) { + lexer.nextToken(); + stmt.setPctused(this.exprParser.expr()); + continue; + } else if (identifierEquals("INITRANS")) { + lexer.nextToken(); + stmt.setInitrans(this.exprParser.expr()); + continue; + } else if (identifierEquals("MAXTRANS")) { + lexer.nextToken(); + stmt.setMaxtrans(this.exprParser.expr()); continue; } break; 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 2063761f7f..1b291f8716 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 @@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; @@ -51,9 +52,11 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalType; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; @@ -65,6 +68,11 @@ public class OracleExprParser extends SQLExprParser { + + + + + public boolean allowStringAdditive = false; /** @@ -266,6 +274,32 @@ public class OracleExprParser extends SQLExprParser { } public SQLExpr primaryRest(SQLExpr expr) throws ParserException { + if (lexer.token() == Token.IDENTIFIER) { + String ident = lexer.stringVal(); + if (ident.length() == 1) { + char unit = ident.charAt(0); + switch (unit) { + case 'K': + case 'M': + case 'G': + case 'T': + case 'P': + case 'E': + case 'k': + case 'm': + case 'g': + case 't': + case 'p': + case 'e': + expr = new OracleSizeExpr(expr, OracleSizeExpr.Unit.valueOf(ident.toUpperCase())); + lexer.nextToken(); + break; + default: + break; + } + } + } + if (lexer.token() == Token.DOTDOT) { lexer.nextToken(); SQLExpr upBound = expr(); @@ -731,4 +765,33 @@ public class OracleExprParser extends SQLExprParser { return expr; } + + public OraclePrimaryKey parsePrimaryKey() { + lexer.nextToken(); + accept(Token.KEY); + + OraclePrimaryKey primaryKey = new OraclePrimaryKey(); + accept(Token.LPAREN); + exprList(primaryKey.getColumns()); + accept(Token.RPAREN); + + + if (lexer.token() == Token.USING) { + lexer.nextToken(); + accept(Token.INDEX); + primaryKey.setUsingIndex(expr()); + } + return primaryKey; + } + + public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { + column = super.parseColumnRest(column); + + if (identifierEquals("ENABLE")) { + lexer.nextToken(); + column.setEnable(Boolean.TRUE); + } + + return column; + } } 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 f11aff84ae..d77fb75b71 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 @@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; @@ -824,17 +825,31 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.OF) { lexer.nextToken(); - AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause(); + if (identifierEquals("SCN")) { + AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause(); clause.setType(AsOfFlashbackQueryClause.Type.SCN); lexer.nextToken(); + clause.setExpr(createExprParser().expr()); + + return clause; + } else if (identifierEquals("SNAPSHOT")) { + lexer.nextToken(); + accept(Token.LPAREN); + AsOfSnapshotClause clause = new AsOfSnapshotClause(); + clause.setExpr(this.expr()); + accept(Token.RPAREN); + + return clause; } else { + AsOfFlashbackQueryClause clause = new AsOfFlashbackQueryClause(); accept(Token.TIMESTAMP); clause.setType(AsOfFlashbackQueryClause.Type.TIMESTAMP); + clause.setExpr(createExprParser().expr()); + + return clause; } - clause.setExpr(createExprParser().expr()); - return clause; } return null; 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 b96b286c03..5c9165f9d5 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 @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLConstaint; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; @@ -39,11 +40,13 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem; 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.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; @@ -51,6 +54,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit 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; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; @@ -58,6 +65,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; @@ -69,9 +77,9 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.Lo import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLStatementParser; @@ -426,8 +434,27 @@ public class OracleStatementParser extends SQLStatementParser { return stmt; } - public SQLStatement parseTruncate() { - return super.parseTruncate(); + public OracleTruncateStatement parseTruncate() { + accept(Token.TRUNCATE); + accept(Token.TABLE); + OracleTruncateStatement stmt = new OracleTruncateStatement(); + + SQLName name = this.exprParser.name(); + stmt.getTableNames().add(name); + + if (identifierEquals("PURGE")) { + lexer.nextToken(); + + if (identifierEquals("SNAPSHOT")) { + lexer.nextToken(); + accept(Token.LOG); + stmt.setPurgeSnapshotLog(true); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + return stmt; } public OracleStatement parserAlter() { @@ -466,6 +493,12 @@ public class OracleStatementParser extends SQLStatementParser { OracleAlterIndexStatement stmt = new OracleAlterIndexStatement(); stmt.setName(this.exprParser.name()); + if (identifierEquals("RENAME")) { + lexer.nextToken(); + accept(Token.TO); + stmt.setRenameTo(this.exprParser.name()); + } + for (;;) { if (identifierEquals("rebuild")) { lexer.nextToken(); @@ -485,6 +518,141 @@ public class OracleStatementParser extends SQLStatementParser { break; } + return stmt; + } else if (identifierEquals("TRIGGER")) { + lexer.nextToken(); + OracleAlterTriggerStatement stmt = new OracleAlterTriggerStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ENABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (identifierEquals("DISABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (identifierEquals("SYNONYM")) { + lexer.nextToken(); + OracleAlterSynonymStatement stmt = new OracleAlterSynonymStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ENABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (identifierEquals("DISABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (lexer.token() == Token.VIEW) { + lexer.nextToken(); + OracleAlterViewStatement stmt = new OracleAlterViewStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ENABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.TRUE); + continue; + } else if (identifierEquals("DISABLE")) { + lexer.nextToken(); + stmt.setEnable(Boolean.FALSE); + continue; + } else if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + continue; + } + break; + } + + return stmt; + } else if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + + OracleAlterTablespaceStatement stmt = new OracleAlterTablespaceStatement(); + stmt.setName(this.exprParser.name()); + + if (identifierEquals("ADD")) { + lexer.nextToken(); + + if (identifierEquals("DATAFILE")) { + lexer.nextToken(); + + OracleAlterTablespaceAddDataFile item = new OracleAlterTablespaceAddDataFile(); + + for (;;) { + OracleFileSpecification file = new OracleFileSpecification(); + + for (;;) { + SQLExpr fileName = this.exprParser.expr(); + file.getFileNames().add(fileName); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + if (identifierEquals("SIZE")) { + lexer.nextToken(); + file.setSize(this.exprParser.expr()); + } + + if (identifierEquals("AUTOEXTEND")) { + lexer.nextToken(); + if (identifierEquals("OFF")) { + lexer.nextToken(); + file.setAutoExtendOff(true); + } else if (identifierEquals("ON")) { + lexer.nextToken(); + file.setAutoExtendOn(this.exprParser.expr()); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + item.getFiles().add(file); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + stmt.setItem(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + return stmt; } @@ -502,11 +670,19 @@ public class OracleStatementParser extends SQLStatementParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - SQLColumnDefinition columnDef = this.exprParser.parseColumn(); - accept(Token.RPAREN); OracleAlterTableAddColumn item = new OracleAlterTableAddColumn(); - item.setColumn(columnDef); + + for (;;) { + SQLColumnDefinition columnDef = this.exprParser.parseColumn(); + item.getColumns().add(columnDef); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); stmt.getItems().add(item); } else if (lexer.token() == Token.CONSTRAINT) { @@ -517,7 +693,18 @@ public class OracleStatementParser extends SQLStatementParser { continue; } else if (identifierEquals("MOVE")) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + lexer.nextToken(); + + if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + + OracleAlterTableMoveTablespace item = new OracleAlterTableMoveTablespace(); + item.setName(this.exprParser.name()); + + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } } else if (identifierEquals("RENAME")) { stmt.getItems().add(parseAlterTableRename()); } else if (identifierEquals("MODIFY")) { @@ -565,6 +752,18 @@ public class OracleStatementParser extends SQLStatementParser { break; } + if (lexer.token() == Token.UPDATE) { + lexer.nextToken(); + + if (identifierEquals("GLOBAL")) { + lexer.nextToken(); + acceptIdentifier("INDEXES"); + stmt.setUpdateGlobalIndexes(true); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + return stmt; } @@ -587,30 +786,18 @@ public class OracleStatementParser extends SQLStatementParser { SQLName name = this.exprParser.name(); + SQLConstaint constraint; if (lexer.token() == Token.PRIMARY) { - lexer.nextToken(); - accept(Token.KEY); - - OraclePrimaryKey primaryKey = new OraclePrimaryKey(); - accept(Token.LPAREN); - this.exprParser.exprList(primaryKey.getColumns()); - accept(Token.RPAREN); - - item.setConstraint(primaryKey); - if (lexer.token() == Token.USING) { - lexer.nextToken(); - accept(Token.INDEX); - primaryKey.setUsingIndex(this.exprParser.expr()); - } - - primaryKey.setName(name); - - item.setConstraint(primaryKey); - - return item; + constraint = exprParser.parsePrimaryKey(); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + constraint.setName(name); + + item.setConstraint(constraint); + + return item; } private void parseAlterTableDrop(OracleAlterTableStatement stmt) { @@ -1116,7 +1303,7 @@ public class OracleStatementParser extends SQLStatementParser { } OracleCreateIndexStatement stmt = new OracleCreateIndexStatement(); - if (lexer.token() == Token.UNION) { + if (lexer.token() == Token.UNIQUE) { stmt.setType(OracleCreateIndexStatement.Type.UNIQUE); lexer.nextToken(); } else if (identifierEquals("BITMAP")) { @@ -1154,10 +1341,25 @@ public class OracleStatementParser extends SQLStatementParser { lexer.nextToken(); stmt.setOnline(true); continue; + } else if (identifierEquals("NOPARALLEL")) { + lexer.nextToken(); + stmt.setNoParallel(true); + continue; + } else if (identifierEquals("PARALLEL")) { + lexer.nextToken(); + stmt.setParallel(this.exprParser.expr()); + continue; + } else if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + acceptIdentifier("ONLY"); + acceptIdentifier("TOPLEVEL"); + stmt.setIndexOnlyTopLevel(true); + continue; } else { break; } } return stmt; } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java index 030761fe87..47322edc8c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleUpdateParser.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.oracle.parser; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.expr.SQLListExpr; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; @@ -68,8 +69,34 @@ public class OracleUpdateParser extends SQLStatementParser { } private void parseReturn(OracleUpdateStatement update) throws ParserException { - if (identifierEquals("RETURN") || identifierEquals("RETURNING")) { - throw new ParserException("TODO"); + if (identifierEquals("RETURN") || lexer.token() == Token.RETURNING) { + lexer.nextToken(); + + for (;;) { + SQLExpr item = this.exprParser.expr(); + update.getReturning().add(item); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + accept(Token.INTO); + + for (;;) { + SQLExpr item = this.exprParser.expr(); + update.getReturningInto().add(item); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } } } 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 4dc4ed88cb..8523b695d6 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 @@ -5,6 +5,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; @@ -22,7 +23,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause.Entry; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; @@ -40,19 +41,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; 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.OracleAlterTableRenameTo; 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; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; @@ -62,6 +70,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; @@ -95,6 +104,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTableExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListMultiColumnItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListSingleColumnItem; @@ -942,15 +952,15 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OracleAlterTableDropPartition x) { } - + @Override public boolean visit(OracleAlterTableTruncatePartition x) { return true; } - + @Override public void endVisit(OracleAlterTableTruncatePartition x) { - + } @Override @@ -962,35 +972,35 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OracleAlterTableStatement x) { } - + @Override public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { return true; } - + @Override public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { - + } - + @Override public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { return true; } - + @Override public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { - + } - + @Override public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { return true; } - + @Override public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { - + } @Override @@ -1000,67 +1010,67 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleAlterTableSplitPartition x) { - + } - + @Override public boolean visit(OracleAlterTableModify x) { return true; } - + @Override public void endVisit(OracleAlterTableModify x) { - + } - + @Override public boolean visit(OracleAlterTableAddColumn x) { return true; } - + @Override public void endVisit(OracleAlterTableAddColumn x) { - + } - + @Override public boolean visit(OracleCreateIndexStatement x) { return true; } - + @Override public void endVisit(OracleCreateIndexStatement x) { - + } - + @Override public boolean visit(OracleAlterIndexStatement x) { return true; } - + @Override public void endVisit(OracleAlterIndexStatement x) { - + } - + @Override public boolean visit(OracleForStatement x) { return true; } - + @Override public void endVisit(OracleForStatement x) { - + } - + @Override public boolean visit(OracleAlterIndexStatement.Rebuild x) { return true; } - + @Override public void endVisit(OracleAlterIndexStatement.Rebuild x) { - + } @Override @@ -1070,87 +1080,87 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(Else x) { - + } - + @Override public boolean visit(ElseIf x) { return true; } - + @Override public void endVisit(ElseIf x) { - + } - + @Override public boolean visit(OracleIfStatement x) { return true; } - + @Override public void endVisit(OracleIfStatement x) { - + } - + @Override public boolean visit(OracleRangeExpr x) { return true; } - + @Override public void endVisit(OracleRangeExpr x) { - + } - + @Override public boolean visit(OracleAlterTableAddConstaint x) { return true; } - + @Override public void endVisit(OracleAlterTableAddConstaint x) { - + } - + @Override public boolean visit(OraclePrimaryKey x) { return true; } - + @Override public void endVisit(OraclePrimaryKey x) { - + } - + @Override public boolean visit(OracleCreateTableStatement x) { return true; } - + @Override public void endVisit(OracleCreateTableStatement x) { - + } - + @Override public boolean visit(OracleAlterTableRenameTo x) { return true; } - + @Override public void endVisit(OracleAlterTableRenameTo x) { - + } @Override - public boolean visit(StorageItem x) { + public boolean visit(OracleStorageClause x) { return true; } @Override - public void endVisit(StorageItem x) { - + public void endVisit(OracleStorageClause x) { + } @Override @@ -1160,17 +1170,17 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleGotoStatement x) { - + } - + @Override public boolean visit(OracleLabelStatement x) { return true; } - + @Override public void endVisit(OracleLabelStatement x) { - + } @Override @@ -1180,16 +1190,116 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleParameter x) { - + } - + @Override public boolean visit(OracleCommitStatement x) { return true; } - + @Override public void endVisit(OracleCommitStatement x) { + + } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + return true; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + return true; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + return true; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + return true; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + return true; + } + + @Override + public void endVisit(OracleTruncateStatement x) { } 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 ea52d767c5..730e112383 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 @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; @@ -29,7 +30,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; @@ -46,19 +47,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; 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.OracleAlterTableRenameTo; 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; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; @@ -68,6 +76,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; @@ -97,6 +106,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTableExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListMultiColumnItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListSingleColumnItem; @@ -506,9 +516,9 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleAlterIndexStatement.Rebuild x); - boolean visit(StorageItem x); + boolean visit(OracleStorageClause x); - void endVisit(StorageItem x); + void endVisit(OracleStorageClause x); boolean visit(OracleGotoStatement x); @@ -525,4 +535,44 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleCommitStatement x); void endVisit(OracleCommitStatement x); + + boolean visit(OracleAlterTriggerStatement x); + + void endVisit(OracleAlterTriggerStatement x); + + boolean visit(OracleAlterSynonymStatement x); + + void endVisit(OracleAlterSynonymStatement x); + + boolean visit(OracleAlterViewStatement x); + + void endVisit(OracleAlterViewStatement x); + + boolean visit(AsOfSnapshotClause x); + + void endVisit(AsOfSnapshotClause x); + + boolean visit(OracleAlterTableMoveTablespace x); + + void endVisit(OracleAlterTableMoveTablespace x); + + boolean visit(OracleSizeExpr x); + + void endVisit(OracleSizeExpr x); + + boolean visit(OracleFileSpecification x); + + void endVisit(OracleFileSpecification x); + + boolean visit(OracleAlterTablespaceAddDataFile x); + + void endVisit(OracleAlterTablespaceAddDataFile x); + + boolean visit(OracleAlterTablespaceStatement x); + + void endVisit(OracleAlterTablespaceStatement x); + + boolean visit(OracleTruncateStatement x); + + void endVisit(OracleTruncateStatement x); } 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 90b508e57c..10cba2a228 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 @@ -34,10 +34,12 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; @@ -58,7 +60,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; @@ -75,17 +77,20 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem; 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.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; @@ -93,6 +98,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit 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; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; @@ -102,6 +111,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; @@ -136,6 +146,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTableExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListMultiColumnItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListSingleColumnItem; @@ -799,6 +810,14 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("WHERE "); x.getWhere().accept(this); } + + if (x.getReturning().size() > 0) { + println(); + print("RETURNING "); + printAndAccept(x.getReturning(), ", "); + print(" INTO "); + printAndAccept(x.getReturningInto(), ", "); + } return false; } @@ -1976,6 +1995,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS println(); item.accept(this); } + if (x.isUpdateGlobalIndexes()) { + println(); + print("UPDATE GLOABL INDEXES"); + } decrementIndent(); return false; } @@ -2105,7 +2128,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public boolean visit(OracleAlterTableAddColumn x) { print("ADD ("); - x.getColumn().accept(this); + printAndAccept(x.getColumns(), ", "); print(")"); return false; } @@ -2129,6 +2152,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("("); printAndAccept(x.getItems(), ", "); print(")"); + + if (x.isIndexOnlyTopLevel()) { + print(" INDEX ONLY TOPLEVEL"); + } + if (x.getTablespace() != null) { print(" TABLESPACE "); x.getTablespace().accept(this); @@ -2137,6 +2165,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (x.isOnline()) { print(" ONLINE"); } + + if (x.isNoParallel()) { + print(" NOPARALLEL"); + } else if (x.getParallel() != null){ + print(" PARALLEL "); + x.getParallel().accept(this); + } return false; } @@ -2149,6 +2184,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public boolean visit(OracleAlterIndexStatement x) { print("ALTER INDEX "); x.getName().accept(this); + + if (x.getRenameTo() != null) { + print(" RENAME TO "); + x.getRenameTo().accept(this); + } if (x.getMonitoringUsage() != null) { print(" MONITORING USAGE"); @@ -2366,6 +2406,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS this.visit((SQLCreateTableStatement) x); incrementIndent(); + + if (x.isOrganizationIndex()) { + print(" ORGANIZATION INDEX"); + } + if (x.getTablespace() != null) { print(" TABLESPACE "); x.getTablespace().accept(this); @@ -2380,15 +2425,34 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } if (x.getParallel() == Boolean.TRUE) { - + print(" PARALLEL"); } else if (x.getParallel() == Boolean.FALSE) { print(" NOPARALLEL"); } - if (x.getStorage().size() > 0) { - print(" STORAGE ("); - printAndAccept(x.getStorage(), ", "); - print(")"); + if (x.getCompress() == Boolean.TRUE) { + print(" COMPRESS"); + } else if (x.getCompress() == Boolean.FALSE) { + print(" NOCOMPRESS"); + } + + if (x.getLogging() == Boolean.TRUE) { + print(" LOGGING"); + } else if (x.getLogging() == Boolean.FALSE) { + print(" NOLOGGING"); + } + + if (x.getStorage() != null) { + print(" "); + x.getStorage().accept(this); + } + + if (x.isOnCommit()) { + print(" ON COMMIT"); + } + + if (x.isPreserveRows()) { + print(" PRESERVE ROWS"); } if (x.getSelect() != null) { @@ -2419,17 +2483,35 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } @Override - public boolean visit(StorageItem x) { - x.getName().accept(this); - if (x.getValue() != null) { - print(" "); - x.getValue().accept(this); + public boolean visit(OracleStorageClause x) { + print("STORAGE ("); + + if (x.getInitial() != null) { + print(" INITIAL "); + x.getInitial().accept(this); } + + if (x.getFreeLists() != null) { + print(" FREELISTS "); + x.getInitial().accept(this); + } + + if (x.getFreeListGroups() != null) { + print(" FREELIST GROUPS "); + x.getInitial().accept(this); + } + + if (x.getBufferPool() != null) { + print(" BUFFER_POOL "); + x.getInitial().accept(this); + } + + print(")"); return false; } @Override - public void endVisit(StorageItem x) { + public void endVisit(OracleStorageClause x) { } @@ -2485,4 +2567,183 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public void endVisit(OracleCommitStatement x) { } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + print("ALTER TRIGGER "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + print("ALTER SYNONYM "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + print("AS OF SNAPSHOT("); + x.getExpr().accept(this); + print(")"); + return false; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + print("ALTER VIEW "); + x.getName().accept(this); + + if (x.isCompile()) { + print(" COMPILE"); + } + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print("ENABLE"); + } else { + print("DISABLE"); + } + } + return false; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + print(" MOVE TABLESPACE "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + x.getValue().accept(this); + print(x.getUnit().name()); + return false; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + + @Override + public boolean visit(OracleFileSpecification x) { + printAndAccept(x.getFileNames(), ", "); + + if (x.getSize() != null) { + print(" SIZE "); + x.getSize().accept(this); + } + + if (x.isAutoExtendOff()) { + print(" AUTOEXTEND OFF"); + } else if (x.getAutoExtendOn() != null) { + print(" AUTOEXTEND ON "); + x.getAutoExtendOn().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + print("ADD DATAFILE"); + incrementIndent(); + for (OracleFileSpecification file : x.getFiles()) { + println(); + file.accept(this); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + print("ALTER TABLESPACE "); + x.getName().accept(this); + println(); + x.getItem().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + print("TRUNCATE TABLE "); + printAndAccept(x.getTableNames(), ", "); + + if (x.isPurgeSnapshotLog()) { + print(" PURGE SNAPSHOT LOG"); + } + return false; + } + + @Override + public void endVisit(OracleTruncateStatement x) { + + } } 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 21ca66a49b..7d80475054 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 @@ -19,10 +19,12 @@ import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.OracleOrderBy; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.VersionsFlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.GroupingSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; @@ -40,7 +42,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause.Entry; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; @@ -58,19 +60,26 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddColumn; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; 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.OracleAlterTableRenameTo; 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; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTriggerStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; @@ -80,6 +89,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; @@ -113,6 +123,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectTableReference; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectUnPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTableExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListMultiColumnItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateSetListSingleColumnItem; @@ -125,7 +136,8 @@ import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.stat.TableStat.Relationship; public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor { - public OracleSchemaStatVisitor() { + + public OracleSchemaStatVisitor(){ this.aliasMap.put("DUAL", null); } @@ -170,7 +182,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle if ("DUAL".equalsIgnoreCase(ident)) { return false; } - + x.putAttribute(ATTR_TABLE, ident); TableStat stat = getTableStat(ident); @@ -227,7 +239,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public boolean visit(OracleSelect x) { setCurrentTable(x); - + if (x.getOrderBy() != null) { x.getOrderBy().setParent(x); } @@ -301,14 +313,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } visit((SQLSelectQueryBlock) x); - + if (x.getInto() instanceof SQLName) { TableStat stat = getTableStat(x.getInto().toString()); if (stat != null) { stat.incrementInsertCount(); } } - + return true; } @@ -581,7 +593,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public boolean visit(OracleSelectJoin x) { x.getLeft().accept(this); x.getRight().accept(this); - + { String leftTable = (String) x.getLeft().getAttribute(ATTR_TABLE); String rightTable = (String) x.getRight().getAttribute(ATTR_TABLE); @@ -654,7 +666,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle accept(x.getSelect()); accept(x.getPivot()); accept(x.getFlashback()); - + String table = (String) x.getSelect().getAttribute(ATTR_TABLE); if (x.getAlias() != null) { if (table != null) { @@ -663,7 +675,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle this.subQueryMap.put(x.getAlias(), x.getSelect()); this.setCurrentTable(x.getAlias()); } - + if (table != null) { x.putAttribute(ATTR_TABLE, table); } @@ -978,7 +990,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle setMode(x.getUsing(), Mode.Select); x.getUsing().accept(this); - + setMode(x, Mode.Merge); String ident = x.getInto().toString(); @@ -1322,7 +1334,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle String tableName = x.getName().toString(); TableStat stat = getTableStat(tableName); stat.incrementAlterCount(); - + setCurrentTable(x, tableName); for (SQLObject item : x.getItems()) { @@ -1386,7 +1398,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle for (SQLColumnDefinition column : x.getColumns()) { String columnName = column.getName().toString(); addColumn(table, columnName); - + } return false; @@ -1401,9 +1413,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public boolean visit(OracleAlterTableAddColumn x) { OracleAlterTableStatement stmt = (OracleAlterTableStatement) x.getParent(); String table = stmt.getName().toString(); - - String columnName = x.getColumn().getName().toString(); - addColumn(table, columnName); + + for (SQLColumnDefinition column : x.getColumns()) { + String columnName = column.getName().toString(); + addColumn(table, columnName); + } return false; } @@ -1417,11 +1431,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle this.setCurrentTable(x); if (x.getTable() != null) { String tableName = x.getTable().toString(); - + TableStat stat = this.getTableStat(tableName); stat.incrementCreateIndexCount(); this.setCurrentTable(tableName); - + accept(x.getItems()); } return false; @@ -1524,7 +1538,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OraclePrimaryKey x) { accept(x.getColumns()); - + return false; } @@ -1536,11 +1550,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public boolean visit(OracleCreateTableStatement x) { this.visit((SQLCreateTableStatement) x); - + if (x.getSelect() != null) { x.getSelect().accept(this); } - + return false; } @@ -1560,12 +1574,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } @Override - public boolean visit(StorageItem x) { + public boolean visit(OracleStorageClause x) { return false; } @Override - public void endVisit(StorageItem x) { + public void endVisit(OracleStorageClause x) { } @@ -1608,4 +1622,103 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleCommitStatement x) { } + + @Override + public boolean visit(OracleAlterTriggerStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTriggerStatement x) { + + } + + @Override + public boolean visit(OracleAlterSynonymStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterSynonymStatement x) { + + } + + @Override + public boolean visit(AsOfSnapshotClause x) { + return false; + } + + @Override + public void endVisit(AsOfSnapshotClause x) { + + } + + @Override + public boolean visit(OracleAlterViewStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterViewStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableMoveTablespace x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableMoveTablespace x) { + + } + + @Override + public boolean visit(OracleSizeExpr x) { + return false; + } + + @Override + public void endVisit(OracleSizeExpr x) { + + } + @Override + public boolean visit(OracleFileSpecification x) { + return false; + } + + @Override + public void endVisit(OracleFileSpecification x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceAddDataFile x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceAddDataFile x) { + + } + + @Override + public boolean visit(OracleAlterTablespaceStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterTablespaceStatement x) { + + } + + @Override + public boolean visit(OracleTruncateStatement x) { + return visit((SQLTruncateStatement) x); + } + + @Override + public void endVisit(OracleTruncateStatement x) { + + } } 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 a246ce0d1b..2ea0b91564 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.parser; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; public class SQLCreateTableParser extends SQLDDLParser { @@ -65,17 +66,23 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - while (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) { - SQLColumnDefinition column = this.exprParser.parseColumn(); - createTable.getTableElementList().add(column); - - // parseConstaint(column.getConstaints()); - - if (lexer.token() != Token.COMMA) { - break; + for (;;) { + if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) { + SQLColumnDefinition column = this.exprParser.parseColumn(); + createTable.getTableElementList().add(column); + } else if (lexer.token() == Token.PRIMARY) { + SQLPrimaryKey primaryKey = exprParser.parsePrimaryKey(); + createTable.getTableElementList().add(primaryKey); + } else { + throw new ParserException("TODO " + lexer.token()); + } + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; } - lexer.nextToken(); + break; } // while @@ -91,10 +98,6 @@ public class SQLCreateTableParser extends SQLDDLParser { } - if (lexer.token() == Token.ON) { - throw new ParserException("TODO"); - } - return createTable; } 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 53f96662b5..ba0beedfcf 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -56,8 +56,10 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; public class SQLExprParser extends SQLParser { @@ -1132,4 +1134,8 @@ public class SQLExprParser extends SQLParser { return column; } + + public SQLPrimaryKey parsePrimaryKey() { + throw new ParserException("TODO"); + } } 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 fb719ad671..7c44940454 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -286,7 +286,7 @@ public class SQLStatementParser extends SQLParser { if (token == Token.TABLE || identifierEquals("GLOBAL")) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); return createTableParser.parseCrateTable(false); - } else if (token == Token.INDEX) { + } else if (token == Token.INDEX || token == Token.UNIQUE) { return parseCreateIndex(false); } 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 507b58d863..1da14d4bda 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -567,7 +567,13 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print(' '); item.accept(this); } - + + if (x.getEnable() != null) { + if (x.getEnable().booleanValue()) { + print(" ENABLE"); + } + } + return false; } @@ -674,13 +680,17 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { if (size > 0) { print(" ("); - + incrementIndent(); + println(); for (int i = 0; i < size; ++i) { if (i != 0) { print(", "); + println(); } x.getTableElementList().get(i).accept(this); } + decrementIndent(); + println(); print(")"); } 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 90b4b071f7..6e0d3e39da 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -362,7 +362,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLTruncateStatement x) { - setMode(x, Mode.Insert); + setMode(x, Mode.Delete); setAliasMap(); @@ -374,7 +374,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { x.putAttribute("_old_local_", originalTable); TableStat stat = getTableStat(ident); - stat.incrementInsertCount(); + stat.incrementDeleteCount(); Map aliasMap = getAliasMap(); if (aliasMap != null) { @@ -805,8 +805,11 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { TableStat stat = getTableStat(tableName); stat.incrementCreateCount(); + setCurrentTable(x, tableName); accept(x.getTableElementList()); + + restoreCurrentTable(x); return false; } diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index 939ee62f05..3d5fc4a0b5 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -403,7 +403,7 @@ public class TableStat { } public static enum Mode { - Insert(1), Update(2), Delete(4), Select(8), Merge(16); + Insert(1), Update(2), Delete(4), Select(8), Merge(16), Truncate(32); public final int mark; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest4.java new file mode 100644 index 0000000000..21be53657c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest4.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterIndexTest4 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter index HT_TASK_TRADE_HIS_TID_RT_IND_N rename to HT_TASK_TRADE_HIS_TID_RT_IND"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterSynonymTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterSynonymTest.java new file mode 100644 index 0000000000..f1e8767b6d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterSynonymTest.java @@ -0,0 +1,44 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; + +public class OracleAlterSynonymTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER SYNONYM \"ESCROW\".\"COMPANY\" COMPILE"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest10.java new file mode 100644 index 0000000000..a0810fba53 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest10.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTableTest10 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE ws_affiliate_tran_product add ( discount_amount NUMBER, commission_amount NUMBER )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ws_affiliate_tran_product"))); + + Assert.assertEquals(2, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", "discount_amount"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", "commission_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest11.java new file mode 100644 index 0000000000..580d691252 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest11.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTableTest11 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table PRODUCT_IDS_ZZJ_TBD0209 move tablespace MCSHADOWTS"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("PRODUCT_IDS_ZZJ_TBD0209"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_IDS_ZZJ_TBD0209", "discount_amount"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", "commission_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest9.java new file mode 100644 index 0000000000..dbce53628d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest9.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTableTest9 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table archive_feedback drop partition P201150 update global indexes"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("archive_feedback"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_i18n_translate_item", "id"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTablespaceTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTablespaceTest.java new file mode 100644 index 0000000000..8dffe61477 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTablespaceTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTablespaceTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter tablespace escrow_data add datafile '/opt/oracle/oradata/usoint/f937.dbf' size 4095m autoextend off"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("WRH$_SERVICE_WAIT_CLASS"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest.java new file mode 100644 index 0000000000..d5132be3f4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTriggerTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter trigger DDL_TRIGGER_FOR_DATABASE ENABLE"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest2.java new file mode 100644 index 0000000000..5bda2b4bef --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTriggerTest2.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterTriggerTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter TRIGGER RETL.TRG_COMPANY_SYNC compile"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterViewTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterViewTest.java new file mode 100644 index 0000000000..a6c3095a48 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterViewTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleAlterViewTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter VIEW ALIBABA1949.COMPANY_VIEW_2 compile"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(0, visitor.getTables().size()); + +// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest2.java new file mode 100644 index 0000000000..ccfdbe4f51 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest2.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateIndexTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE UNIQUE INDEX \"ESCROW\".\"SYS_IOT_TOP_196679\" " + // + "on \"ESCROW\".\"SYS_JOURNAL_196678\"(\"C0\",\"C1\",\"C2\",\"C3\",\"RID\") " + // + "INDEX ONLY TOPLEVEL TABLESPACE \"ESCROW_INDX\" NOPARALLEL"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.SYS_JOURNAL_196678"))); + + Assert.assertEquals(5, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest3.java new file mode 100644 index 0000000000..dfa4743fd4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest3.java @@ -0,0 +1,46 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateIndexTest3 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "create index PRODUCT_ADDITION_NCID_IND on PRODUCT_ADDITION(NEW_CLUSTER_ID,GMT_LAST_FEEDBACK) tablespace APPINDX4M online parallel 4"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("PRODUCT_ADDITION"))); + + Assert.assertEquals(2, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_ADDITION", "NEW_CLUSTER_ID"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_ADDITION", "GMT_LAST_FEEDBACK"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest7.java new file mode 100644 index 0000000000..8599d6f608 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest7.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateTableTest7 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "create table \"ALIBABA1949\".\"SYS_JOURNAL_209051\" (" + // + "C0 VARCHAR2(256), opcode char(1), partno number, rid rowid, primary key( C0 , rid )" + // + ") organization index TABLESPACE \"APPINDX1M\""; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ALIBABA1949.SYS_JOURNAL_209051"))); + + Assert.assertEquals(4, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "C0"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "opcode"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "partno"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ALIBABA1949.SYS_JOURNAL_209051", "rid"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest8.java new file mode 100644 index 0000000000..1d5218cc81 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest8.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateTableTest8 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE TABLE \"PRODUCT_NEW_CLUSTER_YZS_0210\" (" + // + "\"PRODUCT_ID\" NUMBER NOT NULL ENABLE, " + // + "\"NEW_CLUSTER_ID\" NUMBER NOT NULL ENABLE, " + // + "\"STATUS\" VARCHAR2(1) NOT NULL ENABLE" + // + ") " + // + "PCTFREE 10 " + // + "PCTUSED 40 " + // + "INITRANS 1 " + // + "MAXTRANS 255 " + // + "STORAGE(INITIAL 2624585728 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) " + // + "TABLESPACE \"MCSHADOWTS\" LOGGING NOCOMPRESS"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("PRODUCT_NEW_CLUSTER_YZS_0210"))); + + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "PRODUCT_ID"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "NEW_CLUSTER_ID"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_NEW_CLUSTER_YZS_0210", "STATUS"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest9.java new file mode 100644 index 0000000000..e91fcee21c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest9.java @@ -0,0 +1,55 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateTableTest9 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE GLOBAL TEMPORARY TABLE \"ESCROW\".\"RUPD$_HT_TASK_TRADE_HISTOR\" (" + // + "\"ID\" NUMBER, " + // + "dmltype$$ varchar2(1), " + // + "snapid integer, " + // + "change_vector$$ raw(255)" + // + ") ON COMMIT PRESERVE ROWS"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR"))); + + Assert.assertEquals(4, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", "ID"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "dmltype$$"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "snapid"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ESCROW.RUPD$_HT_TASK_TRADE_HISTOR", + "change_vector$$"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest4.java index d3b9fc13f1..f71a95040b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest4.java @@ -47,12 +47,13 @@ public class OracleInsertTest4 extends OracleTest { + " h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.obj$ ot, sys.col$ c, sys.tabpart$ tp, sys.obj$ op, " + " sys.hist_head$ h, histgrm$ hg where u.name = :1 and ot.owner# = u.user# and " + " ot.name = :2 and ot.type# = 2 and c.obj# = ot.obj# and (:4 is null or c.name = :4) and " - + " tp.bo# = ot.obj# and tp.obj# = op.obj# and ((:3 is null and :vc_cascade_parts is not null) " + - " or op.subname = :3) and h.obj# = op.obj# and h.intcol# = c.intcol# and " + - " hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# " + - "" + - " union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, " + - " op.name c1, op.subname c2, null c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and ((:3 is null and :vc_cascade_parts is not null) or op.subname = :3) and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and h.obj# = op.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, op.name c1, op.subname c2, os.subname c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.tabsubpart$ ts, sys.obj$ os, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and ts.pobj# = tp.obj# and ts.obj# = os.obj# and ((:3 is null and :vc_cascade_parts is not null) or (op.subname = :3 and (:vc_cascade_parts is not null -- cascade to subpart or os.subname is null)) -- matches partition itself or os.subname = :3) and -- matches subpartition h.obj# = os.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# order by c5,c1,c2,c3,c4,n10"; + + " tp.bo# = ot.obj# and tp.obj# = op.obj# and ((:3 is null and :vc_cascade_parts is not null) " + + " or op.subname = :3) and h.obj# = op.obj# and h.intcol# = c.intcol# and " + + " hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# " + + "" + + " union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, " + + " op.name c1, op.subname c2, null c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and ((:3 is null and :vc_cascade_parts is not null) or op.subname = :3) and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and h.obj# = op.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# union all select :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, op.name c1, op.subname c2, os.subname c3, c.name c4, u.name c5, h.distcnt n1, h.density n2, h.spare1 n3, h.sample_size n4, h.null_cnt n5, h.minimum n6, h.maximum n7, h.avgcln n8, decode(h.cache_cnt,0,null,1) n9, hg.bucket n10, hg.endpoint n11, null n12, h.timestamp# d1, h.lowval r1, h.hival r2, hg.epvalue ch1 from sys.user$ u, sys.col$ c, sys.tabcompart$ tp, sys.obj$ op, sys.tabsubpart$ ts, sys.obj$ os, sys.hist_head$ h, histgrm$ hg where u.name = :1 and op.owner# = u.user# and op.name = :2 and op.type# = 19 and tp.obj# = op.obj# and c.obj# = tp.bo# and (:4 is null or c.name = :4) and ts.pobj# = tp.obj# and ts.obj# = os.obj# and ((:3 is null and :vc_cascade_parts is not null) or (op.subname = :3 and (:vc_cascade_parts is not null or os.subname is null)) " + + " or os.subname = :3) and h.obj# = os.obj# and h.intcol# = c.intcol# and hg.obj#(+) = h.obj# and hg.intcol#(+) = h.intcol# order by c5,c1,c2,c3,c4,n10"; OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); @@ -69,15 +70,15 @@ public class OracleInsertTest4 extends OracleTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("OPS$ADMIN.ORASTAT"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sys.user$"))); - Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(9, visitor.getTables().size()); + Assert.assertEquals(42, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest2.java index f9f6e8a3ef..c37b3b8f40 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest2.java @@ -58,18 +58,19 @@ public class OracleMergeTest2 extends OracleTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("bonuses"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.MLOG$_HT_TASK_TRADE_HISTOR"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY_NEW"))); - Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(31, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest4.java index adc776405f..284f879012 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest4.java @@ -30,18 +30,19 @@ public class OracleMergeTest4 extends OracleTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("relationships : " + visitor.getRelationships()); - Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("bonuses"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ALL_SUMDELTA"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY_NEW"))); - Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(34, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "bonus"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleTruncateTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleTruncateTableTest.java new file mode 100644 index 0000000000..e630d2a0e3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleTruncateTableTest.java @@ -0,0 +1,45 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleTruncateTableTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "truncate table \"ESCROW\".\"HT_TASK_TRADE_HISTORY_NEW\" purge snapshot log"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ESCROW.HT_TASK_TRADE_HISTORY_NEW"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest4.java new file mode 100644 index 0000000000..6cb76c44cb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleUpdateTest4.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleUpdateTest4 extends OracleTest { + + public void test_0() throws Exception { + String sql = "update tabpart$ set " + + // + "dataobj# = :1, part# = :2, hiboundlen = :3, hiboundval = :4, ts# = :5, file# = :6, block# = :7, pctfree$ = :8, pctused$ = :9, initrans = :10, maxtrans = :11, flags = :12, analyzetime = :13, samplesize = :14, rowcnt = :15, blkcnt = :16, empcnt = :17, avgspc = :18, chncnt = :19, avgrln = :20, bhiboundval = EMPTY_BLOB() " + + // + "where obj# = :21 " + // + "returning bhiboundval into :22"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tabpart$"))); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(22, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("tabpart$", "dataobj#"))); +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("sys.col_usage$", "intcol#"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/sql/TestTransform.java b/src/test/java/com/alibaba/druid/sql/TestTransform.java index 70eb2f527c..4f24005885 100644 --- a/src/test/java/com/alibaba/druid/sql/TestTransform.java +++ b/src/test/java/com/alibaba/druid/sql/TestTransform.java @@ -76,7 +76,7 @@ public class TestTransform extends OracleTest { System.out.println((this.updateCount++) + " : " + sqlId); } - public void test_transform() throws Exception { + public void f_test_transform() throws Exception { Connection conn = dataSource.getConnection(); @@ -191,7 +191,7 @@ public class TestTransform extends OracleTest { conn.close(); } - public void f_test_migrate() throws Exception { + public void test_migrate() throws Exception { Connection conn = dataSource.getConnection(); int count = 0;