mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -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++;
|
||||
}
|
||||
|
||||
|
||||
+18
-2
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user