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 9c5aa476d1..9a5dda66d3 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -677,7 +677,7 @@ public class SQLExprParser extends SQLParser { protected SQLAggregateExpr parseAggregateExpr(String methodName) throws ParserException { methodName = methodName.toUpperCase(); - + SQLAggregateExpr aggregateExpr; if (lexer.token() == Token.ALL) { aggregateExpr = new SQLAggregateExpr(methodName, SQLAggregateExpr.Option.ALL); @@ -945,16 +945,20 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); rightExp = bitOr(); - // rightExp = relationalRest(rightExp); - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.LessThanOrEqualOrGreaterThan, rightExp); } else if (lexer.token() == Token.GT) { + SQLBinaryOperator op = SQLBinaryOperator.GreaterThan; + lexer.nextToken(); + + if (lexer.token() == Token.EQ) { + lexer.nextToken(); + op = SQLBinaryOperator.GreaterThanOrEqual; + } + rightExp = bitOr(); - // rightExp = relationalRest(rightExp); - - expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.GreaterThan, rightExp); + expr = new SQLBinaryOpExpr(expr, op, rightExp); } else if (lexer.token() == Token.GTEQ) { lexer.nextToken(); rightExp = bitOr(); @@ -1083,7 +1087,7 @@ public class SQLExprParser extends SQLParser { SQLName typeExpr = name(); String typeName = typeExpr.toString(); - + if ("character".equalsIgnoreCase(typeName) && "varying".equalsIgnoreCase(lexer.stringVal())) { typeName += ' ' + lexer.stringVal(); lexer.nextToken(); @@ -1154,7 +1158,8 @@ public class SQLExprParser extends SQLParser { if (lexer.token() == token) { lexer.nextToken(); } else { - throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token() + " " + lexer.stringVal()); + throw new SQLParseException("syntax error, expect " + token + ", actual " + lexer.token() + " " + + lexer.stringVal()); } } @@ -1179,7 +1184,7 @@ public class SQLExprParser extends SQLParser { column.getConstaints().add(new NotNullConstraint()); return parseColumnRest(column); } - + if (lexer.token() == Token.NULL) { lexer.nextToken(); column.setDefaultExpr(new SQLNullExpr()); @@ -1211,14 +1216,13 @@ public class SQLExprParser extends SQLParser { return item; } - + public List parseHints() { List hints = new ArrayList(); parseHints(hints); return hints; } - - + @SuppressWarnings({ "unchecked", "rawtypes" }) public void parseHints(List hints) { if (lexer.token() == Token.HINT) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest37.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest37.java new file mode 100644 index 0000000000..fed3205370 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleSelectTest37.java @@ -0,0 +1,56 @@ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import junit.framework.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + +public class OracleSelectTest37 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select resource_value,count(resource_value) nums,http_method " + + "from ( " + + " select * from audit_url_log " + + " where project_id = ? and to_char(begin_time,'yyyy-MM-dd') >= ? and to_char(begin_time,'yyyy-MM-dd') <= ? ) " + + " group by resource_value,http_method having count(resource_value) > = ?"; // + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("audit_url_log"))); + + Assert.assertEquals(5, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("audit_url_log", "project_id"))); + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("audit_url_log", "begin_time"))); + + // Assert.assertTrue(visitor.getOrderByColumns().contains(new TableStat.Column("employees", "last_name"))); + } +}