From fab48f54b1f82ff34e317b4ab586241039b9c756 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:08:06 +0800 Subject: [PATCH] [enhancement](nereids)simplify OneRowRelation scalar subquery (#32276) select count() from t where dt > (select '2024-02-02 00:00:00'); --> select count() from t where dt > '2024-02-02 00:00:00'; --- .../nereids/rules/analysis/SubExprAnalyzer.java | 17 +++++++++++++++++ .../nereids_p0/subquery/test_subquery.groovy | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java index 047b0efbd2..c3c17c7834 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/SubExprAnalyzer.java @@ -20,6 +20,7 @@ package org.apache.doris.nereids.rules.analysis; import org.apache.doris.nereids.CascadesContext; import org.apache.doris.nereids.analyzer.Scope; import org.apache.doris.nereids.exceptions.AnalysisException; +import org.apache.doris.nereids.trees.expressions.Alias; import org.apache.doris.nereids.trees.expressions.Exists; import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.InSubquery; @@ -33,7 +34,9 @@ import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewri import org.apache.doris.nereids.trees.plans.Plan; import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate; import org.apache.doris.nereids.trees.plans.logical.LogicalLimit; +import org.apache.doris.nereids.trees.plans.logical.LogicalOneRowRelation; import org.apache.doris.nereids.trees.plans.logical.LogicalPlan; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -106,6 +109,20 @@ class SubExprAnalyzer extends DefaultExpressionRewriter { checkHasAgg(analyzedResult); checkHasNoGroupBy(analyzedResult); + // if scalar subquery is like select '2024-02-02 00:00:00' + // we can just return the constant expr '2024-02-02 00:00:00' + if (analyzedResult.getLogicalPlan() instanceof LogicalProject) { + LogicalProject project = (LogicalProject) analyzedResult.getLogicalPlan(); + if (project.child() instanceof LogicalOneRowRelation + && project.getProjects().size() == 1 + && project.getProjects().get(0) instanceof Alias) { + Alias alias = (Alias) project.getProjects().get(0); + if (alias.isConstant()) { + return alias.child(); + } + } + } + return new ScalarSubquery(analyzedResult.getLogicalPlan(), analyzedResult.getCorrelatedSlots()); } diff --git a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy index 6e29d2205c..45825a0acb 100644 --- a/regression-test/suites/nereids_p0/subquery/test_subquery.groovy +++ b/regression-test/suites/nereids_p0/subquery/test_subquery.groovy @@ -275,4 +275,20 @@ suite("test_subquery") { qt_select_assert_num_row """SELECT * FROM table_100_undef_partitions2_keys3_properties4_distributed_by5 AS t1 WHERE t1.`pk` IN (0, 6, 8, 9, 5) OR t1.`pk` - 0 < (SELECT `pk` FROM table_5_undef_partitions2_keys3_properties4_distributed_by5 AS t2 WHERE t2.pk = 9) order by t1.pk;""" sql """drop table if exists table_100_undef_partitions2_keys3_properties4_distributed_by5""" sql """drop table if exists table_5_undef_partitions2_keys3_properties4_distributed_by5""" + + sql """drop table if exists scalar_subquery_t""" + sql """create table scalar_subquery_t (id int , name varchar(32), dt datetime) + partition by range(dt) (from ('2024-02-01 00:00:00') to ('2024-02-07 00:00:00') interval 1 day) + distributed by hash(id) buckets 1 + properties ("replication_num"="1");""" + sql """insert into scalar_subquery_t values (1, 'Tom', '2024-02-01 23:12:42'), (2, 'Jelly', '2024-02-02 13:53:32'), (3, 'Kat', '2024-02-03 06:42:21');""" + explain { + sql("""select count(*) from scalar_subquery_t where dt > (select '2024-02-02 00:00:00');""") + contains("partitions=2/") + } + explain { + sql("""select count(*) from scalar_subquery_t where dt > (select '2024-02-02 00:00:00' from scalar_subquery_t);""") + contains("partitions=3/") + } + sql """drop table if exists scalar_subquery_t""" }