Fix access to duplicate rollup array out of bounds

This commit is contained in:
hezuojiao
2023-06-01 03:23:10 +00:00
committed by ob-robot
parent b190ac23b9
commit c0424a690f
2 changed files with 14 additions and 5 deletions

View File

@ -238,10 +238,18 @@ int ObMergeGroupByOp::init()
} else if (OB_FAIL(init_rollup_distributor())) {
LOG_WARN("failed to init rollup distributor", K(ret));
} else {
const bool is_mysql_mode = lib::is_mysql_mode();
max_partial_rollup_idx_ = all_groupby_exprs_.count();
// prepare initial group
if (MY_SPEC.has_rollup_) {
for (int64_t i = 0; !has_dup_group_expr_ && i < MY_SPEC.is_duplicate_rollup_expr_.count(); ++i) {
for (int64_t i = 0; i < MY_SPEC.is_duplicate_rollup_expr_.count(); ++i) {
has_dup_group_expr_ = MY_SPEC.is_duplicate_rollup_expr_.at(i);
if (has_dup_group_expr_) {
if (is_mysql_mode) {
max_partial_rollup_idx_ = i + MY_SPEC.group_exprs_.count() + 1;
}
break;
}
}
aggr_processor_.set_op_eval_infos(&eval_infos_);
}
@ -420,14 +428,12 @@ int ObMergeGroupByOp::find_candidate_key(ObRollupNDVInfo &ndv_info)
ObPxRpcInitSqcArgs &sqc_args = sqc_handle->get_sqc_init_arg();
ndv_info.dop_ = sqc_args.sqc_.get_total_task_count();
}
const bool is_mysql_mode = lib::is_mysql_mode();
for (int64_t i = 0; i < MY_SPEC.rollup_exprs_.count() + 1 && OB_SUCC(ret); ++i) {
if (0 == n_group && i == MY_SPEC.rollup_exprs_.count()) {
break;
}
candidate_ndv = ndv_calculator_[i].estimate();
if ((is_mysql_mode && MY_SPEC.is_duplicate_rollup_expr_[i]) ||
(candidate_ndv >= ObRollupKeyPieceMsgCtx::FAR_GREATER_THAN_RATIO * ndv_info.dop_)) {
if (candidate_ndv >= ObRollupKeyPieceMsgCtx::FAR_GREATER_THAN_RATIO * ndv_info.dop_) {
ndv_info.ndv_ = candidate_ndv;
ndv_info.n_keys_ = 0 == n_group ? i + 1 : i + n_group;
break;
@ -509,6 +515,7 @@ int ObMergeGroupByOp::process_parallel_rollup_key(ObRollupNDVInfo &ndv_info)
} else {
partial_rollup_idx_ = MY_SPEC.group_exprs_.count();
}
partial_rollup_idx_ = MIN(max_partial_rollup_idx_, partial_rollup_idx_);
aggr_processor_.set_partial_rollup_idx(MY_SPEC.group_exprs_.count(), partial_rollup_idx_);
}
LOG_DEBUG("debug partial rollup keys", K(partial_rollup_idx_));

View File

@ -108,7 +108,8 @@ public:
sort_batch_rows_(),
first_batch_from_sort_(true),
dir_id_(-1),
group_batch_factor_(8)
group_batch_factor_(8),
max_partial_rollup_idx_(INT64_MAX)
{
}
void reset();
@ -251,6 +252,7 @@ private:
int64_t dir_id_;
// default is a magic number 8, may use a sophisticated way
int64_t group_batch_factor_;
int64_t max_partial_rollup_idx_;
};
OB_INLINE int ObMergeGroupByOp::aggregate_group_rows(const int64_t group_id,