From f5cbc026b111378765c046f48f7f4de1e87efb40 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 29 Jun 2017 15:56:04 +0800 Subject: [PATCH] improved sql parser. support oracle treat --- .../oracle/ast/expr/OracleTreatExpr.java | 82 +++++++++++++++++++ .../oracle/parser/OracleExprParser.java | 32 ++++---- .../oracle/visitor/OracleASTVisitor.java | 19 ++--- .../visitor/OracleASTVisitorAdapter.java | 24 +++--- .../oracle/visitor/OracleOutputVisitor.java | 33 ++++---- .../visitor/OracleSchemaStatVisitor.java | 25 +++--- .../druid/sql/parser/SQLStatementParser.java | 3 + .../druid/sql/visitor/SchemaStatVisitor.java | 2 +- .../create/OracleCreateIndexTest12.java | 80 ++++++++++++++++++ .../create/OracleCreateIndexTest13.java | 62 ++++++++++++++ .../create/OracleCreateIndexTest14.java | 62 ++++++++++++++ 11 files changed, 352 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest13.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest14.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java new file mode 100644 index 0000000000..adb0486ed3 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java @@ -0,0 +1,82 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.oracle.ast.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 OracleTreatExpr extends OracleSQLObjectImpl implements SQLExpr { + + private SQLExpr expr; + private SQLExpr type; + private boolean ref; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + public SQLExpr getType() { + return type; + } + + public void setType(SQLExpr type) { + if (type != null) { + type.setParent(this); + } + this.type = type; + } + + public boolean isRef() { + return ref; + } + + public void setRef(boolean ref) { + this.ref = ref; + } + + @Override + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, type); + } + visitor.endVisit(this); + } + + public OracleTreatExpr clone() { + OracleTreatExpr x = new OracleTreatExpr(); + + if (expr != null) { + x.setExpr(expr.clone()); + } + + if (type != null) { + x.setType(type.clone()); + } + + x.ref = ref; + + return x; + } +} 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 d0ab173ae9..e4c6082b18 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 @@ -44,21 +44,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause.FlashCacheType; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -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.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCheck; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint.Initially; @@ -513,6 +499,22 @@ public class OracleExprParser extends SQLExprParser { accept(Token.RPAREN); return primaryRest(methodExpr); + } else if ("treat".equalsIgnoreCase(methodName)) { + OracleTreatExpr treatExpr = new OracleTreatExpr(); + + treatExpr.setExpr(this.expr()); + + accept(Token.AS); + + if (identifierEquals("REF")) { + treatExpr.setRef(true); + lexer.nextToken(); + } + + treatExpr.setType(this.expr()); + accept(Token.RPAREN); + + return primaryRest(treatExpr); } } 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 7005dc684b..2b86810007 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 @@ -27,21 +27,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; 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.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.ast.expr.SQLDateExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -441,4 +428,8 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleExecuteImmediateStatement x); void endVisit(OracleExecuteImmediateStatement x); + + boolean visit(OracleTreatExpr x); + + void endVisit(OracleTreatExpr x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 221977920e..7b31b0dc1e 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,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; 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.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -1066,5 +1053,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora @Override public void endVisit(OracleExecuteImmediateStatement x) { + } + @Override + public boolean visit(OracleTreatExpr x) { + return true; + } + + @Override + public void endVisit(OracleTreatExpr 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 feb481b4de..b44f069874 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 @@ -44,20 +44,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; 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.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement.Rebuild; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; @@ -3251,4 +3238,22 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public void endVisit(OracleExecuteImmediateStatement x) { } + + @Override + public boolean visit(OracleTreatExpr x) { + print0(ucase ? "TREAT (" : "treat ("); + x.getExpr().accept(this); + print0(ucase ? " AS " : " as "); + if (x.isRef()) { + print0(ucase ? "REF " : "ref "); + } + x.getType().accept(this); + print(')'); + return false; + } + + @Override + public void endVisit(OracleTreatExpr 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 7be9ff50d5..02957a4d00 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 @@ -51,20 +51,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; 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.expr.OracleAnalytic; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAnalyticWindowing; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIntervalExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleIsSetExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleOuterExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.ConditionalInsertClauseItem; @@ -1459,4 +1446,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleExecuteImmediateStatement x) { } + + @Override + public boolean visit(OracleTreatExpr x) { + return true; + } + + @Override + public void endVisit(OracleTreatExpr x) { + + } } 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 ebadf8aee8..3df9fc6e0c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -1839,6 +1839,9 @@ public class SQLStatementParser extends SQLParser { SQLCreateProcedureStatement stmt = parseCreateProcedure(); stmt.setCreate(true); return stmt; + } else if (identifierEquals("BITMAP")) { + lexer.reset(markBp, markChar, Token.CREATE); + return parseCreateIndex(true); } throw new ParserException("TODO " + lexer.token()); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 86d4348d46..1adb5fb14b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -1638,7 +1638,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { setCurrentTable(table); TableStat stat = getTableStat(table); - stat.incrementDropIndexCount(); + stat.incrementCreateIndexCount(); Map aliasMap = getAliasMap(); putAliasMap(aliasMap, table, table); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java new file mode 100644 index 0000000000..3e76374c7b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest12.java @@ -0,0 +1,80 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateIndexTest12 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE BITMAP INDEX product_bm_ix \n" + + " ON hash_products(list_price)\n" + + " TABLESPACE tbs_1\n" + + " LOCAL(PARTITION ix_p1 TABLESPACE tbs_02,\n" + + " PARTITION ix_p2,\n" + + " PARTITION ix_p3 TABLESPACE tbs_03,\n" + + " PARTITION ix_p4,\n" + + " PARTITION ix_p5 TABLESPACE tbs_04 );\n"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); + stmt.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()); + + assertEquals("CREATE BITMAP INDEX product_bm_ix ON hash_products(list_price)\n" + + "TABLESPACE tbs_1\n" + + "TABLESPACE tbs_1\n" + + "LOCAL (\n" + + "\tPARTITION ix_p1\n" + + "\t\tTABLESPACE tbs_02,\n" + + "\tPARTITION ix_p2,\n" + + "\tPARTITION ix_p3\n" + + "\t\tTABLESPACE tbs_03,\n" + + "\tPARTITION ix_p4,\n" + + "\tPARTITION ix_p5\n" + + "\t\tTABLESPACE tbs_04\n" + + ");" + , SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + assertEquals(1, visitor.getTables().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("hash_products"))); + + assertEquals(1, visitor.getColumns().size()); + +// assertTrue(visitor.getColumns().contains(new TableStat.Column("xwarehouses", "sales_rep_id"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest13.java new file mode 100644 index 0000000000..089ed6460a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest13.java @@ -0,0 +1,62 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateIndexTest13 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE UNIQUE INDEX nested_tab_ix\n" + + " ON textdocs_nestedtab(NESTED_TABLE_ID, document_typ);"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); + stmt.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()); + + assertEquals("CREATE UNIQUE INDEX nested_tab_ix ON textdocs_nestedtab(NESTED_TABLE_ID, document_typ);" + , SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + assertEquals(1, visitor.getTables().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("textdocs_nestedtab"))); + + assertEquals(2, visitor.getColumns().size()); + +// assertTrue(visitor.getColumns().contains(new TableStat.Column("xwarehouses", "sales_rep_id"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest14.java new file mode 100644 index 0000000000..fbb741b3bb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateIndexTest14.java @@ -0,0 +1,62 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateIndexTest14 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE INDEX salary_i \n" + + " ON books (TREAT(author AS employee_t).salary);"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); + stmt.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()); + + assertEquals("CREATE INDEX salary_i ON books(TREAT (author AS employee_t).salary);" + , SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + assertEquals(1, visitor.getTables().size()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("books"))); + + assertEquals(0, visitor.getColumns().size()); + +// assertTrue(visitor.getColumns().contains(new TableStat.Column("xwarehouses", "sales_rep_id"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +}