From 7e7ccc11c5cac219742e355fadb8a893ebe1037e Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 20 Aug 2017 05:48:32 +0800 Subject: [PATCH] improved oracle sql parser support CreateSequence. issue #1923 --- .../statement/SQLCreateSequenceStatement.java | 13 ++++ .../oracle/parser/OracleStatementParser.java | 12 ++++ .../sql/visitor/SQLASTOutputVisitor.java | 20 +++++- ...OracleCreateSequenceTest_3_cachevalue.java | 63 +++++++++++++++++++ .../OracleCreateSequenceTest_4_order.java | 63 +++++++++++++++++++ .../OracleCreateSequenceTest_5_noorder.java | 63 +++++++++++++++++++ 6 files changed, 232 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_3_cachevalue.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_4_order.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_5_noorder.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java index 98aff4ea26..7232924e5c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java @@ -38,6 +38,8 @@ public class SQLCreateSequenceStatement extends SQLStatementImpl implements SQLD private Boolean cycle; private Boolean cache; + private SQLExpr cacheValue; + private Boolean order; @Override @@ -144,4 +146,15 @@ public class SQLCreateSequenceStatement extends SQLStatementImpl implements SQLD return null; } + + public SQLExpr getCacheValue() { + return cacheValue; + } + + public void setCacheValue(SQLExpr cacheValue) { + if (cacheValue != null) { + cacheValue.setParent(this); + } + this.cacheValue = cacheValue; + } } 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 3ba2a1175e..f0e41fe617 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 @@ -2159,11 +2159,23 @@ public class OracleStatementParser extends SQLStatementParser { } else if (lexer.token() == Token.CACHE) { lexer.nextToken(); stmt.setCache(Boolean.TRUE); + + if (lexer.token() == Token.LITERAL_INT) { + stmt.setCacheValue(this.exprParser.primary()); + } continue; } else if (lexer.token() == Token.NOCACHE) { lexer.nextToken(); stmt.setCache(Boolean.FALSE); continue; + } else if (lexer.token() == Token.ORDER) { + lexer.nextToken(); + stmt.setOrder(Boolean.TRUE); + continue; + } else if (identifierEquals("NOORDER")) { + lexer.nextToken(); + stmt.setOrder(Boolean.FALSE); + continue; } else if (identifierEquals("CYCLE")) { lexer.nextToken(); stmt.setCycle(Boolean.TRUE); 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 25050bce73..d45b61ab3f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4444,14 +4444,30 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } } - if (x.getCache() != null) { - if (x.getCache().booleanValue()) { + Boolean cache = x.getCache(); + if (cache != null) { + if (cache.booleanValue()) { print0(ucase ? " CACHE" : " cache"); + + SQLExpr cacheValue = x.getCacheValue(); + if (cacheValue != null) { + print(' '); + cacheValue.accept(this); + } } else { print0(ucase ? " NOCACHE" : " nocache"); } } + Boolean order = x.getOrder(); + if (order != null) { + if (order.booleanValue()) { + print0(ucase ? " ORDER" : " order"); + } else { + print0(ucase ? " NOORDER" : " noorder"); + } + } + return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_3_cachevalue.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_3_cachevalue.java new file mode 100644 index 0000000000..98a34e8697 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_3_cachevalue.java @@ -0,0 +1,63 @@ +/* + * 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.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; + +import java.util.List; + +public class OracleCreateSequenceTest_3_cachevalue extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" CACHE 2"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" CACHE 2",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + 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()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_4_order.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_4_order.java new file mode 100644 index 0000000000..23e956dd03 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_4_order.java @@ -0,0 +1,63 @@ +/* + * 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.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; + +import java.util.List; + +public class OracleCreateSequenceTest_4_order extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" ORDER"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" ORDER",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + 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()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_5_noorder.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_5_noorder.java new file mode 100644 index 0000000000..28bc03760f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateSequenceTest_5_noorder.java @@ -0,0 +1,63 @@ +/* + * 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.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import org.junit.Assert; + +import java.util.List; + +public class OracleCreateSequenceTest_5_noorder extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" NOORDER"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE SEQUENCE \"GJS_ZIXUN\".\"FINANCE_EXPLAIN_ID_GENERATOR\" NOORDER",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + 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()); + + Assert.assertEquals(0, visitor.getTables().size()); + + // Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("cdc.en_complaint_ipr_stat_fdt0"))); + + Assert.assertEquals(0, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "*"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "YEAR"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +}