From 18b7d84436c00576a12bce491ec6c847b77fe555 Mon Sep 17 00:00:00 2001 From: jakevin Date: Fri, 30 Jun 2023 20:29:48 +0800 Subject: [PATCH] [fix](Nereids): reject infer distinct when children exist NLJ (#21391) --- .../rewrite/InferSetOperatorDistinct.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferSetOperatorDistinct.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferSetOperatorDistinct.java index c77edb2e17..8b9f46408f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferSetOperatorDistinct.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferSetOperatorDistinct.java @@ -22,6 +22,8 @@ import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.algebra.SetOperation.Qualifier; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; +import org.apache.doris.nereids.trees.plans.logical.LogicalJoin; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import com.google.common.collect.ImmutableList; @@ -41,7 +43,12 @@ public class InferSetOperatorDistinct extends OneRewriteRuleFactory { public Rule build() { return logicalSetOperation() .when(operation -> operation.getQualifier() == Qualifier.DISTINCT) + .when(operation -> operation.children().stream().allMatch(this::rejectNLJ)) .then(setOperation -> { + if (setOperation.children().stream().anyMatch(child -> child instanceof LogicalAggregate)) { + return null; + } + List newChildren = setOperation.children().stream() .map(child -> new LogicalAggregate<>(ImmutableList.copyOf(child.getOutput()), child)) .collect(ImmutableList.toImmutableList()); @@ -51,4 +58,16 @@ public class InferSetOperatorDistinct extends OneRewriteRuleFactory { return setOperation.withChildren(newChildren); }).toRule(RuleType.INFER_SET_OPERATOR_DISTINCT); } + + // if children exist NLJ, we can't infer distinct + private boolean rejectNLJ(Plan plan) { + if (plan instanceof LogicalProject) { + plan = plan.child(0); + } + if (plan instanceof LogicalJoin) { + LogicalJoin join = (LogicalJoin) plan; + return join.getOtherJoinConjuncts().isEmpty(); + } + return true; + } }