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

xiong pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 1e1ea335ff [CALCITE-7076] IN-list that includes NULL converted to 
Values throws exception when When there is a non-null column being compared 
with a NULL value
1e1ea335ff is described below

commit 1e1ea335ff2ddceb523a760e642a959854c2085b
Author: Xiong Duan <[email protected]>
AuthorDate: Fri Jun 27 19:55:24 2025 +0800

    [CALCITE-7076] IN-list that includes NULL converted to Values throws 
exception when When there is a non-null column being compared with a NULL value
---
 .../adapter/enumerable/EnumerableMergeJoin.java       | 19 ++++++++++++++++++-
 core/src/test/resources/sql/sub-query.iq              |  9 +++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
index e0749a981c..838e37064f 100644
--- 
a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
+++ 
b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java
@@ -38,6 +38,8 @@
 import org.apache.calcite.rel.metadata.RelMdCollation;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.util.BuiltInMethod;
@@ -492,8 +494,23 @@ public static EnumerableMergeJoin create(RelNode left, 
RelNode right,
           new RelFieldCollation(i, RelFieldCollation.Direction.ASCENDING,
               RelFieldCollation.NullDirection.LAST));
     }
+
+    final RelDataTypeFactory.Builder typeBuilder = typeFactory.builder();
+    List<RelDataTypeField> leftRelDataTypeFieldList = 
leftKeyPhysType.getRowType().getFieldList();
+    List<RelDataTypeField> rightRelDataTypeFieldList = 
rightKeyPhysType.getRowType().getFieldList();
+    for (int i = 0; i < leftRelDataTypeFieldList.size(); i++) {
+      typeBuilder.add(leftRelDataTypeFieldList.get(i).getName(),
+          typeFactory.createTypeWithNullability(
+              leftRelDataTypeFieldList.get(i).getType(),
+              leftRelDataTypeFieldList.get(i).getType().isNullable()
+                  || rightRelDataTypeFieldList.get(i).getType().isNullable()));
+    }
+
+    RelDataType comparatorRowType = typeBuilder.build();
+    final PhysType comparatorPhysType =
+        PhysTypeImpl.of(typeFactory, comparatorRowType, JavaRowFormat.LIST);
     final RelCollation collation = RelCollations.of(fieldCollations);
-    final Expression comparator = 
leftKeyPhysType.generateMergeJoinComparator(collation);
+    final Expression comparator = 
comparatorPhysType.generateMergeJoinComparator(collation);
 
     return implementor.result(
         physType,
diff --git a/core/src/test/resources/sql/sub-query.iq 
b/core/src/test/resources/sql/sub-query.iq
index cddd77cf4c..aab9e286c2 100644
--- a/core/src/test/resources/sql/sub-query.iq
+++ b/core/src/test/resources/sql/sub-query.iq
@@ -3958,6 +3958,15 @@ EnumerableCalc(expr#0..14=[{inputs}], expr#15=[0], 
expr#16=[=($t8, $t15)], expr#
         EnumerableValues(tuples=[[{ 3, null }, { 1, 2 }]])
 !plan
 
+select * from "scott".emp where (empno, deptno) not in ((1, 2), (3, null), 
(cast(null as integer), cast(null as integer)));
++-------+-------+-----+-----+----------+-----+------+--------+
+| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
++-------+-------+-----+-----+----------+-----+------+--------+
++-------+-------+-----+-----+----------+-----+------+--------+
+(0 rows)
+
+!ok
+
 select * from "scott".emp where (empno, deptno) not in ((7369, 20), (7499, 
30));
 +-------+--------+-----------+------+------------+---------+---------+--------+
 | EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |

Reply via email to