From e6f3f85b5109477e9eb714ad28fca1d94e9b5987 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 4 Aug 2013 22:27:06 +0800 Subject: [PATCH] add testcase & improve sql parser for sqlserver --- .../druid/sql/parser/SQLExprParser.java | 3 + .../druid/sql/parser/SQLStatementParser.java | 23 ++++-- .../sql/oracle/OracleAlterTableTest21.java | 67 +++++++++++++++++ .../sql/oracle/OracleCreateTableTest34.java | 65 +++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest10.java | 64 +++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest11.java | 64 +++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest12.java | 69 ++++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest13.java | 70 ++++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest14.java | 71 +++++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest15.java | 68 ++++++++++++++++++ .../bvt/sql/oracle/OracleInsertTest16.java | 64 +++++++++++++++++ .../sqlserver/SQLServerCreateIndexTest.java | 5 ++ .../sqlserver/SQLServerCreateIndexTest_2.java | 63 ++++++++++++++++ .../sqlserver/SQLServerCreateIndexTest_3.java | 66 +++++++++++++++++ .../sqlserver/SQLServerCreateTableTest_2.java | 69 ++++++++++++++++++ 15 files changed, 826 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest21.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest34.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest10.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest11.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest12.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest13.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest14.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest15.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_2.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_3.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_2.java diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index f5dafe2f6e..f08d3f1620 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -702,6 +702,9 @@ public class SQLExprParser extends SQLParser { } else if (lexer.token() == Token.LITERAL_CHARS) { identName = '\'' + lexer.stringVal() + '\''; lexer.nextToken(); + } else if (lexer.token() == Token.VARIANT) { + identName = lexer.stringVal(); + lexer.nextToken(); } else { throw new ParserException("error " + lexer.token()); } 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 d49361d127..bf3fdfd6d7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -525,7 +525,7 @@ public class SQLStatementParser extends SQLParser { break; } } - + if (identifierEquals("ADMIN")) { lexer.nextToken(); acceptIdentifier("OPTION"); @@ -772,7 +772,7 @@ public class SQLStatementParser extends SQLParser { return stmt; } - + protected SQLDropDatabaseStatement parseDropDatabase(boolean acceptDrop) { if (acceptDrop) { accept(Token.DROP); @@ -791,7 +791,6 @@ public class SQLStatementParser extends SQLParser { SQLName name = this.exprParser.name(); stmt.setDatabase(name); - return stmt; } @@ -1011,7 +1010,10 @@ public class SQLStatementParser extends SQLParser { if (token == Token.TABLE || identifierEquals("GLOBAL")) { SQLCreateTableParser createTableParser = getSQLCreateTableParser(); return createTableParser.parseCrateTable(false); - } else if (token == Token.INDEX || token == Token.UNIQUE) { + } else if (token == Token.INDEX // + || token == Token.UNIQUE // + || identifierEquals("NONCLUSTERED") // sql server + ) { return parseCreateIndex(false); } else if (lexer.token() == Token.SEQUENCE) { return parseCreateSequence(false); @@ -1075,7 +1077,18 @@ public class SQLStatementParser extends SQLParser { SQLCreateIndexStatement stmt = new SQLCreateIndexStatement(); if (lexer.token() == Token.UNIQUE) { - stmt.setType("UNIQUE"); + lexer.nextToken(); + if (identifierEquals("CLUSTERED")) { + lexer.nextToken(); + stmt.setType("UNIQUE CLUSTERED"); + } else { + stmt.setType("UNIQUE"); + } + } else if (identifierEquals("FULLTEXT")) { + stmt.setType("FULLTEXT"); + lexer.nextToken(); + } else if (identifierEquals("NONCLUSTERED")) { + stmt.setType("NONCLUSTERED"); lexer.nextToken(); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest21.java new file mode 100644 index 0000000000..336205c268 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest21.java @@ -0,0 +1,67 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleAlterTableTest21 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE long_tab DROP COLUMN long_pics;"; + + 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("ALTER TABLE long_tab"// + + "\n\tDROP COLUMN long_pics", // + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("long_tab"))); + + Assert.assertEquals(1, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("long_tab", "long_pics"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", + // "commission_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest34.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest34.java new file mode 100644 index 0000000000..2c91e6ad82 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest34.java @@ -0,0 +1,65 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest34 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE long_tab (pic_id NUMBER, long_pics LONG RAW);"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE long_tab ("// + + "\n\tpic_id NUMBER,"// + + "\n\tlong_pics LONG RAW"// + + "\n)",// + 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(1, visitor.getTables().size()); + + Assert.assertEquals(2, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("long_tab", "pic_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("long_tab", "long_pics"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest10.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest10.java new file mode 100644 index 0000000000..b062b1d036 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest10.java @@ -0,0 +1,64 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest10 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO departments" // + + " VALUES (280, 'Recreation', 121, 1700);"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO departments"// + + "\nVALUES"// + + "\n(280, 'Recreation', 121, 1700)",// + 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest11.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest11.java new file mode 100644 index 0000000000..479a56b2e5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest11.java @@ -0,0 +1,64 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest11 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO departments" + + " VALUES (280, 'Recreation', DEFAULT, 1700);"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO departments"// + + "\nVALUES"// + + "\n(280, 'Recreation', DEFAULT, 1700)",// + 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest12.java new file mode 100644 index 0000000000..75f740edfa --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest12.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest12 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO employees (employee_id, last_name, email, " // + + " hire_date, job_id, salary, commission_pct) "// + + " VALUES (207, 'Gregory', 'pgregory@example.com', "// + + " sysdate, 'PU_CLERK', 1.2E3, NULL);"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO employees" // + + "\n\t(employee_id, last_name, email, hire_date, job_id" // + + "\n\t, salary, commission_pct)" // + + "\nVALUES" // + + "\n(207, 'Gregory', 'pgregory@example.com', SYSDATE, 'PU_CLERK'" // + + "\n\t, 1.2E+3, NULL)",// + 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest13.java new file mode 100644 index 0000000000..365fb80e77 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest13.java @@ -0,0 +1,70 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest13 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO bonuses" // + + " SELECT employee_id, salary*1.1 "// + + " FROM employees"// + + " WHERE commission_pct > 0.25; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO bonuses" // + + "\nSELECT employee_id, salary * 1.1"// + + "\nFROM employees"// + + "\nWHERE commission_pct > 0.25",// + 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()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("bonuses"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest14.java new file mode 100644 index 0000000000..6bb997d97a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest14.java @@ -0,0 +1,71 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest14 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO raises" // + + " SELECT employee_id, salary*1.1 FROM employees"// + + " WHERE commission_pct > .2"// + + " LOG ERRORS INTO errlog ('my_bad') REJECT LIMIT 10;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO raises" // + + "\nSELECT employee_id, salary * 1.1"// + + "\nFROM employees"// + + "\nWHERE commission_pct > 0.2"// + + "\nLOG ERRORS INTO errlog ('my_bad') REJECT LIMIT 10",// + 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()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("raises"))); + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "commission_pct"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest15.java new file mode 100644 index 0000000000..e8914806f7 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest15.java @@ -0,0 +1,68 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest15 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO employees@remote" // + + " VALUES (8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL, "// + + " TO_DATE('04-OCT-1992', 'DD-MON-YYYY'), 'SH_CLERK', 3000, "// + + " NULL, 121, 20); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO employees@remote" // + + "\nVALUES"// + + "\n(8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL"// + + "\n\t, TO_DATE('04-OCT-1992', 'DD-MON-YYYY'), 'SH_CLERK', 3000, NULL, 121"// + + "\n\t, 20)",// + 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees@remote"))); + +// Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + } + +} 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 new file mode 100644 index 0000000000..97be9c8fa1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleInsertTest16.java @@ -0,0 +1,64 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.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; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleInsertTest16 extends OracleTest { + + public void test_0() throws Exception { + String sql = "INSERT INTO departments " // + + " VALUES (departments_seq.nextval, 'Entertainment', 162, 1400); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("INSERT INTO departments" // + + "\nVALUES"// + + "\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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("departments"))); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest.java index 40c8a9012f..6b6d88e428 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest.java @@ -21,12 +21,14 @@ import junit.framework.TestCase; import org.junit.Assert; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; public class SQLServerCreateIndexTest extends TestCase { @@ -38,6 +40,9 @@ public class SQLServerCreateIndexTest extends TestCase { SQLCreateIndexStatement stmt = (SQLCreateIndexStatement) statementList.get(0); Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE UNIQUE INDEX [unique_schema_migrations] ON [schema_migrations] ([version])", // + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); stmt.accept(visitor); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_2.java new file mode 100644 index 0000000000..fbe39c1c00 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_2.java @@ -0,0 +1,63 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateIndexTest_2 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1(c);"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateIndexStatement stmt = (SQLCreateIndexStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1 (c)", // + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("t1"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("t1", "c"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_3.java new file mode 100644 index 0000000000..2f2f14a787 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateIndexTest_3.java @@ -0,0 +1,66 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateIndexTest_3 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD" // + + " ON Sales.SalesPerson (SalesQuota, SalesYTD);"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateIndexStatement stmt = (SQLCreateIndexStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD" // + + " ON Sales.SalesPerson (SalesQuota, SalesYTD)", // + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("Sales.SalesPerson"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("Sales.SalesPerson", "SalesQuota"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("Sales.SalesPerson", "SalesYTD"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_2.java new file mode 100644 index 0000000000..8632d8b38b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerCreateTableTest_2.java @@ -0,0 +1,69 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.sqlserver; + +import java.util.List; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.stat.TableStat.Column; +import com.alibaba.druid.util.JdbcConstants; + +public class SQLServerCreateTableTest_2 extends TestCase { + + public void test_0() throws Exception { + String sql = "CREATE TABLE #Test (C1 nvarchar(10), C2 nvarchar(50), C3 datetime);"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + + Assert.assertEquals(1, statementList.size()); + + String output = SQLUtils.toSQLString(stmt, JdbcConstants.SQL_SERVER); + Assert.assertEquals("CREATE TABLE #Test (" // + + "\n\tC1 nvarchar(10),"// + + "\n\tC2 nvarchar(50),"// + + "\n\tC3 datetime"// + + "\n)", output); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("#Test"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("#Test", "C1"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("#Test", "C2"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("#Test", "C3"))); + } +}