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


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new 8cd18b6cfed [fix](Nereids) should not push down project to the 
nullable side of outer join #27912 (#27913)
8cd18b6cfed is described below

commit 8cd18b6cfed0ad3aabedce17ca2f8b94bbd0ba8b
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Sun Dec 3 14:45:10 2023 +0800

    [fix](Nereids) should not push down project to the nullable side of outer 
join #27912 (#27913)
---
 .../join/PushdownProjectThroughInnerOuterJoin.java |  4 +-
 .../PushdownProjectThroughInnerOuterJoinTest.java  | 53 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 2 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 03fd3e8a8d8..cf907e95786 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
@@ -136,8 +136,8 @@ public class PushdownProjectThroughInnerOuterJoin 
implements ExplorationRuleFact
             return null;
         }
         // we could not push nullable side project
-        if ((join.getJoinType().isLeftOuterJoin() && rightContains)
-                || (join.getJoinType().isRightOuterJoin() && leftContains)) {
+        if (((join.getJoinType().isLeftOuterJoin() || 
join.getJoinType().isFullOuterJoin()) && rightContains)
+                || ((join.getJoinType().isRightOuterJoin() || 
join.getJoinType().isFullOuterJoin()) && leftContains)) {
             return null;
         }
 
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java
index 19be848332d..5e539202d7a 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/exploration/join/PushdownProjectThroughInnerOuterJoinTest.java
@@ -73,6 +73,59 @@ class PushdownProjectThroughInnerOuterJoinTest implements 
MemoPatternMatchSuppor
                 );
     }
 
+    @Test
+    public void pushRightSide() {
+        // project (t1.id + 1) as alias, t1.name, (t2.id + 1) as alias, t2.name
+        List<NamedExpression> projectExprs = ImmutableList.of(
+                new Alias(new Add(scan1.getOutput().get(0), Literal.of(1)), 
"alias"),
+                scan1.getOutput().get(1),
+                scan2.getOutput().get(1)
+        );
+        // complex projection contain ti.id, which isn't in Join Condition
+        LogicalPlan plan = new LogicalPlanBuilder(scan1)
+                .join(scan2, JoinType.LEFT_OUTER_JOIN, Pair.of(1, 1))
+                .projectExprs(projectExprs)
+                .join(scan3, JoinType.INNER_JOIN, Pair.of(1, 1))
+                .build();
+
+        PlanChecker.from(MemoTestUtils.createConnectContext(), plan)
+                
.applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules())
+                .printlnOrigin()
+                .printlnExploration()
+                .matchesExploration(
+                        logicalJoin(
+                                logicalProject(
+                                    logicalJoin(
+                                            logicalProject().when(project -> 
project.getProjects().size() == 2),
+                                            logicalOlapScan()
+                                    )
+                                ),
+                                logicalOlapScan()
+                        )
+                );
+    }
+
+    @Test
+    public void pushNoSide() {
+        // project (t1.id + 1) as alias, t1.name, (t2.id + 1) as alias, t2.name
+        List<NamedExpression> projectExprs = ImmutableList.of(
+                new Alias(new Add(scan1.getOutput().get(0), Literal.of(1)), 
"alias"),
+                scan1.getOutput().get(1),
+                scan2.getOutput().get(1)
+        );
+        // complex projection contain ti.id, which isn't in Join Condition
+        LogicalPlan plan = new LogicalPlanBuilder(scan1)
+                .join(scan2, JoinType.FULL_OUTER_JOIN, Pair.of(1, 1))
+                .projectExprs(projectExprs)
+                .join(scan3, JoinType.INNER_JOIN, Pair.of(1, 1))
+                .build();
+
+        int plansNumber = 
PlanChecker.from(MemoTestUtils.createConnectContext(), plan)
+                
.applyExploration(PushdownProjectThroughInnerOuterJoin.INSTANCE.buildRules())
+                .plansNumber();
+        Assertions.assertEquals(1, plansNumber);
+    }
+
     @Test
     public void pushdownProjectInCondition() {
         // project (t1.id + 1) as alias, t1.name, (t2.id + 1) as alias, t2.name


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to