replace ts related to ddl with scn.
This commit is contained in:
@ -707,162 +707,162 @@ int ObSelectLogPlan::create_hash_group_plan(const ObIArray<ObRawExpr*> &reduce_e
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
|
||||
// allocate exchange
|
||||
if (OB_SUCC(ret)) {
|
||||
ObExchangeInfo exch_info;
|
||||
if (OB_FAIL(get_grouping_style_exchange_info(group_by_exprs,
|
||||
top->get_output_equal_sets(),
|
||||
exch_info))) {
|
||||
LOG_WARN("failed to get grouping style exchange info", K(ret));
|
||||
} else if (OB_FAIL(allocate_exchange_as_top(top, exch_info))) {
|
||||
LOG_WARN("failed to allocate exchange as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
// allocate final group by
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(allocate_group_by_as_top(top,
|
||||
AggregateAlgo::HASH_AGGREGATE,
|
||||
group_by_exprs,
|
||||
rollup_exprs,
|
||||
aggr_items,
|
||||
having_exprs,
|
||||
is_from_povit,
|
||||
groupby_helper.group_ndv_,
|
||||
origin_child_card))) {
|
||||
LOG_WARN("failed to allocate scala group by as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
// allocate exchange
|
||||
if (OB_SUCC(ret)) {
|
||||
ObExchangeInfo exch_info;
|
||||
if (OB_FAIL(get_grouping_style_exchange_info(group_by_exprs,
|
||||
top->get_output_equal_sets(),
|
||||
exch_info))) {
|
||||
LOG_WARN("failed to get grouping style exchange info", K(ret));
|
||||
} else if (OB_FAIL(allocate_exchange_as_top(top, exch_info))) {
|
||||
LOG_WARN("failed to allocate exchange as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
// allocate final group by
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(allocate_group_by_as_top(top,
|
||||
AggregateAlgo::HASH_AGGREGATE,
|
||||
group_by_exprs,
|
||||
rollup_exprs,
|
||||
aggr_items,
|
||||
having_exprs,
|
||||
is_from_povit,
|
||||
groupby_helper.group_ndv_,
|
||||
origin_child_card))) {
|
||||
LOG_WARN("failed to allocate scala group by as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSelectLogPlan::allocate_topk_for_hash_group_plan(ObLogicalOperator *&top)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr*, 16> order_by_exprs;
|
||||
ObSEArray<ObOrderDirection, 16> directions;
|
||||
const ObSelectStmt *select_stmt = NULL;
|
||||
const ObGlobalHint &global_hint = get_optimizer_context().get_global_hint();
|
||||
if (OB_ISNULL(top) || OB_ISNULL(select_stmt = get_stmt())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(top), K(select_stmt), K(ret));
|
||||
} else if (!select_stmt->is_match_topk()) {
|
||||
/*do nothing*/
|
||||
} else if (OB_FAIL(get_order_by_exprs(top, order_by_exprs, &directions))) {
|
||||
LOG_WARN("failed to get order by exprs", K(ret));
|
||||
} else if (order_by_exprs.empty()) {
|
||||
// no need order by, directly allocate topk
|
||||
if (OB_FAIL(allocate_topk_as_top(top,
|
||||
select_stmt->get_limit_expr(),
|
||||
select_stmt->get_offset_expr(),
|
||||
global_hint.sharding_minimum_row_count_,
|
||||
global_hint.topk_precision_))) {
|
||||
LOG_WARN("failed to allocate topk as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
} else {
|
||||
// allocate sort
|
||||
ObSEArray<OrderItem, 8> sort_keys;
|
||||
ObSEArray<OrderItem, 8> topk_sort_keys;
|
||||
if (OB_FAIL(make_order_items(order_by_exprs, directions, sort_keys))) {
|
||||
LOG_WARN("failed to make order items", K(ret));
|
||||
} else if (OB_FAIL(clone_sort_keys_for_topk(sort_keys,
|
||||
topk_sort_keys))) {
|
||||
LOG_WARN("failed to clone sort keys for topk", K(ret));
|
||||
} else if (OB_FAIL(allocate_topk_sort_as_top(top,
|
||||
topk_sort_keys,
|
||||
select_stmt->get_limit_expr(),
|
||||
select_stmt->get_offset_expr(),
|
||||
global_hint.sharding_minimum_row_count_,
|
||||
global_hint.topk_precision_))) {
|
||||
LOG_WARN("failed to allocate topk sort as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
return ret;
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObRawExpr*, 16> order_by_exprs;
|
||||
ObSEArray<ObOrderDirection, 16> directions;
|
||||
const ObSelectStmt *select_stmt = NULL;
|
||||
const ObGlobalHint &global_hint = get_optimizer_context().get_global_hint();
|
||||
if (OB_ISNULL(top) || OB_ISNULL(select_stmt = get_stmt())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(top), K(select_stmt), K(ret));
|
||||
} else if (!select_stmt->is_match_topk()) {
|
||||
/*do nothing*/
|
||||
} else if (OB_FAIL(get_order_by_exprs(top, order_by_exprs, &directions))) {
|
||||
LOG_WARN("failed to get order by exprs", K(ret));
|
||||
} else if (order_by_exprs.empty()) {
|
||||
// no need order by, directly allocate topk
|
||||
if (OB_FAIL(allocate_topk_as_top(top,
|
||||
select_stmt->get_limit_expr(),
|
||||
select_stmt->get_offset_expr(),
|
||||
global_hint.sharding_minimum_row_count_,
|
||||
global_hint.topk_precision_))) {
|
||||
LOG_WARN("failed to allocate topk as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
} else {
|
||||
// allocate sort
|
||||
ObSEArray<OrderItem, 8> sort_keys;
|
||||
ObSEArray<OrderItem, 8> topk_sort_keys;
|
||||
if (OB_FAIL(make_order_items(order_by_exprs, directions, sort_keys))) {
|
||||
LOG_WARN("failed to make order items", K(ret));
|
||||
} else if (OB_FAIL(clone_sort_keys_for_topk(sort_keys,
|
||||
topk_sort_keys))) {
|
||||
LOG_WARN("failed to clone sort keys for topk", K(ret));
|
||||
} else if (OB_FAIL(allocate_topk_sort_as_top(top,
|
||||
topk_sort_keys,
|
||||
select_stmt->get_limit_expr(),
|
||||
select_stmt->get_offset_expr(),
|
||||
global_hint.sharding_minimum_row_count_,
|
||||
global_hint.topk_precision_))) {
|
||||
LOG_WARN("failed to allocate topk sort as top", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSelectLogPlan::allocate_topk_sort_as_top(ObLogicalOperator *&top,
|
||||
const ObIArray<OrderItem> &sort_keys,
|
||||
ObRawExpr *limit_expr,
|
||||
ObRawExpr *offset_expr,
|
||||
int64_t minimum_row_count,
|
||||
int64_t topk_precision)
|
||||
const ObIArray<OrderItem> &sort_keys,
|
||||
ObRawExpr *limit_expr,
|
||||
ObRawExpr *offset_expr,
|
||||
int64_t minimum_row_count,
|
||||
int64_t topk_precision)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObLogSort *sort = NULL;
|
||||
if (OB_ISNULL(top) || OB_ISNULL(limit_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(top), K(limit_expr), K(ret));
|
||||
} else if (OB_ISNULL(sort = static_cast<ObLogSort*>(get_log_op_factory().allocate(*this, LOG_SORT)))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_ERROR("failed to allocate sort for order by", K(ret));
|
||||
} else {
|
||||
sort->set_child(ObLogicalOperator::first_child, top);
|
||||
sort->set_topk_limit_expr(limit_expr);
|
||||
sort->set_topk_offset_expr(offset_expr);
|
||||
sort->set_minimal_row_count(minimum_row_count);
|
||||
sort->set_topk_precision(topk_precision);
|
||||
if (OB_FAIL(sort->set_sort_keys(sort_keys))) {
|
||||
LOG_WARN("failed to set sort keys", K(ret));
|
||||
} else if (OB_FAIL(sort->compute_property())) {
|
||||
LOG_WARN("failed to compute property", K(ret));
|
||||
} else {
|
||||
top = sort;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
int ret = OB_SUCCESS;
|
||||
ObLogSort *sort = NULL;
|
||||
if (OB_ISNULL(top) || OB_ISNULL(limit_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(top), K(limit_expr), K(ret));
|
||||
} else if (OB_ISNULL(sort = static_cast<ObLogSort*>(get_log_op_factory().allocate(*this, LOG_SORT)))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_ERROR("failed to allocate sort for order by", K(ret));
|
||||
} else {
|
||||
sort->set_child(ObLogicalOperator::first_child, top);
|
||||
sort->set_topk_limit_expr(limit_expr);
|
||||
sort->set_topk_offset_expr(offset_expr);
|
||||
sort->set_minimal_row_count(minimum_row_count);
|
||||
sort->set_topk_precision(topk_precision);
|
||||
if (OB_FAIL(sort->set_sort_keys(sort_keys))) {
|
||||
LOG_WARN("failed to set sort keys", K(ret));
|
||||
} else if (OB_FAIL(sort->compute_property())) {
|
||||
LOG_WARN("failed to compute property", K(ret));
|
||||
} else {
|
||||
top = sort;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSelectLogPlan::clone_sort_keys_for_topk(const ObIArray<OrderItem> &sort_keys,
|
||||
ObIArray<OrderItem> &topk_sort_keys)
|
||||
ObIArray<OrderItem> &topk_sort_keys)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < sort_keys.count(); ++i) {
|
||||
ObRawExpr *new_sort_expr = NULL;
|
||||
if (OB_FAIL(ObOptimizerUtil::clone_expr_for_topk(get_optimizer_context().get_expr_factory(),
|
||||
sort_keys.at(i).expr_,
|
||||
new_sort_expr))) {
|
||||
LOG_WARN("failed to copy expr", K(ret));
|
||||
} else if (OB_ISNULL(new_sort_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(new_sort_expr), K(ret));
|
||||
} else {
|
||||
OrderItem new_order_item;
|
||||
new_order_item.expr_ = new_sort_expr;
|
||||
new_order_item.order_type_ = sort_keys.at(i).order_type_;
|
||||
if (OB_FAIL(topk_sort_keys.push_back(new_order_item))) {
|
||||
LOG_WARN("failed to push back order_item", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
int ret = OB_SUCCESS;
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < sort_keys.count(); ++i) {
|
||||
ObRawExpr *new_sort_expr = NULL;
|
||||
if (OB_FAIL(ObOptimizerUtil::clone_expr_for_topk(get_optimizer_context().get_expr_factory(),
|
||||
sort_keys.at(i).expr_,
|
||||
new_sort_expr))) {
|
||||
LOG_WARN("failed to copy expr", K(ret));
|
||||
} else if (OB_ISNULL(new_sort_expr)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(new_sort_expr), K(ret));
|
||||
} else {
|
||||
OrderItem new_order_item;
|
||||
new_order_item.expr_ = new_sort_expr;
|
||||
new_order_item.order_type_ = sort_keys.at(i).order_type_;
|
||||
if (OB_FAIL(topk_sort_keys.push_back(new_order_item))) {
|
||||
LOG_WARN("failed to push back order_item", K(ret));
|
||||
} else { /*do nothing*/ }
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSelectLogPlan::allocate_topk_as_top(ObLogicalOperator *&top,
|
||||
ObRawExpr *topk_limit_count,
|
||||
ObRawExpr *topk_limit_offset,
|
||||
int64_t minimum_row_count,
|
||||
int64_t topk_precision)
|
||||
ObRawExpr *topk_limit_count,
|
||||
ObRawExpr *topk_limit_offset,
|
||||
int64_t minimum_row_count,
|
||||
int64_t topk_precision)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObLogTopk *topk_op = NULL;
|
||||
if (OB_ISNULL(top)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret));
|
||||
} else if (OB_ISNULL(topk_op = static_cast<ObLogTopk*>(log_op_factory_.allocate(
|
||||
*this, log_op_def::LOG_TOPK)))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_WARN("failed to allocate topk operator", K(ret));
|
||||
} else {
|
||||
topk_op->set_child(ObLogicalOperator::first_child, top);
|
||||
topk_op->set_topk_params(topk_limit_count, topk_limit_offset,
|
||||
minimum_row_count, topk_precision);
|
||||
if (OB_FAIL(topk_op->compute_property())) {
|
||||
LOG_WARN("failed to compute property", K(ret));
|
||||
} else {
|
||||
top = topk_op;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
int ret = OB_SUCCESS;
|
||||
ObLogTopk *topk_op = NULL;
|
||||
if (OB_ISNULL(top)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("get unexpected null", K(ret));
|
||||
} else if (OB_ISNULL(topk_op = static_cast<ObLogTopk*>(log_op_factory_.allocate(
|
||||
*this, log_op_def::LOG_TOPK)))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_WARN("failed to allocate topk operator", K(ret));
|
||||
} else {
|
||||
topk_op->set_child(ObLogicalOperator::first_child, top);
|
||||
topk_op->set_topk_params(topk_limit_count, topk_limit_offset,
|
||||
minimum_row_count, topk_precision);
|
||||
if (OB_FAIL(topk_op->compute_property())) {
|
||||
LOG_WARN("failed to compute property", K(ret));
|
||||
} else {
|
||||
top = topk_op;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObSelectLogPlan::create_merge_group_plan(const ObIArray<ObRawExpr*> &reduce_exprs,
|
||||
|
||||
Reference in New Issue
Block a user