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 <[email protected]>
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>