From 7faad9f004b2012e8d019dcf2895edfe14dcc826 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Mon, 24 Oct 2022 16:32:36 +0800 Subject: [PATCH] [FIX](agg)fix group by constant child expr bug (#13485) --- .../org/apache/doris/analysis/GroupByClause.java | 16 ++++------------ .../org/apache/doris/analysis/SelectStmt.java | 12 ++++++++++++ .../correctness_p0/test_group_by_constant.out | 3 +++ .../correctness_p0/test_group_by_constant.groovy | 14 ++++++++++++++ 4 files changed, 33 insertions(+), 12 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 08010dbec0..7e66ae85fa 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 @@ -93,20 +93,12 @@ public class GroupByClause implements ParseNode { } public void reset() { + groupingExprs = new ArrayList<>(); analyzed = false; exprGenerated = false; - if (groupingType != GroupingType.GROUP_BY) { - groupingExprs = new ArrayList<>(); - if (oriGroupingExprs != null) { - Expr.resetList(oriGroupingExprs); - groupingExprs.addAll(oriGroupingExprs); - } - } else { - if (groupingExprs != null) { - for (Expr e : groupingExprs) { - e.reset(); - } - } + if (oriGroupingExprs != null) { + Expr.resetList(oriGroupingExprs); + groupingExprs.addAll(oriGroupingExprs); } if (groupingSetList != null) { for (List s : groupingSetList) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 4b9015be9d..a03cbd06c6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -1389,7 +1389,19 @@ public class SelectStmt extends QueryStmt { } List oriGroupingExprs = groupByClause.getOriGroupingExprs(); if (oriGroupingExprs != null) { + // we must make sure the expr is analyzed before rewrite + try { + for (Expr expr : oriGroupingExprs) { + expr.analyze(analyzer); + } + } catch (AnalysisException ex) { + //ignore any exception + } rewriter.rewriteList(oriGroupingExprs, analyzer); + // after rewrite, need reset the analyze status for later re-analyze + for (Expr expr : oriGroupingExprs) { + expr.reset(); + } } } if (orderByElements != null) { diff --git a/regression-test/data/correctness_p0/test_group_by_constant.out b/regression-test/data/correctness_p0/test_group_by_constant.out index 64fb35ea90..7a98c68fea 100644 --- a/regression-test/data/correctness_p0/test_group_by_constant.out +++ b/regression-test/data/correctness_p0/test_group_by_constant.out @@ -2,3 +2,6 @@ -- !sql -- D +-- !sql -- +D + diff --git a/regression-test/suites/correctness_p0/test_group_by_constant.groovy b/regression-test/suites/correctness_p0/test_group_by_constant.groovy index 8f332b2210..fd2729caa7 100644 --- a/regression-test/suites/correctness_p0/test_group_by_constant.groovy +++ b/regression-test/suites/correctness_p0/test_group_by_constant.groovy @@ -57,6 +57,20 @@ suite("test_group_by_constant") { end; """ + qt_sql """ + SELECT + case + when (inc_day = date_sub(curdate(), interval 1 day)) then 'A' + when (inc_day = date_sub(curdate(), interval 8 day)) then 'B' + when (inc_day = date_sub(curdate(), interval 365 day)) then 'C' + else 'D' + end val + from + table_group_by_constant + group by + val; + """ + sql """ DROP TABLE IF EXISTS `table_group_by_constant`; """