diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java index bae21640a423f5..e291a66e980c87 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownFilterThroughGenerate.java @@ -19,8 +19,17 @@ import org.apache.doris.nereids.rules.Rule; import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalGenerate; +import org.apache.doris.nereids.util.PlanUtils; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; + +import java.util.Set; /** * Push the predicate down through generate. @@ -35,11 +44,23 @@ public class PushdownFilterThroughGenerate extends OneRewriteRuleFactory { public Rule build() { return logicalFilter(logicalGenerate()).then(filter -> { LogicalGenerate generate = filter.child(); - if (generate.child().getOutputSet().containsAll(filter.getInputSlots())) { - return generate.withChildren(filter.withChildren(generate.children())); - } else { + Set childOutputs = generate.child().getOutputSet(); + Set pushDownPredicates = Sets.newLinkedHashSet(); + Set remainPredicates = Sets.newLinkedHashSet(); + filter.getConjuncts().forEach(conjunct -> { + Set conjunctSlots = conjunct.getInputSlots(); + if (!conjunctSlots.isEmpty() && childOutputs.containsAll(conjunctSlots)) { + pushDownPredicates.add(conjunct); + } else { + remainPredicates.add(conjunct); + } + }); + if (pushDownPredicates.isEmpty()) { return null; } + Plan bottomFilter = new LogicalFilter<>(pushDownPredicates, generate.child(0)); + generate = generate.withChildren(ImmutableList.of(bottomFilter)); + return PlanUtils.filterOrSelf(remainPredicates, generate); }).toRule(RuleType.PUSH_DOWN_FILTER_THROUGH_GENERATE); } } diff --git a/regression-test/suites/nereids_syntax_p0/lateral_view.groovy b/regression-test/suites/nereids_syntax_p0/lateral_view.groovy index f8a3ab42aa897e..1d3bbe037727df 100644 --- a/regression-test/suites/nereids_syntax_p0/lateral_view.groovy +++ b/regression-test/suites/nereids_syntax_p0/lateral_view.groovy @@ -98,4 +98,10 @@ suite("nereids_lateral_view") { sql """ insert into test_explode_bitmap values(2, '22', bitmap_from_string("22,33,44"));""" qt_sql_explode_bitmap """ select dt, e1 from test_explode_bitmap lateral view explode_bitmap(user_id) tmp1 as e1 order by dt, e1;""" + explain { + sql("SELECT * FROM nlv_test LATERAL VIEW explode_numbers(c1) lv1 AS clv1 where c1 < 10 and clv1 > 0;") + contains("PREDICATES: c1") + contains("PREDICATES: clv1") + } + }