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 |