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 a1ab24a19dc5..9551c45395fa 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 f9cedb9d81ea..0ab8640ead2c 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -12177,6 +12177,23 @@ private void checkLoptOptimizeJoinRule(LoptOptimizeJoinRule rule) {
.checkUnchanged();
}
+ /** Test case of
+ * [CALCITE-7397]
+ * Error in simplifying join condition when creating LEFT MARK JOIN. */
+ @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
* [CALCITE-7369]
* ProjectToWindowRule loses column alias when optimizing OVER window queries. */
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 785bce783988..53134b3bd3b9 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]])
+]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+