From e1214f14b49229947ca43ad7cafdf80afad56248 Mon Sep 17 00:00:00 2001 From: minghong Date: Fri, 6 Sep 2024 16:36:01 +0800 Subject: [PATCH] when table.rows > topn.limit+topn.offset, do not generate topn-filter --- .../post/TopnFilterPushDownVisitor.java | 6 ++- .../nereids_tpch_p0/tpch/topn_filter.groovy | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 regression-test/suites/nereids_tpch_p0/tpch/topn_filter.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TopnFilterPushDownVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TopnFilterPushDownVisitor.java index a6ec5a70353c96a..95cdbd9cc96af0b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TopnFilterPushDownVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/TopnFilterPushDownVisitor.java @@ -218,8 +218,10 @@ public Boolean visitPhysicalNestedLoopJoin(PhysicalNestedLoopJoin ctx.topn.getLimit() + ctx.topn.getOffset()) { + topnFilterContext.addTopnFilter(ctx.topn, relation, ctx.probeExpr); + return true; + } } return false; } diff --git a/regression-test/suites/nereids_tpch_p0/tpch/topn_filter.groovy b/regression-test/suites/nereids_tpch_p0/tpch/topn_filter.groovy new file mode 100644 index 000000000000000..cb752332cd51fce --- /dev/null +++ b/regression-test/suites/nereids_tpch_p0/tpch/topn_filter.groovy @@ -0,0 +1,40 @@ +/* + * 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("topn_filter") { + String db = context.config.getDbNameByFile(new File(context.file.parent)) + sql "use ${db}" + sql "set topn_opt_limit_threshold=1024" + sql "analyze table nation with sync" + // limit + offset > table.rows, do not generate topn filter + explain{ + sql "select * from nation order by n_nationkey limit 40;" + notContains ("TOPN OPT:") + } + explain{ + sql "select * from nation order by n_nationkey limit 4 offset 21;" + notContains ("TOPN OPT:") + } + + explain{ + sql "select * from nation order by n_nationkey limit 4 offset 20;" + contains ("TOPN OPT:1") + } + +} \ No newline at end of file