fix allocate window function bug in mysqltest,update failed mysqltest

This commit is contained in:
chimyue
2023-07-21 03:48:57 +00:00
committed by ob-robot
parent 9940650223
commit 2fac441fd9

View File

@ -5193,6 +5193,7 @@ int ObSelectLogPlan::check_win_func_need_sort(const ObLogicalOperator &top,
part_cnt = 0; part_cnt = 0;
} else if (!need_sort || 0 >= part_cnt) { } else if (!need_sort || 0 >= part_cnt) {
/* need not hash sort */ /* need not hash sort */
part_cnt = 0;
} else if (OB_FAIL(ObOptimizerUtil::check_need_sort(win_func_helper.sort_keys_, } else if (OB_FAIL(ObOptimizerUtil::check_need_sort(win_func_helper.sort_keys_,
top.get_op_ordering(), top.get_op_ordering(),
top.get_fd_item_set(), top.get_fd_item_set(),
@ -5929,6 +5930,7 @@ int ObSelectLogPlan::create_none_dist_win_func(ObLogicalOperator *top,
bool single_part_parallel = false; bool single_part_parallel = false;
const ObIArray<ObWinFunRawExpr*> &win_func_exprs = win_func_helper.ordered_win_func_exprs_; const ObIArray<ObWinFunRawExpr*> &win_func_exprs = win_func_helper.ordered_win_func_exprs_;
const ObIArray<OrderItem> &sort_keys = win_func_helper.sort_keys_; const ObIArray<OrderItem> &sort_keys = win_func_helper.sort_keys_;
bool is_local_order = false;
if (OB_ISNULL(top)) { if (OB_ISNULL(top)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(ret)); LOG_WARN("get unexpected null", K(ret));
@ -5949,8 +5951,10 @@ int ObSelectLogPlan::create_none_dist_win_func(ObLogicalOperator *top,
K(win_func_helper.force_hash_sort_), K(win_func_helper.force_normal_sort_)); K(win_func_helper.force_hash_sort_), K(win_func_helper.force_normal_sort_));
need_normal_sort = !win_func_helper.force_hash_sort_; need_normal_sort = !win_func_helper.force_hash_sort_;
need_hash_sort = need_sort && part_cnt > 0 && !win_func_helper.force_normal_sort_; need_hash_sort = need_sort && part_cnt > 0 && !win_func_helper.force_normal_sort_;
is_local_order = top->get_is_local_order();
if (!top->is_distributed() || single_part_parallel || is_partition_wise) { if (!top->is_distributed() || single_part_parallel || is_partition_wise) {
exch_info.dist_method_ = ObPQDistributeMethod::NONE; exch_info.dist_method_ = ObPQDistributeMethod::NONE;
is_local_order &= top->is_single() || (top->is_distributed() && top->is_exchange_allocated());
} }
} }
} }
@ -5958,7 +5962,7 @@ int ObSelectLogPlan::create_none_dist_win_func(ObLogicalOperator *top,
if (OB_SUCC(ret) && need_normal_sort) { if (OB_SUCC(ret) && need_normal_sort) {
ObLogicalOperator *normal_sort_top= top; ObLogicalOperator *normal_sort_top= top;
if (OB_FAIL(allocate_sort_and_exchange_as_top(normal_sort_top, exch_info, sort_keys, need_sort, if (OB_FAIL(allocate_sort_and_exchange_as_top(normal_sort_top, exch_info, sort_keys, need_sort,
prefix_pos, top->get_is_local_order()))) { prefix_pos, is_local_order))) {
LOG_WARN("failed to allocate sort and exchange as top", K(ret)); LOG_WARN("failed to allocate sort and exchange as top", K(ret));
} else if (OB_FAIL(allocate_window_function_as_top(WinDistAlgo::WIN_DIST_NONE, } else if (OB_FAIL(allocate_window_function_as_top(WinDistAlgo::WIN_DIST_NONE,
win_func_exprs, win_func_exprs,
@ -5979,7 +5983,7 @@ int ObSelectLogPlan::create_none_dist_win_func(ObLogicalOperator *top,
if (OB_FAIL(create_hash_sortkey(part_cnt, sort_keys, hash_sortkey))) { if (OB_FAIL(create_hash_sortkey(part_cnt, sort_keys, hash_sortkey))) {
LOG_WARN("failed to create hash sort key", K(ret), K(part_cnt), K(sort_keys)); LOG_WARN("failed to create hash sort key", K(ret), K(part_cnt), K(sort_keys));
} else if (OB_FAIL(allocate_sort_and_exchange_as_top(hash_sort_top, exch_info, sort_keys, need_sort, } else if (OB_FAIL(allocate_sort_and_exchange_as_top(hash_sort_top, exch_info, sort_keys, need_sort,
prefix_pos, top->get_is_local_order(), prefix_pos, is_local_order,
NULL, /* topn_expr */ NULL, /* topn_expr */
false, /* is_fetch_with_ties */ false, /* is_fetch_with_ties */
&hash_sortkey))) { &hash_sortkey))) {