diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index 9d7817c8f4..6d7dd5474a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -127,4 +128,7 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements Serializable { return true; } + public String toString() { + return SQLUtils.toSQLString(this); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 10c9af0163..a5adf5e08d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -82,15 +82,6 @@ public class MySqlExprParser extends SQLExprParser { return new SQLBinaryOpExpr(expr, SQLBinaryOperator.RegExp, rightExp); } - if (identifierEquals("RLIKE")) { - lexer.nextToken(); - SQLExpr rightExp = equality(); - - rightExp = relationalRest(rightExp); - - return new SQLBinaryOpExpr(expr, SQLBinaryOperator.RegExp, rightExp); - } - return super.relationalRest(expr); } @@ -117,15 +108,6 @@ public class MySqlExprParser extends SQLExprParser { return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotRegExp, rightExp); } - if (identifierEquals("RLIKE")) { - lexer.nextToken(); - SQLExpr rightExp = primary(); - - rightExp = relationalRest(rightExp); - - return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotRLike, rightExp); - } - return super.notRationalRest(expr); } 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 5f260cd32b..a0b7ad3376 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -498,7 +498,7 @@ public class SQLExprParser extends SQLParser { break; case BANG: lexer.nextToken(); - SQLExpr bangExpr = expr(); + SQLExpr bangExpr = primary(); sqlExpr = new SQLUnaryExpr(SQLUnaryOperator.Not, bangExpr); break; case LITERAL_HEX: @@ -1234,6 +1234,13 @@ public class SQLExprParser extends SQLParser { rightExp = primary(); expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.Escape, rightExp); } + } else if (identifierEquals("RLIKE")) { + lexer.nextToken(); + rightExp = equality(); + + rightExp = relationalRest(rightExp); + + expr = new SQLBinaryOpExpr(expr, SQLBinaryOperator.RLike, rightExp); } else if (lexer.token() == (Token.NOT)) { lexer.nextToken(); expr = notRationalRest(expr); @@ -1307,6 +1314,13 @@ public class SQLExprParser extends SQLParser { expr = new SQLBetweenExpr(expr, true, beginExpr, endExpr); return expr; + } else if (identifierEquals("RLIKE")) { + lexer.nextToken(); + SQLExpr rightExp = primary(); + + rightExp = relationalRest(rightExp); + + return new SQLBinaryOpExpr(expr, SQLBinaryOperator.NotRLike, rightExp); } else { throw new ParserException("TODO " + lexer.token()); } diff --git a/src/test/java/com/alibaba/druid/bvt/OrTest.java b/src/test/java/com/alibaba/druid/bvt/OrTest.java new file mode 100644 index 0000000000..744b2cb780 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/OrTest.java @@ -0,0 +1,19 @@ +package com.alibaba.druid.bvt; + +import java.util.List; + +import junit.framework.TestCase; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; + + +public class OrTest extends TestCase { + public void test_xx() throws Exception { + String sql = "select * from t where not match('', '') or (c > 0 and d >0)"; + + List stmtList = SQLUtils.parseStatements(sql, null); + SQLStatement stmt = stmtList.get(0); + System.out.println(stmt.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java index 6cb6fdc94d..d76f606a22 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/LogicalOperatorsTest.java @@ -112,7 +112,7 @@ public class LogicalOperatorsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT !(1 + 1);", text); + Assert.assertEquals("SELECT !1 + 1;", text); } public void test_8() throws Exception {