This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 84a660158d1e62c4a6db7fd2c9400bae9207ac9b Author: morrySnow <[email protected]> AuthorDate: Thu Jul 20 11:10:11 2023 +0800 [fix](Nereids) should not push down project to the nullable side of outer join (#21999) --- .../join/PushdownProjectThroughInnerOuterJoin.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java index 6d01078cdc..8a480c67dd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoin.java @@ -57,8 +57,8 @@ public class PushdownProjectThroughInnerOuterJoin implements ExplorationRuleFact public List<Rule> buildRules() { return ImmutableList.of( logicalJoin(logicalProject(logicalJoin()), group()) - .when(j -> j.left().child().getJoinType().isOuterJoin() || j.left().child().getJoinType() - .isInnerJoin()) + .when(j -> j.left().child().getJoinType().isOuterJoin() + || j.left().child().getJoinType().isInnerJoin()) // Just pushdown project with non-column expr like (t.id + 1) .whenNot(j -> j.left().isAllSlots()) .whenNot(j -> j.left().child().hasJoinHint()) @@ -71,8 +71,8 @@ public class PushdownProjectThroughInnerOuterJoin implements ExplorationRuleFact return topJoin.withChildren(newLeft, topJoin.right()); }).toRule(RuleType.PUSH_DOWN_PROJECT_THROUGH_INNER_OUTER_JOIN), logicalJoin(group(), logicalProject(logicalJoin())) - .when(j -> j.right().child().getJoinType().isOuterJoin() || j.right().child().getJoinType() - .isInnerJoin()) + .when(j -> j.right().child().getJoinType().isOuterJoin() + || j.right().child().getJoinType().isInnerJoin()) // Just pushdown project with non-column expr like (t.id + 1) .whenNot(j -> j.right().isAllSlots()) .whenNot(j -> j.right().child().hasJoinHint()) @@ -135,6 +135,11 @@ public class PushdownProjectThroughInnerOuterJoin implements ExplorationRuleFact if (!leftContains) { return null; } + // we could not push nullable side project + if ((join.getJoinType().isLeftOuterJoin() && rightContains) + || (join.getJoinType().isRightOuterJoin() && leftContains)) { + return null; + } Builder<NamedExpression> newAProject = ImmutableList.<NamedExpression>builder().addAll(aProjects); Set<Slot> aConditionSlots = CBOUtils.joinChildConditionSlots(join, true); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
