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` >> ?" 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` << 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` << ?" 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` > 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` > ?)" 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>