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

silun 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 41774e2b2f [CALCITE-7397] Error in simplifying join condition when 
creating LEFT MARK JOIN
41774e2b2f is described below

commit 41774e2b2f67c1307be9a20361a708288256ce2c
Author: Zhen Chen <[email protected]>
AuthorDate: Mon Jan 26 21:47:45 2026 +0800

    [CALCITE-7397] Error in simplifying join condition when creating LEFT MARK 
JOIN
---
 .../java/org/apache/calcite/tools/RelBuilder.java  |  8 ++++-
 .../org/apache/calcite/test/RelOptRulesTest.java   | 17 ++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml    | 36 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java 
b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index a1ab24a19d..9551c45395 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -84,6 +84,7 @@
 import org.apache.calcite.rex.RexShuttle;
 import org.apache.calcite.rex.RexSimplify;
 import org.apache.calcite.rex.RexSubQuery;
+import org.apache.calcite.rex.RexUnknownAs;
 import org.apache.calcite.rex.RexUtil;
 import org.apache.calcite.rex.RexWindowBound;
 import org.apache.calcite.rex.RexWindowBounds;
@@ -3315,7 +3316,12 @@ public RelBuilder join(JoinRelType joinType, RexNode 
condition,
             RelOptUtil.collapseExpandedIsNotDistinctFromExpr((RexCall) 
condition,
                 getRexBuilder());
       }
-      condition = simplifier.simplifyUnknownAsFalse(condition);
+
+      condition =
+          simplifier.simplifyUnknownAs(condition,
+              joinType == JoinRelType.LEFT_MARK
+                  ? RexUnknownAs.UNKNOWN
+                  : RexUnknownAs.FALSE);
     }
     if (correlate) {
       final CorrelationId id = Iterables.getOnlyElement(variablesSet);
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java 
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index a7dd7dd614..81f07a6f6a 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -12193,6 +12193,23 @@ private void 
checkLoptOptimizeJoinRule(LoptOptimizeJoinRule rule) {
         .checkUnchanged();
   }
 
+  /** Test case of
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7397";>[CALCITE-7397]
+   * Error in simplifying join condition when creating LEFT MARK JOIN</a>. */
+  @Test void testMarkJoinMarkerColumnTypeNullableMismatch() {
+    final String sql = "select sal,\n"
+        + "  cast(null as int) IN (\n"
+        + "    select cast(null as int)\n"
+        + "    from dept)\n"
+        + "from emp";
+
+    sql(sql)
+        .withRule(CoreRules.PROJECT_SUB_QUERY_TO_MARK_CORRELATE)
+        .withLateDecorrelate(true)
+        .withTopDownGeneralDecorrelate(true)
+        .check();
+  }
+
   /** Test case of
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-7369";>[CALCITE-7369]
    * ProjectToWindowRule loses column alias when optimizing OVER window 
queries</a>. */
diff --git 
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml 
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 977367cf19..103744e311 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -9705,6 +9705,42 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], 
MGR=[$3], HIREDATE=[$4], SAL=[$
   MultiJoin(joinFilter=[true], isFullOuterJoin=[false], joinTypes=[[INNER, 
LEFT]], outerJoinConditions=[[NULL, =($7, $9)]], projFields=[[{0, 1, 2, 3, 4, 
5, 6, 7, 8}, {0, 1}]], postJoinFilter=[AND(LIKE($1, 'bar'), >($9, 3))])
     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
     LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testMarkJoinMarkerColumnTypeNullableMismatch">
+    <Resource name="sql">
+      <![CDATA[select sal,
+  cast(null as int) IN (
+    select cast(null as int)
+    from dept)
+from emp]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalProject(SAL=[$5], EXPR$1=[IN(null:INTEGER, {
+LogicalProject(EXPR$0=[null:INTEGER])
+  LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+})])
+  LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+    <Resource name="planMid">
+      <![CDATA[
+LogicalProject(SAL=[$5], EXPR$1=[$9])
+  LogicalJoin(condition=[null:BOOLEAN], joinType=[left_mark])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+    LogicalProject(EXPR$0=[null:INTEGER])
+      LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+    </Resource>
+    <Resource name="planAfter">
+      <![CDATA[
+LogicalProject(SAL=[$5], EXPR$1=[$9])
+  LogicalJoin(condition=[null:BOOLEAN], joinType=[left_mark])
+    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+    LogicalProject(EXPR$0=[null:INTEGER])
+      LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to