From e9334f09e2baed8be847115ce79a3d536dcdd44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sat, 9 Jul 2016 05:01:27 +0800 Subject: [PATCH] db2 sql parser support sequence expr. fixed issue #1323 --- .../oracle/parser/OracleExprParser.java | 17 +++++ .../bvt/sql/oracle/OracleInsertTest16.java | 12 ++-- .../bvt/sql/oracle/OracleSelectTest1.java | 10 +-- .../bvt/sql/oracle/OracleSelectTest54.java | 71 +++++++++++++++++++ .../bvt/sql/oracle/OracleSelectTest55.java | 71 +++++++++++++++++++ 5 files changed, 170 insertions(+), 11 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest54.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest55.java 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 9ad47c2410..4b9d956977 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 @@ -36,6 +36,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; +import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; @@ -717,6 +718,22 @@ public class OracleExprParser extends SQLExprParser { return expr; } + + if (identifierEquals("NEXTVAL")) { + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; + SQLSequenceExpr seqExpr = new SQLSequenceExpr(identExpr, SQLSequenceExpr.Function.NextVal); + lexer.nextToken(); + return seqExpr; + } + } else if (identifierEquals("CURRVAL")) { + if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr; + SQLSequenceExpr seqExpr = new SQLSequenceExpr(identExpr, SQLSequenceExpr.Function.CurrVal); + lexer.nextToken(); + return seqExpr; + } + } return super.dotRest(expr); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java index b55744a101..c81ebaf1ab 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java @@ -36,22 +36,22 @@ public class OracleInsertTest16 extends OracleTest { OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - print(statementList); +// print(statementList); Assert.assertEquals(1, statementList.size()); Assert.assertEquals("INSERT INTO departments" // + "\nVALUES"// - + "\n(departments_seq.nextval, 'Entertainment', 162, 1400)",// + + "\n(departments_seq.NEXTVAL, 'Entertainment', 162, 1400)",// 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("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); +// System.out.println("relationships : " + visitor.getRelationships()); Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(0, visitor.getColumns().size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java index d7e6712350..bc77b67a57 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest1.java @@ -39,15 +39,15 @@ public class OracleSelectTest1 extends OracleTest { 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("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("orders"))); Assert.assertEquals(0, visitor.getTables().size()); - Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getColumns().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("bonuses", "employee_id"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest54.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest54.java new file mode 100644 index 0000000000..89a2053668 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest54.java @@ -0,0 +1,71 @@ +/* + * Copyright 1999-2101 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; + +import java.util.List; + +import org.junit.Assert; + +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; + +public class OracleSelectTest54 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT orderseq.currval FROM emp t"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + 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(1, visitor.getTables().size()); + + Assert.assertEquals(0, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + Assert.assertEquals("SELECT orderseq.CURRVAL" // + + "\nFROM emp t", text); + } + + { + String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + Assert.assertEquals("select orderseq.currval" // + + "\nfrom emp t", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest55.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest55.java new file mode 100644 index 0000000000..f1a378b612 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest55.java @@ -0,0 +1,71 @@ +/* + * Copyright 1999-2101 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; + +import java.util.List; + +import org.junit.Assert; + +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; + +public class OracleSelectTest55 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT orderseq.NEXTVAL FROM emp t"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + 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(1, visitor.getTables().size()); + + Assert.assertEquals(0, visitor.getColumns().size()); + + { + String text = SQLUtils.toOracleString(stmt); + + Assert.assertEquals("SELECT orderseq.NEXTVAL" // + + "\nFROM emp t", text); + } + + { + String text = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + + Assert.assertEquals("select orderseq.nextval" // + + "\nfrom emp t", text); + } + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("acduser.vw_acd_info", "xzqh"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}