Skip to content

Commit 205e604

Browse files
committed
[CALCITE-7397] TopDownGeneralDecorrelator can cause nullable property mismatches
1 parent c251de4 commit 205e604

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

core/src/main/java/org/apache/calcite/tools/RelBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import org.apache.calcite.rex.RexShuttle;
8585
import org.apache.calcite.rex.RexSimplify;
8686
import org.apache.calcite.rex.RexSubQuery;
87+
import org.apache.calcite.rex.RexUnknownAs;
8788
import org.apache.calcite.rex.RexUtil;
8889
import org.apache.calcite.rex.RexWindowBound;
8990
import org.apache.calcite.rex.RexWindowBounds;
@@ -3315,7 +3316,12 @@ public RelBuilder join(JoinRelType joinType, RexNode condition,
33153316
RelOptUtil.collapseExpandedIsNotDistinctFromExpr((RexCall) condition,
33163317
getRexBuilder());
33173318
}
3318-
condition = simplifier.simplifyUnknownAsFalse(condition);
3319+
3320+
condition =
3321+
simplifier.simplifyUnknownAs(condition,
3322+
joinType == JoinRelType.LEFT_MARK
3323+
? RexUnknownAs.UNKNOWN
3324+
: RexUnknownAs.FALSE);
33193325
}
33203326
if (correlate) {
33213327
final CorrelationId id = Iterables.getOnlyElement(variablesSet);

core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12177,6 +12177,24 @@ private void checkLoptOptimizeJoinRule(LoptOptimizeJoinRule rule) {
1217712177
.checkUnchanged();
1217812178
}
1217912179

12180+
/** Test case of
12181+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7397">[CALCITE-7397]
12182+
* TopDownGeneralDecorrelator can cause nullable property mismatches</a>. */
12183+
@Test void testMarkJoinMarkerColumnTypeNullableMismatch() {
12184+
final String sql = "select sal,\n"
12185+
+ " cast(null as int) IN (\n"
12186+
+ " select cast(null as int)\n"
12187+
+ " from dept)\n"
12188+
+ "from emp";
12189+
12190+
sql(sql)
12191+
.withPreRule(CoreRules.PROJECT_SUB_QUERY_TO_MARK_CORRELATE)
12192+
.withLateDecorrelate(true)
12193+
.withTopDownGeneralDecorrelate(true)
12194+
.withRule(CoreRules.PROJECT_MERGE)
12195+
.checkUnchanged();
12196+
}
12197+
1218012198
/** Test case of
1218112199
* <a href="https://issues.apache.org/jira/browse/CALCITE-7369">[CALCITE-7369]
1218212200
* ProjectToWindowRule loses column alias when optimizing OVER window queries</a>. */

core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9705,6 +9705,33 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$
97059705
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))])
97069706
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
97079707
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
9708+
]]>
9709+
</Resource>
9710+
</TestCase>
9711+
<TestCase name="testMarkJoinMarkerColumnTypeNullableMismatch">
9712+
<Resource name="sql">
9713+
<![CDATA[select sal,
9714+
cast(null as int) IN (
9715+
select cast(null as int)
9716+
from dept)
9717+
from emp]]>
9718+
</Resource>
9719+
<Resource name="planBefore">
9720+
<![CDATA[
9721+
LogicalProject(SAL=[$5], EXPR$1=[$9])
9722+
LogicalJoin(condition=[null:BOOLEAN], joinType=[left_mark])
9723+
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
9724+
LogicalProject(EXPR$0=[null:INTEGER])
9725+
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
9726+
]]>
9727+
</Resource>
9728+
<Resource name="planMid">
9729+
<![CDATA[
9730+
LogicalProject(SAL=[$5], EXPR$1=[$9])
9731+
LogicalJoin(condition=[null:BOOLEAN], joinType=[left_mark])
9732+
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
9733+
LogicalProject(EXPR$0=[null:INTEGER])
9734+
LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
97089735
]]>
97099736
</Resource>
97109737
</TestCase>

0 commit comments

Comments
 (0)