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]]) +]]> + + + + + + + + + + + + + +