diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 2d0b4b69f1..c4ceaea885 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -802,10 +802,10 @@ public class SQLUtils { } public static void acceptBooleanOr(String sql, DbType dbType, Consumer consumer) { - acceptBinaryOpExpr(sql, dbType, consumer, e -> e.getOperator() == SQLBinaryOperator.BooleanOr); + acceptBinaryOpExprGroup(sql, dbType, consumer, e -> e.getOperator() == SQLBinaryOperator.BooleanOr); } - public static void acceptBinaryOpExpr(String sql, DbType dbType, Consumer consumer, Predicate filter) { + public static void acceptBinaryOpExprGroup(String sql, DbType dbType, Consumer consumer, Predicate filter) { if (sql == null || sql.isEmpty()) { return; } @@ -850,6 +850,51 @@ public class SQLUtils { } } + public static void acceptBinaryOpExpr(String sql, DbType dbType, Consumer consumer, Predicate filter) { + if (sql == null || sql.isEmpty()) { + return; + } + + List stmtList = new ArrayList<>(); + + try { + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType, SQLParserFeature.EnableMultiUnion, SQLParserFeature.KeepComments, SQLParserFeature.EnableSQLBinaryOpExprGroup); + parser.parseStatementList(stmtList, -1, null); + } catch (Exception ignored) { + return; + } + + SQLASTVisitor visitor; + switch (dbType) { + case odps: + visitor = new OdpsASTVisitorAdapter() { + @Override + public boolean visit(SQLBinaryOpExpr x) { + if (filter == null || filter.test(x)) { + consumer.accept(x); + } + return super.visit(x); + } + }; + break; + default: + visitor = new SQLASTVisitorAdapter() { + @Override + public boolean visit(SQLBinaryOpExpr x) { + if (filter == null || filter.test(x)) { + consumer.accept(x); + } + return super.visit(x); + } + }; + break; + } + + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + } + public static void acceptSelectQueryBlock(String sql, DbType dbType, Consumer consumer, Predicate filter) { if (sql == null || sql.isEmpty()) { return;