[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:
obdev
2023-01-28 16:01:26 +08:00
committed by ob-robot
parent 3080f2b66f
commit 2d19a9d8f5
846 changed files with 161957 additions and 116661 deletions

View File

@ -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;
}
}