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/05/11 08:52:19 UTC

[shardingsphere] branch master updated: support for boolean primary SQL (#25564)

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 009002ae1fc support for boolean primary SQL (#25564)
009002ae1fc is described below

commit 009002ae1fc6b4c904700edb36b9859f43623c2d
Author: kanha gupta <92...@users.noreply.github.com>
AuthorDate: Thu May 11 14:22:10 2023 +0530

    support for boolean primary SQL (#25564)
---
 .../impl/BinaryOperationExpressionConverter.java   | 32 ++++++++++++----------
 .../test/it/optimize/SQLNodeConverterEngineIT.java |  2 ++
 2 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
index 82cb54e8b21..a9179c11e09 100644
--- a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
+++ b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/converter/segment/expression/impl/BinaryOperationExpressionConverter.java
@@ -25,6 +25,7 @@ import org.apache.calcite.sql.SqlOperator;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.BinaryOperationExpression;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.SQLSegmentConverter;
 import org.apache.shardingsphere.sqlfederation.optimizer.converter.segment.expression.ExpressionConverter;
 
@@ -63,6 +64,8 @@ public final class BinaryOperationExpressionConverter implements SQLSegmentConve
         register(SqlStdOperatorTable.LIKE);
         register(SqlStdOperatorTable.NOT_LIKE);
         register(SqlStdOperatorTable.PERCENT_REMAINDER);
+        register(SqlStdOperatorTable.IS_NULL);
+        register(SqlStdOperatorTable.IS_NOT_NULL);
     }
     
     private static void register(final SqlOperator sqlOperator) {
@@ -79,22 +82,23 @@ public final class BinaryOperationExpressionConverter implements SQLSegmentConve
     
     @Override
     public Optional<SqlNode> convert(final BinaryOperationExpression segment) {
-        SqlOperator operator = convertOperator(segment.getOperator());
-        List<SqlNode> sqlNodes = convertSqlNodes(segment);
-        return Optional.of(new SqlBasicCall(operator, sqlNodes, SqlParserPos.ZERO));
-    }
-    
-    private List<SqlNode> convertSqlNodes(final BinaryOperationExpression segment) {
         SqlNode left = new ExpressionConverter().convert(segment.getLeft()).orElseThrow(IllegalStateException::new);
         SqlNode right = new ExpressionConverter().convert(segment.getRight()).orElseThrow(IllegalStateException::new);
-        List<SqlNode> result = new LinkedList<>();
-        result.add(left);
-        result.addAll(right instanceof SqlNodeList ? ((SqlNodeList) right).getList() : Collections.singletonList(right));
-        return result;
-    }
-    
-    private SqlOperator convertOperator(final String operator) {
+        String operator = segment.getOperator();
+        List<SqlNode> sqlNodes = new LinkedList<>();
+        sqlNodes.add(left);
+        if ("IS".equals(operator)) {
+            right = null;
+            if (((LiteralExpressionSegment) segment.getRight()).getLiterals().equals("NULL")) {
+                operator = "IS NULL";
+            } else if (((LiteralExpressionSegment) segment.getRight()).getLiterals().equals("NOT NULL")) {
+                operator = "IS NOT NULL";
+            }
+        } else {
+            sqlNodes.addAll(right instanceof SqlNodeList ? ((SqlNodeList) right).getList() : Collections.singletonList(right));
+        }
         Preconditions.checkState(REGISTRY.containsKey(operator), "Unsupported SQL operator: `%s`", operator);
-        return REGISTRY.get(operator);
+        SqlOperator sqlOperator = REGISTRY.get(operator);
+        return Optional.of(new SqlBasicCall(sqlOperator, sqlNodes.toArray(new SqlNode[0]), SqlParserPos.ZERO));
     }
 }
diff --git a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
index 117ca1004a7..3b2f88a0a44 100644
--- a/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
+++ b/test/it/optimizer/src/test/java/org/apache/shardingsphere/test/it/optimize/SQLNodeConverterEngineIT.java
@@ -206,6 +206,8 @@ class SQLNodeConverterEngineIT {
             result.add("select_where_with_bit_expr_with_plus_interval");
             result.add("select_where_with_bit_expr_with_minus_interval");
             result.add("select_where_with_predicate_with_in_subquery");
+            result.add("select_where_with_boolean_primary_with_is");
+            result.add("select_where_with_boolean_primary_with_is_not");
             return result;
         }
         // CHECKSTYLE:ON