[FEAT MERGE]4_1_sql_feature
Co-authored-by: leslieyuchen <leslieyuchen@gmail.com> Co-authored-by: Charles0429 <xiezhenjiang@gmail.com> Co-authored-by: raywill <hustos@gmail.com>
This commit is contained in:
@ -173,6 +173,7 @@ int ObTransformGroupByPushdown::check_groupby_push_down_validity(ObSelectStmt *s
|
||||
LOG_WARN("failed to check if contain inner table", K(ret));
|
||||
} else if (contain_inner_table && !stmt->get_stmt_hint().has_enable_hint(T_PLACE_GROUP_BY)) {
|
||||
is_valid = false;
|
||||
OPT_TRACE("do not rewrite inner table stmt with cost-based rule");
|
||||
// do not rewrite inner table stmt with cost-based rule
|
||||
} else if (stmt->has_window_function() ||
|
||||
stmt->has_rollup() ||
|
||||
@ -189,18 +190,22 @@ int ObTransformGroupByPushdown::check_groupby_push_down_validity(ObSelectStmt *s
|
||||
// where t1.c1 = t2.c1;
|
||||
is_valid = false;
|
||||
LOG_TRACE("invalid stmt for eager aggregation", K(is_valid));
|
||||
OPT_TRACE("invalid stmt for eager aggregation");
|
||||
} else if (OB_FAIL(stmt->has_rownum(has_rownum))) {
|
||||
LOG_WARN("failed to check stmt has rownum", K(ret));
|
||||
} else if (has_rownum) {
|
||||
is_valid = false;
|
||||
OPT_TRACE("stmt contain rownum, can not transform");
|
||||
} else if (OB_FAIL(stmt->has_rand(has_rand))) {
|
||||
LOG_WARN("failed to check stmt has rand", K(ret));
|
||||
} else if (has_rand) {
|
||||
is_valid = false;
|
||||
OPT_TRACE("stmt has rand expr, can not transform");
|
||||
} else if (OB_FAIL(check_groupby_validity(*stmt, is_valid))) {
|
||||
LOG_WARN("failed to check group by validity", K(ret));
|
||||
} else if (!is_valid) {
|
||||
// do nothing
|
||||
OPT_TRACE("not a valid group stmt");
|
||||
} else if (OB_FAIL(check_collation_validity(*stmt, is_valid))) {
|
||||
LOG_WARN("failed to check collation validity", K(ret));
|
||||
} else if (!is_valid) {
|
||||
@ -217,6 +222,7 @@ int ObTransformGroupByPushdown::check_groupby_push_down_validity(ObSelectStmt *s
|
||||
aggr_expr->get_expr_type() != T_FUN_MAX) ||
|
||||
aggr_expr->is_param_distinct()) {
|
||||
is_valid = false;
|
||||
OPT_TRACE("invalid aggregation type for group by placement", aggr_expr);
|
||||
LOG_TRACE("invalid aggregation type for group by placement", K(is_valid),
|
||||
K(aggr_expr->get_expr_type()), K(aggr_expr->is_param_distinct()));
|
||||
}
|
||||
@ -453,8 +459,7 @@ int ObTransformGroupByPushdown::check_outer_join_aggr(ObSelectStmt *stmt,
|
||||
} else if (OB_ISNULL(param = stmt->get_aggr_item(i)->get_param_expr(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("param expr is null", K(ret), K(param));
|
||||
} else if (!param->get_expr_levels().has_member(stmt->get_current_level()) ||
|
||||
!param->get_relation_ids().overlap2(null_table_set)) {
|
||||
} else if (!param->get_relation_ids().overlap2(null_table_set)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(param, columns))) {
|
||||
LOG_WARN("failed to extract column exprs", K(ret));
|
||||
@ -547,8 +552,8 @@ int ObTransformGroupByPushdown::is_filterable_join(ObSelectStmt *stmt,
|
||||
OB_ISNULL(right_expr = join_cond->get_param_expr(1))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("params are null", K(ret), K(left_expr), K(right_expr));
|
||||
} else if (!left_expr->get_expr_levels().has_member(stmt->get_current_level()) ||
|
||||
!right_expr->get_expr_levels().has_member(stmt->get_current_level()) ||
|
||||
} else if (!left_expr->has_flag(CNT_COLUMN) ||
|
||||
!right_expr->has_flag(CNT_COLUMN) ||
|
||||
left_expr->get_relation_ids().overlap(right_expr->get_relation_ids())) {
|
||||
is_valid = false;
|
||||
} else if (OB_FAIL(check_join_expr_validity(stmt, params, left_expr, is_valid))) {
|
||||
@ -612,7 +617,7 @@ int ObTransformGroupByPushdown::check_join_expr_validity(ObSelectStmt *stmt,
|
||||
} else if (OB_ISNULL(param_expr = aggr->get_param_expr(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("param expr is null", K(ret));
|
||||
} else if (!param_expr->get_expr_levels().has_member(stmt->get_current_level())) {
|
||||
} else if (!param_expr->has_flag(CNT_COLUMN)) {
|
||||
// do nothing
|
||||
} else {
|
||||
is_valid = param_expr->get_relation_ids().overlap(col->get_relation_ids());
|
||||
@ -622,8 +627,7 @@ int ObTransformGroupByPushdown::check_join_expr_validity(ObSelectStmt *stmt,
|
||||
ObArenaAllocator alloc;
|
||||
EqualSets &equal_sets = ctx_->equal_sets_;
|
||||
ObSEArray<ObRawExpr *, 4> const_exprs;
|
||||
if (OB_FAIL(stmt->get_stmt_equal_sets(equal_sets, alloc, true,
|
||||
EQUAL_SET_SCOPE::SCOPE_WHERE))) {
|
||||
if (OB_FAIL(stmt->get_stmt_equal_sets(equal_sets, alloc, true))) {
|
||||
LOG_WARN("failed to get stmt equal sets", K(ret));
|
||||
} else if (OB_FAIL(ObOptimizerUtil::compute_const_exprs(stmt->get_condition_exprs(),
|
||||
const_exprs))) {
|
||||
@ -783,8 +787,6 @@ int ObTransformGroupByPushdown::distribute_group_aggr(ObSelectStmt *stmt,
|
||||
LOG_WARN("failed to formalize count expr", K(ret));
|
||||
} else if (OB_FAIL(param.aggr_exprs_.push_back(count_expr))) {
|
||||
LOG_WARN("failed to push back count expr", K(ret));
|
||||
} else {
|
||||
count_expr->set_expr_level(stmt->get_current_level());
|
||||
}
|
||||
if (OB_SUCC(ret) && (is_unique || param.aggr_exprs_.empty() ||
|
||||
(param.join_columns_.empty() && param.group_exprs_.empty()))) {
|
||||
@ -829,7 +831,7 @@ int ObTransformGroupByPushdown::distribute_filter(ObSelectStmt *stmt,
|
||||
if (OB_ISNULL(stmt) || OB_ISNULL(cond)) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("params have null", K(ret), K(stmt), K(cond));
|
||||
} else if (!cond->get_expr_levels().has_member(stmt->get_current_level())) {
|
||||
} else if (!cond->has_flag(CNT_COLUMN)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(cond, column_exprs))) {
|
||||
LOG_WARN("failed to extract column exprs", K(ret));
|
||||
@ -1029,10 +1031,14 @@ int ObTransformGroupByPushdown::transform_groupby_push_down(ObSelectStmt *stmt,
|
||||
}
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (OB_FAIL(stmt->replace_inner_stmt_expr(origin_aggr_exprs, deduce_aggr_exprs))) {
|
||||
if (OB_FAIL(stmt->replace_relation_exprs(origin_aggr_exprs, deduce_aggr_exprs))) {
|
||||
LOG_WARN("failed to replace inner stmt expr", K(ret));
|
||||
// TODO link.zt seems to be useless
|
||||
} else if (OB_FAIL(ObTransformUtils::replace_exprs(origin_aggr_exprs,
|
||||
deduce_aggr_exprs,
|
||||
stmt->get_aggr_items()))) {
|
||||
LOG_WARN("failed to replace exprs", K(ret));
|
||||
} else {
|
||||
stmt->get_deduced_exprs().reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1103,8 +1109,6 @@ int ObTransformGroupByPushdown::push_down_group_by_into_view(ObSelectStmt *stmt,
|
||||
} else if (OB_FAIL(sub_stmt->get_stmt_hint().assign(stmt->get_stmt_hint()))) {
|
||||
// zhanyue todo: remove some hint for sub stmt
|
||||
LOG_WARN("failed to assign stmt hint", K(ret));
|
||||
} else {
|
||||
sub_stmt->set_current_level(stmt->get_current_level());
|
||||
}
|
||||
/// 1. build table and from list
|
||||
for (int64_t i = 0; OB_SUCC(ret) && i < table_index_array.count(); ++i) {
|
||||
@ -1122,6 +1126,8 @@ int ObTransformGroupByPushdown::push_down_group_by_into_view(ObSelectStmt *stmt,
|
||||
LOG_WARN("failed to push back table item", K(ret));
|
||||
} else if (OB_FAIL(stmt->remove_table_item(table_item))) {
|
||||
LOG_WARN("failed to remove table item", K(ret));
|
||||
} else if (OB_FAIL(stmt->remove_check_constraint_item(table_item->table_id_))) {
|
||||
LOG_WARN("failed to remove table item info", K(ret));
|
||||
} else if (OB_FAIL(ObTransformUtils::get_from_item(stmt, table_item, from_item))) {
|
||||
LOG_WARN("failed to from item", K(ret));
|
||||
} else if (!from_item.is_joined_) {
|
||||
@ -1379,7 +1385,6 @@ int ObTransformGroupByPushdown::transform_aggregation_expr(ObDMLStmt &stmt,
|
||||
LOG_WARN("the copied aggregation expr is null", K(ret), K(group_aggr));
|
||||
} else {
|
||||
group_aggr->add_real_param_expr(new_aggr_expr);
|
||||
group_aggr->set_expr_level(stmt.get_current_level());
|
||||
new_aggr_expr = group_aggr;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user