You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by "Sean Broeder (Jira)" <ji...@apache.org> on 2026/05/09 14:35:00 UTC
[jira] [Created] (CALCITE-7514) MultiJoinOptimizeBushyRule throws AssertionError when a join condition references 3 or more factors
Sean Broeder created CALCITE-7514:
-------------------------------------
Summary: MultiJoinOptimizeBushyRule throws AssertionError when a join condition references 3 or more factors
Key: CALCITE-7514
URL: https://issues.apache.org/jira/browse/CALCITE-7514
Project: Calcite
Issue Type: Bug
Components: core
Reporter: Sean Broeder
Assignee: Sean Broeder
MultiJoinOptimizeBushyRule.onMatch builds a list of Edge objects from multiJoin.getJoinFilters() and assumes every edge connects exactly two factors. When a join condition references three or more factors — for
example, a CASE expression that spans three tables — LoptMultiJoin.createEdge produces an edge whose factors.cardinality() is 3, causing an AssertionError in the edge comparator:
java.lang.AssertionError: {0, 1, 2}
at MultiJoinOptimizeBushyRule$1.rowCountDiff(MultiJoinOptimizeBushyRule.java:147)
at MultiJoinOptimizeBushyRule$1.compare(MultiJoinOptimizeBushyRule.java:143)
at MultiJoinOptimizeBushyRule.minPos(MultiJoinOptimizeBushyRule.java:347)
at MultiJoinOptimizeBushyRule.chooseBestEdge(MultiJoinOptimizeBushyRule.java:329)
at MultiJoinOptimizeBushyRule.onMatch(MultiJoinOptimizeBushyRule.java:157)
The class Javadoc already acknowledges this as a known gap:
* TODO:
* <li>Join conditions that touch 1 factor.
* <li>Join conditions that touch 3 factors.
This can be reproduced with the following query:
SELECT e1.ename
FROM emp e1, dept d, emp e2
WHERE e1.deptno = d.deptno
AND e2.deptno = d.deptno
AND d.deptno = CASE WHEN e1.sal > 1000 THEN e2.empno ELSE e1.empno END
With pre-program FILTER_INTO_JOIN (bottom-up) + JOIN_TO_MULTI_JOIN, the CASE condition spans all three factors and ends up in the MultiJoin's joinFilter. When MULTI_JOIN_OPTIMIZE_BUSHY fires, the assertion in
rowCountDiff fails.
Expected behavior: The rule handles conditions that touch ≠ 2 factors gracefully, producing a valid join tree.
Actual behavior: AssertionError at rowCountDiff (line 147), chooseBestEdge (line 329), or the edge-rewrite loop (line 244), depending on which assertion is reached first.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)