diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java index d0a40e651c..169d86ecef 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataType.java @@ -24,4 +24,9 @@ public interface SQLDataType extends SQLObject { void setName(String name); List getArguments(); + + Boolean getWithTimeZone(); + void setWithTimeZone(Boolean value); + + boolean isWithLocalTimeZone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java index 95a2500934..080f9cfa61 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLDataTypeImpl.java @@ -24,6 +24,9 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { protected String name; protected final List arguments = new ArrayList(); + private Boolean withTimeZone; + + private boolean withLocalTimeZone = false; public SQLDataTypeImpl(){ @@ -62,26 +65,40 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType { this.arguments.add(argument); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SQLDataTypeImpl dataType = (SQLDataTypeImpl) o; + + if (name != null ? !name.equals(dataType.name) : dataType.name != null) return false; + if (arguments != null ? !arguments.equals(dataType.arguments) : dataType.arguments != null) return false; + return withTimeZone != null ? withTimeZone.equals(dataType.withTimeZone) : dataType.withTimeZone == null; + } + @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + arguments.hashCode(); - result = prime * result + ((name == null) ? 0 : name.hashCode()); + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (arguments != null ? arguments.hashCode() : 0); + result = 31 * result + (withTimeZone != null ? withTimeZone.hashCode() : 0); return result; } @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null) return false; - if (getClass() != obj.getClass()) return false; - SQLDataTypeImpl other = (SQLDataTypeImpl) obj; - if (!arguments.equals(other.arguments)) return false; - if (name == null) { - if (other.name != null) return false; - } else if (!name.equals(other.name)) return false; - return true; + public Boolean getWithTimeZone() { + return withTimeZone; } + public void setWithTimeZone(Boolean withTimeZone) { + this.withTimeZone = withTimeZone; + } + + public boolean isWithLocalTimeZone() { + return withLocalTimeZone; + } + + public void setWithLocalTimeZone(boolean withLocalTimeZone) { + this.withLocalTimeZone = withLocalTimeZone; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleDataTypeTimestamp.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleDataTypeTimestamp.java deleted file mode 100644 index 61f4b1956f..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleDataTypeTimestamp.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 1999-2017 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.ast; - -import com.alibaba.druid.sql.ast.SQLDataTypeImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class OracleDataTypeTimestamp extends SQLDataTypeImpl implements OracleSQLObject { - - private boolean withTimeZone = false; - private boolean withLocalTimeZone = false; - - public OracleDataTypeTimestamp(){ - this.setName("TIMESTAMP"); - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, getArguments()); - } - visitor.endVisit(this); - } - - public boolean isWithTimeZone() { - return withTimeZone; - } - - public void setWithTimeZone(boolean withTimeZone) { - this.withTimeZone = withTimeZone; - } - - public boolean isWithLocalTimeZone() { - return withLocalTimeZone; - } - - public void setWithLocalTimeZone(boolean withLocalTimeZone) { - this.withLocalTimeZone = withLocalTimeZone; - } - -} 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 87dfd6a477..8b801d568b 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 @@ -39,7 +39,6 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; @@ -200,7 +199,7 @@ public class OracleExprParser extends SQLExprParser { } if ("TIMESTAMP".equalsIgnoreCase(typeName)) { - OracleDataTypeTimestamp timestamp = new OracleDataTypeTimestamp(); + SQLDataTypeImpl timestamp = new SQLDataTypeImpl(typeName); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); @@ -214,9 +213,9 @@ public class OracleExprParser extends SQLExprParser { if (identifierEquals("LOCAL")) { lexer.nextToken(); timestamp.setWithLocalTimeZone(true); - } else { - timestamp.setWithTimeZone(true); } + + timestamp.setWithTimeZone(true); acceptIdentifier("TIME"); acceptIdentifier("ZONE"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index 2b86810007..37974009cb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -17,7 +17,6 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; @@ -369,10 +368,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleDropDbLinkStatement x); - boolean visit(OracleDataTypeTimestamp x); - - void endVisit(OracleDataTypeTimestamp x); - boolean visit(OracleDataTypeIntervalYear x); void endVisit(OracleDataTypeIntervalYear x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index 7b31b0dc1e..7683ad0f30 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -19,7 +19,6 @@ import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; @@ -912,16 +911,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleDataTypeTimestamp x) { - return true; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - @Override public boolean visit(OracleDataTypeIntervalYear x) { return true; 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 ae67f94e34..be1416badd 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 @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; @@ -2748,29 +2747,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - @Override - public boolean visit(OracleDataTypeTimestamp x) { - print0(x.getName()); - if (x.getArguments().size() > 0) { - print('('); - x.getArguments().get(0).accept(this); - print(')'); - } - - if (x.isWithTimeZone()) { - print0(ucase ? " WITH TIME ZONE" : " with time zone"); - } else if (x.isWithLocalTimeZone()) { - print0(ucase ? " WITH LOCAL TIME ZONE" : " with local time zone"); - } - - return false; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - @Override public boolean visit(OracleDataTypeIntervalYear x) { print0(x.getName()); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 02957a4d00..4f913977ae 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -33,7 +33,6 @@ import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; @@ -1256,16 +1255,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } - @Override - public boolean visit(OracleDataTypeTimestamp x) { - return false; - } - - @Override - public void endVisit(OracleDataTypeTimestamp x) { - - } - @Override public boolean visit(OracleDataTypeIntervalYear x) { 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 01d9fddb44..0282b3531d 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1844,8 +1844,10 @@ public class SQLExprParser extends SQLParser { typeName += ' ' + lexer.stringVal(); lexer.nextToken(); } - + SQLDataType dataType = new SQLDataTypeImpl(typeName); + + return parseDataTypeRest(dataType); } @@ -1861,6 +1863,20 @@ public class SQLExprParser extends SQLParser { dataType.setName("DOUBLE PRECISION"); } + if ("timestamp".equalsIgnoreCase(dataType.getName())) { + if (identifierEquals("WITHOUT")) { + lexer.nextToken(); + acceptIdentifier("TIME"); + acceptIdentifier("ZONE"); + dataType.setWithTimeZone(false); + } else if (lexer.token() == Token.WITH) { + lexer.nextToken(); + acceptIdentifier("TIME"); + acceptIdentifier("ZONE"); + dataType.setWithTimeZone(true); + } + } + return dataType; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index e2e97bdeeb..c3d83d8a9c 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -721,6 +721,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printAndAccept(x.getArguments(), ", "); print(')'); } + + Boolean withTimeZone = x.getWithTimeZone(); + if (withTimeZone != null) { + if (withTimeZone) { + if (x.isWithLocalTimeZone()) { + print0(ucase ? " WITH LOCAL TIME ZONE" : " with local time zone"); + } else { + print0(ucase ? " WITH TIME ZONE" : " with time zone"); + } + } else { + print0(ucase ? " WITHOUT TIME ZONE" : " without time zone"); + } + } } public boolean visit(SQLCharacterDataType x) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest15.java index c464085679..d4e90e0463 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest15.java @@ -45,9 +45,9 @@ public class OracleCreateTableTest15 extends OracleTest { SQLStatement statement = statementList.get(0); print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); - Assert.assertEquals("CREATE TABLE T (" + // + assertEquals("CREATE TABLE T (" + // "\n\tF1 TIMESTAMP," + // "\n\tF2 TIMESTAMP(9)," + // "\n\tF3 TIMESTAMP WITH TIME ZONE," + // @@ -65,15 +65,15 @@ public class OracleCreateTableTest15 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); + assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(6, visitor.getColumns().size()); + assertEquals(6, visitor.getColumns().size()); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F1"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F2"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F3"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F4"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F5"))); - Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F6"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F1"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F2"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F3"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F4"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F5"))); + assertTrue(visitor.getColumns().contains(new TableStat.Column("T", "F6"))); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index cd43f2f4c3..2dd68897e0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -8,7 +8,6 @@ import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeUpdateClause; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.CellAssignment; @@ -152,7 +151,6 @@ public class OracleASTVisitorAdapterTest extends TestCase { new SQLDropSequenceStatement().accept(adapter); new OracleDataTypeIntervalDay().accept(adapter); new OracleDataTypeIntervalYear().accept(adapter); - new OracleDataTypeTimestamp().accept(adapter); new OracleDropDbLinkStatement().accept(adapter); new OracleCreateDatabaseDbLinkStatement().accept(adapter); new SQLCreateProcedureStatement().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest52.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest52.java new file mode 100644 index 0000000000..a50b310b62 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest52.java @@ -0,0 +1,55 @@ +/* + * 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 PGSelectTest52 extends TestCase { + private final String dbType = JdbcConstants.POSTGRESQL; + + public void test_0() throws Exception { + String sql = "select * from t where gmt = #{time}::timestamp without time zone"; + + List stmtList = SQLUtils.parseStatements(sql, dbType); + SQLStatement stmt = stmtList.get(0); + + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE gmt = #{time}::timestamp WITHOUT TIME ZONE", SQLUtils.toPGString(stmt)); + + assertEquals("select *\n" + + "from t\n" + + "where gmt = #{time}::timestamp without time zone", 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(2, visitor.getColumns().size()); + assertEquals(1, visitor.getTables().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest53.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest53.java new file mode 100644 index 0000000000..ec1e40a30f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/select/PGSelectTest53.java @@ -0,0 +1,55 @@ +/* + * 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 PGSelectTest53 extends TestCase { + private final String dbType = JdbcConstants.POSTGRESQL; + + public void test_0() throws Exception { + String sql = "select * from t where gmt = #{time}::timestamp with time zone"; + + List stmtList = SQLUtils.parseStatements(sql, dbType); + SQLStatement stmt = stmtList.get(0); + + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE gmt = #{time}::timestamp WITH TIME ZONE", SQLUtils.toPGString(stmt)); + + assertEquals("select *\n" + + "from t\n" + + "where gmt = #{time}::timestamp with time zone", 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(2, visitor.getColumns().size()); + assertEquals(1, visitor.getTables().size()); + } +}