From f3ee6dd55a5e877a87fd6ee601de3dc0d1ddf4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E5=81=A5?= Date: Thu, 16 Nov 2023 10:30:28 +0800 Subject: [PATCH] [feature](Nereids): eliminate sort under subquery (#26993) --- .../doris/nereids/jobs/executor/Rewriter.java | 2 ++ .../rewrite/EliminateSortUnderSubquery.java | 33 +++++++++++++++++++ .../rules/rewrite/EliminateSortTest.java | 27 +++++++++++++-- .../group_concat/test_group_concat.groovy | 2 +- 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateSortUnderSubquery.java diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java index 1f314ce565..1b8b0d86f0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java @@ -62,6 +62,7 @@ import org.apache.doris.nereids.rules.rewrite.EliminateNotNull; import org.apache.doris.nereids.rules.rewrite.EliminateNullAwareLeftAntiJoin; import org.apache.doris.nereids.rules.rewrite.EliminateOrderByConstant; import org.apache.doris.nereids.rules.rewrite.EliminateSort; +import org.apache.doris.nereids.rules.rewrite.EliminateSortUnderSubquery; import org.apache.doris.nereids.rules.rewrite.EliminateUnnecessaryProject; import org.apache.doris.nereids.rules.rewrite.EnsureProjectOnTopJoin; import org.apache.doris.nereids.rules.rewrite.ExtractAndNormalizeWindowExpression; @@ -125,6 +126,7 @@ public class Rewriter extends AbstractBatchJobExecutor { topic("Plan Normalization", topDown( new EliminateOrderByConstant(), + new EliminateSortUnderSubquery(), new EliminateGroupByConstant(), // MergeProjects depends on this rule new LogicalSubQueryAliasToLogicalProject(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateSortUnderSubquery.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateSortUnderSubquery.java new file mode 100644 index 0000000000..298b632204 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/EliminateSortUnderSubquery.java @@ -0,0 +1,33 @@ +// 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. + +package org.apache.doris.nereids.rules.rewrite; + +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; + +/** + * SELECT * FROM lineorder ORDER BY 'f' -> SELECT * FROM lineorder + */ +public class EliminateSortUnderSubquery extends OneRewriteRuleFactory { + @Override + public Rule build() { + return logicalSubQueryAlias(logicalSort()) + .then(subq -> subq.withChildren(subq.child().child(0))) + .toRule(RuleType.ELIMINATE_ORDER_BY_CONSTANT); + } +} diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java index fc88287d10..cc039cbabb 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateSortTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test; /** * column prune ut. */ -public class EliminateSortTest extends TestWithFeService implements MemoPatternMatchSupported { +class EliminateSortTest extends TestWithFeService implements MemoPatternMatchSupported { @Override protected void runBeforeAll() throws Exception { createDatabase("test"); @@ -37,7 +37,7 @@ public class EliminateSortTest extends TestWithFeService implements MemoPatternM } @Test - public void test() { + void test() { PlanChecker.from(connectContext) .analyze("select * from student order by id") .rewrite() @@ -47,4 +47,27 @@ public class EliminateSortTest extends TestWithFeService implements MemoPatternM .rewrite() .nonMatch(logicalSort()); } + + @Test + void testSortLimit() { + PlanChecker.from(connectContext) + .analyze("select count(*) from (select * from student order by id) t limit 1") + .rewrite() + .nonMatch(logicalTopN()); + PlanChecker.from(connectContext) + .analyze("select count(*) from (select * from student order by id limit 1) t") + .rewrite() + .matches(logicalTopN()); + + PlanChecker.from(connectContext) + .analyze("select count(*) from " + + "(select * from student order by id limit 1) t1 left join student t2 on t1.id = t2.id") + .rewrite() + .matches(logicalTopN()); + PlanChecker.from(connectContext) + .analyze("select count(*) from " + + "(select * from student order by id) t1 left join student t2 on t1.id = t2.id limit 1") + .rewrite() + .nonMatch(logicalTopN()); + } } diff --git a/regression-test/suites/nereids_p0/group_concat/test_group_concat.groovy b/regression-test/suites/nereids_p0/group_concat/test_group_concat.groovy index a570ac3da1..ecb4126afa 100644 --- a/regression-test/suites/nereids_p0/group_concat/test_group_concat.groovy +++ b/regression-test/suites/nereids_p0/group_concat/test_group_concat.groovy @@ -115,7 +115,7 @@ suite("test_group_concat") { """ sql """create view if not exists test_view as SELECT b1, group_concat(cast(abs(b3) as varchar) order by abs(b2) desc, b3 desc) FROM table_group_concat group by b1 order by b1;""" - qt_select_group_concat_order_by_desc4 """ + order_qt_select_group_concat_order_by_desc4 """ select * from test_view; """ sql """drop view if exists test_view"""