From 3902b8c30a7af4e20c5d6ebd65e3f1798c4f5cae Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 19 Sep 2016 14:28:27 +0800 Subject: [PATCH] improved postgresql sql parser support. support Date Expressions. issue #1391 --- .../expr/SQLDateExpr.java} | 14 ++-- .../oracle/parser/OracleExprParser.java | 13 +--- .../oracle/visitor/OracleASTVisitor.java | 6 +- .../visitor/OracleASTVisitorAdapter.java | 13 +--- .../oracle/visitor/OracleOutputVisitor.java | 14 +--- .../visitor/OracleSchemaStatVisitor.java | 13 +--- .../druid/sql/parser/SQLExprParser.java | 76 +++++++++---------- .../sql/visitor/SQLASTOutputVisitor.java | 43 ++--------- .../druid/sql/visitor/SQLASTVisitor.java | 3 + .../sql/visitor/SQLASTVisitorAdapter.java | 44 +++-------- .../druid/bvt/sql/EqualTest_OracleDate.java | 6 +- .../visitor/OracleASTVisitorAdapterTest.java | 4 +- .../bvt/sql/postgresql/PGSelectTest37.java | 52 +++++++++++++ 13 files changed, 126 insertions(+), 175 deletions(-) rename src/main/java/com/alibaba/druid/sql/{dialect/oracle/ast/expr/OracleDateExpr.java => ast/expr/SQLDateExpr.java} (79%) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest37.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java similarity index 79% rename from src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDateExpr.java rename to src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java index ce6ce73503..6c145381bd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.oracle.ast.expr; +package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class OracleDateExpr extends SQLExprImpl implements SQLLiteralExpr, OracleExpr { +public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr { private String literal; - public OracleDateExpr(){ + public SQLDateExpr(){ } @@ -38,10 +38,6 @@ public class OracleDateExpr extends SQLExprImpl implements SQLLiteralExpr, Oracl @Override protected void accept0(SQLASTVisitor visitor) { - this.accept0((OracleASTVisitor) visitor); - } - - public void accept0(OracleASTVisitor visitor) { visitor.visit(this); visitor.endVisit(this); } @@ -65,7 +61,7 @@ public class OracleDateExpr extends SQLExprImpl implements SQLLiteralExpr, Oracl if (getClass() != obj.getClass()) { return false; } - OracleDateExpr other = (OracleDateExpr) obj; + SQLDateExpr other = (SQLDateExpr) obj; if (literal == null) { if (other.literal != null) { return false; 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 eaa334c035..0face25d03 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 @@ -59,7 +59,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateTimeUnit; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; @@ -536,17 +536,6 @@ public class OracleExprParser extends SQLExprParser { public SQLExpr primaryRest(SQLExpr expr) { if (expr.getClass() == SQLIdentifierExpr.class) { String ident = ((SQLIdentifierExpr)expr).getName(); - - if ("DATE".equalsIgnoreCase(ident)) { - OracleDateExpr timestamp = new OracleDateExpr(); - - String literal = lexer.stringVal(); - timestamp.setLiteral(literal); - accept(Token.LITERAL_CHARS); - - return primaryRest(timestamp); - } - if ("TIMESTAMP".equalsIgnoreCase(ident)) { if (lexer.token() != Token.LITERAL_ALIAS && lexer.token() != Token.LITERAL_CHARS) { return new SQLIdentifierExpr("TIMESTAMP"); 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 9b7de81dcc..4f49025da0 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 @@ -36,7 +36,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; @@ -108,7 +108,7 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleAnalyticWindowing x); - void endVisit(OracleDateExpr x); + void endVisit(SQLDateExpr x); void endVisit(OracleDbLinkExpr x); @@ -146,7 +146,7 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleAnalyticWindowing x); - boolean visit(OracleDateExpr x); + boolean visit(SQLDateExpr x); boolean visit(OracleDbLinkExpr 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 ad3ef37d13..62906fde2f 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 @@ -46,7 +46,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; @@ -136,11 +136,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public void endVisit(OracleDateExpr x) { - - } - @Override public void endVisit(OracleDbLinkExpr x) { @@ -234,12 +229,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora return true; } - @Override - public boolean visit(OracleDateExpr x) { - - return true; - } - @Override public boolean visit(OracleDbLinkExpr x) { 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 37e00f8762..a231e58fc7 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 @@ -62,7 +62,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; @@ -232,13 +232,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS return false; } - public boolean visit(OracleDateExpr x) { - print0(ucase ? "DATE '" : "date '"); - print0(x.getLiteral()); - print('\''); - return false; - } - public boolean visit(OracleDbLinkExpr x) { x.getExpr().accept(this); print('@'); @@ -767,11 +760,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public void endVisit(OracleDateExpr x) { - - } - @Override public void endVisit(OracleDbLinkExpr x) { 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 d240680820..392bcdf4c0 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 @@ -69,7 +69,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; @@ -360,11 +360,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } - @Override - public void endVisit(OracleDateExpr x) { - - } - @Override public void endVisit(OracleDbLinkExpr x) { @@ -448,12 +443,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle return true; } - @Override - public boolean visit(OracleDateExpr x) { - - return true; - } - @Override public boolean visit(OracleDbLinkExpr x) { 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 457f45343a..e2bcc73d5c 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -30,40 +30,7 @@ import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.ast.SQLPartitionValue; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAggregateOption; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllExpr; -import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; -import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; -import com.alibaba.druid.sql.ast.expr.SQLCastExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; -import com.alibaba.druid.sql.ast.expr.SQLDefaultExpr; -import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; -import com.alibaba.druid.sql.ast.expr.SQLGroupingSetExpr; -import com.alibaba.druid.sql.ast.expr.SQLHexExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLInListExpr; -import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLListExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLNotExpr; -import com.alibaba.druid.sql.ast.expr.SQLNullExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; -import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.SQLNotNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLNullConstraint; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -252,8 +219,22 @@ public class SQLExprParser extends SQLParser { sqlExpr = new SQLIdentifierExpr("INSERT"); break; case IDENTIFIER: - sqlExpr = new SQLIdentifierExpr(lexer.stringVal()); + String ident = lexer.stringVal(); lexer.nextToken(); + + if ("DATE".equalsIgnoreCase(ident) + && lexer.token() == Token.LITERAL_CHARS + && (JdbcConstants.ORACLE.equals(getDbType()) + || JdbcConstants.POSTGRESQL.equals(getDbType()))) { + String literal = lexer.stringVal(); + lexer.nextToken(); + + SQLDateExpr dateExpr = new SQLDateExpr(); + dateExpr.setLiteral(literal); + sqlExpr = dateExpr; + } else { + sqlExpr = new SQLIdentifierExpr(ident); + } break; case NEW: throw new ParserException("TODO"); @@ -2002,13 +1983,28 @@ public class SQLExprParser extends SQLParser { SQLExpr expr; boolean connectByRoot = false; if (lexer.token() == Token.IDENTIFIER) { - if (identifierEquals("CONNECT_BY_ROOT")) { - connectByRoot = true; - lexer.nextToken(); - } - expr = new SQLIdentifierExpr(lexer.stringVal()); + String ident = lexer.stringVal(); lexer.nextTokenComma(); + if ("CONNECT_BY_ROOT".equalsIgnoreCase(ident)) { + connectByRoot = true; + expr = new SQLIdentifierExpr(lexer.stringVal()); + lexer.nextToken(); + } else if ("DATE".equalsIgnoreCase(ident) + && lexer.token() == Token.LITERAL_CHARS + && (JdbcConstants.ORACLE.equals(getDbType()) + || JdbcConstants.POSTGRESQL.equals(getDbType()))) { + String literal = lexer.stringVal(); + lexer.nextToken(); + + SQLDateExpr dateExpr = new SQLDateExpr(); + dateExpr.setLiteral(literal); + + expr = dateExpr; + } else { + expr = new SQLIdentifierExpr(ident); + } + if (lexer.token() != Token.COMMA) { expr = this.primaryRest(expr); expr = this.exprRest(expr); 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 9c0714e933..184cc57f2f 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -48,41 +48,7 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLSubPartition; import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; import com.alibaba.druid.sql.ast.SQLSubPartitionByList; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllExpr; -import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; -import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; -import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; -import com.alibaba.druid.sql.ast.expr.SQLCastExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; -import com.alibaba.druid.sql.ast.expr.SQLDefaultExpr; -import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; -import com.alibaba.druid.sql.ast.expr.SQLGroupingSetExpr; -import com.alibaba.druid.sql.ast.expr.SQLHexExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLInListExpr; -import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLListExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLNotExpr; -import com.alibaba.druid.sql.ast.expr.SQLNullExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; -import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; -import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerEvent; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType; @@ -3304,4 +3270,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + + public boolean visit(SQLDateExpr x) { + print0(ucase ? "DATE '" : "date '"); + print0(x.getLiteral()); + print('\''); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 08ecd0e88c..911c9f41c6 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -676,4 +676,7 @@ public interface SQLASTVisitor { boolean visit(SQLCreateSequenceStatement x); void endVisit(SQLCreateSequenceStatement x); + + boolean visit(SQLDateExpr x); + void endVisit(SQLDateExpr x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index b11079b49d..1923bf843d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -32,40 +32,7 @@ import com.alibaba.druid.sql.ast.SQLPartitionValue; import com.alibaba.druid.sql.ast.SQLSubPartition; import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; import com.alibaba.druid.sql.ast.SQLSubPartitionByList; -import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; -import com.alibaba.druid.sql.ast.expr.SQLAllExpr; -import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; -import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; -import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; -import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; -import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; -import com.alibaba.druid.sql.ast.expr.SQLCastExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; -import com.alibaba.druid.sql.ast.expr.SQLDefaultExpr; -import com.alibaba.druid.sql.ast.expr.SQLExistsExpr; -import com.alibaba.druid.sql.ast.expr.SQLGroupingSetExpr; -import com.alibaba.druid.sql.ast.expr.SQLHexExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLInListExpr; -import com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; -import com.alibaba.druid.sql.ast.expr.SQLListExpr; -import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; -import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLNotExpr; -import com.alibaba.druid.sql.ast.expr.SQLNullExpr; -import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; -import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; -import com.alibaba.druid.sql.ast.expr.SQLSequenceExpr; -import com.alibaba.druid.sql.ast.expr.SQLSomeExpr; -import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; -import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; +import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLMergeStatement.MergeInsertClause; @@ -1582,6 +1549,15 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLCreateSequenceStatement x) { + } + + @Override + public boolean visit(SQLDateExpr x) { + return true; + } + + @Override + public void endVisit(SQLDateExpr x) { } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java index 1077a844a1..9a7c484435 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_OracleDate.java @@ -4,13 +4,13 @@ import junit.framework.TestCase; import org.junit.Assert; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; public class EqualTest_OracleDate extends TestCase { public void test_eq() throws Exception { - OracleDateExpr exprA = new OracleDateExpr(); - OracleDateExpr exprB = new OracleDateExpr(); + SQLDateExpr exprA = new SQLDateExpr(); + SQLDateExpr exprB = new SQLDateExpr(); Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); Assert.assertEquals(exprA, exprB); } 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 c3df31799b..9f2cbb795a 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 @@ -34,7 +34,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryDoubleExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleBinaryFloatExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleCursorExpr; -import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDateExpr; +import com.alibaba.druid.sql.ast.expr.SQLDateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDatetimeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleDbLinkExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExtractExpr; @@ -100,7 +100,7 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OraclePLSQLCommitStatement().accept(adapter); new OracleAnalytic().accept(adapter); new OracleAnalyticWindowing().accept(adapter); - new OracleDateExpr().accept(adapter); + new SQLDateExpr().accept(adapter); new OracleDbLinkExpr().accept(adapter); new OracleExtractExpr().accept(adapter); new OracleSelectForUpdate().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest37.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest37.java new file mode 100644 index 0000000000..282364876e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/PGSelectTest37.java @@ -0,0 +1,52 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.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 org.junit.Assert; + +import java.util.List; + +public class PGSelectTest37 extends PGTest { + + public void test_0() throws Exception { + String sql = "select date '2001-09-28'"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals("SELECT DATE '2001-09-28'", SQLUtils.toPGString(stmt)); + + Assert.assertEquals("select date '2001-09-28'", SQLUtils.toPGString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + +// System.out.println("Tables : " + visitor.getTables()); +// System.out.println("fields : " + visitor.getColumns()); +// System.out.println("coditions : " + visitor.getConditions()); + + Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getTables().size()); + } +}