fix transformer bugs caused by shared expr

This commit is contained in:
yinyj17 2023-11-13 10:09:17 +00:00 committed by ob-robot
parent 6fcd3d2020
commit a6117944b9
2 changed files with 11 additions and 43 deletions

View File

@ -152,7 +152,8 @@ int ObSharedExprResolver::get_shared_instance(ObRawExpr *expr,
if (OB_ISNULL(expr)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("expr is null", K(ret), K(expr));
} else if (!expr->is_aggr_expr() && !expr->is_win_func_expr()) {
} else if (!expr->is_aggr_expr() && !expr->is_win_func_expr() &&
T_OP_CASE != expr->get_expr_type()) {
for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) {
ObRawExpr *old_param_expr = expr->get_param_expr(i);
ObRawExpr *new_param_expr = NULL;

View File

@ -1897,8 +1897,6 @@ int ObTransformJoinElimination::eliminate_semi_right_child_table(ObDMLStmt *stmt
{
int ret = OB_SUCCESS;
ObSEArray<ObRawExpr*, 4> pullup_conds;
ObSEArray<ObRawExpr*, 4> column_exprs;
ObSEArray<ObRawExpr*, 4> upper_column_exprs;
ObSEArray<ObRawExpr*, 4> pullup_column_exprs;
ObSEArray<ObRawExpr*, 4> pullup_select_exprs;
TableItem *semi_right_table = NULL;
@ -1985,50 +1983,20 @@ int ObTransformJoinElimination::eliminate_semi_right_child_table(ObDMLStmt *stmt
}
}
// 3. add new select expr & column expr, repalce column exprs in semi_info->semi_conditions_
// 3. remove right_tables and replace exprs
if (OB_SUCC(ret)) {
ObSqlBitSet<> table_set;
ObSEArray<ObRawExpr *, 4> tmp;
ObSEArray<ObRawExpr*, 4> pullup_exprs;
ObSEArray<ObQueryRefRawExpr*, 2> pullup_subqueries;
if (OB_FAIL(child_stmt->get_table_rel_ids(child_stmt->get_table_items(), table_set))) {
LOG_WARN("failed to get rel ids", K(ret));
} else if (OB_FAIL(table_set.del_members(right_rel_ids))) {
LOG_WARN("failed to del members", K(ret));
} else if (OB_FAIL(append(pullup_exprs, pullup_select_exprs)) ||
OB_FAIL(append(pullup_exprs, pullup_conds))) {
LOG_WARN("failed to append exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::extract_column_exprs(pullup_exprs, tmp))) {
LOG_WARN("extract column exprs failed", K(ret));
} else if (OB_FAIL(ObTransformUtils::extract_table_exprs(*child_stmt,
tmp,
table_set,
column_exprs))) {
LOG_WARN("failed to extract table exprs", K(ret));
} else if (OB_FAIL(ObTransformUtils::create_columns_for_view(ctx_, *semi_right_table, stmt,
column_exprs,
upper_column_exprs))) {
LOG_WARN("failed to create columns for view", K(ret));
} else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(pullup_exprs, pullup_subqueries))) {
LOG_WARN("failed to adjust subquery list", K(ret));
} else if (OB_FAIL(append_array_no_dup(stmt->get_subquery_exprs(), pullup_subqueries))) {
LOG_WARN("failed to append array no dup", K(ret));
} else if (OB_FAIL(child_stmt->adjust_subquery_list())) {
LOG_WARN("failed to adjust subquery list", K(ret));
}
}
// 4. remove right_tables
if (OB_SUCC(ret)) {
if (OB_FAIL(append(column_exprs, target_col_exprs)) ||
OB_FAIL(append(upper_column_exprs, source_col_exprs))) {
LOG_WARN("failed to append exprs", K(ret));
} else if (OB_FAIL(stmt->remove_table_item(semi_right_table))) {
ObSEArray<ObRawExpr*, 4> select_exprs;
if (OB_FAIL(stmt->remove_table_item(semi_right_table))) {
LOG_WARN("failed to remove table item", K(ret));
} else if (OB_FAIL(stmt->replace_relation_exprs(column_exprs, upper_column_exprs))) {
} else if (OB_FAIL(stmt->replace_relation_exprs(target_col_exprs, source_col_exprs))) {
LOG_WARN("failed to replace inner stmt expr", K(ret));
} else if (OB_FAIL(stmt->get_table_items().push_back(semi_right_table))) {
LOG_WARN("failed to push back table item", K(ret));
} else if (OB_FAIL(child_stmt->get_select_exprs(select_exprs))) {
LOG_WARN("failed to get child stmt select exprs", K(ret));
} else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt,
semi_right_table, &select_exprs))) {
LOG_WARN("failed to generate select list for shared exprs", K(ret));
} else if (OB_FAIL(child_stmt->rebuild_tables_hash())) {
LOG_WARN("rebuild table hash failed", K(ret));
} else if (OB_FAIL(child_stmt->update_column_item_rel_id())) {
@ -4008,4 +3976,3 @@ int ObTransformJoinElimination::construct_eliminated_table(const ObDMLStmt *stmt
} //namespace sql
} //namespace oceanbase