improved sql parser.

This commit is contained in:
wenshao
2017-10-27 20:31:42 +08:00
parent 1f0c49ec2c
commit 635413abd8
4 changed files with 103 additions and 13 deletions
@@ -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
@@ -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;
@@ -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;
}