From 6798a24a27c16f9ec0c3f080eef4b65adf099ee1 Mon Sep 17 00:00:00 2001 From: LiBinfeng <46676950+LiBinfeng-01@users.noreply.github.com> Date: Wed, 3 Apr 2024 12:23:41 +0800 Subject: [PATCH] [Enhencement](Nereids) reduce child output rows if agg child is literal (#32188) with group by: select max(1) from t1 group by c1; -> select 1 from (select c1 from t1 group by c1); without group by: select max(1) from t1; -> select max(1) from (select 1 from t1 limit 1) tmp; --- .../doris/nereids/jobs/executor/Rewriter.java | 2 + .../apache/doris/nereids/rules/RuleType.java | 1 + .../ReduceAggregateChildOutputRows.java | 89 ++ .../eliminate_aggregate_constant.out | 993 ++++++++++++++++++ .../eliminate_aggregate_constant.groovy | 285 +++++ 5 files changed, 1370 insertions(+) create mode 100644 fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReduceAggregateChildOutputRows.java create mode 100644 regression-test/data/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.out create mode 100644 regression-test/suites/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.groovy 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 a68c751096..e822352436 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 @@ -117,6 +117,7 @@ import org.apache.doris.nereids.rules.rewrite.PushFilterInsideJoin; import org.apache.doris.nereids.rules.rewrite.PushProjectIntoOneRowRelation; import org.apache.doris.nereids.rules.rewrite.PushProjectIntoUnion; import org.apache.doris.nereids.rules.rewrite.PushProjectThroughUnion; +import org.apache.doris.nereids.rules.rewrite.ReduceAggregateChildOutputRows; import org.apache.doris.nereids.rules.rewrite.ReorderJoin; import org.apache.doris.nereids.rules.rewrite.RewriteCteChildren; import org.apache.doris.nereids.rules.rewrite.SplitLimit; @@ -203,6 +204,7 @@ public class Rewriter extends AbstractBatchJobExecutor { new EliminateLimit(), new EliminateFilter(), new EliminateAggregate(), + new ReduceAggregateChildOutputRows(), new EliminateJoinCondition(), new EliminateAssertNumRows(), new EliminateSemiJoin() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java index aa38af04ec..3a43e1ad67 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/RuleType.java @@ -239,6 +239,7 @@ public enum RuleType { MATERIALIZED_INDEX_PROJECT_SCAN(RuleTypeClass.REWRITE), MATERIALIZED_INDEX_PROJECT_FILTER_SCAN(RuleTypeClass.REWRITE), MATERIALIZED_INDEX_FILTER_PROJECT_SCAN(RuleTypeClass.REWRITE), + REDUCE_AGGREGATE_CHILD_OUTPUT_ROWS(RuleTypeClass.REWRITE), OLAP_SCAN_PARTITION_PRUNE(RuleTypeClass.REWRITE), diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReduceAggregateChildOutputRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReduceAggregateChildOutputRows.java new file mode 100644 index 0000000000..94109879e2 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReduceAggregateChildOutputRows.java @@ -0,0 +1,89 @@ +// 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.exceptions.AnalysisException; +import org.apache.doris.nereids.rules.Rule; +import org.apache.doris.nereids.rules.RuleType; +import org.apache.doris.nereids.trees.expressions.Alias; +import org.apache.doris.nereids.trees.expressions.Expression; +import org.apache.doris.nereids.trees.expressions.NamedExpression; +import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction; +import org.apache.doris.nereids.trees.expressions.functions.agg.Max; +import org.apache.doris.nereids.trees.expressions.functions.agg.Min; +import org.apache.doris.nereids.trees.plans.LimitPhase; +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.LogicalProject; + +import com.google.common.collect.ImmutableList; + +import java.util.Set; + +/** ReduceAggregateChildOutputRows + * with group by: + * select max(1) from t1 group by c1; -> select 1 from (select c1 from t1 group by c1); + * without group by: + * select max(1) from t1; -> select max(1) from (select 1 from t1 limit 1) tmp; + * */ +public class ReduceAggregateChildOutputRows extends OneRewriteRuleFactory { + @Override + public Rule build() { + return logicalAggregate().then(agg -> { + Set aggFunctions = agg.getAggregateFunctions(); + // check whether we have aggregate(constant) in all aggregateFunctions + if (!(agg.child() instanceof LogicalLimit && ((LogicalLimit) agg.child()).getLimit() == 1) + || aggFunctions.isEmpty() || !aggFunctions.stream().allMatch( + f -> (f instanceof Min || f instanceof Max) + && (f.arity() == 1 && f.child(0).isConstant()))) { + return null; + } + + ImmutableList.Builder newOutput = ImmutableList.builder(); + for (int i = 0; i < agg.getOutputExpressions().size(); i++) { + NamedExpression expr = agg.getOutputExpressions().get(i); + if (expr instanceof Alias && expr.child(0) instanceof AggregateFunction) { + AggregateFunction f = (AggregateFunction) expr.child(0); + if (f instanceof Min || f instanceof Max) { + newOutput.add(new Alias(expr.getExprId(), f.child(0), expr.getName())); + } else { + throw new AnalysisException("Unexpected aggregate function: " + f); + } + } else { + newOutput.add(expr); + } + } + + if (agg.getGroupByExpressions().isEmpty()) { + LogicalAggregate newAgg = new LogicalAggregate<>(agg.getGroupByExpressions(), + agg.getOutputExpressions(), new LogicalLimit(1, 0, LimitPhase.ORIGIN, + new LogicalProject<>(newOutput.build(), agg.child()))); + return newAgg; + } else { + ImmutableList.Builder childOutput = + ImmutableList.builderWithExpectedSize(agg.getGroupByExpressions().size()); + for (Expression expr : agg.getGroupByExpressions()) { + childOutput.add((NamedExpression) expr); + } + return new LogicalProject<>(newOutput.build(), + new LogicalAggregate<>(agg.getGroupByExpressions(), childOutput.build(), agg.child())); + } + }).toRule(RuleType.REDUCE_AGGREGATE_CHILD_OUTPUT_ROWS); + } + +} diff --git a/regression-test/data/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.out b/regression-test/data/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.out new file mode 100644 index 0000000000..c0d8526bc6 --- /dev/null +++ b/regression-test/data/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.out @@ -0,0 +1,993 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !basic_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_4 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_6 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_8 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_2_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_4 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_6 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_2_8 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_3_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_4 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_6 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_3_8 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_4_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_2 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_4 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_6 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_4_8 -- +PhysicalResultSink +--hashAgg[GLOBAL] +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_add_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_add_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !basic_add_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_add_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !basic_add_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_add_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !basic_add_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !basic_add_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !basic_add_2_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_add_2_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !basic_add_2_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_add_2_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !basic_add_2_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_add_2_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !basic_add_2_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !basic_add_2_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !basic_add_3_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_add_3_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !basic_add_3_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_add_3_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !basic_add_3_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_add_3_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !basic_add_3_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !basic_add_3_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !basic_add_4_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_add_4_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !basic_add_4_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_add_4_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !basic_add_4_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_add_4_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !basic_add_4_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !basic_add_4_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !add_sum_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !add_sum_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !add_sum_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !add_sum_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !add_sum_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !add_sum_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !add_sum_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t1] + +-- !add_sum_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t1] + +-- !add_sum_2_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !add_sum_2_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !add_sum_2_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !add_sum_2_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !add_sum_2_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !add_sum_2_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !add_sum_2_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t2] + +-- !add_sum_2_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t2] + +-- !add_sum_3_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !add_sum_3_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !add_sum_3_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !add_sum_3_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !add_sum_3_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !add_sum_3_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !add_sum_3_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t3] + +-- !add_sum_3_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t3] + +-- !add_sum_4_1 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !add_sum_4_2 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !add_sum_4_3 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !add_sum_4_4 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !add_sum_4_5 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !add_sum_4_6 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !add_sum_4_7 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[LOCAL] +------PhysicalProject +--------PhysicalOlapScan[t4] + +-- !add_sum_4_8 -- +PhysicalResultSink +--PhysicalProject +----hashAgg[GLOBAL] +------hashAgg[LOCAL] +--------PhysicalProject +----------PhysicalOlapScan[t4] + +-- !basic_1 -- +1 + +-- !basic_2 -- +1 + +-- !basic_3 -- +1 + +-- !basic_4 -- +1 + +-- !basic_5 -- +1 + +-- !basic_6 -- +1 + +-- !basic_7 -- +1.0 + +-- !basic_8 -- +1.0 + +-- !basic_2_1 -- +1 + +-- !basic_2_2 -- +1 + +-- !basic_2_3 -- +1 + +-- !basic_2_4 -- +1 + +-- !basic_2_5 -- +1 + +-- !basic_2_6 -- +1 + +-- !basic_2_7 -- +1.0 + +-- !basic_2_8 -- +1.0 + +-- !basic_3_1 -- + +-- !basic_3_2 -- +\N + +-- !basic_3_3 -- + +-- !basic_3_4 -- +\N + +-- !basic_3_5 -- + +-- !basic_3_6 -- +\N + +-- !basic_3_7 -- + +-- !basic_3_8 -- +\N + +-- !basic_4_1 -- +1 +1 + +-- !basic_4_2 -- +1 + +-- !basic_4_3 -- +1 +1 + +-- !basic_4_4 -- +1 + +-- !basic_4_5 -- +1 +1 + +-- !basic_4_6 -- +2 + +-- !basic_4_7 -- +1.0 +1.0 + +-- !basic_4_8 -- +1.0 + +-- !basic_add_1 -- +2 + +-- !basic_add_2 -- +2 + +-- !basic_add_3 -- +2 + +-- !basic_add_4 -- +2 + +-- !basic_add_5 -- +2 + +-- !basic_add_6 -- +2 + +-- !basic_add_7 -- +2.0 + +-- !basic_add_8 -- +2.0 + +-- !basic_add_2_1 -- +2 + +-- !basic_add_2_2 -- +2 + +-- !basic_add_2_3 -- +2 + +-- !basic_add_2_4 -- +2 + +-- !basic_add_2_5 -- +2 + +-- !basic_add_2_6 -- +2 + +-- !basic_add_2_7 -- +2.0 + +-- !basic_add_2_8 -- +2.0 + +-- !basic_add_3_1 -- + +-- !basic_add_3_2 -- +\N + +-- !basic_add_3_3 -- + +-- !basic_add_3_4 -- +\N + +-- !basic_add_3_5 -- + +-- !basic_add_3_6 -- +\N + +-- !basic_add_3_7 -- + +-- !basic_add_3_8 -- +\N + +-- !basic_add_4_1 -- +2 +2 + +-- !basic_add_4_2 -- +2 + +-- !basic_add_4_3 -- +2 +2 + +-- !basic_add_4_4 -- +2 + +-- !basic_add_4_5 -- +2 +2 + +-- !basic_add_4_6 -- +3 + +-- !basic_add_4_7 -- +2.0 +2.0 + +-- !basic_add_4_8 -- +2.0 + +-- !add_sum_1 -- +3 + +-- !add_sum_2 -- +3 + +-- !add_sum_3 -- +3 + +-- !add_sum_4 -- +3 + +-- !add_sum_5 -- +3 + +-- !add_sum_6 -- +3 + +-- !add_sum_7 -- +3.0 + +-- !add_sum_8 -- +3.0 + +-- !add_sum_2_1 -- +3 + +-- !add_sum_2_2 -- +3 + +-- !add_sum_2_3 -- +3 + +-- !add_sum_2_4 -- +3 + +-- !add_sum_2_5 -- +3 + +-- !add_sum_2_6 -- +3 + +-- !add_sum_2_7 -- +3.0 + +-- !add_sum_2_8 -- +3.0 + +-- !add_sum_3_1 -- + +-- !add_sum_3_2 -- +\N + +-- !add_sum_3_3 -- + +-- !add_sum_3_4 -- +\N + +-- !add_sum_3_5 -- + +-- !add_sum_3_6 -- +\N + +-- !add_sum_3_7 -- + +-- !add_sum_3_8 -- +\N + +-- !add_sum_4_1 -- +3 +3 + +-- !add_sum_4_2 -- +5 + +-- !add_sum_4_3 -- +3 +3 + +-- !add_sum_4_4 -- +5 + +-- !add_sum_4_5 -- +3 +3 + +-- !add_sum_4_6 -- +6 + +-- !add_sum_4_7 -- +3.0 +3.0 + +-- !add_sum_4_8 -- +5.0 + diff --git a/regression-test/suites/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.groovy b/regression-test/suites/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.groovy new file mode 100644 index 0000000000..e22b408700 --- /dev/null +++ b/regression-test/suites/nereids_rules_p0/eliminate_aggregate_constant/eliminate_aggregate_constant.groovy @@ -0,0 +1,285 @@ +// 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("eliminate_aggregate_constant") { + sql "SET enable_nereids_planner=true" + sql "set runtime_filter_mode=OFF" + sql "SET enable_fallback_to_original_planner=false" + sql "SET ignore_shape_nodes='PhysicalDistribute'" + sql 'DROP DATABASE IF EXISTS test_aggregate_constant' + sql 'CREATE DATABASE IF NOT EXISTS test_aggregate_constant' + sql 'use test_aggregate_constant' + + // create tables + sql """drop table if exists t1;""" + sql """drop table if exists t2;""" + sql """drop table if exists t3;""" + sql """drop table if exists t4;""" + + sql """create table t1 (c1 int, c11 int) distributed by hash(c1) buckets 3 properties('replication_num' = '1');""" + sql """create table t2 (c2 int, c22 int) distributed by hash(c2) buckets 3 properties('replication_num' = '1');""" + sql """create table t3 (c3 int, c33 int) distributed by hash(c3) buckets 3 properties('replication_num' = '1');""" + sql """create table t4 (c4 int, c44 int) distributed by hash(c4) buckets 3 properties('replication_num' = '1');""" + + sql "insert into t1 values (101, 101)" + sql "insert into t2 values (null, null)" + sql "insert into t4 values (102, 102)" + sql "insert into t4 values (103, 103)" + + /* ******** with one row ******** */ + qt_basic_1 """explain shape plan select max(1) from t1 group by c1;""" + qt_basic_2 """explain shape plan select max(1) from t1;""" + qt_basic_3 """explain shape plan select min(1) from t1 group by c1;""" + qt_basic_4 """explain shape plan select min(1) from t1;""" + qt_basic_5 """explain shape plan select sum(1) from t1 group by c1;""" + qt_basic_6 """explain shape plan select sum(1) from t1;""" + qt_basic_7 """explain shape plan select avg(1) from t1 group by c1;""" + qt_basic_8 """explain shape plan select avg(1) from t1;""" + + /* ******** with one row "null" ******** */ + qt_basic_2_1 """explain shape plan select max(1) from t2 group by c2;""" + qt_basic_2_2 """explain shape plan select max(1) from t2;""" + qt_basic_2_3 """explain shape plan select min(1) from t2 group by c2;""" + qt_basic_2_4 """explain shape plan select min(1) from t2;""" + qt_basic_2_5 """explain shape plan select sum(1) from t2 group by c2;""" + qt_basic_2_6 """explain shape plan select sum(1) from t2;""" + qt_basic_2_7 """explain shape plan select avg(1) from t2 group by c2;""" + qt_basic_2_8 """explain shape plan select avg(1) from t2;""" + + /* ******** with empty table ******** */ + qt_basic_3_1 """explain shape plan select max(1) from t3 group by c3;""" + qt_basic_3_2 """explain shape plan select max(1) from t3;""" + qt_basic_3_3 """explain shape plan select min(1) from t3 group by c3;""" + qt_basic_3_4 """explain shape plan select min(1) from t3;""" + qt_basic_3_5 """explain shape plan select sum(1) from t3 group by c3;""" + qt_basic_3_6 """explain shape plan select sum(1) from t3;""" + qt_basic_3_7 """explain shape plan select avg(1) from t3 group by c3;""" + qt_basic_3_8 """explain shape plan select avg(1) from t3;""" + + /* ******** with different group table ******** */ + qt_basic_4_1 """explain shape plan select max(1) from t4 group by c4;""" + qt_basic_4_2 """explain shape plan select max(1) from t4;""" + qt_basic_4_3 """explain shape plan select min(1) from t4 group by c4;""" + qt_basic_4_4 """explain shape plan select min(1) from t4;""" + qt_basic_4_5 """explain shape plan select sum(1) from t4 group by c4;""" + qt_basic_4_6 """explain shape plan select sum(1) from t4;""" + qt_basic_4_7 """explain shape plan select avg(1) from t4 group by c4;""" + qt_basic_4_8 """explain shape plan select avg(1) from t4;""" + + /* ******** with one row ******** */ + qt_basic_add_1 """explain shape plan select max(1) + 1 from t1 group by c1;""" + qt_basic_add_2 """explain shape plan select max(1) + 1 from t1;""" + qt_basic_add_3 """explain shape plan select min(1) + 1 from t1 group by c1;""" + qt_basic_add_4 """explain shape plan select min(1) + 1 from t1;""" + qt_basic_add_5 """explain shape plan select sum(1) + 1 from t1 group by c1;""" + qt_basic_add_6 """explain shape plan select sum(1) + 1 from t1;""" + qt_basic_add_7 """explain shape plan select avg(1) + 1 from t1 group by c1;""" + qt_basic_add_8 """explain shape plan select avg(1) + 1 from t1;""" + + /* ******** with one row "null" ******** */ + qt_basic_add_2_1 """explain shape plan select max(1) + 1 from t2 group by c2;""" + qt_basic_add_2_2 """explain shape plan select max(1) + 1 from t2;""" + qt_basic_add_2_3 """explain shape plan select min(1) + 1 from t2 group by c2;""" + qt_basic_add_2_4 """explain shape plan select min(1) + 1 from t2;""" + qt_basic_add_2_5 """explain shape plan select sum(1) + 1 from t2 group by c2;""" + qt_basic_add_2_6 """explain shape plan select sum(1) + 1 from t2;""" + qt_basic_add_2_7 """explain shape plan select avg(1) + 1 from t2 group by c2;""" + qt_basic_add_2_8 """explain shape plan select avg(1) + 1 from t2;""" + + /* ******** with empty table ******** */ + qt_basic_add_3_1 """explain shape plan select max(1) + 1 from t3 group by c3;""" + qt_basic_add_3_2 """explain shape plan select max(1) + 1 from t3;""" + qt_basic_add_3_3 """explain shape plan select min(1) + 1 from t3 group by c3;""" + qt_basic_add_3_4 """explain shape plan select min(1) + 1 from t3;""" + qt_basic_add_3_5 """explain shape plan select sum(1) + 1 from t3 group by c3;""" + qt_basic_add_3_6 """explain shape plan select sum(1) + 1 from t3;""" + qt_basic_add_3_7 """explain shape plan select avg(1) + 1 from t3 group by c3;""" + qt_basic_add_3_8 """explain shape plan select avg(1) + 1 from t3;""" + + /* ******** with different group table ******** */ + qt_basic_add_4_1 """explain shape plan select max(1) + 1 from t4 group by c4;""" + qt_basic_add_4_2 """explain shape plan select max(1) + 1 from t4;""" + qt_basic_add_4_3 """explain shape plan select min(1) + 1 from t4 group by c4;""" + qt_basic_add_4_4 """explain shape plan select min(1) + 1 from t4;""" + qt_basic_add_4_5 """explain shape plan select sum(1) + 1 from t4 group by c4;""" + qt_basic_add_4_6 """explain shape plan select sum(1) + 1 from t4;""" + qt_basic_add_4_7 """explain shape plan select avg(1) + 1 from t4 group by c4;""" + qt_basic_add_4_8 """explain shape plan select avg(1) + 1 from t4;""" + + /* ******** with one row ******** */ + qt_add_sum_1 """explain shape plan select max(1) + sum(2) from t1 group by c1;""" + qt_add_sum_2 """explain shape plan select max(1) + sum(2) from t1;""" + qt_add_sum_3 """explain shape plan select min(1) + sum(2) from t1 group by c1;""" + qt_add_sum_4 """explain shape plan select min(1) + sum(2) from t1;""" + qt_add_sum_5 """explain shape plan select sum(1) + sum(2) from t1 group by c1;""" + qt_add_sum_6 """explain shape plan select sum(1) + sum(2) from t1;""" + qt_add_sum_7 """explain shape plan select avg(1) + sum(2) from t1 group by c1;""" + qt_add_sum_8 """explain shape plan select avg(1) + sum(2) from t1;""" + + /* ******** with one row "null" ******** */ + qt_add_sum_2_1 """explain shape plan select max(1) + sum(2) from t2 group by c2;""" + qt_add_sum_2_2 """explain shape plan select max(1) + sum(2) from t2;""" + qt_add_sum_2_3 """explain shape plan select min(1) + sum(2) from t2 group by c2;""" + qt_add_sum_2_4 """explain shape plan select min(1) + sum(2) from t2;""" + qt_add_sum_2_5 """explain shape plan select sum(1) + sum(2) from t2 group by c2;""" + qt_add_sum_2_6 """explain shape plan select sum(1) + sum(2) from t2;""" + qt_add_sum_2_7 """explain shape plan select avg(1) + sum(2) from t2 group by c2;""" + qt_add_sum_2_8 """explain shape plan select avg(1) + sum(2) from t2;""" + + /* ******** with empty table ******** */ + qt_add_sum_3_1 """explain shape plan select max(1) + sum(2) from t3 group by c3;""" + qt_add_sum_3_2 """explain shape plan select max(1) + sum(2) from t3;""" + qt_add_sum_3_3 """explain shape plan select min(1) + sum(2) from t3 group by c3;""" + qt_add_sum_3_4 """explain shape plan select min(1) + sum(2) from t3;""" + qt_add_sum_3_5 """explain shape plan select sum(1) + sum(2) from t3 group by c3;""" + qt_add_sum_3_6 """explain shape plan select sum(1) + sum(2) from t3;""" + qt_add_sum_3_7 """explain shape plan select avg(1) + sum(2) from t3 group by c3;""" + qt_add_sum_3_8 """explain shape plan select avg(1) + sum(2) from t3;""" + + /* ******** with different group table ******** */ + qt_add_sum_4_1 """explain shape plan select max(1) + sum(2) from t4 group by c4;""" + qt_add_sum_4_2 """explain shape plan select max(1) + sum(2) from t4;""" + qt_add_sum_4_3 """explain shape plan select min(1) + sum(2) from t4 group by c4;""" + qt_add_sum_4_4 """explain shape plan select min(1) + sum(2) from t4;""" + qt_add_sum_4_5 """explain shape plan select sum(1) + sum(2) from t4 group by c4;""" + qt_add_sum_4_6 """explain shape plan select sum(1) + sum(2) from t4;""" + qt_add_sum_4_7 """explain shape plan select avg(1) + sum(2) from t4 group by c4;""" + qt_add_sum_4_8 """explain shape plan select avg(1) + sum(2) from t4;""" + + + /* ******** Output ******** */ + + /* ******** with one row ******** */ + order_qt_basic_1 """select max(1) from t1 group by c1;""" + order_qt_basic_2 """select max(1) from t1;""" + order_qt_basic_3 """select min(1) from t1 group by c1;""" + order_qt_basic_4 """select min(1) from t1;""" + order_qt_basic_5 """select sum(1) from t1 group by c1;""" + order_qt_basic_6 """select sum(1) from t1;""" + order_qt_basic_7 """select avg(1) from t1 group by c1;""" + order_qt_basic_8 """select avg(1) from t1;""" + + /* ******** with one row "null" ******** */ + order_qt_basic_2_1 """select max(1) from t2 group by c2;""" + order_qt_basic_2_2 """select max(1) from t2;""" + order_qt_basic_2_3 """select min(1) from t2 group by c2;""" + order_qt_basic_2_4 """select min(1) from t2;""" + order_qt_basic_2_5 """select sum(1) from t2 group by c2;""" + order_qt_basic_2_6 """select sum(1) from t2;""" + order_qt_basic_2_7 """select avg(1) from t2 group by c2;""" + order_qt_basic_2_8 """select avg(1) from t2;""" + + /* ******** with empty table ******** */ + order_qt_basic_3_1 """select max(1) from t3 group by c3;""" + order_qt_basic_3_2 """select max(1) from t3;""" + order_qt_basic_3_3 """select min(1) from t3 group by c3;""" + order_qt_basic_3_4 """select min(1) from t3;""" + order_qt_basic_3_5 """select sum(1) from t3 group by c3;""" + order_qt_basic_3_6 """select sum(1) from t3;""" + order_qt_basic_3_7 """select avg(1) from t3 group by c3;""" + order_qt_basic_3_8 """select avg(1) from t3;""" + + /* ******** with different group table ******** */ + order_qt_basic_4_1 """select max(1) from t4 group by c4;""" + order_qt_basic_4_2 """select max(1) from t4;""" + order_qt_basic_4_3 """select min(1) from t4 group by c4;""" + order_qt_basic_4_4 """select min(1) from t4;""" + order_qt_basic_4_5 """select sum(1) from t4 group by c4;""" + order_qt_basic_4_6 """select sum(1) from t4;""" + order_qt_basic_4_7 """select avg(1) from t4 group by c4;""" + order_qt_basic_4_8 """select avg(1) from t4;""" + + /* ******** with one row ******** */ + order_qt_basic_add_1 """select max(1) + 1 from t1 group by c1;""" + order_qt_basic_add_2 """select max(1) + 1 from t1;""" + order_qt_basic_add_3 """select min(1) + 1 from t1 group by c1;""" + order_qt_basic_add_4 """select min(1) + 1 from t1;""" + order_qt_basic_add_5 """select sum(1) + 1 from t1 group by c1;""" + order_qt_basic_add_6 """select sum(1) + 1 from t1;""" + order_qt_basic_add_7 """select avg(1) + 1 from t1 group by c1;""" + order_qt_basic_add_8 """select avg(1) + 1 from t1;""" + + /* ******** with one row "null" ******** */ + order_qt_basic_add_2_1 """select max(1) + 1 from t2 group by c2;""" + order_qt_basic_add_2_2 """select max(1) + 1 from t2;""" + order_qt_basic_add_2_3 """select min(1) + 1 from t2 group by c2;""" + order_qt_basic_add_2_4 """select min(1) + 1 from t2;""" + order_qt_basic_add_2_5 """select sum(1) + 1 from t2 group by c2;""" + order_qt_basic_add_2_6 """select sum(1) + 1 from t2;""" + order_qt_basic_add_2_7 """select avg(1) + 1 from t2 group by c2;""" + order_qt_basic_add_2_8 """select avg(1) + 1 from t2;""" + + /* ******** with empty table ******** */ + order_qt_basic_add_3_1 """select max(1) + 1 from t3 group by c3;""" + order_qt_basic_add_3_2 """select max(1) + 1 from t3;""" + order_qt_basic_add_3_3 """select min(1) + 1 from t3 group by c3;""" + order_qt_basic_add_3_4 """select min(1) + 1 from t3;""" + order_qt_basic_add_3_5 """select sum(1) + 1 from t3 group by c3;""" + order_qt_basic_add_3_6 """select sum(1) + 1 from t3;""" + order_qt_basic_add_3_7 """select avg(1) + 1 from t3 group by c3;""" + order_qt_basic_add_3_8 """select avg(1) + 1 from t3;""" + + /* ******** with different group table ******** */ + order_qt_basic_add_4_1 """select max(1) + 1 from t4 group by c4;""" + order_qt_basic_add_4_2 """select max(1) + 1 from t4;""" + order_qt_basic_add_4_3 """select min(1) + 1 from t4 group by c4;""" + order_qt_basic_add_4_4 """select min(1) + 1 from t4;""" + order_qt_basic_add_4_5 """select sum(1) + 1 from t4 group by c4;""" + order_qt_basic_add_4_6 """select sum(1) + 1 from t4;""" + order_qt_basic_add_4_7 """select avg(1) + 1 from t4 group by c4;""" + order_qt_basic_add_4_8 """select avg(1) + 1 from t4;""" + + /* ******** with one row ******** */ + order_qt_add_sum_1 """select max(1) + sum(2) from t1 group by c1;""" + order_qt_add_sum_2 """select max(1) + sum(2) from t1;""" + order_qt_add_sum_3 """select min(1) + sum(2) from t1 group by c1;""" + order_qt_add_sum_4 """select min(1) + sum(2) from t1;""" + order_qt_add_sum_5 """select sum(1) + sum(2) from t1 group by c1;""" + order_qt_add_sum_6 """select sum(1) + sum(2) from t1;""" + order_qt_add_sum_7 """select avg(1) + sum(2) from t1 group by c1;""" + order_qt_add_sum_8 """select avg(1) + sum(2) from t1;""" + + /* ******** with one row "null" ******** */ + order_qt_add_sum_2_1 """select max(1) + sum(2) from t2 group by c2;""" + order_qt_add_sum_2_2 """select max(1) + sum(2) from t2;""" + order_qt_add_sum_2_3 """select min(1) + sum(2) from t2 group by c2;""" + order_qt_add_sum_2_4 """select min(1) + sum(2) from t2;""" + order_qt_add_sum_2_5 """select sum(1) + sum(2) from t2 group by c2;""" + order_qt_add_sum_2_6 """select sum(1) + sum(2) from t2;""" + order_qt_add_sum_2_7 """select avg(1) + sum(2) from t2 group by c2;""" + order_qt_add_sum_2_8 """select avg(1) + sum(2) from t2;""" + + /* ******** with empty table ******** */ + order_qt_add_sum_3_1 """select max(1) + sum(2) from t3 group by c3;""" + order_qt_add_sum_3_2 """select max(1) + sum(2) from t3;""" + order_qt_add_sum_3_3 """select min(1) + sum(2) from t3 group by c3;""" + order_qt_add_sum_3_4 """select min(1) + sum(2) from t3;""" + order_qt_add_sum_3_5 """select sum(1) + sum(2) from t3 group by c3;""" + order_qt_add_sum_3_6 """select sum(1) + sum(2) from t3;""" + order_qt_add_sum_3_7 """select avg(1) + sum(2) from t3 group by c3;""" + order_qt_add_sum_3_8 """select avg(1) + sum(2) from t3;""" + + /* ******** with different group table ******** */ + order_qt_add_sum_4_1 """select max(1) + sum(2) from t4 group by c4;""" + order_qt_add_sum_4_2 """select max(1) + sum(2) from t4;""" + order_qt_add_sum_4_3 """select min(1) + sum(2) from t4 group by c4;""" + order_qt_add_sum_4_4 """select min(1) + sum(2) from t4;""" + order_qt_add_sum_4_5 """select sum(1) + sum(2) from t4 group by c4;""" + order_qt_add_sum_4_6 """select sum(1) + sum(2) from t4;""" + order_qt_add_sum_4_7 """select avg(1) + sum(2) from t4 group by c4;""" + order_qt_add_sum_4_8 """select avg(1) + sum(2) from t4;""" +} \ No newline at end of file