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>