From 13c7228baf677c88c488686b1c6291d73a08dc8b Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 11 May 2017 16:54:38 +0800 Subject: [PATCH] improved oracle sql parser. --- .../oracle/parser/OracleExprParser.java | 16 ++++++- .../druid/sql/parser/SQLExprParser.java | 46 +++++++++++++++---- .../alibaba/druid/sql/parser/SQLParser.java | 24 ++++++---- 3 files changed, 66 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index 5dd58fe0a0..b06efd5c3a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -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()); } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 3a417de7ef..fdf18e15bb 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -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(); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java index c8b098a0e7..73bd72db15 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParser.java @@ -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: