From f1462f6cf48f712703c8c8ec4d6af048097754b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=81=A5?= Date: Thu, 18 Jan 2024 15:55:34 +0800 Subject: [PATCH] [fix](Nereids): eliminate redundant join condition after inferring condition (#30093) eliminate redundant join when find hashing join condition such as for plan: ``` T1 join T2 on T1.id = T2.id join T3 on T1.id = T3.id and T2.id = T3.id ``` we infer a new predicate T1.id = T2.id which is redundant. Therefore we need to eliminate it when find hash condition --- .../nereids/rules/rewrite/FindHashConditionForJoin.java | 9 +++++---- .../jobs/joinorder/hypergraph/CompareOuterJoinTest.java | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/FindHashConditionForJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/FindHashConditionForJoin.java index fe51a7d830..aeeeefb593 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/FindHashConditionForJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/FindHashConditionForJoin.java @@ -28,6 +28,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; import org.apache.doris.nereids.util.JoinUtils; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Streams; import java.util.List; @@ -61,10 +62,10 @@ public class FindHashConditionForJoin extends OneRewriteRuleFactory { return join; } - List combinedHashJoinConjuncts = new ImmutableList.Builder() - .addAll(join.getHashJoinConjuncts()) - .addAll(extractedHashJoinConjuncts) - .build(); + List combinedHashJoinConjuncts = Streams + .concat(join.getHashJoinConjuncts().stream(), extractedHashJoinConjuncts.stream()) + .distinct() + .collect(ImmutableList.toImmutableList()); JoinType joinType = join.getJoinType(); if (joinType == JoinType.CROSS_JOIN && !combinedHashJoinConjuncts.isEmpty()) { joinType = JoinType.INNER_JOIN; diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/CompareOuterJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/CompareOuterJoinTest.java index f73d8a2923..bbf7746ec6 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/CompareOuterJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/jobs/joinorder/hypergraph/CompareOuterJoinTest.java @@ -28,10 +28,12 @@ import org.apache.doris.nereids.rules.exploration.mv.mapping.RelationMapping; import org.apache.doris.nereids.rules.exploration.mv.mapping.SlotMapping; import org.apache.doris.nereids.sqltest.SqlTestBase; import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.plans.JoinType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.util.HyperGraphBuilder; import org.apache.doris.nereids.util.PlanChecker; +import com.google.common.collect.Sets; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -69,7 +71,8 @@ class CompareOuterJoinTest extends SqlTestBase { @Test void testRandomQuery() { - Plan p1 = new HyperGraphBuilder().randomBuildPlanWith(3, 3); + Plan p1 = new HyperGraphBuilder(Sets.newHashSet(JoinType.INNER_JOIN)) + .randomBuildPlanWith(3, 3); p1 = PlanChecker.from(connectContext, p1) .analyze() .rewrite()