improved oracle sql parser.

This commit is contained in:
wenshao
2017-05-11 16:54:38 +08:00
parent f16196b320
commit 13c7228baf
3 changed files with 66 additions and 20 deletions
@@ -361,8 +361,13 @@ public class OracleExprParser extends SQLExprParser {
accept(Token.RPAREN);
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr);
break;
case IDENTIFIER: {
sqlExpr = expr();
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Plus, sqlExpr);
break;
}
default:
throw new ParserException("TODO");
throw new ParserException("TODO " + lexer.info());
}
return primaryRest(sqlExpr);
case SUB:
@@ -403,6 +408,7 @@ public class OracleExprParser extends SQLExprParser {
lexer.nextToken();
break;
case VARIANT:
case QUES:
case IDENTIFIER:
sqlExpr = expr();
sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Negative, sqlExpr);
@@ -985,6 +991,14 @@ public class OracleExprParser extends SQLExprParser {
rightExp = equalityRest(rightExp);
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp, getDbType());
} else if (lexer.token() == Token.BANG) {
lexer.nextToken();
accept(Token.EQ);
rightExp = shift();
rightExp = equalityRest(rightExp);
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp, getDbType());
}
@@ -858,20 +858,40 @@ public class SQLExprParser extends SQLParser {
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
methodInvokeExpr.setOwner(expr);
if (lexer.token() == Token.RPAREN) {
if (lexer.token() == Token.DISTINCT) {
lexer.nextToken();
} else {
if (lexer.token() == Token.PLUS) {
methodInvokeExpr.addParameter(new SQLIdentifierExpr("+"));
String aggreateMethodName = expr.toString() + "." + name;
SQLAggregateExpr aggregateExpr = new SQLAggregateExpr(aggreateMethodName, SQLAggregateOption.DISTINCT);
if (lexer.token() == Token.RPAREN) {
lexer.nextToken();
} else {
exprList(methodInvokeExpr.getParameters(), methodInvokeExpr);
if (lexer.token() == Token.PLUS) {
aggregateExpr.getArguments().add(new SQLIdentifierExpr("+"));
lexer.nextToken();
} else {
exprList(aggregateExpr.getArguments(), aggregateExpr);
}
accept(Token.RPAREN);
}
accept(Token.RPAREN);
expr = aggregateExpr;
} else {
SQLMethodInvokeExpr methodInvokeExpr = new SQLMethodInvokeExpr(name);
methodInvokeExpr.setOwner(expr);
if (lexer.token() == Token.RPAREN) {
lexer.nextToken();
} else {
if (lexer.token() == Token.PLUS) {
methodInvokeExpr.addParameter(new SQLIdentifierExpr("+"));
lexer.nextToken();
} else {
exprList(methodInvokeExpr.getParameters(), methodInvokeExpr);
}
accept(Token.RPAREN);
}
expr = methodInvokeExpr;
}
expr = methodInvokeExpr;
} else {
expr = new SQLPropertyExpr(expr, name);
}
@@ -1313,6 +1333,14 @@ public class SQLExprParser extends SQLParser {
rightExp = equalityRest(rightExp);
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp, getDbType());
} else if (lexer.token() == Token.BANG) {
lexer.nextToken();
accept(Token.EQ);
rightExp = bitOr();
rightExp = equalityRest(rightExp);
expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotEqual, rightExp, getDbType());
} else if (lexer.token() == Token.COLONEQ) {
lexer.nextToken();
@@ -112,16 +112,20 @@ public class SQLParser {
} else if (lexer.token() == Token.LITERAL_CHARS) {
alias = "'" + lexer.stringVal() + "'";
lexer.nextToken();
} else if (lexer.token() == Token.CASE) {
alias = lexer.token.name();
lexer.nextToken();
} else if (lexer.token() == Token.USER) {
alias = lexer.stringVal();
lexer.nextToken();
} else if (lexer.token() == Token.END) {
alias = lexer.stringVal();
lexer.nextToken();
}
} else {
switch (lexer.token()) {
case CASE:
case USER:
case LOB:
case END:
case DEFERRED:
alias = lexer.stringVal();
lexer.nextToken();
break;
default:
break;
}
}
switch (lexer.token()) {
case KEY: