This is an automated email from the ASF dual-hosted git repository.
mbudiu 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 99c4493260 [CALCITE-7006] Incorrect left join results with IS NOT
DISTINCT FROM under specific plan
99c4493260 is described below
commit 99c4493260dba7b96aa4da75c53fe0965f508d28
Author: Zhen Chen <[email protected]>
AuthorDate: Sat May 10 23:20:56 2025 +0800
[CALCITE-7006] Incorrect left join results with IS NOT DISTINCT FROM under
specific plan
---
.../calcite/adapter/enumerable/RexImpTable.java | 3 +-
core/src/test/resources/sql/join.iq | 150 +++++++++++++++++++++
2 files changed, 152 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
index 3364459261..d182eff6e3 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
@@ -4763,7 +4763,8 @@ private static class IsNotDistinctFromImplementor extends
AbstractRexCallImpleme
Expressions.condition(left.isNullVariable,
Expressions.condition(right.isNullVariable, BOXED_TRUE_EXPR,
BOXED_FALSE_EXPR),
Expressions.condition(right.isNullVariable, BOXED_FALSE_EXPR,
- Expressions.equal(left.valueVariable, right.valueVariable)));
+ Expressions.call(BuiltInMethod.OBJECTS_EQUAL.method,
+ left.valueVariable, right.valueVariable)));
BlockBuilder builder = translator.getBlockBuilder();
final ParameterExpression valueVariable =
diff --git a/core/src/test/resources/sql/join.iq
b/core/src/test/resources/sql/join.iq
index a5ee6eea15..5355d57845 100644
--- a/core/src/test/resources/sql/join.iq
+++ b/core/src/test/resources/sql/join.iq
@@ -854,4 +854,154 @@ EnumerableCalc(expr#0..1=[{inputs}], A=[$t0])
EnumerableValues(tuples=[[{ 1 }, { null }]])
!plan
+# Test for Double
+SELECT t1.a
+FROM (VALUES (1.0e0), (2.0e0), (null)) AS t1(a)
+JOIN (VALUES (1.0e0), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++-----+
+| A |
++-----+
+| 1.0 |
+| |
++-----+
+(2 rows)
+
+!ok
+
+# Test for Int
+SELECT t1.a
+FROM (VALUES (1), (2), (null)) AS t1(a)
+JOIN (VALUES (1), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++---+
+| A |
++---+
+| 1 |
+| |
++---+
+(2 rows)
+
+!ok
+
+# Test for Varchar/Char
+SELECT t1.a
+FROM (VALUES ('x'), ('y'), (null)) AS t1(a)
+JOIN (VALUES ('x'), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++---+
+| A |
++---+
+| x |
+| |
++---+
+(2 rows)
+
+!ok
+
+# Test for Boolean
+SELECT t1.a
+FROM (VALUES (true), (false), (null)) AS t1(a)
+JOIN (VALUES (true), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++------+
+| A |
++------+
+| true |
+| |
++------+
+(2 rows)
+
+!ok
+
+# Test for Date
+SELECT t1.a
+FROM (VALUES (DATE '2025-05-10'), (DATE '2025-05-11'), (null)) AS t1(a)
+JOIN (VALUES (DATE '2025-05-10'), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++------------+
+| A |
++------------+
+| 2025-05-10 |
+| |
++------------+
+(2 rows)
+
+!ok
+
+# Test for Timestamp
+SELECT t1.a
+FROM (VALUES (TIMESTAMP '2025-05-10 10:22:34'), (TIMESTAMP '2025-05-11
10:22:34'), (null)) AS t1(a)
+JOIN (VALUES (TIMESTAMP '2025-05-10 10:22:34'), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++---------------------+
+| A |
++---------------------+
+| 2025-05-10 10:22:34 |
+| |
++---------------------+
+(2 rows)
+
+!ok
+
+# Test for Decimal
+SELECT t1.a
+FROM (VALUES (CAST(1.0 AS DECIMAL(10, 2))), (CAST(2.0 AS DECIMAL(10, 2))),
(null)) AS t1(a)
+JOIN (VALUES (CAST(1.0 AS DECIMAL(10, 2))), (null)) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++------+
+| A |
++------+
+| 1.00 |
+| |
++------+
+(2 rows)
+
+!ok
+
+# Test for Array
+SELECT t1.a
+FROM (VALUES (ARRAY[1.0, 1.0]), (ARRAY[2.0, 2.0]), (CAST(NULL AS DOUBLE
ARRAY))) AS t1(a)
+JOIN (VALUES (ARRAY[1.0, 1.0]), (CAST(NULL AS DOUBLE ARRAY))) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++------------+
+| A |
++------------+
+| [1.0, 1.0] |
+| |
++------------+
+(2 rows)
+
+!ok
+
+# Test for Map
+SELECT t1.a
+FROM (VALUES (MAP['k1', 1.0]), (MAP['k2', 2.0]), (CAST(NULL AS MAP<VARCHAR,
DOUBLE>)) ) AS t1(a)
+JOIN (VALUES (MAP['k1', 1.0]), (CAST(NULL AS MAP<VARCHAR, DOUBLE>)) ) AS t2(a)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++----------+
+| A |
++----------+
+| {k1=1.0} |
+| |
++----------+
+(2 rows)
+
+!ok
+
+# Test for Row
+SELECT t1.a, t1.b
+FROM (VALUES (ROW('k1', 1.0)), (ROW('k2', 2.0)), (ROW(NULL, NULL)) ) AS t1(a,
b)
+JOIN (VALUES (ROW('k1', 1.0)), (ROW(NULL, NULL)) ) AS t2(a, b)
+ON t1.a IS NOT DISTINCT FROM t2.a;
++----+-----+
+| A | B |
++----+-----+
+| k1 | 1.0 |
+| | |
++----+-----+
+(2 rows)
+
+!ok
+
# End join.iq