You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/09/30 06:56:45 UTC
[shardingsphere] branch master updated: add support parser for
ExistsSubqueryExpression (#7650)
This is an automated email from the ASF dual-hosted git repository.
panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new ebb3a5b add support parser for ExistsSubqueryExpression (#7650)
ebb3a5b is described below
commit ebb3a5bb343f2d39fdbaa36ed404ab48033de901
Author: JingShang Lu <lu...@apache.org>
AuthorDate: Wed Sep 30 14:56:11 2020 +0800
add support parser for ExistsSubqueryExpression (#7650)
---
.../src/test/resources/sharding/select.xml | 6 ++++++
.../src/main/antlr4/imports/mysql/BaseRule.g4 | 7 +++---
.../sql/parser/mysql/visitor/MySQLVisitor.java | 25 +++++++++++++++-------
.../sql/parser/oracle/visitor/OracleVisitor.java | 5 +----
.../sql/parser/sql92/visitor/SQL92Visitor.java | 5 +----
.../parser/sqlserver/visitor/SQLServerVisitor.java | 5 +----
.../sql/common/extractor/TableExtractor.java | 4 ++++
...pression.java => ExistsSubqueryExpression.java} | 15 ++++++++-----
.../sql/common/segment/dml/expr/NotExpression.java | 10 ++++-----
9 files changed, 48 insertions(+), 34 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/resources/sharding/select.xml b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/resources/sharding/select.xml
index c01a58d..6bf9a19 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/resources/sharding/select.xml
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-rewrite/src/test/resources/sharding/select.xml
@@ -27,6 +27,12 @@
<output sql="SELECT * FROM t_account_0 WHERE account_id = 100" />
</rewrite-assertion>
+ <rewrite-assertion id="select_with_not_exsist" db-type="MySQL">
+ <input sql="SELECT * FROM t_account a WHERE not exists (select * from t_account_detail where a.account_id=account_id and account_id=1000) and account_id = 100" />
+ <output sql="SELECT * FROM t_account_0 a WHERE not exists (select * from t_account_detail_0 where a.account_id=account_id and account_id=1000) and account_id = 100" />
+ <output sql="SELECT * FROM t_account_1 a WHERE not exists (select * from t_account_detail_1 where a.account_id=account_id and account_id=1000) and account_id = 100" />
+ </rewrite-assertion>
+
<rewrite-assertion id="select_with_sum_fun">
<input sql="SELECT SUM(DISTINCT account_id), SUM(account_id) FROM t_account WHERE account_id = 100" />
<output sql="SELECT SUM(DISTINCT account_id), SUM(account_id) FROM t_account_0 WHERE account_id = 100" />
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4 b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index 734b324..16e0cf8 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -314,11 +314,10 @@ triggerOrder
;
expr
- : expr logicalOperator expr
+ : booleanPrimary
+ | expr logicalOperator expr
| expr XOR expr
| notOperator_ expr
- | LP_ expr RP_
- | booleanPrimary
;
logicalOperator
@@ -377,7 +376,7 @@ simpleExpr
| simpleExpr COLLATE (STRING_ | identifier)
| variable
| simpleExpr OR_ simpleExpr
- | (PLUS_ | MINUS_ | TILDE_ | NOT_ | BINARY) simpleExpr
+ | (PLUS_ | MINUS_ | TILDE_ | notOperator_ | BINARY) simpleExpr
| ROW? LP_ expr (COMMA_ expr)* RP_
| EXISTS? subquery
| LBE_ identifier expr RBE_
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
index 1d9db5d..6e5fefe 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/MySQLVisitor.java
@@ -73,6 +73,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSe
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
@@ -253,9 +254,6 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
if (null != ctx.booleanPrimary()) {
return visit(ctx.booleanPrimary());
}
- if (null != ctx.LP_()) {
- return visit(ctx.expr(0));
- }
if (null != ctx.XOR()) {
ExpressionSegment left = (ExpressionSegment) visit(ctx.expr(0));
ExpressionSegment right = (ExpressionSegment) visit(ctx.expr(1));
@@ -272,10 +270,7 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
return result;
}
- NotExpression result = new NotExpression();
- result.setStartIndex(ctx.start.getStartIndex());
- result.setStopIndex(ctx.stop.getStopIndex());
- result.setExpression((ExpressionSegment) visit(ctx.expr(0)));
+ NotExpression result = new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
return result;
}
@@ -416,7 +411,10 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
@Override
public final ASTNode visitSimpleExpr(final SimpleExprContext ctx) {
if (null != ctx.subquery()) {
- SubquerySegment subquerySegment = new SubquerySegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), (MySQLSelectStatement) visit(ctx.subquery()));
+ SubquerySegment subquerySegment = new SubquerySegment(ctx.subquery().getStart().getStartIndex(), ctx.subquery().getStop().getStopIndex(), (MySQLSelectStatement) visit(ctx.subquery()));
+ if (null != ctx.EXISTS()) {
+ return new ExistsSubqueryExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), subquerySegment);
+ }
return new SubqueryExpressionSegment(subquerySegment);
}
if (null != ctx.parameterMarker()) {
@@ -437,6 +435,17 @@ public abstract class MySQLVisitor extends MySQLStatementBaseVisitor<ASTNode> {
if (null != ctx.matchExpression_()) {
return visit(ctx.matchExpression_());
}
+ if (null != ctx.notOperator_()) {
+ ASTNode expression = visit(ctx.simpleExpr(0));
+ if (expression instanceof ExistsSubqueryExpression) {
+ ((ExistsSubqueryExpression) expression).setNot(true);
+ return expression;
+ }
+ return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) expression);
+ }
+ if (null != ctx.LP_() && 1 == ctx.expr().size()) {
+ return visit(ctx.expr(0));
+ }
return visitRemainSimpleExpr(ctx);
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
index 0deca6e..22c2648 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/OracleVisitor.java
@@ -245,10 +245,7 @@ public abstract class OracleVisitor extends OracleStatementBaseVisitor<ASTNode>
BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
return result;
}
- NotExpression result = new NotExpression();
- result.setStartIndex(ctx.start.getStartIndex());
- result.setStopIndex(ctx.stop.getStopIndex());
- result.setExpression((ExpressionSegment) visit(ctx.expr(0)));
+ NotExpression result = new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
return result;
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
index 087ea10..25a1b75 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/SQL92Visitor.java
@@ -238,10 +238,7 @@ public abstract class SQL92Visitor extends SQL92StatementBaseVisitor<ASTNode> {
BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
return result;
}
- NotExpression result = new NotExpression();
- result.setStartIndex(ctx.start.getStartIndex());
- result.setStopIndex(ctx.stop.getStopIndex());
- result.setExpression((ExpressionSegment) visit(ctx.expr(0)));
+ NotExpression result = new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
return result;
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
index 1ee5c78..c5a3737 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/SQLServerVisitor.java
@@ -252,10 +252,7 @@ public abstract class SQLServerVisitor extends SQLServerStatementBaseVisitor<AST
BinaryOperationExpression result = new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
return result;
}
- NotExpression result = new NotExpression();
- result.setStartIndex(ctx.start.getStartIndex());
- result.setStopIndex(ctx.stop.getStopIndex());
- result.setExpression((ExpressionSegment) visit(ctx.expr(0)));
+ NotExpression result = new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
return result;
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
index 638106f..b182a09 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/extractor/TableExtractor.java
@@ -21,6 +21,7 @@ import lombok.Getter;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BetweenExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExistsSubqueryExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.InExpression;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ListExpression;
@@ -107,6 +108,9 @@ public final class TableExtractor {
extractTablesFromExpression(each);
}
}
+ if (expressionSegment instanceof ExistsSubqueryExpression) {
+ extractTablesFromSelect(((ExistsSubqueryExpression) expressionSegment).getSubquery().getSelect());
+ }
if (expressionSegment instanceof BetweenExpression) {
extractTablesFromExpression(((BetweenExpression) expressionSegment).getLeft());
extractTablesFromExpression(((BetweenExpression) expressionSegment).getBetweenExpr());
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExistsSubqueryExpression.java
similarity index 71%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExistsSubqueryExpression.java
index 98c2a7b..5ce7855 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/ExistsSubqueryExpression.java
@@ -18,15 +18,20 @@
package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
import lombok.Getter;
+import lombok.RequiredArgsConstructor;
import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.subquery.SubquerySegment;
+@RequiredArgsConstructor
@Getter
-@Setter
-public final class NotExpression implements ExpressionSegment {
+public class ExistsSubqueryExpression implements ExpressionSegment {
- private int startIndex;
+ private final int startIndex;
- private int stopIndex;
+ private final int stopIndex;
- private ExpressionSegment expression;
+ private final SubquerySegment subquery;
+
+ @Setter
+ private boolean not;
}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
index 98c2a7b..a7910a2 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
@@ -18,15 +18,15 @@
package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr;
import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
+@RequiredArgsConstructor
@Getter
-@Setter
public final class NotExpression implements ExpressionSegment {
- private int startIndex;
+ private final int startIndex;
- private int stopIndex;
+ private final int stopIndex;
- private ExpressionSegment expression;
+ private final ExpressionSegment expression;
}