From 5af7e9df57d8e3a85af2e633cb3563244eb5ea1a Mon Sep 17 00:00:00 2001 From: morrySnow Date: Mon, 27 May 2024 18:05:54 +0800 Subject: [PATCH] [fix](Nereids) could not push down filter through cte producer sometimes when consumer side eliminate some consumers from plan, the size of consumers is wrong. so we cannot push down some filter in producer side. this PR fix this problem by update consumer set after rewrite outer side --- .../nereids/rules/rewrite/RewriteCteChildren.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/RewriteCteChildren.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/RewriteCteChildren.java index 3a2da623b4c4d0..11491bc5876249 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/RewriteCteChildren.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/RewriteCteChildren.java @@ -42,6 +42,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; import java.util.HashSet; import java.util.List; @@ -86,14 +87,18 @@ public Plan visitLogicalCTEAnchor(LogicalCTEAnchor { + Set cteConsumers = Sets.newHashSet(); + outer.foreach(p -> { if (p instanceof LogicalCTEConsumer) { LogicalCTEConsumer logicalCTEConsumer = (LogicalCTEConsumer) p; - return logicalCTEConsumer.getCteId().equals(cteAnchor.getCteId()); + if (logicalCTEConsumer.getCteId().equals(cteAnchor.getCteId())) { + cteConsumers.add(logicalCTEConsumer); + } } return false; }); - if (!reserveAnchor) { + cascadesContext.getCteIdToConsumers().put(cteAnchor.getCteId(), cteConsumers); + if (cteConsumers.isEmpty()) { return outer; } Plan producer = cteAnchor.child(0).accept(this, cascadesContext);