You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/10/17 11:57:22 UTC
[doris] 04/04: [fix](Nereids) non-slot filter should not be push through aggregate (#25525)
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 1016ed2f2ec04ba69ad42690e8829ca88a97f319
Author: morrySnow <10...@users.noreply.github.com>
AuthorDate: Tue Oct 17 18:02:26 2023 +0800
[fix](Nereids) non-slot filter should not be push through aggregate (#25525)
---
.../rewrite/PushdownFilterThroughAggregation.java | 8 ++--
.../filter_push_through_aggregate.out | 3 ++
.../filter_push_through_aggregate.groovy | 43 ++++++++++++++++++++++
3 files changed, 51 insertions(+), 3 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java
index 217834c4bdc..45fa1c645b2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughAggregation.java
@@ -26,6 +26,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
import org.apache.doris.nereids.util.PlanUtils;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import java.util.HashSet;
@@ -63,17 +64,18 @@ public class PushdownFilterThroughAggregation extends OneRewriteRuleFactory {
Set<Expression> filterPredicates = Sets.newHashSet();
filter.getConjuncts().forEach(conjunct -> {
Set<Slot> conjunctSlots = conjunct.getInputSlots();
- if (canPushDownSlots.containsAll(conjunctSlots)) {
+ // NOTICE: filter not contain slot should not be pushed. e.g. 'a' = 'b'
+ if (!conjunctSlots.isEmpty() && canPushDownSlots.containsAll(conjunctSlots)) {
pushDownPredicates.add(conjunct);
} else {
filterPredicates.add(conjunct);
}
});
- if (pushDownPredicates.size() == 0) {
+ if (pushDownPredicates.isEmpty()) {
return null;
}
Plan bottomFilter = new LogicalFilter<>(pushDownPredicates, aggregate.child(0));
- aggregate = (LogicalAggregate<Plan>) aggregate.withChildren(bottomFilter);
+ aggregate = aggregate.withChildren(ImmutableList.of(bottomFilter));
return PlanUtils.filterOrSelf(filterPredicates, aggregate);
}).toRule(RuleType.PUSHDOWN_PREDICATE_THROUGH_AGGREGATION);
}
diff --git a/regression-test/data/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.out b/regression-test/data/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.out
new file mode 100644
index 00000000000..816c5d8a9ca
--- /dev/null
+++ b/regression-test/data/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.out
@@ -0,0 +1,3 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !do_not_push_no_slot_filter --
+
diff --git a/regression-test/suites/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.groovy b/regression-test/suites/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.groovy
new file mode 100644
index 00000000000..dfb65dd2466
--- /dev/null
+++ b/regression-test/suites/nereids_rules_p0/filter_push_down/filter_push_through_aggregate.groovy
@@ -0,0 +1,43 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("filter_push_through_aggregate") {
+ sql "SET enable_nereids_planner=true"
+ sql "SET enable_fallback_to_original_planner=false"
+
+ sql """
+ DROP TABLE IF EXISTS filter_push_through_aggregate
+ """
+ sql """
+ CREATE TABLE IF NOT EXISTS filter_push_through_aggregate(
+ `id` int(11) NULL,
+ `msg` text NULL
+ ) ENGINE = OLAP
+ DISTRIBUTED BY HASH(id) BUCKETS 4
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+ """
+
+ sql "set disable_nereids_rules='REWRITE_FILTER_EXPRESSION'"
+
+ // 'a' = 'b' should not be push down aggregate.
+ qt_do_not_push_no_slot_filter """
+ select * from (select 'a' a, sum(1) from filter_push_through_aggregate) t where a = 'b';
+ """
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org