From eb5657239117cc2108f10c5389347ed3a0631416 Mon Sep 17 00:00:00 2001 From: sdc Date: Fri, 28 Jul 2023 06:54:16 +0000 Subject: [PATCH] [CP] fix not mark GI as partition-wise bug --- src/sql/optimizer/ob_log_distinct.h | 5 ++++- src/sql/optimizer/ob_select_log_plan.cpp | 14 ++++++++++---- src/sql/optimizer/ob_select_log_plan.h | 3 ++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/sql/optimizer/ob_log_distinct.h b/src/sql/optimizer/ob_log_distinct.h index abe758a083..453f271ebc 100644 --- a/src/sql/optimizer/ob_log_distinct.h +++ b/src/sql/optimizer/ob_log_distinct.h @@ -64,7 +64,7 @@ public: inline void set_push_down(const bool is_push_down) { is_push_down_ = is_push_down; } inline double get_total_ndv() const { return total_ndv_; } inline void set_total_ndv(double total_ndv) { total_ndv_ = total_ndv; } - inline bool force_partition_gi() const { return is_partition_wise() && !is_push_down(); } + inline bool force_partition_gi() const { return (is_partition_wise() && !is_push_down()) || is_partition_gi_; } inline bool force_push_down() const { return force_push_down_; } inline void set_force_push_down(bool force_push_down) { force_push_down_ = force_push_down; } int get_distinct_output_exprs(ObIArray &output_exprs); @@ -72,6 +72,8 @@ public: ObSqlPlanItem &plan_item) override; virtual int print_outline_data(PlanText &plan_text) override; virtual int print_used_hint(PlanText &plan_text) override; + inline bool is_partition_ig() const { return is_partition_gi_; } + inline void set_is_partition_gi(bool v) { is_partition_gi_ = v; } private: common::ObSEArray distinct_exprs_; @@ -80,6 +82,7 @@ private: bool is_push_down_; double total_ndv_; bool force_push_down_; // control by _aggregation_optimization_settings + bool is_partition_gi_; private: DISALLOW_COPY_AND_ASSIGN(ObLogDistinct); }; diff --git a/src/sql/optimizer/ob_select_log_plan.cpp b/src/sql/optimizer/ob_select_log_plan.cpp index 67e2923ada..a31d2a62cc 100644 --- a/src/sql/optimizer/ob_select_log_plan.cpp +++ b/src/sql/optimizer/ob_select_log_plan.cpp @@ -1543,8 +1543,9 @@ int ObSelectLogPlan::create_hash_distinct_plan(ObLogicalOperator *&top, AggregateAlgo::HASH_AGGREGATE, distinct_exprs, distinct_helper.group_ndv_, - false, - true))) { + false, /* is_partition_wise */ + true, /* is_push_down */ + false /* is_partition_gi */))) { LOG_WARN("failed to allocate distinct as top", K(ret)); } else if (OB_FAIL(get_grouping_style_exchange_info(distinct_exprs, top->get_output_equal_sets(), @@ -1636,8 +1637,10 @@ int ObSelectLogPlan::create_merge_distinct_plan(ObLogicalOperator *&top, OPT_TRACE("generate pushdown distinct plan"); bool should_pullup_gi = false; bool top_is_local_order = false; + bool is_partition_gi = false; if (OB_FAIL(check_can_pullup_gi(*top, false, need_sort, should_pullup_gi))) { LOG_WARN("failed to check can pullup gi", K(ret)); + } else if (OB_FALSE_IT(is_partition_gi = top->is_partition_wise())) { } else if (OB_FALSE_IT(top_is_local_order = top->get_is_local_order() && !should_pullup_gi)) { } else if ((need_sort || top_is_local_order) && OB_FAIL(allocate_sort_as_top(top, @@ -1650,7 +1653,8 @@ int ObSelectLogPlan::create_merge_distinct_plan(ObLogicalOperator *&top, distinct_exprs, distinct_helper.group_ndv_, should_pullup_gi, - true))) { + true, + is_partition_gi))) { LOG_WARN("failed to allocate distinct as top", K(ret)); } else { prefix_pos = 0; @@ -1687,7 +1691,8 @@ int ObSelectLogPlan::allocate_distinct_as_top(ObLogicalOperator *&top, const ObIArray &distinct_exprs, const double total_ndv, const bool is_partition_wise, - const bool is_pushed_down) + const bool is_pushed_down, + const bool is_partition_gi) { int ret = OB_SUCCESS; ObLogDistinct *distinct_op = NULL; @@ -1702,6 +1707,7 @@ LOG_ERROR("failed to allocate distinct operator", K(ret)); distinct_op->set_child(ObLogicalOperator::first_child, top); distinct_op->set_algo_type(algo); distinct_op->set_push_down(is_pushed_down); +distinct_op->set_is_partition_gi(is_partition_gi); distinct_op->set_total_ndv(total_ndv); distinct_op->set_is_partition_wise(is_partition_wise); distinct_op->set_force_push_down(FORCE_GPD & get_optimizer_context().get_aggregation_optimization_settings()); diff --git a/src/sql/optimizer/ob_select_log_plan.h b/src/sql/optimizer/ob_select_log_plan.h index d73d94b395..67b954c086 100644 --- a/src/sql/optimizer/ob_select_log_plan.h +++ b/src/sql/optimizer/ob_select_log_plan.h @@ -204,7 +204,8 @@ private: const ObIArray &distinct_exprs, const double total_ndv, const bool is_partition_wise = false, - const bool is_pushed_down = false); + const bool is_pushed_down = false, + const bool is_partition_gi = false); /** * @brief GENERATE the PLAN tree FOR "SET" operator (UNION/INTERSECT/EXCEPT) * Warning: