diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java index 044d7d892f..fad83a192f 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java @@ -100,8 +100,11 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, return from; } - public void setFrom(SQLExpr from) { - this.from = from; + public void setFrom(SQLExpr x) { + if (x != null) { + x.setParent(this); + } + this.from = x; } public List getParameters() { @@ -138,6 +141,9 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, if (visitor.visit(this)) { acceptChild(visitor, this.owner); acceptChild(visitor, this.parameters); + acceptChild(visitor, this.from); + acceptChild(visitor, this.using); + acceptChild(visitor, this._for); } visitor.endVisit(this); @@ -158,6 +164,9 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, if (visitor.visit(this)) { acceptChild(visitor, this.owner); acceptChild(visitor, this.parameters); + acceptChild(visitor, this.from); + acceptChild(visitor, this.using); + acceptChild(visitor, this._for); } visitor.endVisit(this); @@ -215,6 +224,7 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, if (target == null) { return false; } + for (int i = 0; i < parameters.size(); ++i) { if (parameters.get(i) == expr) { parameters.set(i, target); @@ -222,6 +232,22 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, return true; } } + + if (from == expr) { + setFrom(target); + return true; + } + + if (using == expr) { + setUsing(target); + return true; + } + + if (_for == expr) { + setFor(target); + return true; + } + return false; } @@ -278,11 +304,11 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, return using; } - public void setUsing(SQLExpr using) { - if (using != null) { - using.setParent(this); + public void setUsing(SQLExpr x) { + if (x != null) { + x.setParent(this); } - this.using = using; + this.using = x; } public SQLExpr getFor() { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index bc12ca29d1..8cf5b348e5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -55,6 +55,9 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS protected SQLPartitionBy partitioning; protected SQLName storedAs; + protected boolean onCommitPreserveRows; + protected boolean onCommitDeleteRows; + public SQLCreateTableStatement(){ } @@ -786,6 +789,22 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return true; } + public boolean renameColumn(String colummName, String newColumnName) { + if (colummName == null || newColumnName == null || newColumnName.length() == 0) { + return false; + } + + int columnIndex = columnIndexOf(new SQLIdentifierExpr(colummName)); + if (columnIndex == -1) { + return false; + } + + SQLColumnDefinition column = (SQLColumnDefinition) tableElementList.get(columnIndex); + column.setName(new SQLIdentifierExpr(newColumnName)); + + return true; + } + private boolean apply(SQLAlterTableRename item) { SQLName name = item.getToName(); if (name == null) { @@ -978,6 +997,9 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS if (comment != null) { x.setComment(comment.clone()); } + + x.onCommitPreserveRows = onCommitPreserveRows; + x.onCommitDeleteRows = onCommitDeleteRows; } public SQLName getStoredAs() { @@ -1001,4 +1023,12 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return SQLUtils.toSQLString(this, dbType); } + public boolean isOnCommitPreserveRows() { + return onCommitPreserveRows; + } + + public void setOnCommitPreserveRows(boolean onCommitPreserveRows) { + this.onCommitPreserveRows = onCommitPreserveRows; + } + } 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 6df459deee..fce5b7f3f0 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 @@ -56,9 +56,6 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen private Integer compressLevel; private boolean compressForOltp; - private boolean onCommitPreserveRows; - private boolean onCommitDeleteRows; - private Boolean cache; private DeferredSegmentCreation deferredSegmentCreation; @@ -125,14 +122,6 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen this.cache = cache; } - public boolean isOnCommitPreserveRows() { - return onCommitPreserveRows; - } - - public void setOnCommitPreserveRows(boolean onCommitPreserveRows) { - this.onCommitPreserveRows = onCommitPreserveRows; - } - public boolean isOnCommitDeleteRows() { return onCommitDeleteRows; } 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 c6edc60a14..5c23993ca2 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 @@ -801,18 +801,18 @@ public class OracleExprParser extends SQLExprParser { over.setOrderBy(parseOrderBy()); if (over.getOrderBy() != null) { OracleAnalyticWindowing windowing = null; - if (lexer.stringVal().equalsIgnoreCase("ROWS")) { + if (lexer.identifierEquals(FnvHash.Constants.ROWS)) { lexer.nextToken(); windowing = new OracleAnalyticWindowing(); windowing.setType(OracleAnalyticWindowing.Type.ROWS); - } else if (lexer.stringVal().equalsIgnoreCase("RANGE")) { + } else if (lexer.identifierEquals(FnvHash.Constants.RANGE)) { lexer.nextToken(); windowing = new OracleAnalyticWindowing(); windowing.setType(OracleAnalyticWindowing.Type.RANGE); } if (windowing != null) { - if (lexer.stringVal().equalsIgnoreCase("CURRENT")) { + if (lexer.identifierEquals(FnvHash.Constants.CURRENT)) { lexer.nextToken(); if (lexer.stringVal().equalsIgnoreCase("ROW")) { lexer.nextToken(); @@ -821,7 +821,7 @@ public class OracleExprParser extends SQLExprParser { } throw new ParserException("syntax error. " + lexer.info()); } - if (lexer.stringVal().equalsIgnoreCase("UNBOUNDED")) { + if (lexer.identifierEquals(FnvHash.Constants.UNBOUNDED)) { lexer.nextToken(); if (lexer.stringVal().equalsIgnoreCase("PRECEDING")) { lexer.nextToken(); @@ -829,6 +829,12 @@ public class OracleExprParser extends SQLExprParser { } else { throw new ParserException("syntax error. " + lexer.info()); } + } else { + SQLExpr expr = this.expr(); + windowing.setExpr(expr); + + acceptIdentifier("PRECEDING"); + over.setWindowingPreceding(true); } over.setWindowing(windowing); 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 a7e76c3d56..a4889a63d6 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 @@ -116,6 +116,10 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS visit(windowing); } + if (x.isWindowingPreceding()) { + print0(ucase ? " PRECEDING" : " preceding"); + } + print(')'); return false; 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 a6ba88ebbb..275f69f262 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1310,6 +1310,11 @@ public class SQLExprParser extends SQLParser { case DO: case JOIN: case TYPE: + case FUNCTION: + case KEY: + case SCHEMA: + case INTERVAL: + case EXPLAIN: identName = lexer.stringVal(); lexer.nextToken(); break; 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 d8d3601cb1..ade6c4d624 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -353,7 +353,7 @@ public class SQLStatementParser extends SQLParser { continue; } - if (lexer.identifierEquals("COMMIT")) { + if (lexer.identifierEquals(FnvHash.Constants.COMMIT)) { SQLStatement stmt = parseCommit(); statementList.add(stmt); diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 01c7a5a298..79354aa1cd 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -570,6 +570,7 @@ public final class FnvHash { long ISOPEN = fnv1a_64_lower("ISOPEN"); long CONFLICT = fnv1a_64_lower("CONFLICT"); long NOTHING = fnv1a_64_lower("NOTHING"); + long COMMIT = fnv1a_64_lower("COMMIT"); long RS = fnv1a_64_lower("RS"); long RR = fnv1a_64_lower("RR"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_57.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_57.java new file mode 100644 index 0000000000..b8a95cfbce --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_57.java @@ -0,0 +1,68 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_57 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "select `ktv_resource`.`VERSION` from `ktv_resource_0118` `ktv_resource` " + + "where ((`ktv_resource`.`BUYER_ID` = 736485494) " + + " AND (`ktv_resource`.`STATUS` = 1) " + + " AND (`ktv_resource`.`START_TIME` <= '2017-10-24 00:27:21.839') " + + " AND (`ktv_resource`.`END_TIME` >= '2017-10-24 00:27:21.839') " + + " AND (`ktv_resource`.`seller_id` = 2933220011) " + + " AND (`ktv_resource`.`AVAILABLE_COUNT` IS NULL " + + " OR (`ktv_resource`.`AVAILABLE_COUNT` > 0) " + + " OR (`ktv_resource`.`AVAILABLE_COUNT` = -1))" + + ") limit 0,20"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement stmt = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + stmt.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + + System.out.println(psql); + + + assertEquals("SELECT `ktv_resource`.`VERSION`\n" + + "FROM ktv_resource `ktv_resource`\n" + + "WHERE `ktv_resource`.`BUYER_ID` = ?\n" + + "\tAND `ktv_resource`.`STATUS` = ?\n" + + "\tAND `ktv_resource`.`START_TIME` <= ?\n" + + "\tAND `ktv_resource`.`END_TIME` >= ?\n" + + "\tAND `ktv_resource`.`seller_id` = ?\n" + + "\tAND (`ktv_resource`.`AVAILABLE_COUNT` IS NULL\n" + + "\t\tOR `ktv_resource`.`AVAILABLE_COUNT` > ?\n" + + "\t\tOR `ktv_resource`.`AVAILABLE_COUNT` = ?)\n" + + "LIMIT ?, ?", psql); + + String rsql = SQLUtils.format(psql, JdbcConstants.MYSQL, parameters); + System.out.println(rsql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/SQLSortTest_2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/SQLSortTest_2.java new file mode 100644 index 0000000000..314390c74c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/SQLSortTest_2.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +public class SQLSortTest_2 extends TestCase { + public void test_sort() throws Exception { + String sql = "CREATE SYNONYM offices \n" + + " FOR hr.locations;create table hr.locations(fid varchar(200));"; + + String sortedSql = SQLUtils.sort(sql, JdbcConstants.ORACLE); + assertEquals("CREATE VIEW v0\n" + + "AS\n" + + "SELECT *\n" + + "FROM t;\n" + + "CREATE VIEW v1\n" + + "AS\n" + + "SELECT *\n" + + "FROM v0;", sortedSql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest80.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest80.java new file mode 100644 index 0000000000..6b3e6f8fe3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest80.java @@ -0,0 +1,65 @@ +/* + * 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.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest80 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE KTV.ALI_KTV_VISIT_TBD20150401 (\n" + + "\tKEY VARCHAR(20),\n" + + "\tVALUE VARCHAR(400),\n" + + "\tTYPE VARCHAR(20),\n" + + "\tID VARCHAR(50)\n" + + ")"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE KTV.ALI_KTV_VISIT_TBD20150401 (\n" + + "\tKEY VARCHAR(20),\n" + + "\tVALUE VARCHAR(400),\n" + + "\tTYPE VARCHAR(20),\n" + + "\tID VARCHAR(50)\n" + + ")",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// 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(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest81.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest81.java new file mode 100644 index 0000000000..f2977da666 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest81.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.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest81 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE ZEUS.USER_LOGIN (\n" + + "\tMACHINE VARCHAR(50),\n" + + "\tCOMMENTS VARCHAR(100),\n" + + "\tSCHEMA VARCHAR(20)\n" + + ")"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE ZEUS.USER_LOGIN (\n" + + "\tMACHINE VARCHAR(50),\n" + + "\tCOMMENTS VARCHAR(100),\n" + + "\tSCHEMA VARCHAR(20)\n" + + ")",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// 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(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest82.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest82.java new file mode 100644 index 0000000000..66e4d3afdc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest82.java @@ -0,0 +1,75 @@ +/* + * 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.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest82 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE EOA_KTV.EOA_TMP_JOBS (\n" + + "\tJOB DECIMAL(38) NOT NULL,\n" + + "\tLOG_KTV VARCHAR(30) NOT NULL,\n" + + "\tSCHEMA_KTV VARCHAR(30) NOT NULL,\n" + + "\tBROKEN VARCHAR(1),\n" + + "\tINTERVAL VARCHAR(200) NOT NULL,\n" + + "\tFAILURES DECIMAL(38),\n" + + "\tWHAT VARCHAR(4000),\n" + + "\tDBID DECIMAL(38),\n" + + "\tCOLLECTION_TIME VARCHAR(19)\n" + + ");"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE EOA_KTV.EOA_TMP_JOBS (\n" + + "\tJOB DECIMAL(38) NOT NULL,\n" + + "\tLOG_KTV VARCHAR(30) NOT NULL,\n" + + "\tSCHEMA_KTV VARCHAR(30) NOT NULL,\n" + + "\tBROKEN VARCHAR(1),\n" + + "\tINTERVAL VARCHAR(200) NOT NULL,\n" + + "\tFAILURES DECIMAL(38),\n" + + "\tWHAT VARCHAR(4000),\n" + + "\tDBID DECIMAL(38),\n" + + "\tCOLLECTION_TIME VARCHAR(19)\n" + + ");",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// 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(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest83.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest83.java new file mode 100644 index 0000000000..52009db950 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest83.java @@ -0,0 +1,103 @@ +/* + * 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.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest83 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE NIRVANA.CS_MATURE_ADVICE (\n" + + "\tID DECIMAL(38) NOT NULL,\n" + + "\tGMT_CREATED TIMESTAMP(0) NOT NULL,\n" + + "\tGMT_MODIFIED TIMESTAMP(0),\n" + + "\tCREATOR VARCHAR(32) NOT NULL,\n" + + "\tMODIFIER VARCHAR(32),\n" + + "\tTYPE VARCHAR(32) NOT NULL,\n" + + "\tEXPLAIN VARCHAR(256),\n" + + "\tMATURITY_REF DECIMAL(38) NOT NULL,\n" + + "\tSERVICE VARCHAR(512) NOT NULL,\n" + + "\tPRIORITY BIGINT,\n" + + "\tREPOSITORY_URL VARCHAR(512),\n" + + "\tSERVICE_URL VARCHAR(512),\n" + + "\tPRIMARY KEY (ID)\n" + + ");"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLCreateTableStatement stmt = (SQLCreateTableStatement) statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE NIRVANA.CS_MATURE_ADVICE (\n" + + "\tID DECIMAL(38) NOT NULL,\n" + + "\tGMT_CREATED TIMESTAMP(0) NOT NULL,\n" + + "\tGMT_MODIFIED TIMESTAMP(0),\n" + + "\tCREATOR VARCHAR(32) NOT NULL,\n" + + "\tMODIFIER VARCHAR(32),\n" + + "\tTYPE VARCHAR(32) NOT NULL,\n" + + "\tEXPLAIN VARCHAR(256),\n" + + "\tMATURITY_REF DECIMAL(38) NOT NULL,\n" + + "\tSERVICE VARCHAR(512) NOT NULL,\n" + + "\tPRIORITY BIGINT,\n" + + "\tREPOSITORY_URL VARCHAR(512),\n" + + "\tSERVICE_URL VARCHAR(512),\n" + + "\tPRIMARY KEY (ID)\n" + + ");",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + stmt.renameColumn("ID", "FID"); + + assertEquals("CREATE TABLE NIRVANA.CS_MATURE_ADVICE (\n" + + "\tFID DECIMAL(38) NOT NULL,\n" + + "\tGMT_CREATED TIMESTAMP(0) NOT NULL,\n" + + "\tGMT_MODIFIED TIMESTAMP(0),\n" + + "\tCREATOR VARCHAR(32) NOT NULL,\n" + + "\tMODIFIER VARCHAR(32),\n" + + "\tTYPE VARCHAR(32) NOT NULL,\n" + + "\tEXPLAIN VARCHAR(256),\n" + + "\tMATURITY_REF DECIMAL(38) NOT NULL,\n" + + "\tSERVICE VARCHAR(512) NOT NULL,\n" + + "\tPRIORITY BIGINT,\n" + + "\tREPOSITORY_URL VARCHAR(512),\n" + + "\tSERVICE_URL VARCHAR(512),\n" + + "\tPRIMARY KEY (ID)\n" + + ");",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// 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(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100.java new file mode 100644 index 0000000000..4b8e0ad815 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100.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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest100 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT EXTRACT(YEAR FROM SYSTIMESTAMP) AS \"YEAR\" FROM DUAL;\n" + + "SELECT EXTRACT(MONTH FROM SYSTIMESTAMP) \"MONTH\" FROM DUAL;" + + "SELECT EXTRACT(DAY FROM SYSTIMESTAMP) AS \"DAY\" FROM DUAL;" + + "SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) AS \"HOUR\" FROM DUAL;" + + "SELECT EXTRACT(MINUTE FROM SYSTIMESTAMP) AS \"MINUTE\" FROM DUAL;" + + "SELECT EXTRACT(SECOND FROM SYSTIMESTAMP) AS \"SECOND\" FROM DUAL;" + + "SELECT EXTRACT(TIMEZONE_HOUR FROM SYSTIMESTAMP) AS \"TIMEZONE_HOUR\" FROM DUAL;" + + "SELECT EXTRACT(TIMEZONE_MINUTE FROM SYSTIMESTAMP) AS \"TIMEZONE_MINUTE\" FROM DUAL;" + + "SELECT EXTRACT(TIMEZONE_REGION FROM SYSTIMESTAMP) AS \"TIMEZONE_REGION\" FROM DUAL;" + + "SELECT EXTRACT(TIMEZONE_ABBR FROM SYSTIMESTAMP) AS \"TIMEZONE_ABBR\" FROM DUAL;"; + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(10, statementList.size()); + +// SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) stmt.getSelect().getQueryBlock().getSelectList().get(0).getExpr(); +// SQLMethodInvokeExpr param0 = (SQLMethodInvokeExpr) expr.getParameters().get(0); +// assertTrue(param0.getParameters().get(0) +// instanceof SQLAggregateExpr); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT last_name, hire_date, salary, SUM(salary) OVER (ORDER BY hire_date RANGE NUMTOYMINTERVAL(1, 'year') PRECEDING) AS t_sal\n" + + "FROM employees;", text); + } + + 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(1, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(1, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest98.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest98.java new file mode 100644 index 0000000000..2fd5de7b97 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest98.java @@ -0,0 +1,78 @@ +/* + * 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest98 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT manager_id, last_name, hire_date, \n" + + " COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date \n" + + " RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count \n" + + " FROM employees;"; + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + +// SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) stmt.getSelect().getQueryBlock().getSelectList().get(0).getExpr(); +// SQLMethodInvokeExpr param0 = (SQLMethodInvokeExpr) expr.getParameters().get(0); +// assertTrue(param0.getParameters().get(0) +// instanceof SQLAggregateExpr); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT manager_id, last_name, hire_date, COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count\n" + + "FROM employees;", text); + } + + 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(1, visitor.getTables().size()); + assertEquals(4, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(1, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest99.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest99.java new file mode 100644 index 0000000000..c61b4c3a9d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest99.java @@ -0,0 +1,75 @@ +/* + * 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.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest99 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "SELECT last_name, hire_date, salary, SUM(salary) \n" + + " OVER (ORDER BY hire_date \n" + + " RANGE NUMTOYMINTERVAL(1,'year') PRECEDING) AS t_sal \n" + + " FROM employees;"; + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLSelectStatement stmt = (SQLSelectStatement) statementList.get(0); + System.out.println(stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + +// SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) stmt.getSelect().getQueryBlock().getSelectList().get(0).getExpr(); +// SQLMethodInvokeExpr param0 = (SQLMethodInvokeExpr) expr.getParameters().get(0); +// assertTrue(param0.getParameters().get(0) +// instanceof SQLAggregateExpr); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT last_name, hire_date, salary, SUM(salary) OVER (ORDER BY hire_date RANGE NUMTOYMINTERVAL(1, 'year') PRECEDING) AS t_sal\n" + + "FROM employees;", text); + } + + 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(1, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(1, visitor.getOrderByColumns().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_10.java new file mode 100644 index 0000000000..ee73863448 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_10.java @@ -0,0 +1,67 @@ +/* + * 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.postgresql; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +import java.util.List; + +public class PGCreateTableTest_10 extends PGTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE KTV.ALI_KTV_LEADS_AREA_FIX_TBD (\n" + + "\tID VARCHAR(200) NOT NULL,\n" + + "\tTYPE VARCHAR(200),\n" + + "\tCONSTRAINT idx_ALI_KTV_LEADS_AREA_FIX_TBD_PK0 PRIMARY KEY (ID)\n" + + ")"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + assertEquals("CREATE TABLE KTV.ALI_KTV_LEADS_AREA_FIX_TBD (\n" + + "\tID VARCHAR(200) NOT NULL,\n" + + "\tTYPE VARCHAR(200),\n" + + "\tCONSTRAINT idx_ALI_KTV_LEADS_AREA_FIX_TBD_PK0 PRIMARY KEY (ID)\n" + + ")", SQLUtils.toPGString(stmt)); + + assertEquals("create table KTV.ALI_KTV_LEADS_AREA_FIX_TBD (\n" + + "\tID VARCHAR(200) not null,\n" + + "\tTYPE VARCHAR(200),\n" + + "\tconstraint idx_ALI_KTV_LEADS_AREA_FIX_TBD_PK0 primary key (ID)\n" + + ")", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("KTV.ALI_KTV_LEADS_AREA_FIX_TBD"))); + + assertTrue(visitor.getTables().get(new TableStat.Name("KTV.ALI_KTV_LEADS_AREA_FIX_TBD")).getCreateCount() == 1); + + assertEquals(3, visitor.getColumns().size() ); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_11.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_11.java new file mode 100644 index 0000000000..c85a1b435e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_11.java @@ -0,0 +1,70 @@ +/* + * 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.postgresql; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +import java.util.List; + +public class PGCreateTableTest_11 extends PGTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE KTV.KTV_FUNCTION_ROLE_20151211 (\n" + + "\tURL VARCHAR(150),\n" + + "\tFUNCTION VARCHAR(1002),\n" + + "\tROLE VARCHAR(100),\n" + + "\t\"COUNT\" VARCHAR(102)\n" + + ")"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + assertEquals("CREATE TABLE KTV.KTV_FUNCTION_ROLE_20151211 (\n" + + "\tURL VARCHAR(150),\n" + + "\tFUNCTION VARCHAR(1002),\n" + + "\tROLE VARCHAR(100),\n" + + "\t\"COUNT\" VARCHAR(102)\n" + + ")", SQLUtils.toPGString(stmt)); + + assertEquals("create table KTV.KTV_FUNCTION_ROLE_20151211 (\n" + + "\tURL VARCHAR(150),\n" + + "\tFUNCTION VARCHAR(1002),\n" + + "\tROLE VARCHAR(100),\n" + + "\t\"COUNT\" VARCHAR(102)\n" + + ")", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("KTV.KTV_FUNCTION_ROLE_20151211"))); + + assertTrue(visitor.getTables().get(new TableStat.Name("KTV.KTV_FUNCTION_ROLE_20151211")).getCreateCount() == 1); + + assertEquals(4, visitor.getColumns().size() ); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_12.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_12.java new file mode 100644 index 0000000000..3a60633b16 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGCreateTableTest_12.java @@ -0,0 +1,71 @@ +/* + * 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.postgresql; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +import java.util.List; + +public class PGCreateTableTest_12 extends PGTest { + + public void test_0() throws Exception { + String sql = "CREATE GLOBAL TEMPORARY TABLE ZEUS.\"RUPD$_ALI_ZEUS_CSREASON\" (\n" + + "\tID DECIMAL(38),\n" + + "\t\"DMLTYPE$$\" VARCHAR(1),\n" + + "\tSNAPID BIGINT,\n" + + "\t\"CHANGE_VECTOR$$\" BYTEA\n" + + ")\n" + + "ON COMMIT PRESERVE ROWS"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + assertEquals("CREATE TABLE KTV.KTV_FUNCTION_ROLE_20151211 (\n" + + "\tURL VARCHAR(150),\n" + + "\tFUNCTION VARCHAR(1002),\n" + + "\tROLE VARCHAR(100),\n" + + "\t\"COUNT\" VARCHAR(102)\n" + + ")", SQLUtils.toPGString(stmt)); + + assertEquals("create table KTV.KTV_FUNCTION_ROLE_20151211 (\n" + + "\tURL VARCHAR(150),\n" + + "\tFUNCTION VARCHAR(1002),\n" + + "\tROLE VARCHAR(100),\n" + + "\t\"COUNT\" VARCHAR(102)\n" + + ")", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); + + assertTrue(visitor.getTables().containsKey(new TableStat.Name("KTV.KTV_FUNCTION_ROLE_20151211"))); + + assertTrue(visitor.getTables().get(new TableStat.Name("KTV.KTV_FUNCTION_ROLE_20151211")).getCreateCount() == 1); + + assertEquals(4, visitor.getColumns().size() ); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest59_lateral.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest59_lateral.java new file mode 100644 index 0000000000..4de8d84487 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest59_lateral.java @@ -0,0 +1,72 @@ +/* + * 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.postgresql.select; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +public class PGSelectTest59_lateral extends TestCase { + private final String dbType = JdbcConstants.POSTGRESQL; + + public void test_0() throws Exception { + String sql = "SELECT m.name AS mname, pname\n" + + "FROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true;"; + + List stmtList = SQLUtils.parseStatements(sql, dbType); + SQLStatement stmt = stmtList.get(0); + + assertEquals("SELECT id, SUM(uv[1]) AS uv1, SUM(uv[2]) AS uv2\n" + + "FROM xxxxx\n" + + "WHERE a IN (?)\n" + + "\tAND ta -> 'taAge' ?| '{ \n" + + " 1\n" + + " , \n" + + " 2\n" + + " , \n" + + " 3\n" + + " }'\n" + + "GROUP BY id", SQLUtils.toPGString(stmt)); + + assertEquals("select id, sum(uv[1]) as uv1, sum(uv[2]) as uv2\n" + + "from xxxxx\n" + + "where a in (?)\n" + + "\tand ta -> 'taAge' ?| '{ \n" + + " 1\n" + + " , \n" + + " 2\n" + + " , \n" + + " 3\n" + + " }'\n" + + "group by id", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + assertEquals(1, stmtList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(dbType); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); + + assertEquals(4, visitor.getColumns().size()); + assertEquals(1, visitor.getTables().size()); + } +}