improve sql parser & wall

This commit is contained in:
wenshao
2013-08-31 05:03:59 +08:00
parent 36594269f8
commit ee0a1c4d4d
6 changed files with 81 additions and 8 deletions
@@ -83,6 +83,8 @@ import com.alibaba.druid.sql.parser.Token;
public class OracleExprParser extends SQLExprParser {
public boolean allowStringAdditive = false;
/**
@@ -480,12 +482,37 @@ public class OracleExprParser extends SQLExprParser {
protected SQLExpr methodRest(SQLExpr expr, boolean acceptLPAREN) {
if (acceptLPAREN) {
accept(Token.LPAREN);
if (lexer.token() == Token.PLUS) {
lexer.nextToken();
}
if (lexer.token() == Token.PLUS) {
lexer.nextToken();
accept(Token.RPAREN);
return new OracleOuterExpr(expr);
}
if (expr instanceof SQLIdentifierExpr) {
String methodName = ((SQLIdentifierExpr) expr).getName();
SQLMethodInvokeExpr methodExpr = new SQLMethodInvokeExpr(methodName);
if ("trim".equalsIgnoreCase(methodName)) {
if (identifierEquals("LEADING") //
|| identifierEquals("TRAILING") //
|| identifierEquals("BOTH")
) {
methodExpr.putAttribute("trim_option", lexer.stringVal());
lexer.nextToken();
}
SQLExpr trim_character = this.primary();
trim_character.setParent(methodExpr);
methodExpr.putAttribute("trim_character", trim_character);
accept(Token.FROM);
SQLExpr trim_source = this.expr();
methodExpr.addParameter(trim_source);
accept(Token.RPAREN);
return new OracleOuterExpr(expr);
return primaryRest(methodExpr);
}
}
return super.methodRest(expr, false);
}
@@ -3383,4 +3383,27 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
protected void printCascade() {
print(" CASCADE CONSTRAINTS");
}
@Override
public boolean visit(SQLMethodInvokeExpr x) {
if ("trim".equalsIgnoreCase(x.getMethodName())) {
SQLExpr trim_character = (SQLExpr) x.getAttribute("trim_character");
if (trim_character != null) {
print(x.getMethodName());
print("(");
String trim_option = (String) x.getAttribute("trim_option");
if (trim_option != null && trim_option.length() != 0) {
print(trim_option);
print(' ');
}
trim_character.accept(this);
print(" FROM ");
x.getParameters().get(0).accept(this);
print(")");
return false;
}
}
return super.visit(x);
}
}