From ec6c5b3ab069cd8d0dd28df3313191a9e0099d19 Mon Sep 17 00:00:00 2001 From: kanlon Date: Thu, 28 Jul 2022 22:58:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=99global=20in=E8=AF=AD=E6=B3=95?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=A4=9Aglobal=20not=20in=20=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alibaba/druid/sql/parser/SQLExprParser.java | 13 ++++++++++--- .../druid/sql/visitor/SQLASTOutputVisitor.java | 6 +++++- 2 files changed, 15 insertions(+), 4 deletions(-) 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 4e06cf04b1..923bd7b3d7 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -3036,6 +3036,11 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.GLOBAL) { global = true; lexer.nextToken(); + // global not in logic + if (lexer.token == Token.NOT) { + lexer.nextToken(); + return notRationalRest(expr, true); + } } if (lexer.token == Token.IN) { @@ -3729,12 +3734,12 @@ public class SQLExprParser extends SQLParser { break; case NOT: lexer.nextToken(); - expr = notRationalRest(expr); + expr = notRationalRest(expr, false); break; case BANG: if (dbType == DbType.odps) { lexer.nextToken(); - expr = notRationalRest(expr); + expr = notRationalRest(expr, false); } break; case BETWEEN: @@ -3894,7 +3899,7 @@ public class SQLExprParser extends SQLParser { return expr; } - public SQLExpr notRationalRest(SQLExpr expr) { + public SQLExpr notRationalRest(SQLExpr expr, boolean global) { switch (lexer.token) { case LIKE: lexer.nextTokenValue(); @@ -3953,6 +3958,7 @@ public class SQLExprParser extends SQLParser { inSubQueryExpr.setNot(true); inSubQueryExpr.setExpr(inListExpr.getExpr()); inSubQueryExpr.setSubQuery(((SQLQueryExpr) targetExpr).getSubQuery()); + inSubQueryExpr.setGlobal(global); expr = inSubQueryExpr; } } @@ -4547,6 +4553,7 @@ public class SQLExprParser extends SQLParser { return charType; } + @Override public void accept(Token token) { if (lexer.token == token) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index d70abbac6b..754d394c9b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4327,7 +4327,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLInSubQueryExpr x) { x.getExpr().accept(this); if (x.isNot()) { - print0(ucase ? " NOT IN (" : " not in ("); + if (x.isGlobal()) { + print0(ucase ? " GLOBAL NOT IN (" : " global not in ("); + } else { + print0(ucase ? " NOT IN (" : " not in ("); + } } else { if (x.isGlobal()) { print0(ucase ? " GLOBAL IN (" : " global in (");