improved sql parser.

This commit is contained in:
wenshao
2017-10-31 15:38:39 +08:00
parent 72cb76dc49
commit 6220b9a65b
11 changed files with 279 additions and 5 deletions
@@ -48,6 +48,11 @@ public class SQLDataTypeImpl extends SQLObjectImpl implements SQLDataType {
addArgument(new SQLIntegerExpr(precision));
}
public SQLDataTypeImpl(String name, SQLExpr arg) {
this(name);
addArgument(arg);
}
public SQLDataTypeImpl(String name, int precision, int scale) {
this(name);
addArgument(new SQLIntegerExpr(precision));
@@ -2922,7 +2922,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
if (count != 0) {
print0(", ");
}
print0(ucase ? "FOREIGHN KEY" : "foreighn key");
print0(ucase ? "FOREIGN KEY" : "foreign key");
count++;
}
@@ -41,6 +41,7 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.Fetc
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.ForClause;
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock.WindowClause;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.util.FnvHash;
import com.alibaba.druid.util.JdbcConstants;
import java.util.LinkedHashSet;
@@ -453,17 +454,32 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
@Override
public boolean visit(PGTypeCastExpr x) {
SQLExpr expr = x.getExpr();
SQLDataType dataType = x.getDataType();
if (dataType.nameHashCode64() == FnvHash.Constants.VARBIT) {
dataType.accept(this);
print(' ');
printExpr(expr);
return false;
}
if (expr != null) {
if (expr instanceof SQLBinaryOpExpr) {
print('(');
expr.accept(this);
print(')');
} else if (expr instanceof PGTypeCastExpr && dataType.getArguments().size() == 0) {
dataType.accept(this);
print('(');
visit((PGTypeCastExpr) expr);
print(')');
return false;
} else {
expr.accept(this);
}
}
print0("::");
x.getDataType().accept(this);
dataType.accept(this);
return false;
}
@@ -1775,7 +1791,7 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
if (count != 0) {
print0(", ");
}
print0(ucase ? "FOREIGHN KEY" : "foreighn key");
print0(ucase ? "FOREIGN KEY" : "foreign key");
count++;
}
@@ -27,6 +27,7 @@ import com.alibaba.druid.sql.ast.*;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleArgumentExpr;
import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGTypeCastExpr;
import com.alibaba.druid.util.FnvHash;
import com.alibaba.druid.util.JdbcConstants;
@@ -1012,6 +1013,19 @@ public class SQLExprParser extends SQLParser {
} else if (hash_lower == FnvHash.Constants.POSITION
&& JdbcConstants.MYSQL.equals(dbType)) {
return parsePosition();
} else if (hash_lower == FnvHash.Constants.INT4 && JdbcConstants.POSTGRESQL.equals(dbType)) {
PGTypeCastExpr castExpr = new PGTypeCastExpr();
castExpr.setExpr(this.expr());
castExpr.setDataType(new SQLDataTypeImpl(methodName));
accept(Token.RPAREN);
return castExpr;
} else if (hash_lower == FnvHash.Constants.VARBIT && JdbcConstants.POSTGRESQL.equals(dbType)) {
PGTypeCastExpr castExpr = new PGTypeCastExpr();
SQLExpr len = this.primary();
castExpr.setDataType(new SQLDataTypeImpl(methodName, len));
accept(Token.RPAREN);
castExpr.setExpr(this.expr());
return castExpr;
}
aggMethodName = getAggreateFunction(hash_lower);
} else if (expr instanceof SQLPropertyExpr) {
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.parser;
public enum SQLParserFeature {
KeepInsertValueClauseOriginalString,
KeepSelectListOriginalString, // for improved sql parameterized performance
UseInsertColumnsCache,
EnableSQLBinaryOpExprGroup,
OptimizedForParameterized,