From e058f143348bcc1b128a43a7158dd247c4c4c2bc Mon Sep 17 00:00:00 2001 From: ChangerR Date: Fri, 24 Feb 2023 14:47:16 +0000 Subject: [PATCH] fix three-stage group by generate normal group by as scalar group by --- src/sql/optimizer/ob_log_plan.cpp | 16 +++++++++++++--- src/sql/optimizer/ob_log_plan.h | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 4a3ff76456..35bf2dc142 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -6256,8 +6256,13 @@ int ObLogPlan::create_three_stage_group_plan(const ObIArray &group_b // 3. prepare to allocate the third group by if (OB_SUCC(ret)) { - const bool is_scalar_aggr = group_by_exprs.empty() && rollup_exprs.empty(); - third_aggr_algo = is_scalar_aggr ? SCALAR_AGGREGATE : second_aggr_algo; + if (helper.is_scalar_group_by_) { + third_aggr_algo = SCALAR_AGGREGATE; + } else if (group_by_exprs.empty()) { + third_aggr_algo = MERGE_AGGREGATE; + } else { + third_aggr_algo = second_aggr_algo; + } third_rollup_status = !rollup_exprs.empty() ? ROLLUP_COLLECTOR : NONE_ROLLUP; third_exch_info.is_rollup_hybrid_ = !rollup_exprs.empty(); @@ -6643,15 +6648,20 @@ int ObLogPlan::init_groupby_helper(const ObIArray &group_exprs, int ret = OB_SUCCESS; ObSQLSessionInfo *session_info = NULL; ObLogicalOperator *best_plan = NULL; + const ObSelectStmt* stmt = NULL; ObSEArray group_rollup_exprs; bool push_group = false; groupby_helper.force_use_hash_ = get_log_plan_hint().use_hash_aggregate(); groupby_helper.force_use_merge_ = get_log_plan_hint().use_merge_aggregate(); if (OB_FAIL(candidates_.get_best_plan(best_plan))) { LOG_WARN("failed to get best plan", K(ret)); - } else if (OB_ISNULL(best_plan)) { + } else if (OB_ISNULL(best_plan) || + OB_ISNULL(get_stmt()) || + OB_UNLIKELY(!get_stmt()->is_select_stmt()) || + OB_ISNULL(stmt = static_cast(get_stmt()))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); + } else if (OB_FALSE_IT(groupby_helper.is_scalar_group_by_ = stmt->is_scala_group_by())) { } else if (OB_FAIL(append(group_rollup_exprs, group_exprs)) || OB_FAIL(append(group_rollup_exprs, rollup_exprs))) { LOG_WARN("failed to append group rollup exprs", K(ret)); diff --git a/src/sql/optimizer/ob_log_plan.h b/src/sql/optimizer/ob_log_plan.h index 6af9e3739c..0c921c1d13 100644 --- a/src/sql/optimizer/ob_log_plan.h +++ b/src/sql/optimizer/ob_log_plan.h @@ -496,6 +496,7 @@ public: can_rollup_pushdown_(false), force_use_hash_(false), force_use_merge_(false), + is_scalar_group_by_(false), distinct_exprs_(), aggr_code_expr_(NULL), non_distinct_aggr_items_(), @@ -514,6 +515,7 @@ public: bool can_rollup_pushdown_; bool force_use_hash_; // has use_hash_aggregation/use_hash_distinct hint bool force_use_merge_; // has no_use_hash_aggregation/no_use_hash_distinct hint + bool is_scalar_group_by_; ObSEArray distinct_exprs_; // context for three stage group by push down @@ -537,6 +539,7 @@ public: K_(can_rollup_pushdown), K_(force_use_hash), K_(force_use_merge), + K_(is_scalar_group_by), K_(distinct_exprs)); };