diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java similarity index 87% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableParser.java rename to src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 54f7e7910a..30cfc4bec9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; +package com.alibaba.druid.sql.dialect.mysql.parser; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -22,7 +22,8 @@ import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLTableConstaint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; -import com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLCreateTableParser; @@ -32,10 +33,12 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { public MySqlCreateTableParser(String sql) throws ParserException{ super(sql); + this.exprParser = new MySqlExprParser(lexer); } public MySqlCreateTableParser(Lexer lexer){ super(lexer); + this.exprParser = new MySqlExprParser(lexer); } public SQLCreateTableStatement parseCrateTable() throws ParserException { @@ -70,7 +73,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { for (;;) { if (lexer.token() == Token.IDENTIFIER) { - SQLColumnDefinition column = parseColumn(); + SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(column); } else if (lexer.token() == (Token.CONSTRAINT)) { createTable.getTableElementList().add(parseConstraint()); @@ -149,28 +152,6 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { return createTable; } - protected SQLColumnDefinition parseColumn() throws ParserException { - MySqlSQLColumnDefinition column = new MySqlSQLColumnDefinition(); - column.setName(this.exprParser.name()); - column.setDataType(this.exprParser.parseDataType()); - - return parseColumnRest(column); - } - - protected SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) throws ParserException { - if (identifierEquals("AUTO_INCREMENT")) { - lexer.nextToken(); - if (column instanceof MySqlSQLColumnDefinition) { - ((MySqlSQLColumnDefinition) column).setAutoIncrement(true); - } - return parseColumnRest(column); - } - - super.parseColumnRest(column); - - return column; - } - @SuppressWarnings("unused") protected SQLTableConstaint parseConstraint() throws ParserException { SQLName name = null; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 64fe05a29f..24ddd9b367 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; @@ -32,6 +33,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalUnit; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr.SearchModifier; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinition; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -420,4 +422,26 @@ public class MySqlExprParser extends SQLExprParser { return intervalExpr; } } + + public SQLColumnDefinition parseColumn() throws ParserException { + MySqlSQLColumnDefinition column = new MySqlSQLColumnDefinition(); + column.setName(name()); + column.setDataType(parseDataType()); + + return parseColumnRest(column); + } + + public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) throws ParserException { + if (identifierEquals("AUTO_INCREMENT")) { + lexer.nextToken(); + if (column instanceof MySqlSQLColumnDefinition) { + ((MySqlSQLColumnDefinition) column).setAutoIncrement(true); + } + return parseColumnRest(column); + } + + super.parseColumnRest(column); + + return column; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 6b16264f57..6d4bcc4f92 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -34,7 +34,6 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableParser; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateUserStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDropUser; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java new file mode 100644 index 0000000000..c5fd7cdbe8 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java @@ -0,0 +1,48 @@ +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 OracleRangeExpr extends OracleSQLObjectImpl implements SQLExpr { + + private static final long serialVersionUID = 1L; + + private SQLExpr lowBound; + private SQLExpr upBound; + + public OracleRangeExpr(){ + + } + + public OracleRangeExpr(SQLExpr lowBound, SQLExpr upBound){ + this.lowBound = lowBound; + this.upBound = upBound; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, lowBound); + acceptChild(visitor, upBound); + } + visitor.endVisit(this); + } + + public SQLExpr getLowBound() { + return lowBound; + } + + public void setLowBound(SQLExpr lowBound) { + this.lowBound = lowBound; + } + + public SQLExpr getUpBound() { + return upBound; + } + + public void setUpBound(SQLExpr upBound) { + this.upBound = upBound; + } + +} 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 new file mode 100644 index 0000000000..55a3021b98 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterIndexStatement.java @@ -0,0 +1,93 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterIndexStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + private boolean compile; + + private Boolean enable; + + private Boolean monitoringUsage; + + private Rebuild rebuild; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, rebuild); + } + visitor.endVisit(this); + } + + public Boolean getMonitoringUsage() { + return monitoringUsage; + } + + public void setMonitoringUsage(Boolean monitoringUsage) { + this.monitoringUsage = monitoringUsage; + } + + public Rebuild getRebuild() { + return rebuild; + } + + public void setRebuild(Rebuild rebuild) { + this.rebuild = rebuild; + } + + 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; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + + public static class Rebuild extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + private SQLObject option; + + public SQLObject getOption() { + return option; + } + + public void setOption(SQLObject option) { + this.option = option; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, option); + } + visitor.endVisit(this); + } + + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterProcedureStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterProcedureStatement.java new file mode 100644 index 0000000000..cb5fac89c7 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterProcedureStatement.java @@ -0,0 +1,47 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterProcedureStatement extends OracleStatementImpl { + + private SQLExpr name; + + private boolean compile = false; + private boolean reuseSettings = false; + + private static final long serialVersionUID = 1L; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + public SQLExpr getName() { + return name; + } + + public void setName(SQLExpr name) { + this.name = name; + } + + public boolean isCompile() { + return compile; + } + + public void setCompile(boolean compile) { + this.compile = compile; + } + + public boolean isReuseSettings() { + return reuseSettings; + } + + public void setReuseSettings(boolean reuseSettings) { + this.reuseSettings = reuseSettings; + } + +} 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 new file mode 100644 index 0000000000..4db1ab694c --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddColumn.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +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 SQLColumnDefinition column; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + } + visitor.endVisit(this); + } + + public SQLColumnDefinition getColumn() { + return column; + } + + public void setColumn(SQLColumnDefinition column) { + this.column = column; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableDropPartition.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableDropPartition.java new file mode 100644 index 0000000000..3b7cec2a80 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableDropPartition.java @@ -0,0 +1,28 @@ +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 OracleAlterTableDropPartition extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + 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/OracleAlterTableItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableItem.java new file mode 100644 index 0000000000..7b122a0d88 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableItem.java @@ -0,0 +1,9 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; + +public abstract class OracleAlterTableItem extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.java new file mode 100644 index 0000000000..6be5dff21f --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableModify.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.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTableModify extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private List columns = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, columns); + } + visitor.endVisit(this); + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableSplitPartition.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableSplitPartition.java new file mode 100644 index 0000000000..953ede43fb --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableSplitPartition.java @@ -0,0 +1,161 @@ +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.SQLObject; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTableSplitPartition extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName name; + private List at = new ArrayList(); + private List values = new ArrayList(); + private List into = new ArrayList(); + + private UpdateIndexesClause updateIndexes = null; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, at); + acceptChild(visitor, values); + acceptChild(visitor, updateIndexes); + } + visitor.endVisit(this); + } + + public UpdateIndexesClause getUpdateIndexes() { + return updateIndexes; + } + + public void setUpdateIndexes(UpdateIndexesClause updateIndexes) { + this.updateIndexes = updateIndexes; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public List getAt() { + return at; + } + + public void setAt(List at) { + this.at = at; + } + + public List getInto() { + return into; + } + + public void setInto(List into) { + this.into = into; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + public static class NestedTablePartitionSpec extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + + private SQLName partition; + + private List segmentAttributeItems = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + acceptChild(visitor, segmentAttributeItems); + } + visitor.endVisit(this); + } + + public SQLName getPartition() { + return partition; + } + + public void setPartition(SQLName partition) { + this.partition = partition; + } + + public List getSegmentAttributeItems() { + return segmentAttributeItems; + } + + public void setSegmentAttributeItems(List segmentAttributeItems) { + this.segmentAttributeItems = segmentAttributeItems; + } + + } + + public static class TableSpaceItem extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + private SQLName tablespace; + + public TableSpaceItem(){ + + } + + public TableSpaceItem(SQLName tablespace){ + this.tablespace = tablespace; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, tablespace); + } + visitor.endVisit(this); + } + + public SQLName getTablespace() { + return tablespace; + } + + public void setTablespace(SQLName tablespace) { + this.tablespace = tablespace; + } + } + + public static class UpdateIndexesClause extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + private List items = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, items); + } + visitor.endVisit(this); + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + } +} 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 new file mode 100644 index 0000000000..b5c5bc3ba7 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableStatement.java @@ -0,0 +1,40 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTableStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + private SQLName name; + private List items = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, items); + } + visitor.endVisit(this); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableTruncatePartition.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableTruncatePartition.java new file mode 100644 index 0000000000..a4658c5c81 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableTruncatePartition.java @@ -0,0 +1,28 @@ +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 OracleAlterTableTruncatePartition extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLName name; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + 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/OracleBlockStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java index 4d1db86fa1..31f66aba68 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleBlockStatement.java @@ -4,13 +4,16 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class OracleBlockStatement extends OracleStatementImpl { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - private List statementList = new ArrayList(); + private List parameters = new ArrayList(); + + private List statementList = new ArrayList(); public List getStatementList() { return statementList; @@ -23,9 +26,18 @@ public class OracleBlockStatement extends OracleStatementImpl { @Override public void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { + acceptChild(visitor, parameters); acceptChild(visitor, statementList); } visitor.endVisit(this); } + public List getParameters() { + return parameters; + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } + } 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 new file mode 100644 index 0000000000..01f2f3208e --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateIndexStatement.java @@ -0,0 +1,89 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import java.util.ArrayList; +import java.util.List; + +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 SQLName name; + + private SQLName table; + + private List items = new ArrayList(); + + private SQLName tablespace; + + private Type type; + + private boolean online = false; + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, table); + acceptChild(visitor, items); + acceptChild(visitor, tablespace); + } + visitor.endVisit(this); + } + + public static enum Type { + UNIQUE, BITMAP + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public SQLName getTable() { + return table; + } + + public void setTable(SQLName table) { + this.table = table; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public SQLName getTablespace() { + return tablespace; + } + + public void setTablespace(SQLName tablespace) { + this.tablespace = tablespace; + } + + public boolean isOnline() { + return online; + } + + public void setOnline(boolean online) { + this.online = online; + } + +} 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 new file mode 100644 index 0000000000..43dd20ea91 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -0,0 +1,20 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; + +public class OracleCreateTableStatement extends SQLCreateTableStatement { + + private static final long serialVersionUID = 1L; + + private SQLName tablespace; + + public SQLName getTablespace() { + return tablespace; + } + + public void setTablespace(SQLName tablespace) { + this.tablespace = tablespace; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java index 45a1fc9cf0..114c27f0bb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleDeleteStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -30,11 +31,20 @@ public class OracleDeleteStatement extends SQLDeleteStatement { private boolean only = false; private String alias; private final List hints = new ArrayList(); + private OracleReturningClause returning = null; public OracleDeleteStatement(){ } + public OracleReturningClause getReturning() { + return returning; + } + + public void setReturning(OracleReturningClause returning) { + this.returning = returning; + } + public List getHints() { return this.hints; } @@ -48,6 +58,7 @@ public class OracleDeleteStatement extends SQLDeleteStatement { acceptChild(visitor, this.hints); acceptChild(visitor, this.getTableName()); acceptChild(visitor, this.getWhere()); + acceptChild(visitor, returning); } visitor.endVisit(this); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExplainStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExplainStatement.java new file mode 100644 index 0000000000..472cee0429 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExplainStatement.java @@ -0,0 +1,50 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleExplainStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLCharExpr statementId; + private SQLExpr into; + private SQLStatement forStatement; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, statementId); + acceptChild(visitor, into); + acceptChild(visitor, forStatement); + } + visitor.endVisit(this); + } + + public SQLCharExpr getStatementId() { + return statementId; + } + + public void setStatementId(SQLCharExpr statementId) { + this.statementId = statementId; + } + + public SQLExpr getInto() { + return into; + } + + public void setInto(SQLExpr into) { + this.into = into; + } + + public SQLStatement getForStatement() { + return forStatement; + } + + public void setForStatement(SQLStatement forStatement) { + this.forStatement = forStatement; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMethodInvokeStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExprStatement.java similarity index 56% rename from src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMethodInvokeStatement.java rename to src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExprStatement.java index 2f6a549afe..72144990eb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleMethodInvokeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExprStatement.java @@ -1,19 +1,19 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -public class OracleMethodInvokeStatement extends OracleStatementImpl { +public class OracleExprStatement extends OracleStatementImpl { private static final long serialVersionUID = 1L; - private SQLMethodInvokeExpr expr; + private SQLExpr expr; - public OracleMethodInvokeStatement(){ + public OracleExprStatement(){ } - public OracleMethodInvokeStatement(SQLMethodInvokeExpr expr){ + public OracleExprStatement(SQLExpr expr){ this.expr = expr; } @@ -26,11 +26,11 @@ public class OracleMethodInvokeStatement extends OracleStatementImpl { } - public SQLMethodInvokeExpr getExpr() { + public SQLExpr getExpr() { return expr; } - public void setExpr(SQLMethodInvokeExpr expr) { + public void setExpr(SQLExpr expr) { this.expr = expr; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForStatement.java new file mode 100644 index 0000000000..19b24ae9c3 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForStatement.java @@ -0,0 +1,55 @@ +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.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleForStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLName index; + + private SQLExpr range; + + private List statements = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, index); + acceptChild(visitor, range); + acceptChild(visitor, statements); + } + visitor.endVisit(this); + } + + public SQLName getIndex() { + return index; + } + + public void setIndex(SQLName index) { + this.index = index; + } + + public SQLExpr getRange() { + return range; + } + + public void setRange(SQLExpr range) { + this.range = range; + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java new file mode 100644 index 0000000000..1c47c05a31 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleIfStatement.java @@ -0,0 +1,120 @@ +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.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleIfStatement extends OracleStatementImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr condition; + private List statements = new ArrayList(); + private List elseIfList = new ArrayList(); + private Else elseItem; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, condition); + acceptChild(visitor, statements); + acceptChild(visitor, elseIfList); + acceptChild(visitor, elseItem); + } + visitor.endVisit(this); + } + + public SQLExpr getCondition() { + return condition; + } + + public void setCondition(SQLExpr condition) { + this.condition = condition; + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + public List getElseIfList() { + return elseIfList; + } + + public void setElseIfList(List elseIfList) { + this.elseIfList = elseIfList; + } + + public Else getElseItem() { + return elseItem; + } + + public void setElseItem(Else elseItem) { + this.elseItem = elseItem; + } + + public static class ElseIf extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + + private SQLExpr condition; + private List statements = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, condition); + acceptChild(visitor, statements); + } + visitor.endVisit(this); + } + + public SQLExpr getCondition() { + return condition; + } + + public void setCondition(SQLExpr condition) { + this.condition = condition; + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + } + + public static class Else extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + + private List statements = new ArrayList(); + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, statements); + } + visitor.endVisit(this); + } + + public List getStatements() { + return statements; + } + + public void setStatements(List statements) { + this.statements = statements; + } + + } +} 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 new file mode 100644 index 0000000000..59595dd2d8 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -0,0 +1,34 @@ +package com.alibaba.druid.sql.dialect.oracle.parser; + +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.parser.Lexer; +import com.alibaba.druid.sql.parser.SQLCreateTableParser; + +public class OracleCreateTableParser extends SQLCreateTableParser { + + public OracleCreateTableParser(Lexer lexer){ + super(lexer); + this.exprParser = new OracleExprParser(lexer); + } + + public OracleCreateTableParser(String sql){ + super(new OracleLexer(sql)); + this.lexer.nextToken(); + this.exprParser = new OracleExprParser(lexer); + } + + protected OracleCreateTableStatement newCreateStatement() { + return new OracleCreateTableStatement(); + } + + public OracleCreateTableStatement parseCrateTable(boolean acceptCreate) { + OracleCreateTableStatement stmt = (OracleCreateTableStatement) super.parseCrateTable(acceptCreate); + + if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + stmt.setTablespace(this.exprParser.name()); + } + + return stmt; + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleDeleteParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleDeleteParser.java deleted file mode 100644 index e18eea8fc2..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleDeleteParser.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 1999-2011 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.parser; - -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement; -import com.alibaba.druid.sql.parser.Lexer; -import com.alibaba.druid.sql.parser.ParserException; -import com.alibaba.druid.sql.parser.SQLStatementParser; -import com.alibaba.druid.sql.parser.Token; - -public class OracleDeleteParser extends SQLStatementParser { - - public OracleDeleteParser(String sql){ - super(sql); - this.exprParser = new OracleExprParser(lexer); - } - - public OracleDeleteParser(Lexer lexer){ - super(lexer); - this.exprParser = new OracleExprParser(lexer); - } - - - public OracleDeleteStatement parseDelete() throws ParserException { - accept(Token.DELETE); - - OracleDeleteStatement deleteStatement = new OracleDeleteStatement(); - - parseHints(deleteStatement); - - if (lexer.token() == (Token.FROM)) { - lexer.nextToken(); - } - - if (identifierEquals("ONLY")) { - lexer.nextToken(); - accept(Token.LPAREN); - - SQLName tableName = exprParser.name(); - deleteStatement.setTableName(tableName); - - accept(Token.RPAREN); - } else { - SQLName tableName = exprParser.name(); - deleteStatement.setTableName(tableName); - } - - deleteStatement.setAlias(as()); - - if (lexer.token() == (Token.WHERE)) { - lexer.nextToken(); - deleteStatement.setWhere(this.exprParser.expr()); - } - - if (identifierEquals("RETURN") || identifierEquals("RETURNING")) { - throw new ParserException("TODO"); - } - - if (identifierEquals("LOG")) { - throw new ParserException("TODO"); - } - - return deleteStatement; - } - - protected OracleExprParser createExprParser() { - return new OracleExprParser(lexer); - } - - private void parseHints(OracleDeleteStatement parseInsert) throws ParserException { - this.createExprParser().parseHints(parseInsert.getHints()); - } -} 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 655c6fc294..4d9285b7c5 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 @@ -50,6 +50,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; 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.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; @@ -250,6 +251,19 @@ public class OracleExprParser extends SQLExprParser { return super.primary(); } } + + @Override + protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { + if (acceptLPAREN) { + accept(Token.LPAREN); + if (lexer.token() == Token.PLUS) { + lexer.nextToken(); + accept(Token.RPAREN); + return new OracleOuterExpr(expr); + } + } + return super.methodRest(expr, false); + } public SQLExpr primaryRest(SQLExpr expr) throws ParserException { if (lexer.token() == Token.MONKEYS_AT) { @@ -355,6 +369,13 @@ public class OracleExprParser extends SQLExprParser { } protected SQLExpr dotRest(SQLExpr expr) { + if (lexer.token() == Token.DOT) { + lexer.nextToken(); + SQLExpr upBound = expr(); + + return new OracleRangeExpr(expr, upBound); + } + if (lexer.token() == Token.LITERAL_ALIAS) { String name = '"' + lexer.stringVal() + '"'; lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java index 6e82c97ec0..12ee7e87b0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleLexer.java @@ -122,6 +122,7 @@ public class OracleLexer extends Lexer { map.put("WAIT", Token.WAIT); map.put("NOWAIT", Token.NOWAIT); map.put("SESSION", Token.SESSION); + map.put("PROCEDURE", Token.PROCEDURE); map.put("AT", Token.AT); map.put("LOCAL", Token.LOCAL); map.put("TIME", Token.TIME); @@ -131,6 +132,9 @@ public class OracleLexer extends Lexer { map.put("EXCEPTION", Token.EXCEPTION); map.put("GRANT", Token.GRANT); map.put("COMMENT", Token.COMMENT); + map.put("LOOP", Token.LOOP); + map.put("IF", Token.IF); + map.put("ELSE", Token.ELSE); DEFAULT_ORACLE_KEYWORDS = new Keywords(map); } @@ -162,6 +166,13 @@ public class OracleLexer extends Lexer { sp = 1; char ch; + boolean quoteFlag = false; + if (buf[bp + 1] == '"') { + hash = 31 * hash + '"'; + bp++; + sp++; + quoteFlag = true; + } for (;;) { ch = buf[++bp]; @@ -174,6 +185,14 @@ public class OracleLexer extends Lexer { sp++; continue; } + if (quoteFlag) { + if (ch != '"') { + throw new SQLParseException("syntax error"); + } + hash = 31 * hash + '"'; + ++bp; + sp++; + } this.ch = buf[bp]; 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 4b205b9526..f11aff84ae 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 @@ -919,8 +919,8 @@ public class OracleSelectParser extends SQLSelectParser { this.createExprParser().exprList(join.getUsing()); accept(Token.RPAREN); } - - return join; + + return parseTableSourceRest(join); } return tableSource; 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 0361217cac..33b6cd0d8f 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 @@ -23,9 +23,11 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLInsertInto; import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; @@ -33,15 +35,31 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.dialect.oracle.ast.OracleHint; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; 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.OracleAlterTableAddColumn; +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.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; +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.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.LockMode; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMethodInvokeStatement; 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.OracleSetTransactionStatement; @@ -68,6 +86,10 @@ public class OracleStatementParser extends SQLStatementParser { return new OracleExprParser(lexer); } + public OracleCreateTableParser getSQLCreateTableParser() { + return new OracleCreateTableParser(lexer); + } + protected void parseInsert0_hinits(SQLInsertInto insertStatement) { if (insertStatement instanceof OracleInsertStatement) { OracleInsertStatement stmt = (OracleInsertStatement) insertStatement; @@ -97,6 +119,9 @@ public class OracleStatementParser extends SQLStatementParser { if (lexer.token() == Token.END) { return; } + if (lexer.token() == Token.ELSE) { + return; + } if (lexer.token() == (Token.SEMI)) { lexer.nextToken(); @@ -114,9 +139,8 @@ public class OracleStatementParser extends SQLStatementParser { } if (lexer.token() == (Token.CREATE)) { - lexer.nextToken(); - - throw new ParserException("TODO"); + statementList.add(parseCreate()); + continue; } if (lexer.token() == Token.INSERT) { @@ -125,7 +149,7 @@ public class OracleStatementParser extends SQLStatementParser { } if (lexer.token() == (Token.DELETE)) { - statementList.add(new OracleDeleteParser(this.lexer).parseDelete()); + statementList.add(parseDelete()); continue; } @@ -199,25 +223,29 @@ public class OracleStatementParser extends SQLStatementParser { } if (lexer.token() == Token.IDENTIFIER) { - SQLExpr expr = exprParser.expr(); - if (expr instanceof SQLMethodInvokeExpr) { - OracleMethodInvokeStatement stmt = new OracleMethodInvokeStatement((SQLMethodInvokeExpr) expr); - statementList.add(stmt); + if (identifierEquals("EXPLAIN")) { + statementList.add(this.parseExplain()); continue; - } else if (expr instanceof SQLName) { - SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(((SQLName) expr).toString()); - statementList.add(new OracleMethodInvokeStatement(methodInvokeExpr)); - continue; - } else { - throw new ParserException("expr : " + expr); } + + SQLExpr expr = exprParser.expr(); + OracleExprStatement stmt = new OracleExprStatement(expr); + statementList.add(stmt); + continue; } if (lexer.token() == Token.LPAREN) { + char ch = lexer.current(); + int bp = lexer.bp(); lexer.nextToken(); - parseStatementList(statementList, statementList.size() + 1); - accept(Token.RPAREN); - continue; + + if (lexer.token() == Token.SELECT) { + lexer.reset(bp, ch, Token.LPAREN); + statementList.add(this.parseSelect()); + continue; + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } } if (lexer.token() == Token.SET) { @@ -233,11 +261,74 @@ public class OracleStatementParser extends SQLStatementParser { statementList.add(this.parseComment()); continue; } + if (lexer.token() == Token.FOR) { + statementList.add(this.parseFor()); + continue; + } + if (lexer.token() == Token.IF) { + statementList.add(this.parseIf()); + continue; + } throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } } + public SQLStatement parseIf() { + accept(Token.IF); + + OracleIfStatement stmt = new OracleIfStatement(); + + stmt.setCondition(this.exprParser.expr()); + + accept(Token.THEN); + + this.parseStatementList(stmt.getStatements()); + + while (lexer.token() == Token.ELSE) { + lexer.nextToken(); + + if (lexer.token() == Token.IF) { + lexer.nextToken(); + + OracleIfStatement.ElseIf elseIf = new OracleIfStatement.ElseIf(); + + elseIf.setCondition(this.exprParser.expr()); + + accept(Token.THEN); + this.parseStatementList(elseIf.getStatements()); + + stmt.getElseIfList().add(elseIf); + } else { + OracleIfStatement.Else elseItem = new OracleIfStatement.Else(); + this.parseStatementList(elseItem.getStatements()); + stmt.setElseItem(elseItem); + break; + } + } + + accept(Token.END); + accept(Token.IF); + + return stmt; + } + + public OracleForStatement parseFor() { + accept(Token.FOR); + + OracleForStatement stmt = new OracleForStatement(); + + stmt.setIndex(this.exprParser.name()); + accept(Token.IN); + stmt.setRange(this.exprParser.expr()); + accept(Token.LOOP); + + this.parseStatementList(stmt.getStatements()); + accept(Token.END); + accept(Token.LOOP); + return stmt; + } + public SQLStatement parseGrant() { accept(Token.GRANT); OracleGrantStatement stmt = new OracleGrantStatement(); @@ -315,11 +406,210 @@ public class OracleStatementParser extends SQLStatementParser { } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } + return stmt; + } else if (lexer.token() == Token.PROCEDURE) { + lexer.nextToken(); + OracleAlterProcedureStatement stmt = new OracleAlterProcedureStatement(); + stmt.setName(this.exprParser.name()); + if (identifierEquals("COMPILE")) { + lexer.nextToken(); + stmt.setCompile(true); + } + + if (identifierEquals("REUSE")) { + lexer.nextToken(); + acceptIdentifier("SETTINGS"); + stmt.setReuseSettings(true); + } + + return stmt; + } else if (lexer.token() == Token.TABLE) { + return parseAlterTable(); + } else if (lexer.token() == Token.INDEX) { + lexer.nextToken(); + OracleAlterIndexStatement stmt = new OracleAlterIndexStatement(); + stmt.setName(this.exprParser.name()); + + if (identifierEquals("rebuild")) { + lexer.nextToken(); + + OracleAlterIndexStatement.Rebuild rebuild = new OracleAlterIndexStatement.Rebuild(); + stmt.setRebuild(rebuild); + } else if (identifierEquals("MONITORING")) { + lexer.nextToken(); + acceptIdentifier("USAGE"); + stmt.setMonitoringUsage(Boolean.TRUE); + } + return stmt; } + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } + private OracleStatement parseAlterTable() { + lexer.nextToken(); + OracleAlterTableStatement stmt = new OracleAlterTableStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ADD")) { + lexer.nextToken(); + + SQLColumnDefinition columnDef; + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + columnDef = this.exprParser.parseColumn(); + accept(Token.RPAREN); + } else { + columnDef = this.exprParser.parseColumn(); + } + + OracleAlterTableAddColumn item = new OracleAlterTableAddColumn(); + item.setColumn(columnDef); + + stmt.getItems().add(item); + continue; + } else if (identifierEquals("MOVE")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("RENAME")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("MODIFY")) { + lexer.nextToken(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + OracleAlterTableModify item = new OracleAlterTableModify(); + + 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 { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + continue; + } else if (identifierEquals("SPLIT")) { + parseAlterTableSplit(stmt); + continue; + } else if (lexer.token() == Token.TRUNCATE) { + lexer.nextToken(); + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableTruncatePartition item = new OracleAlterTableTruncatePartition(); + item.setName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + continue; + } else if (lexer.token() == Token.DROP) { + parseAlterTableDrop(stmt); + continue; + } + + break; + } + + return stmt; + } + + private void parseAlterTableDrop(OracleAlterTableStatement stmt) { + lexer.nextToken(); + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableDropPartition item = new OracleAlterTableDropPartition(); + item.setName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + + private void parseAlterTableSplit(OracleAlterTableStatement stmt) { + lexer.nextToken(); + if (identifierEquals("PARTITION")) { + lexer.nextToken(); + OracleAlterTableSplitPartition item = new OracleAlterTableSplitPartition(); + item.setName(this.exprParser.name()); + + if (lexer.token() == Token.AT) { + lexer.nextToken(); + accept(Token.LPAREN); + this.exprParser.exprList(item.getAt()); + accept(Token.RPAREN); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + accept(Token.LPAREN); + + for (;;) { + NestedTablePartitionSpec spec = new NestedTablePartitionSpec(); + acceptIdentifier("PARTITION"); + spec.setPartition(this.exprParser.name()); + + for (;;) { + if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + SQLName tablespace = this.exprParser.name(); + spec.getSegmentAttributeItems().add(new TableSpaceItem(tablespace)); + continue; + } else if (identifierEquals("PCTREE")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("PCTUSED")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("INITRANS")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } else if (identifierEquals("STORAGE")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } else if (identifierEquals("LOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("NOLOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("FILESYSTEM_LIKE_LOGGING")) { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + + } + + break; + } + + item.getInto().add(spec); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + } + + if (lexer.token() == Token.UPDATE) { + lexer.nextToken(); + acceptIdentifier("INDEXES"); + UpdateIndexesClause updateIndexes = new UpdateIndexesClause(); + item.setUpdateIndexes(updateIndexes); + } + stmt.getItems().add(item); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } + public OracleLockTableStatement parseLock() { accept(Token.LOCK); accept(Token.TABLE); @@ -347,12 +637,30 @@ public class OracleStatementParser extends SQLStatementParser { } public OracleStatement parseBlock() { + OracleBlockStatement block = new OracleBlockStatement(); + if (lexer.token() == Token.DECLARE) { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + lexer.nextToken(); + + for (;;) { + SQLColumnDefinition parameter = this.exprParser.parseColumn(); + block.getParameters().add(parameter); + + if (lexer.token() == Token.COLONEQ) { + lexer.nextToken(); + parameter.setDefaultExpr(this.exprParser.expr()); + } + parameter.setParent(block); + accept(Token.SEMI); + if (lexer.token() != Token.BEGIN) { + continue; + } + + break; + } } accept(Token.BEGIN); - OracleBlockStatement block = new OracleBlockStatement(); parseStatementList(block.getStatementList()); @@ -597,7 +905,7 @@ public class OracleStatementParser extends SQLStatementParser { return null; } - private OracleReturningClause parseReturningClause() { + public OracleReturningClause parseReturningClause() { OracleReturningClause clause = null; if (lexer.token() == Token.RETURNING) { @@ -626,4 +934,132 @@ public class OracleStatementParser extends SQLStatementParser { } return clause; } + + public SQLStatement parseStatement() { + List list = new ArrayList(); + + this.parseStatementList(list, 1); + + return list.get(0); + } + + public OracleExplainStatement parseExplain() { + acceptIdentifier("EXPLAIN"); + acceptIdentifier("PLAN"); + OracleExplainStatement stmt = new OracleExplainStatement(); + + if (lexer.token() == Token.SET) { + lexer.nextToken(); + acceptIdentifier("STATEMENT_ID"); + accept(Token.EQ); + stmt.setStatementId((SQLCharExpr) this.exprParser.primary()); + } + + if (lexer.token() == Token.INTO) { + lexer.nextToken(); + stmt.setInto(this.exprParser.name()); + } + + accept(Token.FOR); + stmt.setForStatement(parseStatement()); + + return stmt; + } + + public OracleDeleteStatement parseDelete() throws ParserException { + accept(Token.DELETE); + + OracleDeleteStatement deleteStatement = new OracleDeleteStatement(); + + this.createExprParser().parseHints(deleteStatement.getHints()); + + if (lexer.token() == (Token.FROM)) { + lexer.nextToken(); + } + + if (identifierEquals("ONLY")) { + lexer.nextToken(); + accept(Token.LPAREN); + + SQLName tableName = exprParser.name(); + deleteStatement.setTableName(tableName); + + accept(Token.RPAREN); + } else { + SQLName tableName = exprParser.name(); + deleteStatement.setTableName(tableName); + } + + deleteStatement.setAlias(as()); + + if (lexer.token() == (Token.WHERE)) { + lexer.nextToken(); + deleteStatement.setWhere(this.exprParser.expr()); + } + + if (lexer.token() == Token.RETURNING) { + OracleReturningClause clause = this.parseReturningClause(); + deleteStatement.setReturning(clause); + } + if (identifierEquals("RETURN") || identifierEquals("RETURNING")) { + throw new ParserException("TODO"); + } + + if (identifierEquals("LOG")) { + throw new ParserException("TODO"); + } + + return deleteStatement; + } + + public OracleCreateIndexStatement parseCreateIndex(boolean acceptCreate) { + if (acceptCreate) { + accept(Token.CREATE); + } + + OracleCreateIndexStatement stmt = new OracleCreateIndexStatement(); + if (lexer.token() == Token.UNION) { + stmt.setType(OracleCreateIndexStatement.Type.UNIQUE); + lexer.nextToken(); + } else if (identifierEquals("BITMAP")) { + stmt.setType(OracleCreateIndexStatement.Type.BITMAP); + lexer.nextToken(); + } + + accept(Token.INDEX); + + stmt.setName(this.exprParser.name()); + + accept(Token.ON); + + stmt.setTable(this.exprParser.name()); + + accept(Token.LPAREN); + + for (;;) { + SQLSelectOrderByItem item = this.exprParser.parseSelectOrderByItem(); + stmt.getItems().add(item); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + + for (;;) { + if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + stmt.setTablespace(this.exprParser.name()); + continue; + } else if (identifierEquals("ONLINE")) { + lexer.nextToken(); + stmt.setOnline(true); + continue; + } else { + break; + } + } + return stmt; + } } 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 c0de8f1918..f3572ca4a6 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 @@ -37,20 +37,35 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; 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.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.OracleAlterTableAddColumn; +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.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.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; 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.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMethodInvokeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -810,12 +825,12 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora } @Override - public boolean visit(OracleMethodInvokeStatement x) { + public boolean visit(OracleExprStatement x) { return true; } @Override - public void endVisit(OracleMethodInvokeStatement x) { + public void endVisit(OracleExprStatement x) { } @@ -866,7 +881,7 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleArgumentExpr x) { - + } @Override @@ -876,16 +891,206 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleSetTransactionStatement x) { - + } - + @Override public boolean visit(OracleGrantStatement x) { return true; } - + @Override public void endVisit(OracleGrantStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + return true; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + return true; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + return true; + } + + @Override + 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 + public boolean visit(OracleAlterTableSplitPartition x) { + return true; + } + + @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 + public boolean visit(Else x) { + return true; + } + + @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) { } 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 6b66deb48b..0b3f1a57a2 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 @@ -43,18 +43,33 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; 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.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.OracleAlterTableAddColumn; +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.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.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; 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.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMethodInvokeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -301,92 +316,168 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(ModelClause x); void endVisit(ModelClause x); - + boolean visit(OracleMergeStatement x); - + void endVisit(OracleMergeStatement x); - + boolean visit(OracleMergeStatement.MergeUpdateClause x); - + void endVisit(OracleMergeStatement.MergeUpdateClause x); - + boolean visit(OracleMergeStatement.MergeInsertClause x); - + void endVisit(OracleMergeStatement.MergeInsertClause x); - + boolean visit(OracleErrorLoggingClause x); - + void endVisit(OracleErrorLoggingClause x); - + boolean visit(OracleReturningClause x); - + void endVisit(OracleReturningClause x); - + boolean visit(OracleInsertStatement x); - + void endVisit(OracleInsertStatement x); - + boolean visit(InsertIntoClause x); - + void endVisit(InsertIntoClause x); - + boolean visit(OracleMultiInsertStatement x); - + void endVisit(OracleMultiInsertStatement x); - + boolean visit(ConditionalInsertClause x); - + void endVisit(ConditionalInsertClause x); - + boolean visit(ConditionalInsertClauseItem x); - + void endVisit(ConditionalInsertClauseItem x); - + boolean visit(OracleSelectQueryBlock x); - + void endVisit(OracleSelectQueryBlock x); - + boolean visit(OracleBlockStatement x); - + void endVisit(OracleBlockStatement x); - + boolean visit(OracleLockTableStatement x); - + void endVisit(OracleLockTableStatement x); - + boolean visit(OracleAlterSessionStatement x); - + void endVisit(OracleAlterSessionStatement x); - - boolean visit(OracleMethodInvokeStatement x); - - void endVisit(OracleMethodInvokeStatement x); - + + boolean visit(OracleExprStatement x); + + void endVisit(OracleExprStatement x); + boolean visit(OracleDatetimeExpr x); - + void endVisit(OracleDatetimeExpr x); - + boolean visit(OracleSysdateExpr x); - + void endVisit(OracleSysdateExpr x); - + boolean visit(OracleExceptionStatement x); - + void endVisit(OracleExceptionStatement x); - + boolean visit(OracleExceptionStatement.Item x); - + void endVisit(OracleExceptionStatement.Item x); - + boolean visit(OracleArgumentExpr x); - + void endVisit(OracleArgumentExpr x); - + boolean visit(OracleSetTransactionStatement x); - + void endVisit(OracleSetTransactionStatement x); - + boolean visit(OracleGrantStatement x); - + void endVisit(OracleGrantStatement x); + + boolean visit(OracleExplainStatement x); + + void endVisit(OracleExplainStatement x); + + boolean visit(OracleAlterProcedureStatement x); + + void endVisit(OracleAlterProcedureStatement x); + + boolean visit(OracleAlterTableDropPartition x); + + void endVisit(OracleAlterTableDropPartition x); + + boolean visit(OracleAlterTableTruncatePartition x); + + void endVisit(OracleAlterTableTruncatePartition x); + + boolean visit(OracleAlterTableStatement x); + + void endVisit(OracleAlterTableStatement x); + + boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x); + + void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x); + + boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x); + + void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x); + + boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); + + void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x); + + boolean visit(OracleAlterTableSplitPartition x); + + void endVisit(OracleAlterTableSplitPartition x); + + boolean visit(OracleAlterTableModify x); + + void endVisit(OracleAlterTableModify x); + + boolean visit(OracleAlterTableAddColumn x); + + void endVisit(OracleAlterTableAddColumn x); + + boolean visit(OracleCreateIndexStatement x); + + void endVisit(OracleCreateIndexStatement x); + + boolean visit(OracleForStatement x); + + void endVisit(OracleForStatement x); + + boolean visit(Else x); + + void endVisit(Else x); + + boolean visit(ElseIf x); + + void endVisit(ElseIf x); + + boolean visit(OracleIfStatement x); + + void endVisit(OracleIfStatement x); + + boolean visit(OracleRangeExpr x); + + void endVisit(OracleRangeExpr x); + + boolean visit(OracleAlterIndexStatement x); + + void endVisit(OracleAlterIndexStatement x); + + boolean visit(OracleAlterIndexStatement.Rebuild x); + + void endVisit(OracleAlterIndexStatement.Rebuild 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 a036658eda..8d632e36f4 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 @@ -28,6 +28,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; 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; @@ -70,20 +71,40 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; 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.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.OracleAlterTableAddColumn; +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.OracleAlterTableSplitPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; 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.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMethodInvokeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -124,7 +145,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return; } - if (x.getParent() instanceof SQLStatement) { + if (x.getParent() != null) { print(";"); } else { println(";"); @@ -231,6 +252,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS x.getWhere().accept(this); } + if (x.getReturning() != null) { + println(); + x.getReturning().accept(this); + } + return false; } @@ -349,7 +375,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS printAndAccept(x.getOf(), ", "); print(")"); } - + if (x.isNotWait()) { print(" NOWAIT"); } else if (x.isSkipLocked()) { @@ -407,12 +433,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS printAndAccept(x.getUsing(), ", "); print(")"); } - + if (x.getFlashback() != null) { println(); x.getFlashback().accept(this); } - + return false; } @@ -496,7 +522,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } printSelectList(select.getSelectList()); - + if (select.getInto() != null) { println(); print("INTO "); @@ -556,7 +582,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS println(); decrementIndent(); print(")"); - + if (x.getPivot() != null) { incrementIndent(); @@ -565,7 +591,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS decrementIndent(); } - + if (x.getFlashback() != null) { println(); x.getFlashback().accept(this); @@ -598,7 +624,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS x.getPartition().accept(this); } } - + if (x.getHints().size() > 0) { this.printHints(x.getHints()); } @@ -1624,9 +1650,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS if (i != 0) { println(); } - + ConditionalInsertClauseItem item = x.getItems().get(i); - + item.accept(this); } @@ -1661,16 +1687,28 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(ConditionalInsertClauseItem x) { - + } @Override public void endVisit(OracleSelectQueryBlock x) { - + } @Override public boolean visit(OracleBlockStatement x) { + if (x.getParameters().size() != 0) { + print("DECLARE"); + incrementIndent(); + println(); + + for (SQLColumnDefinition param : x.getParameters()) { + param.accept(this); + println(); + } + + decrementIndent(); + } print("BEGIN"); incrementIndent(); println(); @@ -1690,7 +1728,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleBlockStatement x) { - + } @Override @@ -1702,7 +1740,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(" MODE "); if (x.isNoWait()) { print("NOWAIT"); - } else if (x.getWait() != null){ + } else if (x.getWait() != null) { print("WAIT "); x.getWait().accept(this); } @@ -1711,7 +1749,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleLockTableStatement x) { - + } @Override @@ -1723,41 +1761,41 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleAlterSessionStatement x) { - + } @Override - public boolean visit(OracleMethodInvokeStatement x) { + public boolean visit(OracleExprStatement x) { x.getExpr().accept(this); return false; } @Override - public void endVisit(OracleMethodInvokeStatement x) { - + public void endVisit(OracleExprStatement x) { + } @Override public boolean visit(OracleDatetimeExpr x) { x.getExpr().accept(this); SQLExpr timeZone = x.getTimeZone(); - + if (timeZone instanceof SQLIdentifierExpr) { if (((SQLIdentifierExpr) timeZone).getName().equalsIgnoreCase("LOCAL")) { print(" AT LOCAL"); return false; } } - + print(" AT TIME ZONE "); timeZone.accept(this); - + return false; } @Override public void endVisit(OracleDatetimeExpr x) { - + } @Override @@ -1772,12 +1810,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleSysdateExpr x) { - + } @Override public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - + } @Override @@ -1805,7 +1843,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleExceptionStatement x) { - + } @Override @@ -1818,7 +1856,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleArgumentExpr x) { - + } @Override @@ -1830,7 +1868,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleSetTransactionStatement x) { - + } @Override @@ -1842,7 +1880,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } print(x.getPrivileges().get(i)); } - + if (x.getOn() != null) { print(" ON "); x.getOn().accept(this); @@ -1852,6 +1890,421 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS @Override public void endVisit(OracleGrantStatement x) { - + + } + + @Override + public boolean visit(OracleExplainStatement x) { + print("XPLAIN PLAN"); + incrementIndent(); + println(); + if (x.getStatementId() != null) { + print("SET STATEMENT_ID = "); + x.getStatementId().accept(this); + println(); + } + + if (x.getInto() != null) { + print("INTO "); + x.getInto().accept(this); + println(); + } + + print("FRO"); + println(); + x.getForStatement().accept(this); + + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + print("ALTER PROCEDURE "); + x.getName().accept(this); + if (x.isCompile()) { + print(" COMPILE"); + } + if (x.isReuseSettings()) { + print(" REUSE SETTINGS"); + } + return false; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + print("DROP PARTITION "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + print("ALTER TABLE "); + x.getName().accept(this); + incrementIndent(); + for (OracleAlterTableItem item : x.getItems()) { + println(); + item.accept(this); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleAlterTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + print("TRUNCATE PARTITION "); + x.getName().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(TableSpaceItem x) { + print("TABLESPACE "); + x.getTablespace().accept(this); + return false; + } + + @Override + public void endVisit(TableSpaceItem x) { + + } + + @Override + public boolean visit(UpdateIndexesClause x) { + print("UPDATE INDEXES"); + if (x.getItems().size() > 0) { + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + } + return false; + } + + @Override + public void endVisit(UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + print("SPLIT PARTITION "); + x.getName().accept(this); + + if (x.getAt().size() > 0) { + incrementIndent(); + println(); + print("AT ("); + printAndAccept(x.getAt(), ", "); + print(")"); + decrementIndent(); + } + + if (x.getInto().size() > 0) { + println(); + incrementIndent(); + print("INTO ("); + printAndAccept(x.getInto(), ", "); + print(")"); + decrementIndent(); + } + + if (x.getUpdateIndexes() != null) { + println(); + incrementIndent(); + x.getUpdateIndexes().accept(this); + decrementIndent(); + } + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(NestedTablePartitionSpec x) { + print("PARTITION "); + x.getPartition().accept(this); + for (SQLObject item : x.getSegmentAttributeItems()) { + print(" "); + item.accept(this); + } + return false; + } + + @Override + public void endVisit(NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + print("MODIFY ("); + incrementIndent(); + for (int i = 0, size = x.getColumns().size(); i < size; ++i) { + println(); + SQLColumnDefinition column = x.getColumns().get(i); + column.accept(this); + if (i != size - 1) { + print(", "); + } + } + decrementIndent(); + println(); + print(")"); + + return false; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleAlterTableAddColumn x) { + print("ADD ("); + x.getColumn().accept(this); + print(")"); + return false; + } + + @Override + public void endVisit(OracleAlterTableAddColumn x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + print("CREATE INDEX "); + if (x.getType() != null) { + print(x.getType().name()); + print(" "); + } + + x.getName().accept(this); + print(" ON "); + x.getTable().accept(this); + print("("); + printAndAccept(x.getItems(), ", "); + print(")"); + if (x.getTablespace() != null) { + print(" TABLESPACE "); + x.getTablespace().accept(this); + } + + if (x.isOnline()) { + print(" ONLINE"); + } + return false; + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + print("ALTER INDEX "); + x.getName().accept(this); + + if (x.getMonitoringUsage() != null) { + print(" MONITORING USAGE"); + } + + if (x.getRebuild() != null) { + print(" "); + x.getRebuild().accept(this); + } + + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(Rebuild x) { + print("REBUILD"); + + if (x.getOption() != null) { + print(" "); + x.getOption().accept(this); + } + return false; + } + + @Override + public void endVisit(Rebuild x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + print("FOR "); + x.getIndex().accept(this); + print(" IN "); + x.getRange().accept(this); + println(); + print("LOOP"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + + decrementIndent(); + println(); + print("END LOOP"); + return false; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(Else x) { + print("ELSE"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + if (i != 0) { + println(); + } + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + } + + decrementIndent(); + return false; + } + + @Override + public boolean visit(ElseIf x) { + print("ELSE IF "); + x.getCondition().accept(this); + print(" THEN"); + incrementIndent(); + println(); + + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + if (i != 0) { + println(); + } + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + } + + decrementIndent(); + return false; + } + + @Override + public void endVisit(ElseIf x) { + + } + + @Override + public void endVisit(Else x) { + + } + + @Override + public boolean visit(OracleIfStatement x) { + print("IF "); + x.getCondition().accept(this); + print(" THEN"); + incrementIndent(); + println(); + for (int i = 0, size = x.getStatements().size(); i < size; ++i) { + SQLStatement item = x.getStatements().get(i); + item.setParent(x); + item.accept(this); + if (i != size - 1) { + println(); + } + } + decrementIndent(); + + for (ElseIf elseIf : x.getElseIfList()) { + println(); + elseIf.accept(this); + } + + if (x.getElseItem() != null) { + println(); + x.getElseItem().accept(this); + } + println(); + print("END IF"); + return false; + } + + @Override + public void endVisit(OracleIfStatement x) { + + } + + @Override + public boolean visit(OracleRangeExpr x) { + x.getLowBound().accept(this); + print(".."); + x.getUpBound().accept(this); + return false; + } + + @Override + public void endVisit(OracleRangeExpr x) { + + } + + protected void visitColumnDefault(SQLColumnDefinition x) { + if (x.getParent() instanceof OracleBlockStatement) { + print(" := "); + } else { + print(" DEFAULT "); + } + x.getDefaultExpr().accept(this); } } 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 95c21560b7..63cc5791c8 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 @@ -54,20 +54,35 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; 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.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.OracleAlterTableAddColumn; +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.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.OracleBlockStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement; 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.OracleForStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.Else; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement.ElseIf; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement.MergeUpdateClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMethodInvokeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -228,11 +243,11 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle SQLTableSource tableSource = x.getTableSource(); SQLExpr tableExpr = null; - + if (tableSource instanceof SQLExprTableSource) { - tableExpr = ((SQLExprTableSource) tableSource).getExpr(); + tableExpr = ((SQLExprTableSource) tableSource).getExpr(); } - + if (tableExpr instanceof SQLIdentifierExpr) { String ident = tableExpr.toString(); currentTableLocal.set(ident); @@ -1129,15 +1144,15 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleAlterSessionStatement x) { } - + @Override - public boolean visit(OracleMethodInvokeStatement x) { + public boolean visit(OracleExprStatement x) { return false; } - + @Override - public void endVisit(OracleMethodInvokeStatement x) { - + public void endVisit(OracleExprStatement x) { + } @Override @@ -1160,7 +1175,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleDatetimeExpr x) { - + } @Override @@ -1170,12 +1185,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleSysdateExpr x) { - + } @Override public void endVisit(com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement.Item x) { - + } @Override @@ -1190,7 +1205,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleExceptionStatement x) { - + } @Override @@ -1200,7 +1215,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleArgumentExpr x) { - + } @Override @@ -1210,7 +1225,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleSetTransactionStatement x) { - + } @Override @@ -1220,6 +1235,203 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle @Override public void endVisit(OracleGrantStatement x) { + + } + + @Override + public boolean visit(OracleExplainStatement x) { + return false; + } + + @Override + public void endVisit(OracleExplainStatement x) { + + } + + @Override + public boolean visit(OracleAlterProcedureStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterProcedureStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableDropPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableDropPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableTruncatePartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableTruncatePartition x) { + + } + + @Override + public boolean visit(OracleAlterTableStatement x) { + String tableName = x.getName().toString(); + TableStat stat = new TableStat(); + stat.incrementAlterCount(); + this.tableStats.put(new TableStat.Name(tableName), stat); + + accept(x.getItems()); + + return false; + } + + @Override + public void endVisit(OracleAlterTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.TableSpaceItem x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.TableSpaceItem x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.UpdateIndexesClause x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition.NestedTablePartitionSpec x) { + + } + + @Override + public boolean visit(OracleAlterTableSplitPartition x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableSplitPartition x) { + + } + + @Override + public boolean visit(OracleAlterTableModify x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableModify x) { + + } + + @Override + public boolean visit(OracleAlterTableAddColumn x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableAddColumn x) { + + } + + @Override + public boolean visit(OracleCreateIndexStatement x) { + return false; + } + + @Override + public void endVisit(OracleCreateIndexStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement x) { + + } + + @Override + public boolean visit(OracleForStatement x) { + return false; + } + + @Override + public void endVisit(OracleForStatement x) { + + } + + @Override + public boolean visit(OracleAlterIndexStatement.Rebuild x) { + return false; + } + + @Override + public void endVisit(OracleAlterIndexStatement.Rebuild x) { + + } + + @Override + public boolean visit(Else x) { + return true; + } + + @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) { } } 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 fccd6e20d9..f36426c983 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -66,7 +66,7 @@ public class SQLCreateTableParser extends SQLDDLParser { lexer.nextToken(); while (lexer.token() == Token.IDENTIFIER) { - SQLColumnDefinition column = parseColumn(); + SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(column); // parseConstaint(column.getConstaints()); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLDDLParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLDDLParser.java index 12dd71dfdb..07f31280ef 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLDDLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLDDLParser.java @@ -16,8 +16,6 @@ package com.alibaba.druid.sql.parser; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.statement.NotNullConstraint; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLTableConstaint; public class SQLDDLParser extends SQLStatementParser { @@ -30,31 +28,6 @@ public class SQLDDLParser extends SQLStatementParser { super(lexer); } - protected SQLColumnDefinition parseColumn() { - SQLColumnDefinition column = new SQLColumnDefinition(); - column.setName(this.exprParser.name()); - column.setDataType(this.exprParser.parseDataType()); - - return parseColumnRest(column); - } - - protected SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { - if (lexer.token() == Token.DEFAULT) { - lexer.nextToken(); - column.setDefaultExpr(this.exprParser.expr()); - return parseColumnRest(column); - } - - if (lexer.token() == Token.NOT) { - lexer.nextToken(); - accept(Token.NULL); - column.getConstaints().add(new NotNullConstraint()); - return parseColumnRest(column); - } - - return column; - } - protected SQLTableConstaint parseConstraint() { SQLName name = null; if (lexer.token() == Token.CONSTRAINT) { 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 e379933a68..bb4ef01980 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -53,7 +53,9 @@ import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; 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.NotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem; @@ -375,6 +377,13 @@ public class SQLExprParser extends SQLParser { case INTERVAL: sqlExpr = parseInterval(); break; + case COLON: + lexer.nextToken(); + if (lexer.token == Token.LITERAL_ALIAS) { + sqlExpr = new SQLVariantRefExpr(":\"" + lexer.stringVal() + "\""); + lexer.nextToken(); + } + break; case ANY: lexer.nextToken(); if (lexer.token() == Token.LPAREN) { @@ -440,6 +449,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == Token.DOT) { lexer.nextToken(); + expr = dotRest(expr); return primaryRest(expr); } else if (lexer.token() == Token.COLONEQ) { @@ -448,44 +458,49 @@ public class SQLExprParser extends SQLParser { expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Assignment, rightExp); } else { if (lexer.token() == Token.LPAREN) { - if (expr instanceof SQLName || expr instanceof SQLDefaultExpr) { - String method_name; - - SQLMethodInvokeExpr methodInvokeExpr; - if (expr instanceof SQLPropertyExpr) { - method_name = ((SQLPropertyExpr) expr).getName(); - methodInvokeExpr = new SQLMethodInvokeExpr(method_name); - methodInvokeExpr.setOwner(((SQLPropertyExpr) expr).getOwner()); - } else { - method_name = expr.toString(); - methodInvokeExpr = new SQLMethodInvokeExpr(method_name); - } - - lexer.nextToken(); - - if (isAggreateFunction(method_name)) { - SQLAggregateExpr aggregateExpr = parseAggregateExpr(method_name); - - return aggregateExpr; - } - - - if (lexer.token() != Token.RPAREN) { - exprList(methodInvokeExpr.getParameters()); - } - - accept(Token.RPAREN); - - return primaryRest(methodInvokeExpr); - } - - throw new ParserException("not support token:" + lexer.token()); + return methodRest(expr, true); } } return expr; } + protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) { + if (acceptLPAREN) { + accept(Token.LPAREN); + } + + if (expr instanceof SQLName || expr instanceof SQLDefaultExpr) { + String method_name; + + SQLMethodInvokeExpr methodInvokeExpr; + if (expr instanceof SQLPropertyExpr) { + method_name = ((SQLPropertyExpr) expr).getName(); + methodInvokeExpr = new SQLMethodInvokeExpr(method_name); + methodInvokeExpr.setOwner(((SQLPropertyExpr) expr).getOwner()); + } else { + method_name = expr.toString(); + methodInvokeExpr = new SQLMethodInvokeExpr(method_name); + } + + if (isAggreateFunction(method_name)) { + SQLAggregateExpr aggregateExpr = parseAggregateExpr(method_name); + + return aggregateExpr; + } + + if (lexer.token() != Token.RPAREN) { + exprList(methodInvokeExpr.getParameters()); + } + + accept(Token.RPAREN); + + return primaryRest(methodInvokeExpr); + } + + throw new ParserException("not support token:" + lexer.token()); + } + protected SQLExpr dotRest(SQLExpr expr) { if (lexer.token() == Token.STAR) { lexer.nextToken(); @@ -578,9 +593,12 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token() == Token.IDENTIFIER) { identName = lexer.stringVal(); + lexer.nextToken(); + } else if (lexer.token() == Token.REFERENCE || lexer.token() == Token.DATE || lexer.token() == Token.TIMESTAMP) { + identName = lexer.stringVal(); lexer.nextToken(); } else { - throw new ParserException("error"); + throw new ParserException("error " + lexer.token()); } SQLName name = new SQLIdentifierExpr(identName); @@ -1009,19 +1027,20 @@ public class SQLExprParser extends SQLParser { return expr; } else { - throw new ParserException("TODO"); + throw new ParserException("TODO " + lexer.token()); } return expr; } public SQLDataType parseDataType() throws ParserException { - if (lexer.token() != Token.DATE && lexer.token() != Token.TIMESTAMP && lexer.token() != Token.IDENTIFIER) { - throw new ParserException("unexpect token : " + lexer.token() + " " + lexer.stringVal()); + + if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) { + return null; } + + SQLName typeExpr = name(); + String typeName = typeExpr.toString(); - String typeName = lexer.stringVal(); - - lexer.nextToken(); SQLDataType dataType = new SQLDataTypeImpl(typeName); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); @@ -1087,4 +1106,29 @@ public class SQLExprParser extends SQLParser { throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token()); } } + + public SQLColumnDefinition parseColumn() { + SQLColumnDefinition column = new SQLColumnDefinition(); + column.setName(name()); + column.setDataType(parseDataType()); + + return parseColumnRest(column); + } + + public SQLColumnDefinition parseColumnRest(SQLColumnDefinition column) { + if (lexer.token() == Token.DEFAULT) { + lexer.nextToken(); + column.setDefaultExpr(bitOr()); + return parseColumnRest(column); + } + + if (lexer.token() == Token.NOT) { + lexer.nextToken(); + accept(Token.NULL); + column.getConstaints().add(new NotNullConstraint()); + return parseColumnRest(column); + } + + return column; + } } 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 5daa4c4bcc..060cf3101f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -287,10 +287,16 @@ public class SQLStatementParser extends SQLParser { if (token == Token.TABLE) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); return createTableParser.parseCrateTable(false); + } else if (token == Token.INDEX) { + return parseCreateIndex(false); } throw new ParserException("TODO " + lexer.token()); } + + public SQLStatement parseCreateIndex(boolean acceptCreate) { + throw new ParserException("TODO " + lexer.token()); + } public SQLCreateTableParser getSQLCreateTableParser() { return new SQLCreateTableParser(lexer); diff --git a/src/main/java/com/alibaba/druid/sql/parser/Token.java b/src/main/java/com/alibaba/druid/sql/parser/Token.java index 494a30fc0c..67f286b2ca 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Token.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Token.java @@ -23,6 +23,7 @@ package com.alibaba.druid.sql.parser; */ public enum Token { FOR("FOR"), + IF("IF"), INDEX("INDEX"), PRIMARY("PRIMARY"), KEY("KEY"), @@ -159,6 +160,7 @@ public enum Token { WAIT("WAIT"), ADVISE("ADVISE"), SESSION("SESSION"), + PROCEDURE("PROCEDURE"), AT("AT"), LOCAL("LOCAL"), TIME("TIME"), @@ -167,6 +169,7 @@ public enum Token { DECLARE("DECLARE"), EXCEPTION("EXCEPTION"), GRANT("GRANT"), + LOOP("LOOP"), // transact-sql TOP("TOP"), 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 1aa3d2d492..e0c52eb62b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -396,7 +396,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { if (parent instanceof SQLSelect) { parent = parent.getParent(); } - + if (parent instanceof SQLStatement) { incrementIndent(); @@ -553,12 +553,14 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLColumnDefinition x) { x.getName().accept(this); - print(' '); - x.getDataType().accept(this); + + if (x.getDataType() != null) { + print(' '); + x.getDataType().accept(this); + } if (x.getDefaultExpr() != null) { - print(" DEFAULT "); - x.getDefaultExpr().accept(this); + visitColumnDefault(x); } for (SQLColumnConstraint item : x.getConstaints()) { @@ -569,6 +571,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { return false; } + protected void visitColumnDefault(SQLColumnDefinition x) { + print(" DEFAULT "); + x.getDefaultExpr().accept(this); + } + public boolean visit(SQLDeleteStatement x) { print("DELETE FROM "); @@ -888,16 +895,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { printAndAccept(x.getTableNames(), ", "); return false; } - + @Override public boolean visit(SQLDefaultExpr x) { print("DEFAULT"); return false; } - + @Override public void endVisit(SQLCommentStatement x) { - + } @Override @@ -908,10 +915,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { print(" "); } x.getOn().accept(this); - + print(" IS "); x.getComment().accept(this); - + 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 74a7f0e815..f87527e7a1 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -24,6 +24,15 @@ public class TableStat { int dropCount = 0; int mergeCount = 0; int createCount = 0; + int alterCount = 0; + + public int getAlterCount() { + return alterCount; + } + + public void incrementAlterCount() { + this.alterCount++; + } public int getCreateCount() { return createCount; @@ -124,6 +133,9 @@ public class TableStat { if (createCount > 0) { buf.append("Create"); } + if (alterCount > 0) { + buf.append("Alter"); + } return buf.toString(); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest1.java new file mode 100644 index 0000000000..5d5f23262c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest1.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 OracleAlterIndexTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter index PRODUCT_ADDITION_IND1 monitoring usage"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterIndexTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest2.java new file mode 100644 index 0000000000..f10eca8491 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterIndexTest2.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 OracleAlterIndexTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter index TAXI.AE_ID_AU_CATE_PROD_HMK_TMP_IND rebuild"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterProcedureTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterProcedureTest.java new file mode 100644 index 0000000000..b98e75f348 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterProcedureTest.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 OracleAlterProcedureTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter PROCEDURE ALIBABA1949.SP_BUILD_WS_DEGRADE_EMAIL compile "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleAlterProcedureTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterProcedureTest2.java new file mode 100644 index 0000000000..c586819f1d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterProcedureTest2.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 OracleAlterProcedureTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER PROCEDURE \"ALIBABA1949\".\"FIX_PRODUCT_ADDITION_YZS_0210\" COMPILE REUSE SETTINGS"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleAlterTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest.java new file mode 100644 index 0000000000..0324f7f38a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest.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 OracleAlterTableTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table WRH$_SERVICE_WAIT_CLASS drop partition WRH$_SERVIC_1870432296_13478"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest2.java new file mode 100644 index 0000000000..3e24c0053a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest2.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 OracleAlterTableTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table cdc.en_complaint_ipr_stat_fdt0 truncate partition AUTO_P_2012_02_14"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest3.java new file mode 100644 index 0000000000..ccb784879b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest3.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 OracleAlterTableTest3 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table WRH$_ROWCACHE_SUMMARY split partition WRH$_ROWCAC_1870432296_13862 " // + + " at (1870432296,13910) " // + + " into (partition WRH$_ROWCAC_1870432296_13862 tablespace SYSAUX, partition WRH$_ROWCAC_1870432296_13910 tablespace SYSAUX" // + + ") " + // + " update indexes"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest4.java new file mode 100644 index 0000000000..dd7d5e20b7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest4.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 OracleAlterTableTest4 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE ws_pledge_contract modify ( reference VARCHAR2(4000) )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest5.java new file mode 100644 index 0000000000..d50ef5fc56 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest5.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 OracleAlterTableTest5 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE ht_task_flow_biz_product_2 modify ( ipr_biz_type_id DEFAULT 0 )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest6.java new file mode 100644 index 0000000000..c15ca1d7eb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest6.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 OracleAlterTableTest6 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE wl_service_record add ( service_type VARCHAR2(32) )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleAlterTableTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest7.java new file mode 100644 index 0000000000..494155c2d5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest7.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 OracleAlterTableTest7 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE wl_ship_order modify ( forwarder_service DEFAULT 'UPS', status DEFAULT 500 )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleBlockTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest1.java new file mode 100644 index 0000000000..1dc88d66ac --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest1.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 OracleBlockTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = "DECLARE n NUMBER; str_stmt VARCHAR2(4000); sql_text ora_name_list_t; l_trace NUMBER; l_alert NUMBER; BEGIN n := ora_sql_txt(sql_text); FOR i IN 1 .. n LOOP str_stmt := SUBSTR(str_stmt || sql_text(i), 1, 300); END LOOP; SELECT COUNT(*) INTO l_trace FROM DUAL WHERE (sys_context('userenv', 'ip_address') IS NOT NULL) and lower(str_stmt) like 'alter% compile%'; IF l_trace > 0 THEN RAISE_APPLICATION_ERROR(-20001,'Please try later,DBA is publishing DDL for project'); END IF; END;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "job_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java new file mode 100644 index 0000000000..11d0c862f4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest2.java @@ -0,0 +1,65 @@ +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 OracleBlockTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = "declare i integer := 0; " // + + "begin " + // + " for c in (" + // + " select id " + // + " from wl_ship_order" + // + " where forwarder_service is null or status is null) " + // + " loop" + // + " update wl_ship_order" + // + " set forwarder_service = nvl(forwarder_service, 'UPS'), status = nvl(status, 500)" + // + " where id = c.id;" + // + " i := i + 1;" + // + " if mod(i, 100) = 0 then" + // + " commit;" + // + " end if;" + // + " end loop;" + // + " commit; " + // + "end;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "job_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest3.java new file mode 100644 index 0000000000..37377ab50b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleBlockTest3.java @@ -0,0 +1,59 @@ +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 OracleBlockTest3 extends OracleTest { + + public void test_0() throws Exception { + String sql = "DECLARE " + // + " job BINARY_INTEGER := :job; " + // + " next_date DATE := :mydate; " + // + " broken BOOLEAN := FALSE; " + // + "BEGIN " + // + " get_promo_product_search; " + // + " :mydate := next_date; " + // + " IF broken THEN :b := 1; " + // + " ELSE :b := 0; " + // + " END IF; " + // + "END; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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(2, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("departments", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "department_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "job_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("UNKNOWN", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest1.java new file mode 100644 index 0000000000..5f43189924 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateIndexTest1.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 OracleCreateIndexTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "create index PFS_PACKAGE_SAMPLE_PID_IND on PFS_PACKAGE_SAMPLE(PACKAGE_ID) tablespace appindx1m"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleCreateTableTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest1.java new file mode 100644 index 0000000000..2a4c18b4e2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest1.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 OracleCreateTableTest1 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE TABLE wl_track_task ( id NUMBER NOT NULL, gmt_modified DATE NOT NULL, gmt_create DATE NOT NULL, task_status VARCHAR2(8) NOT NULL, task_error_msg VARCHAR2(512), task_update_count NUMBER, logistics_no VARCHAR2(32) NOT NULL, logistics_type NUMBER NOT NULL ) tablespace escrow_data"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleCreateTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest2.java new file mode 100644 index 0000000000..cd422e5875 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest2.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 OracleCreateTableTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE TABLE wl_ship_forecast ( id NUMBER NOT NULL, gmt_modified DATE DEFAULT sysdate NOT NULL, gmt_create DATE DEFAULT sysdate NOT NULL, status NUMBER NOT NULL, gmt_forecast DATE, gmt_accept DATE, gmt_accept_notify DATE ) tablespace escrow_data"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleCreateTableTest3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest3.java new file mode 100644 index 0000000000..7580f34397 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest3.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 OracleCreateTableTest3 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE wl_ship_order modify ( forwarder_service NOT NULL , status NOT NULL )"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("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/OracleExplainTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleExplainTest.java new file mode 100644 index 0000000000..82569b05c1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleExplainTest.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 OracleExplainTest extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "EXPLAIN PLAN SET STATEMENT_ID='PLUS19628905' FOR select * from( select row_.*, rownum rownum_ from( SELECT h.id taskId, t.id tradeId, t.OUT_ORDER_ID orderId, t.SELLER_SEQ sellerSeq, t.BUYER_SEQ buyerSeq, h.RECORD_TYPE recordType, t.SELLER_LOGIN_ID sellerLoginId, t.SELLER_ADMIN_SEQ sellerAdminSeq, h.GMT_CREATE gmtTaskCreate, h.GMT_MODIFIED gmtTaskModified, h.GMT_FETCH_TASK gmtFetchTask, h.GMT_FINISH_TASK gmtFinishTask, h.STATUS status, h.OWNER owner FROM HT_TASK_TRADE_HISTORY h, escrow_trade t WHERE h.TRADE_ID= t.ID and h.OWNER='zhoufei.zhangzf' and h.STATUS in('running') ORDER BY h.TASK_FLOW_LEVEL, t.GMT_CREATE, h.GMT_MODIFIED DESC) row_ where rownum<= 100) where rownum_>= 80"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleExplainTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleExplainTest2.java new file mode 100644 index 0000000000..87dcbb456e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleExplainTest2.java @@ -0,0 +1,52 @@ +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 OracleExplainTest2 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "EXPLAIN PLAN " + // + " SET STATEMENT_ID = 'Raise in Tokyo' " + // + " INTO plan_table " + // + " FOR UPDATE employees " + // + " SET salary = salary * 1.10 " + // + " WHERE department_id = " + // + " (SELECT department_id FROM departments" + // + " WHERE location_id = 1700); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleInsertTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest6.java new file mode 100644 index 0000000000..0ff5882353 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest6.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; +import com.alibaba.druid.stat.TableStat; + +public class OracleInsertTest6 extends OracleTest { + + public void test_0() throws Exception { + String sql = "insert into \"OPS$ADMIN\".\"ORASTAT\" select /*+ rule */ :5 statid, 'C' type, :6 version, bitand(h.spare2,7) flags, ot.name c1, null 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.obj$ ot, sys.col$ c, sys.hist_head$ h, histgrm$ hg where :3 is null and 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 h.obj# = ot.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, ot.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.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 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(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("raises"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, 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"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest26.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest26.java new file mode 100644 index 0000000000..601c1af10e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest26.java @@ -0,0 +1,52 @@ +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 OracleSelectTest26 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from ( select rownum rnm, z.* from (select " + + " o.id,o.gmt_create as \"gm_create\",o.country as \"country\",o.status as \"status\"," + + " o.logistics_company as \"company\",o.type as \"type\",o.freight/100 as \"feight\"," + + " d.gmt_create as \"gm_create_1\",d.logistics_company as \"company_1\",d.package_num as \" \",d.declare_amount as \" \"," + + " i.gmt_stockin as \" \",i.package_amount as \" \",i.weight as \" \"," + + " u.gmt_create as \" \",u.logistics_company as \" \",u.package_amount as \" \"" + + " from wl_wh_order o left join wl_domestic_send d on d.wh_order_id=o.id left join wl_wh_in i on i.wh_order_id=o.id left join wl_wh_out u on u.out_order_id=o.id" + + " where o.id=100120667) z where rownum < :1 ) where rnm >= :2 "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleSelectTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.java new file mode 100644 index 0000000000..8128c18d18 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest27.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 OracleSelectTest27 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select object_id tab_id_noprint , -9999999 col_id_noprint " + // + ", 'table '||lower(owner)||' '||object_id||' '||lower(object_name)||' '||y.tid from dba_objects x" + // + ", search.retl_table_config_search y where object_type='TABLE' and x.owner=upper(case when instr(y.TSCHEMA,'|',1,1)>0 then substr(y.TSCHEMA,1,instr(y.TSCHEMA,'|',1,1)-1) else y.TSCHEMA end) and x.object_name=upper(y.TNAME) and ( owner not in ('SYS','SYSTEM','OUTLN','PUBLIC','WMSYS') or ( owner in ('SYS') and object_name in ('TAB$','OBJ$','COL$','CCOL$','CDEF$') ) ) union all select g.object_id as tab_id_noprint, g.column_id as tab_id_noprint , 'column '||g.column_id||' '||g.data_type||' '||g.data_length ||' '||decode(h.column_name,null ,0 ,1)||' '||lower(g.column_name) from ( select a.object_id ,a.owner, a.object_name as table_name, b.name as column_name ,b.segcol# as column_id, b.type# as data_type, b.segcollength as data_length from dba_objects a ,sys.col$ b ,search.retl_table_config_search g where a.object_id=b.obj# and a.object_type='TABLE' and a.owner=upper(case when instr(g.TSCHEMA,'|',1,1)>0 then substr(g.TSCHEMA,1,instr(g.TSCHEMA,'|',1,1)-1) else g.TSCHEMA end) and a.object_name=upper(g.TNAME) and b.segcol#!=0 and ( owner not in ('SYS','SYSTEM','OUTLN','PUBLIC','WMSYS') or ( owner in ('SYS') and a.object_name in ('TAB$','OBJ$','COL$','CCOL$','CDEF$') ) ) ) g, ( select upper(case when instr(TSCHEMA,'|',1,1)>0 then substr(TSCHEMA,1,instr(TSCHEMA,'|',1,1)-1) else TSCHEMA end) as owner, upper(a.tname) as table_name, upper(b.COLUMN_VALUE) as column_name from search.retl_table_config_search a, table(cast(erosazm.str2varlist(a.pks) as erosazm.vartabletype)) b ) h where g.owner=h.owner(+) and g.table_name=h.table_name(+) and g.column_name=h.column_name(+) order by tab_id_noprint,col_id_noprint"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleSelectTest28.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest28.java new file mode 100644 index 0000000000..85874c66d4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest28.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 OracleSelectTest28 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT /*+ ORDERED USE_NL ( \"A1 \") USE_NL ( \"A2 \") USE_NL ( \"A3 \") */ \"A3 \". \"AP_PAY_TIME \", \"A2 \". \"ORDER_ID \", \"A3 \". \"AP_PAY_AMT \", \"A1 \". \"COUNTRY \" FROM \"ESCROW \". \"TRADE_PAY \" \"A3 \", \"ESCROW \". \"ESCROW_TRADE \" \"A2 \", \"ESCROW \". \"BUSINESS_ORDER \" \"A1 \" WHERE \"A3 \". \"TRADE_ID \"= \"A2 \". \"ID \" AND \"A1 \". \"ID \"(+)=TO_NUMBER( \"A2 \". \"OUT_ORDER_ID \") AND \"A2 \". \"ORDER_FROM \"='wholesale_order' AND \"A3 \". \"AP_PAY_TIME \">=:1-.003819444444444444444444444444444444444444 AND \"A3 \". \"AP_PAY_TIME \">=TRUNC(:2)"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleSelectTest29.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest29.java new file mode 100644 index 0000000000..449f31d2e9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest29.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 OracleSelectTest29 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "(select id,super_category_id_1 from category where super_category_id_1 is not null and super_category_id_1 != '-1') union (select id,super_category_id_2 from category where super_category_id_2 is not null and super_category_id_2 != '-1') union (select id,super_category_id_3 from category where super_category_id_3 is not null and super_category_id_3 != '-1') union (select id,super_category_id_4 from category where super_category_id_4 is not null and super_category_id_4 != '-1') union (select id,super_category_id_5 from category where super_category_id_5 is not null and super_category_id_5 != '-1')"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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("\"DUAL\""))); + + 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/OracleSelectTest30.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest30.java new file mode 100644 index 0000000000..0cef33131b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest30.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 OracleSelectTest30 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT " + + // + "/* OPT_DYN_SAMP */ " + + // + "/*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ " // + + "NVL(SUM(C1),:\"SYS_B_0\"), NVL(SUM(C2),:\"SYS_B_1\") " + + // + "FROM (SELECT " + + // + " /*+ NO_PARALLEL(\"IPAY_ACCOUNT_FUND_RCD\") FULL(\"IPAY_ACCOUNT_FUND_RCD\") NO_PARALLEL_INDEX(\"IPAY_ACCOUNT_FUND_RCD\") */ " + + // + ":\"SYS_B_2\" AS C1, :\"SYS_B_3\" AS C2 FROM \"ESCROW\".\"IPAY_ACCOUNT_FUND_RCD\" SAMPLE BLOCK (:\"SYS_B_4\" , :\"SYS_B_5\") SEED (:\"SYS_B_6\") \"IPAY_ACCOUNT_FUND_RCD\") SAMPLESUB"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + System.out.println(output(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\".\"IPAY_ACCOUNT_FUND_RCD\""))); + + 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/sql/TestTransform.java b/src/test/java/com/alibaba/druid/sql/TestTransform.java index f4af9bc15a..9dcef87e56 100644 --- a/src/test/java/com/alibaba/druid/sql/TestTransform.java +++ b/src/test/java/com/alibaba/druid/sql/TestTransform.java @@ -117,40 +117,6 @@ public class TestTransform extends OracleTest { String s2 = rs.getString(2); String sqlId = rs.getString(3); - if (sqlId.equals("018vcjmqxuguv")) { - continue; - } - if (sqlId.equals("0d69js78vuh8j")) { - continue; - } - if (sqlId.equals("0khp9aykj08vq")) { - continue; - } - if (sqlId.equals("0ns0zv7qaxzus")) { - continue; - } - if (sqlId.equals("0tg8ryp81gq1w")) { - continue; - } - if (sqlId.equals("0tvydgpa3jmkv")) { - continue; - } - if (sqlId.equals("09xu7vwbdz0gs")) { - continue; - } - if (sqlId.equals("0wjc3zzc5z2x9")) { - continue; - } - if (sqlId.equals("22vkv80fyntg0")) { - continue; - } - if (sqlId.equals("24j7jc4c8hsw4")) { - continue; - } - if (sqlId.equals("2b4s4scg6rgp8")) { - continue; - } - r.setSnapshotDate(d1); r.setDbName(s2); r.setSqlId(sqlId); @@ -162,11 +128,11 @@ public class TestTransform extends OracleTest { r.setDbPk(rs.getLong(8)); System.out.println(i + "(" + r.getDbName() + "/" + r.getSqlId() + ") : " + r.getSqlText()); -// try { -// schemaStatInternal(r); -// } catch (Exception e) { -// e.printStackTrace(); -// } + try { + schemaStatInternal(r); + } catch (Throwable e) { + // e.printStackTrace(); + } } rs.close(); stmt.close(); @@ -181,7 +147,7 @@ public class TestTransform extends OracleTest { try { schemaStatInternal(r); } catch (Exception e) { - // e.printStackTrace(); + e.printStackTrace(); } } }); @@ -190,55 +156,6 @@ public class TestTransform extends OracleTest { public void schemaStatInternal(Record r) throws Exception { String sql = r.getSqlText(); - if (sql.startsWith("/* MV_REFRESH (INS) */")) { - return; - } - if (sql.startsWith("/* MV_REFRESH (DEL) */")) { - return; - } - if (sql.startsWith("SELECT /*+ Q1630000 NO_EXPAND ROWID(A1) */ A1.\"PRODUCT_ID\",A1.\"SUMMARY\"")) { - return; - } - if (sql.startsWith("declare") || sql.startsWith("DECLARE")) { - return; - } - if (sql.startsWith("alter table")) { - return; - } - if (sql.startsWith("SELECT /* OPT_DYN_SAMP */")) { - return; - } - if (sql.startsWith("EXPLAIN")) { - return; - } - if (sql.startsWith("SET")) { - return; - } - if (sql.startsWith("create index")) { - return; - } - if (sql.startsWith("alter ")) { - return; - } - if (sql.startsWith("create")) { - return; - } - if (sql.startsWith("CREATE")) { - return; - } - if (sql.startsWith("explain plan")) { - return; - } - if (sql.startsWith("ALTER ")) { - return; - } - if (r.getSqlId().equals("09x7ytfdk63sp")) { - return; - } - if (sql.indexOf("AS OF SNAPSHOT") != -1) { - return; - } - OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0);