This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch dev-1.1.2 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/dev-1.1.2 by this push: new 076dd67347 [fix](grouping)fix grouping function bug (#11861) 076dd67347 is described below commit 076dd67347c79d57a0604c6905ae5f0b09218936 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Wed Aug 24 15:05:25 2022 +0800 [fix](grouping)fix grouping function bug (#11861) --- .../org/apache/doris/analysis/GroupByClause.java | 10 ++- .../org/apache/doris/analysis/GroupingInfo.java | 15 ---- .../aggregate/aggregate_grouping_function.out | 43 ++++++++++ .../aggregate/aggregate_grouping_function.groovy | 93 ++++++++++++++++++++++ 4 files changed, 142 insertions(+), 19 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupByClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupByClause.java index 14d1804e71..faf0fd2626 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupByClause.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupByClause.java @@ -30,9 +30,7 @@ import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; -import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; /** * Wraps all information of group by clause. support normal GROUP BY clause and extended GROUP BY clause like @@ -286,8 +284,12 @@ public class GroupByClause implements ParseNode { Analyzer analyzer) { groupingExprs = Expr.substituteList(groupingExprs, smap, analyzer, true); for (VirtualSlotRef vs : groupingSlots) { - vs.setRealSlots(Optional.ofNullable(Expr.substituteList(vs.getRealSlots(), smap, analyzer, true)).orElse( - new ArrayList<>()).stream().map(e -> (SlotRef) e).collect(Collectors.toList())); + ArrayList<Expr> exprs = Expr.substituteList(vs.getRealSlots(), smap, analyzer, true); + if (exprs != null) { + vs.setRealSlots(exprs); + } else { + vs.setRealSlots(new ArrayList<Expr>()); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java index e153c5f929..b7ba987cc6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java @@ -17,7 +17,6 @@ package org.apache.doris.analysis; -import org.apache.doris.catalog.Table; import org.apache.doris.catalog.Type; import org.apache.doris.common.AnalysisException; @@ -270,20 +269,6 @@ public class GroupingInfo { public void substituteGroupingFn(Expr expr, Analyzer analyzer) throws AnalysisException { if (expr instanceof GroupingFunctionCallExpr) { - // TODO(yangzhengguo) support expression in grouping functions - for (Expr child: expr.getChildren()) { - if (!(child instanceof SlotRef)) { - throw new AnalysisException("grouping functions only support column in current version."); - // expr from inline view - } else if (((SlotRef) child).getDesc().getParent().getTable().getType() - == Table.TableType.INLINE_VIEW) { - InlineViewRef ref = (InlineViewRef) ((SlotRef) child).getDesc().getParent().getRef(); - int colIndex = ref.getColLabels().indexOf(((SlotRef) child).getColumnName()); - if (colIndex != -1 && !(ref.getViewStmt().getResultExprs().get(colIndex) instanceof SlotRef)) { - throw new AnalysisException("grouping functions only support column in current version."); - } - } - } // if is substituted skip if (expr.getChildren().size() == 1 && expr.getChild(0) instanceof VirtualSlotRef) { return; diff --git a/regression-test/data/query/aggregate/aggregate_grouping_function.out b/regression-test/data/query/aggregate/aggregate_grouping_function.out new file mode 100644 index 0000000000..292966bd15 --- /dev/null +++ b/regression-test/data/query/aggregate/aggregate_grouping_function.out @@ -0,0 +1,43 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select -- +1 2022-08-01 \N 6 +0 2022-08-01 aaa 2 +0 2022-08-01 bbb 2 +0 2022-08-01 ccc 2 +1 2022-08-02 \N 6 +0 2022-08-02 aaa 2 +0 2022-08-02 bbb 2 +0 2022-08-02 ccc 2 +1 2022-08-03 \N 6 +0 2022-08-03 aaa 2 +0 2022-08-03 bbb 2 +0 2022-08-03 ccc 2 + +-- !select -- +1 2022-08-01 \N 6 +0 2022-08-01 aaa 2 +0 2022-08-01 bbb 2 +0 2022-08-01 ccc 2 +1 2022-08-02 \N 6 +0 2022-08-02 aaa 2 +0 2022-08-02 bbb 2 +0 2022-08-02 ccc 2 +1 2022-08-03 \N 6 +0 2022-08-03 aaa 2 +0 2022-08-03 bbb 2 +0 2022-08-03 ccc 2 + +-- !select -- +1 2022-08-01 \N 6 +0 2022-08-01 aaa 2 +0 2022-08-01 bbb 2 +0 2022-08-01 ccc 2 +1 2022-08-02 \N 6 +0 2022-08-02 aaa 2 +0 2022-08-02 bbb 2 +0 2022-08-02 ccc 2 +1 2022-08-03 \N 6 +0 2022-08-03 aaa 2 +0 2022-08-03 bbb 2 +0 2022-08-03 ccc 2 + diff --git a/regression-test/suites/query/aggregate/aggregate_grouping_function.groovy b/regression-test/suites/query/aggregate/aggregate_grouping_function.groovy new file mode 100644 index 0000000000..e371fb2d86 --- /dev/null +++ b/regression-test/suites/query/aggregate/aggregate_grouping_function.groovy @@ -0,0 +1,93 @@ +// 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("aggregate_grouping_function") { + sql "DROP TABLE IF EXISTS test_aggregate_grouping_function" + + sql """ + CREATE TABLE `test_aggregate_grouping_function` ( + `dt_date` varchar(1000) NULL COMMENT "", + `name` varchar(1000) NULL COMMENT "", + `num1` bigint(20) SUM NOT NULL COMMENT "", + `num2` bigint(20) SUM NOT NULL COMMENT "" + ) ENGINE=OLAP + AGGREGATE KEY(`dt_date`, `name`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`dt_date`) BUCKETS 32 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2" + ) + ; + """ + + sql """INSERT INTO test_aggregate_grouping_function values ('2022-08-01', "aaa", 1,2),('2022-08-01', "bbb", 1,2),('2022-08-01', "ccc", 1,2), + ('2022-08-02', "aaa", 1,2),('2022-08-02', "bbb", 1,2),('2022-08-02', "ccc", 1,2),('2022-08-03', "aaa", 1,2), + ('2022-08-03', "bbb", 1,2),('2022-08-03', "ccc", 1,2);""" + + qt_select """ + WITH base_table AS ( + SELECT dt_date, name, sum(num1) AS sum1 + , sum(num2) AS sum2 + , sum(num1) / sum(num2) AS ratio + FROM test_aggregate_grouping_function + GROUP BY dt_date, name + ) + SELECT grouping_id(sum1), dt_date, name + , sum(sum2) + FROM base_table + GROUP BY GROUPING SETS ((dt_date), (dt_date, name, sum1)) + ORDER BY dt_date, name; + """ + + qt_select """ + WITH base_table AS ( + SELECT dt_date, name, sum(num1) AS sum1 + , sum(num2) AS sum2 + , sum(num1) / sum(num2) AS ratio + FROM test_aggregate_grouping_function + GROUP BY dt_date, name + ) + SELECT grouping_id(ratio), dt_date, name + , sum(sum2) + FROM base_table + GROUP BY GROUPING SETS ((dt_date), (dt_date, name, ratio)) + ORDER BY dt_date, name; + """ + + qt_select """ + WITH base_table AS ( + SELECT dt_date, name, sum(num1) AS sum1 + , sum(num2) AS sum2 + , sum(num1) / sum(num2) AS ratio + FROM test_aggregate_grouping_function + GROUP BY dt_date, name + ), + base_table2 AS ( + SELECT * + FROM base_table + ) + SELECT grouping_id(ratio), dt_date, name + , sum(sum2) + FROM base_table2 + GROUP BY GROUPING SETS ((dt_date), (dt_date, name, ratio)) + ORDER BY dt_date, name; + """ + + sql "DROP TABLE test_aggregate_grouping_function" +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org