You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/10 08:59:02 UTC

[shardingsphere] branch master updated: test case addition & NOT expression enhancements (#26246)

This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 4de1bba76b4 test case addition & NOT expression enhancements (#26246)
4de1bba76b4 is described below

commit 4de1bba76b47500102869678b0a774ac2d9b5a0f
Author: kanha gupta <92...@users.noreply.github.com>
AuthorDate: Sat Jun 10 14:28:48 2023 +0530

    test case addition & NOT expression enhancements (#26246)
---
 .../segment/expression/impl/NotExpressionConverter.java        |  3 +++
 .../segment/expression/impl/SQLExtensionOperatorTable.java     |  3 +++
 .../parser/mysql/visitor/statement/MySQLStatementVisitor.java  |  8 ++++++--
 .../oracle/visitor/statement/OracleStatementVisitor.java       |  2 +-
 .../parser/sql92/visitor/statement/SQL92StatementVisitor.java  |  2 +-
 .../sqlserver/visitor/statement/SQLServerStatementVisitor.java |  2 +-
 .../sql/parser/sql/common/segment/dml/expr/NotExpression.java  |  2 ++
 .../src/test/resources/converter/select-expression.xml         | 10 ++++++++++
 8 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/NotExpressionConverter.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/NotExpressionConverter.java
index 38a6b488bfc..48e5e30b235 100644
--- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/NotExpressionConverter.java
+++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/NotExpressionConverter.java
@@ -39,6 +39,9 @@ public final class NotExpressionConverter implements SQLSegmentConverter<NotExpr
         SqlNode expression = new ExpressionConverter().convert(segment.getExpression()).orElseThrow(IllegalStateException::new);
         List<SqlNode> sqlNodes = new LinkedList<>();
         sqlNodes.add(expression);
+        if (segment.getNotSign().equals(true)) {
+            return Optional.of(new SqlBasicCall(SQLExtensionOperatorTable.NOT_SIGN, sqlNodes, SqlParserPos.ZERO));
+        }
         return Optional.of(new SqlBasicCall(SqlStdOperatorTable.NOT, sqlNodes, SqlParserPos.ZERO));
     }
 }
diff --git a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/SQLExtensionOperatorTable.java b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/SQLExtensionOperatorTable.java
index 1083566bbc7..23b5e867177 100644
--- a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/SQLExtensionOperatorTable.java
+++ b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/SQLExtensionOperatorTable.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.calcite.sql.SqlBinaryOperator;
 import org.apache.calcite.sql.SqlKind;
+import org.apache.calcite.sql.SqlPrefixOperator;
 
 /**
  * SQL extension operator table.
@@ -37,4 +38,6 @@ public final class SQLExtensionOperatorTable {
     public static final SqlBinaryOperator SIGNED_LEFT_SHIFT = new SqlBinaryOperator("<<", SqlKind.OTHER, 30, true, null, null, null);
     
     public static final SqlBinaryOperator SIGNED_RIGHT_SHIFT = new SqlBinaryOperator(">>", SqlKind.OTHER, 30, true, null, null, null);
+    
+    public static final SqlPrefixOperator NOT_SIGN = new SqlPrefixOperator("!", SqlKind.OTHER, 26, null, null, null);
 }
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
index 27be666640d..97880a94165 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -409,7 +409,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
         if (null != ctx.orOperator()) {
             return createBinaryOperationExpression(ctx, ctx.orOperator().getText());
         }
-        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
+        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)), false);
     }
     
     private BinaryOperationExpression createBinaryOperationExpression(final ExprContext ctx, final String operator) {
@@ -604,11 +604,15 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
         }
         if (null != ctx.notOperator()) {
             ASTNode expression = visit(ctx.simpleExpr(0));
+            Boolean notSign = false;
             if (expression instanceof ExistsSubqueryExpression) {
                 ((ExistsSubqueryExpression) expression).setNot(true);
                 return expression;
             }
-            return new NotExpression(startIndex, stopIndex, (ExpressionSegment) expression);
+            if ("!".equalsIgnoreCase(ctx.notOperator().getText())) {
+                notSign = true;
+            }
+            return new NotExpression(startIndex, stopIndex, (ExpressionSegment) expression, notSign);
         }
         if (null != ctx.LP_() && 1 == ctx.expr().size()) {
             return visit(ctx.expr(0));
diff --git a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
index b7dab4c8b23..1a009736275 100644
--- a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
+++ b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/OracleStatementVisitor.java
@@ -336,7 +336,7 @@ public abstract class OracleStatementVisitor extends OracleStatementBaseVisitor<
         if (null != ctx.datetimeExpr()) {
             return createDatetimeExpression(ctx, ctx.datetimeExpr());
         }
-        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
+        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)), false);
     }
     
     private ASTNode createDatetimeExpression(final ExprContext ctx, final DatetimeExprContext datetimeExpr) {
diff --git a/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/SQL92StatementVisitor.java b/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/SQL92StatementVisitor.java
index fe35c89bdfa..24d72a546df 100644
--- a/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/SQL92StatementVisitor.java
+++ b/parser/sql/dialect/sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/SQL92StatementVisitor.java
@@ -240,7 +240,7 @@ public abstract class SQL92StatementVisitor extends SQL92StatementBaseVisitor<AS
         if (null != ctx.orOperator()) {
             return createBinaryOperationExpression(ctx, ctx.orOperator().getText());
         }
-        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
+        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)), false);
     }
     
     private ASTNode createBinaryOperationExpression(final ExprContext ctx, final String operator) {
diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
index bf52a1a261e..9eede3da434 100644
--- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
+++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/SQLServerStatementVisitor.java
@@ -355,7 +355,7 @@ public abstract class SQLServerStatementVisitor extends SQLServerStatementBaseVi
         if (null != ctx.orOperator()) {
             return createBinaryOperationExpression(ctx, ctx.orOperator().getText());
         }
-        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)));
+        return new NotExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), (ExpressionSegment) visit(ctx.expr(0)), false);
     }
     
     private ASTNode createBinaryOperationExpression(final ExprContext ctx, final String operator) {
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
index a7910a284d7..9f9e07726e1 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/dml/expr/NotExpression.java
@@ -29,4 +29,6 @@ public final class NotExpression implements ExpressionSegment {
     private final int stopIndex;
     
     private final ExpressionSegment expression;
+    
+    private final Boolean notSign;
 }
diff --git a/test/it/optimizer/src/test/resources/converter/select-expression.xml b/test/it/optimizer/src/test/resources/converter/select-expression.xml
index 1d717a44e6c..215a871fc98 100644
--- a/test/it/optimizer/src/test/resources/converter/select-expression.xml
+++ b/test/it/optimizer/src/test/resources/converter/select-expression.xml
@@ -27,4 +27,14 @@
     <test-cases sql-case-id="select_where_with_bit_expr_with_signed_right_shift" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` &gt;&gt; ?" db-types="MySQL" sql-case-types="PLACEHOLDER" />
     <test-cases sql-case-id="select_where_with_bit_expr_with_signed_left_shift" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` &lt;&lt; 1" db-types="MySQL" sql-case-types="LITERAL" />
     <test-cases sql-case-id="select_where_with_bit_expr_with_signed_left_shift" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` &lt;&lt; ?" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_where_with_bit_expr_with_mod" expected-sql="SELECT * FROM `t_order` WHERE MOD(`t_order`.`order_id`, 1)" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_where_with_bit_expr_with_mod" expected-sql="SELECT * FROM `t_order` WHERE MOD(`t_order`.`order_id`, ?)" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_where_with_bit_expr_with_vertical_bar" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` | 1" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_where_with_bit_expr_with_vertical_bar" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` | ?" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_where_with_expr_with_not_sign" expected-sql="SELECT * FROM `t_order` WHERE ! 1 = `t_order`.`order_id`" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_where_with_expr_with_not_sign" expected-sql="SELECT * FROM `t_order` WHERE ! ? = `t_order`.`order_id`" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_where_with_predicate_with_in_subquery" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` NOT IN (SELECT `order_id` FROM `t_order_item` WHERE `status` &gt; 1)" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_where_with_predicate_with_in_subquery" expected-sql="SELECT * FROM `t_order` WHERE `t_order`.`order_id` NOT IN (SELECT `order_id` FROM `t_order_item` WHERE `status` &gt; ?)" db-types="MySQL" sql-case-types="PLACEHOLDER" />
+    <test-cases sql-case-id="select_where_with_expr_with_not" expected-sql="SELECT * FROM `t_order` WHERE NOT 1 = `t_order`.`order_id`" db-types="MySQL" sql-case-types="LITERAL" />
+    <test-cases sql-case-id="select_where_with_expr_with_not" expected-sql="SELECT * FROM `t_order` WHERE NOT ? = `t_order`.`order_id`" db-types="MySQL" sql-case-types="PLACEHOLDER" />
 </sql-node-converter-test-cases>