From a6117944b9989af7d5f098ddc88631a2f32e4b9a Mon Sep 17 00:00:00 2001 From: yinyj17 Date: Mon, 13 Nov 2023 10:09:17 +0000 Subject: [PATCH] fix transformer bugs caused by shared expr --- .../resolver/expr/ob_shared_expr_resolver.cpp | 3 +- .../rewrite/ob_transform_join_elimination.cpp | 51 ++++--------------- 2 files changed, 11 insertions(+), 43 deletions(-) diff --git a/src/sql/resolver/expr/ob_shared_expr_resolver.cpp b/src/sql/resolver/expr/ob_shared_expr_resolver.cpp index 660ecbd1f..723bb3cfb 100644 --- a/src/sql/resolver/expr/ob_shared_expr_resolver.cpp +++ b/src/sql/resolver/expr/ob_shared_expr_resolver.cpp @@ -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; diff --git a/src/sql/rewrite/ob_transform_join_elimination.cpp b/src/sql/rewrite/ob_transform_join_elimination.cpp index 17e2c09d6..f81925bd8 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.cpp +++ b/src/sql/rewrite/ob_transform_join_elimination.cpp @@ -1897,8 +1897,6 @@ int ObTransformJoinElimination::eliminate_semi_right_child_table(ObDMLStmt *stmt { int ret = OB_SUCCESS; ObSEArray pullup_conds; - ObSEArray column_exprs; - ObSEArray upper_column_exprs; ObSEArray pullup_column_exprs; ObSEArray 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 tmp; - ObSEArray pullup_exprs; - ObSEArray 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 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 -