diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java new file mode 100644 index 0000000000..95e774c000 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/StorageItem.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.clause; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class StorageItem extends OracleSQLObjectImpl { + + private static final long serialVersionUID = 1L; + private SQLName name; + private SQLExpr value; + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public SQLExpr getValue() { + return value; + } + + public void setValue(SQLExpr value) { + this.value = value; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, value); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddConstaint.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddConstaint.java new file mode 100644 index 0000000000..d946f45921 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableAddConstaint.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.statement.SQLConstaint; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OracleAlterTableAddConstaint extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLConstaint constraint; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, constraint); + } + visitor.endVisit(this); + } + + public SQLConstaint getConstraint() { + return constraint; + } + + public void setConstraint(SQLConstaint constraint) { + this.constraint = constraint; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java new file mode 100644 index 0000000000..599d1b0ec8 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java @@ -0,0 +1,28 @@ +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 OracleAlterTableRenameTo extends OracleAlterTableItem { + + private static final long serialVersionUID = 1L; + + private SQLExpr to; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, to); + } + visitor.endVisit(this); + } + + public SQLExpr getTo() { + return to; + } + + public void setTo(SQLExpr to) { + this.to = to; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index 43dd20ea91..169d142ec7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -1,14 +1,56 @@ 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.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class OracleCreateTableStatement extends SQLCreateTableStatement { +public class OracleCreateTableStatement extends SQLCreateTableStatement implements OracleStatement { private static final long serialVersionUID = 1L; private SQLName tablespace; + private SQLSelect select; + + private boolean inMemoryMetadata; + + private boolean cursorSpecificSegment; + + // NOPARALLEL + private Boolean parallel; + + private List storage = new ArrayList(); + + public Boolean getParallel() { + return parallel; + } + + public void setParallel(Boolean parallel) { + this.parallel = parallel; + } + + public boolean isCursorSpecificSegment() { + return cursorSpecificSegment; + } + + public void setCursorSpecificSegment(boolean cursorSpecificSegment) { + this.cursorSpecificSegment = cursorSpecificSegment; + } + + public boolean isInMemoryMetadata() { + return inMemoryMetadata; + } + + public void setInMemoryMetadata(boolean inMemoryMetadata) { + this.inMemoryMetadata = inMemoryMetadata; + } + public SQLName getTablespace() { return tablespace; } @@ -17,4 +59,35 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement { this.tablespace = tablespace; } + public SQLSelect getSelect() { + return select; + } + + public void setSelect(SQLSelect select) { + this.select = select; + } + + protected void accept0(SQLASTVisitor visitor) { + accept0((OracleASTVisitor) visitor); + } + + public List getStorage() { + return storage; + } + + public void setStorage(List storage) { + this.storage = storage; + } + + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + this.acceptChild(visitor, name); + this.acceptChild(visitor, tableElementList); + this.acceptChild(visitor, tablespace); + this.acceptChild(visitor, select); + this.acceptChild(visitor, storage); + } + visitor.endVisit(this); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java new file mode 100644 index 0000000000..fe1dd1ec10 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.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.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; + +public class OraclePrimaryKey extends OracleSQLObjectImpl implements SQLPrimaryKey { + + private static final long serialVersionUID = 1L; + + private SQLName name; + private List columns = new ArrayList(); + + private SQLExpr usingIndex; + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, columns); + acceptChild(visitor, usingIndex); + } + visitor.endVisit(this); + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public SQLExpr getUsingIndex() { + return usingIndex; + } + + public void setUsingIndex(SQLExpr usingIndex) { + this.usingIndex = usingIndex; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java index 59595dd2d8..dee5e835c9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -1,8 +1,11 @@ package com.alibaba.druid.sql.dialect.oracle.parser; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.parser.Lexer; import com.alibaba.druid.sql.parser.SQLCreateTableParser; +import com.alibaba.druid.sql.parser.Token; public class OracleCreateTableParser extends SQLCreateTableParser { @@ -20,15 +23,53 @@ public class OracleCreateTableParser extends SQLCreateTableParser { 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()); + + for (;;) { + if (identifierEquals("TABLESPACE")) { + lexer.nextToken(); + stmt.setTablespace(this.exprParser.name()); + } else if (identifierEquals("IN_MEMORY_METADATA")) { + lexer.nextToken(); + stmt.setInMemoryMetadata(true); + continue; + } else if (identifierEquals("CURSOR_SPECIFIC_SEGMENT")) { + lexer.nextToken(); + stmt.setCursorSpecificSegment(true); + continue; + } else if (identifierEquals("NOPARALLEL")) { + lexer.nextToken(); + stmt.setParallel(false); + continue; + } else if (identifierEquals("STORAGE")) { + lexer.nextToken(); + accept(Token.LPAREN); + + for (;;) { + if (lexer.token() == Token.IDENTIFIER) { + StorageItem item = new StorageItem(); + item.setName(this.exprParser.name()); + item.setValue(this.exprParser.expr()); + stmt.getStorage().add(item); + } else { + break; + } + } + accept(Token.RPAREN); + continue; + } + break; } - + + if (lexer.token() == Token.AS) { + lexer.nextToken(); + + OracleSelect select = new OracleSelectParser(lexer).select(); + stmt.setSelect(select); + } + return stmt; } } 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 33b6cd0d8f..e48f7fc391 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 @@ -39,8 +39,11 @@ 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.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; 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; @@ -62,6 +65,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLockTableStatement.Lo import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement; import com.alibaba.druid.sql.parser.Lexer; @@ -297,7 +301,7 @@ public class OracleStatementParser extends SQLStatementParser { accept(Token.THEN); this.parseStatementList(elseIf.getStatements()); - + stmt.getElseIfList().add(elseIf); } else { OracleIfStatement.Else elseItem = new OracleIfStatement.Else(); @@ -306,7 +310,7 @@ public class OracleStatementParser extends SQLStatementParser { break; } } - + accept(Token.END); accept(Token.IF); @@ -456,24 +460,26 @@ public class OracleStatementParser extends SQLStatementParser { if (identifierEquals("ADD")) { lexer.nextToken(); - SQLColumnDefinition columnDef; if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - columnDef = this.exprParser.parseColumn(); + SQLColumnDefinition columnDef = this.exprParser.parseColumn(); accept(Token.RPAREN); + + OracleAlterTableAddColumn item = new OracleAlterTableAddColumn(); + item.setColumn(columnDef); + + stmt.getItems().add(item); + } else if (lexer.token() == Token.CONSTRAINT) { + stmt.getItems().add(parseConstaint()); } else { - columnDef = this.exprParser.parseColumn(); + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } - 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()); + stmt.getItems().add(parseAlterTableRename()); } else if (identifierEquals("MODIFY")) { lexer.nextToken(); @@ -522,6 +528,51 @@ public class OracleStatementParser extends SQLStatementParser { return stmt; } + private OracleAlterTableItem parseAlterTableRename() { + acceptIdentifier("RENAME"); + + if (lexer.token() == Token.TO) { + lexer.nextToken(); + OracleAlterTableRenameTo item = new OracleAlterTableRenameTo(); + item.setTo(this.exprParser.name()); + return item; + } + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + private OracleAlterTableAddConstaint parseConstaint() { + accept(Token.CONSTRAINT); + + OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint(); + + SQLName name = this.exprParser.name(); + + if (lexer.token() == Token.PRIMARY) { + lexer.nextToken(); + accept(Token.KEY); + + OraclePrimaryKey primaryKey = new OraclePrimaryKey(); + accept(Token.LPAREN); + this.exprParser.exprList(primaryKey.getColumns()); + accept(Token.RPAREN); + + item.setConstraint(primaryKey); + if (lexer.token() == Token.USING) { + lexer.nextToken(); + accept(Token.INDEX); + primaryKey.setUsingIndex(this.exprParser.expr()); + } + + primaryKey.setName(name); + + item.setConstraint(primaryKey); + + return item; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + private void parseAlterTableDrop(OracleAlterTableStatement stmt) { lexer.nextToken(); if (identifierEquals("PARTITION")) { @@ -645,7 +696,7 @@ public class OracleStatementParser extends SQLStatementParser { for (;;) { SQLColumnDefinition parameter = this.exprParser.parseColumn(); block.getParameters().add(parameter); - + if (lexer.token() == Token.COLONEQ) { lexer.nextToken(); parameter.setDefaultExpr(this.exprParser.expr()); 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 f3572ca4a6..67eefbe02d 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 @@ -21,6 +21,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause.Entry; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; @@ -44,14 +45,17 @@ 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.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.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.OracleCreateTableStatement; 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; @@ -72,6 +76,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement. import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; @@ -1093,5 +1098,55 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OracleRangeExpr x) { } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + return true; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + return true; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + return true; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(StorageItem x) { + return true; + } + + @Override + public void endVisit(StorageItem 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 0b3f1a57a2..ed82744e2d 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 @@ -28,6 +28,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; @@ -50,14 +51,17 @@ 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.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.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.OracleCreateTableStatement; 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; @@ -76,6 +80,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement. import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; @@ -424,60 +429,80 @@ public interface OracleASTVisitor extends SQLASTVisitor { 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(OracleAlterTableAddConstaint x); + + void endVisit(OracleAlterTableAddConstaint x); + + boolean visit(OracleAlterTableRenameTo x); + + void endVisit(OracleAlterTableRenameTo x); + + boolean visit(OraclePrimaryKey x); + + void endVisit(OraclePrimaryKey x); + + boolean visit(OracleCreateTableStatement x); + + void endVisit(OracleCreateTableStatement x); + boolean visit(OracleAlterIndexStatement.Rebuild x); - + void endVisit(OracleAlterIndexStatement.Rebuild x); + + boolean visit(StorageItem x); + + void endVisit(StorageItem 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 8d632e36f4..8324311d07 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.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.SQLCreateTableStatement; 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; @@ -56,6 +57,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; @@ -79,9 +81,11 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.R 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.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; 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; @@ -91,6 +95,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePar 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.OracleCreateTableStatement; 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; @@ -111,6 +116,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement. import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; @@ -2307,4 +2313,110 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } x.getDefaultExpr().accept(this); } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + print("ADD "); + x.getConstraint().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + if (x.getName() != null) { + print("CONSTRAINT "); + x.getName().accept(this); + print(" "); + } + print("PRIMARY KEY ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + if (x.getUsingIndex() != null) { + print(" USING INDEX "); + x.getUsingIndex().accept(this); + } + return false; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + this.visit((SQLCreateTableStatement) x); + + incrementIndent(); + if (x.getTablespace() != null) { + print(" TABLESPACE "); + x.getTablespace().accept(this); + } + + if (x.isInMemoryMetadata()) { + print(" IN_MEMORY_METADATA"); + } + + if (x.isCursorSpecificSegment()) { + print(" CURSOR_SPECIFIC_SEGMENT"); + } + + if (x.getParallel() == Boolean.TRUE) { + + } else if (x.getParallel() == Boolean.FALSE) { + print(" NOPARALLEL"); + } + + if (x.getStorage().size() > 0) { + print(" STORAGE ("); + printAndAccept(x.getStorage(), ", "); + print(")"); + } + + if (x.getSelect() != null) { + println(); + print("AS"); + println(); + x.getSelect().accept(this); + } + decrementIndent(); + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + print("RENAME TO "); + x.getTo().accept(this); + return false; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(StorageItem x) { + x.getName().accept(this); + if (x.getValue() != null) { + print(" "); + x.getValue().accept(this); + } + return false; + } + + @Override + public void endVisit(StorageItem x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 63cc5791c8..375096e064 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 @@ -12,6 +12,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; @@ -38,6 +39,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; +import com.alibaba.druid.sql.dialect.oracle.ast.clause.StorageItem; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause.Entry; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr; @@ -61,14 +63,17 @@ 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.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.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.OracleCreateTableStatement; 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; @@ -89,6 +94,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement. import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.InsertIntoClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause; @@ -1434,4 +1440,55 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleRangeExpr x) { } + + @Override + public boolean visit(OracleAlterTableAddConstaint x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableAddConstaint x) { + + } + + @Override + public boolean visit(OraclePrimaryKey x) { + return false; + } + + @Override + public void endVisit(OraclePrimaryKey x) { + + } + + @Override + public boolean visit(OracleCreateTableStatement x) { + this.visit((SQLCreateTableStatement) x); + return false; + } + + @Override + public void endVisit(OracleCreateTableStatement x) { + this.endVisit((SQLCreateTableStatement) x); + } + + @Override + public boolean visit(OracleAlterTableRenameTo x) { + return false; + } + + @Override + public void endVisit(OracleAlterTableRenameTo x) { + + } + + @Override + public boolean visit(StorageItem x) { + return false; + } + + @Override + public void endVisit(StorageItem 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 f36426c983..a246ce0d1b 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -39,14 +39,14 @@ public class SQLCreateTableParser extends SQLDDLParser { SQLCreateTableStatement createTable = newCreateStatement(); - if (lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase("GLOBAL")) { + if (identifierEquals("GLOBAL")) { lexer.nextToken(); - if (lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase("TEMPORAY")) { + if (identifierEquals("TEMPORARY")) { lexer.nextToken(); createTable.setType(SQLCreateTableStatement.Type.GLOBAL_TEMPORARY); } else { - throw new ParserException("syntax error"); + throw new ParserException("syntax error " + lexer.token() + " " + lexer.stringVal()); } } else if (lexer.token() == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase("LOCAL")) { lexer.nextToken(); @@ -65,7 +65,7 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - while (lexer.token() == Token.IDENTIFIER) { + while (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) { SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(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 060cf3101f..15364d2a90 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -284,7 +284,7 @@ public class SQLStatementParser extends SQLParser { Token token = lexer.token(); - if (token == Token.TABLE) { + if (token == Token.TABLE || identifierEquals("GLOBAL")) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); return createTableParser.parseCrateTable(false); } else if (token == Token.INDEX) { 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 e0c52eb62b..507b58d863 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -553,7 +553,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLColumnDefinition x) { x.getName().accept(this); - + if (x.getDataType() != null) { print(' '); x.getDataType().accept(this); @@ -669,15 +669,20 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { } x.getName().accept(this); - print(" ("); - for (int i = 0, size = x.getTableElementList().size(); i < size; ++i) { - if (i != 0) { - print(", "); + int size = x.getTableElementList().size(); + + if (size > 0) { + print(" ("); + + for (int i = 0; i < size; ++i) { + if (i != 0) { + print(", "); + } + x.getTableElementList().get(i).accept(this); } - x.getTableElementList().get(i).accept(this); + print(")"); } - print(")"); return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest8.java new file mode 100644 index 0000000000..5f66470d16 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest8.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 OracleAlterTableTest8 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE ws_i18n_translate_item ADD CONSTRAINT ws_i18n_translate_item_pk PRIMARY KEY (id) USING INDEX ws_i18n_translate_item_pk"; + + 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/OracleAlterTableTestRename.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTestRename.java new file mode 100644 index 0000000000..d528d929da --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTestRename.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 OracleAlterTableTestRename extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "alter table PRODUCT_NEW_CLUSTER_YZS_0210 rename to PRODUCT_NEW_CLUSTER_YZS_0210_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("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/OracleCreateTableTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest4.java new file mode 100644 index 0000000000..64b09d4a32 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest4.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 OracleCreateTableTest4 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "create table tbd_qi_xiaq_100961 tablespace tbd_data as select * /*1*/from product where company_id=10239004 "; + + 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/OracleCreateTableTest5.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest5.java new file mode 100644 index 0000000000..88de950ab4 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest5.java @@ -0,0 +1,46 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleCreateTableTest5 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE GLOBAL TEMPORARY TABLE \"SYS\".\"SYS_TEMP_0FD9D670A_93E068F3\" (\"C0\" VARCHAR2(30),\"C1\" VARCHAR2(27) ) " + + "IN_MEMORY_METADATA CURSOR_SPECIFIC_SEGMENT STORAGE (OBJNO 4254951178 )"; + + 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/OracleCreateTableTest6.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest6.java new file mode 100644 index 0000000000..61b7566727 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest6.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 OracleCreateTableTest6 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE GLOBAL TEMPORARY TABLE \"SYS\".\"SYS_TEMP_0FD9D66FD_93E068F3\" (\"C0\" NUMBER,\"C1\" NUMBER ) IN_MEMORY_METADATA CURSOR_SPECIFIC_SEGMENT STORAGE (OBJNO 4254951165 ) NOPARALLEL"; + + 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"))); + } +}