diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java index 9382843ad8..8c08da636a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; @@ -29,26 +30,36 @@ import java.util.List; public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { public static final SQLDataType DEFAULT_DATA_TYPE = new SQLCharacterDataType("date"); - private String literal; + private SQLExpr literal; public SQLDateExpr(){ } public SQLDateExpr(String literal) { - this.literal = literal; + this.setLiteral(literal); } - public String getLiteral() { + public SQLExpr getLiteral() { return literal; } public void setLiteral(String literal) { - this.literal = literal; + setLiteral(new SQLCharExpr(literal)); + } + + public void setLiteral(SQLExpr x) { + if (x != null) { + x.setParent(this); + } + this.literal = x; } public String getValue() { - return literal; + if (literal instanceof SQLCharExpr) { + return ((SQLCharExpr) literal).getText(); + } + return null; } @Override @@ -88,7 +99,13 @@ public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValua } public SQLDateExpr clone() { - return new SQLDateExpr(literal); + SQLDateExpr x = new SQLDateExpr(); + + if (this.literal != null) { + x.setLiteral(literal.clone()); + } + + return x; } @Override 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 f599ac3ee9..ffa1adf5f5 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -314,13 +314,11 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); if (hash_lower == FnvHash.Constants.DATE - && lexer.token == Token.LITERAL_CHARS + && (lexer.token == Token.LITERAL_CHARS || lexer.token == Token.VARIANT) && (JdbcConstants.ORACLE.equals(dbType) || JdbcConstants.POSTGRESQL.equals(dbType) || JdbcConstants.MYSQL.equals(dbType))) { - String literal = lexer.stringVal(); - lexer.nextToken(); - + SQLExpr literal = this.primary(); SQLDateExpr dateExpr = new SQLDateExpr(); dateExpr.setLiteral(literal); sqlExpr = dateExpr; 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 1cf0a559fe..9b3f47948d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -5329,9 +5329,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public boolean visit(SQLDateExpr x) { - print0(ucase ? "DATE '" : "date '"); - print0(x.getLiteral()); - print('\''); + SQLExpr literal = x.getLiteral(); + print0(ucase ? "DATE " : "date "); + printExpr(literal); + return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100_var.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100_var.java new file mode 100644 index 0000000000..44f27ff4fb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest100_var.java @@ -0,0 +1,74 @@ +/* + * 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_var extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from zj_sb_zzs_fb3_mx where fphm=:\"SYS_B_0\" and sssq_q=date:\"SYS_B_1\"\n"; + + 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 *\n" + + "FROM zj_sb_zzs_fb3_mx\n" + + "WHERE fphm = :\"SYS_B_0\"\n" + + "\tAND sssq_q = DATE :\"SYS_B_1\"", 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(2, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + } + + +}