From 0487d20e6db997f937fd638c34e07e7a2328d9ed Mon Sep 17 00:00:00 2001 From: jingtaoye35 <1255153887@qq.com> Date: Fri, 15 Mar 2024 03:15:37 +0000 Subject: [PATCH] adjust subquery_exprs in formalize_stmt --- src/sql/optimizer/ob_log_plan.cpp | 2 +- src/sql/optimizer/ob_optimizer_util.cpp | 3 +- src/sql/resolver/dml/ob_dml_stmt.cpp | 28 +- .../expr/ob_raw_expr_resolver_impl.cpp | 8 +- .../rewrite/ob_transform_aggr_subquery.cpp | 9 +- src/sql/rewrite/ob_transform_dblink.cpp | 6 +- src/sql/rewrite/ob_transform_expr_pullup.cpp | 29 +- src/sql/rewrite/ob_transform_expr_pullup.h | 1 - .../rewrite/ob_transform_groupby_pullup.cpp | 4 +- .../rewrite/ob_transform_join_elimination.cpp | 3 - src/sql/rewrite/ob_transform_or_expansion.cpp | 67 ++--- src/sql/rewrite/ob_transform_pre_process.cpp | 32 +- src/sql/rewrite/ob_transform_simplify_set.cpp | 10 +- .../ob_transform_subquery_coalesce.cpp | 274 ++++++++---------- src/sql/rewrite/ob_transform_utils.cpp | 13 +- .../ob_transform_where_subquery_pullup.cpp | 18 +- 16 files changed, 185 insertions(+), 322 deletions(-) diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index aa296a7ca..2e7c18d45 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -9848,7 +9848,7 @@ int ObLogPlan::check_if_subplan_filter_match_repart(ObLogicalOperator *top, right_keys, null_safe_info))) { LOG_WARN("failed to get equal join key", K(ret)); - } else if (child->get_strong_sharding()->get_all_partition_keys(target_part_keys, true)) { + } else if (OB_FAIL(child->get_strong_sharding()->get_all_partition_keys(target_part_keys, true))) { LOG_WARN("failed to get partition keys", K(ret)); } else if (OB_FAIL(ObShardingInfo::check_if_match_repart_or_rehash(input_esets, left_keys, diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index 1957de997..0dfcca5cc 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -3223,10 +3223,11 @@ int ObOptimizerUtil::get_fd_set_parent_exprs(const ObIArray &fd_item for (int64_t i = 0; OB_SUCC(ret) && i < fd_item_set.count(); ++i) { if (OB_ISNULL(fd_item = fd_item_set.at(i)) || OB_ISNULL(parent_exprs = fd_item->get_parent_exprs())) { + ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); } else { for (int64_t j = 0; OB_SUCC(ret) && j < parent_exprs->count(); ++j) { - if (add_var_to_array_no_dup(fd_set_parent_exprs, parent_exprs->at(j))) { + if (OB_FAIL(add_var_to_array_no_dup(fd_set_parent_exprs, parent_exprs->at(j)))) { LOG_WARN("failed to append array no dup", K(ret)); } } diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index 9f0694ad2..4a4d836da 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -1754,6 +1754,7 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info) LOG_WARN("get relation exprs failed", K(ret)); } else { // rel id maintenance of dependent exprs + subquery_exprs_.reset(); for (int64_t i = 0; OB_SUCC(ret) && i < column_items_.count(); i++) { ObColumnRefRawExpr *column_expr = NULL; if (OB_ISNULL(column_expr = column_items_.at(i).expr_)) { @@ -1777,6 +1778,7 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info) ret = OB_ERR_UNEXPECTED; LOG_WARN("expr is NULL", K(ret)); } else if (OB_FAIL(expr->formalize(session_info))) { + // 'formalize' method calls 'extract_info' and 'decude_type' methods inside LOG_WARN("failed to formalize expr", K(ret)); } else if (OB_FAIL(expr->pull_relation_id())) { LOG_WARN("pull expr relation ids failed", K(ret), K(*expr)); @@ -1784,6 +1786,8 @@ int ObDMLStmt::formalize_relation_exprs(ObSQLSessionInfo *session_info) // zhanyue todo: adjust this. // Add IS_JOIN_COND flag need use expr relation_ids, here call extract_info() again. LOG_WARN("failed to extract info", K(*expr)); + } else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(expr, subquery_exprs_, true))) { + LOG_WARN("failed to extract query ref expr", K(ret)); } } } @@ -1802,6 +1806,17 @@ int ObDMLStmt::formalize_stmt_expr_reference(ObRawExprFactory *expr_factory, } else if (OB_FAIL(get_relation_exprs(stmt_exprs))) { LOG_WARN("get relation exprs failed", K(ret)); } else { + // SQL DEFENSIVE CODE + for (int64_t i = 0; OB_SUCC(ret) && i < subquery_exprs_.count(); ++i) { + ObQueryRefRawExpr *query_ref = subquery_exprs_.at(i); + if (OB_ISNULL(query_ref)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("query ref expr is null", K(ret)); + } else if (OB_UNLIKELY(query_ref->is_explicited_reference())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("query ref expr is referenced at two different levels", K(ret)); + } + } for (int64_t i = 0; OB_SUCC(ret) && i < stmt_exprs.count(); i++) { if (OB_ISNULL(stmt_exprs.at(i))) { ret = OB_ERR_UNEXPECTED; @@ -1838,8 +1853,6 @@ int ObDMLStmt::formalize_stmt_expr_reference(ObRawExprFactory *expr_factory, return ret; } - - int ObDMLStmt::formalize_child_stmt_expr_reference(ObRawExprFactory *expr_factory, ObSQLSessionInfo *session_info) { @@ -1952,10 +1965,12 @@ int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, ExplicitedRefType re LOG_WARN("failed to find pseudo column", K(ret), K(expr)); } else if (expr.is_query_ref_expr() && !ObRawExprUtils::find_expr(get_subquery_exprs(), &expr)) { + // SQL DEFENSIVE CODE ret = OB_ERR_UNEXPECTED; LOG_WARN("query ref expr does not exist in the stmt", K(ret), K(expr)); } else if (is_select_stmt() && OB_FAIL(static_cast(this)->check_aggr_and_winfunc(expr))) { + // SQL DEFENSIVE CODE LOG_WARN("failed to check aggr and winfunc validity", K(ret)); } } else if (expr.is_exec_param_expr()) { @@ -2146,14 +2161,6 @@ int ObDMLStmt::clear_sharable_expr_reference() expr->clear_explicited_referece(); } } - for (int64_t i = 0; OB_SUCC(ret) && i < subquery_exprs_.count(); i++) { - if (OB_ISNULL(subquery_exprs_.at(i))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); - } else { - subquery_exprs_.at(i)->clear_explicited_referece(); - } - } for (int64_t i = 0; OB_SUCC(ret) && i < pseudo_column_like_exprs_.count(); i++) { if (OB_ISNULL(pseudo_column_like_exprs_.at(i))) { ret = OB_ERR_UNEXPECTED; @@ -2168,6 +2175,7 @@ int ObDMLStmt::clear_sharable_expr_reference() ret = OB_ERR_UNEXPECTED; LOG_WARN("query ref expr is null", K(ret)); } else { + query_ref->clear_explicited_referece(); for (int64_t j = 0; OB_SUCC(ret) && j < query_ref->get_exec_params().count(); ++j) { ObExecParamRawExpr *exec_param = query_ref->get_exec_params().at(j); if (OB_ISNULL(exec_param)) { diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 67beebab5..9f5de1ac2 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -415,10 +415,9 @@ int ObRawExprResolverImpl::do_recursive_resolve(const ParseNode *node, ObRawExpr uint64_t dep_obj_id = ctx_.view_ref_id_; if (OB_FAIL(stmt->add_global_dependency_table(udt_schema_version))) { LOG_WARN("failed to add global dependency", K(ret)); - } else if (stmt->add_ref_obj_version(dep_obj_id, db_id, - ObObjectType::VIEW, - udt_schema_version, - ctx_.expr_factory_.get_allocator())) { + } else if (OB_FAIL(stmt->add_ref_obj_version(dep_obj_id, db_id, + ObObjectType::VIEW, udt_schema_version, + ctx_.expr_factory_.get_allocator()))) { LOG_WARN("failed to add ref obj version", K(ret)); } } @@ -3540,6 +3539,7 @@ int ObRawExprResolverImpl::process_between_node(const ParseNode *node, ObRawExpr if (OB_FAIL(recursive_resolve(node->children_[0], btw_params[BTW_PARAM_NUM]))) { SQL_RESV_LOG(WARN, "resolve child expr failed", K(ret), K(BTW_PARAM_NUM)); } else if (OB_ISNULL(btw_params[BTW_PARAM_NUM])) { + ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret), K(BTW_PARAM_NUM)); } } diff --git a/src/sql/rewrite/ob_transform_aggr_subquery.cpp b/src/sql/rewrite/ob_transform_aggr_subquery.cpp index d334727fe..a98e3036c 100644 --- a/src/sql/rewrite/ob_transform_aggr_subquery.cpp +++ b/src/sql/rewrite/ob_transform_aggr_subquery.cpp @@ -949,8 +949,6 @@ int ObTransformAggrSubquery::transform_upper_stmt(ObDMLStmt &stmt, TransformPara OB_ISNULL(subquery = query_expr->get_ref_stmt())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("params are invalid", K(ret), K(ctx_), K(subquery)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt.get_subquery_exprs(), query_expr))) { - LOG_WARN("failed to remove subquery expr", K(ret)); } else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, &stmt, subquery, view_table))) { LOG_WARN("failed to add new table item", K(ret)); } else if (OB_ISNULL(view_table)) { @@ -1724,10 +1722,7 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt, } } if (OB_SUCC(ret)) { - if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt.get_subquery_exprs(), - query_ref_expr))) { - LOG_WARN("failed to remove query ref expr", K(ret)); - } else if (is_exists_op(root_expr->get_expr_type())) { + if (is_exists_op(root_expr->get_expr_type())) { bool need_lnnvl = root_expr->get_expr_type() == T_OP_NOT_EXISTS; if (OB_FAIL(ObOptimizerUtil::remove_item(select_stmt.get_condition_exprs(), root_expr))) { LOG_WARN("failed to remove exprs", K(ret)); @@ -1768,8 +1763,6 @@ int ObTransformAggrSubquery::do_join_first_transform(ObSelectStmt &select_stmt, LOG_WARN("failed to append check constraint items", K(ret)); } else if (OB_FAIL(append(select_stmt.get_aggr_items(), subquery->get_aggr_items()))) { LOG_WARN("failed to append aggr items", K(ret)); - } else if (OB_FAIL(append(select_stmt.get_subquery_exprs(), subquery->get_subquery_exprs()))) { - LOG_WARN("failed to append subquery exprs", K(ret)); } else if (OB_FAIL(select_stmt.rebuild_tables_hash())) { LOG_WARN("failed to rebuild table hash", K(ret)); } else if (OB_FAIL(select_stmt.update_column_item_rel_id())) { diff --git a/src/sql/rewrite/ob_transform_dblink.cpp b/src/sql/rewrite/ob_transform_dblink.cpp index 87ad3ee28..227eb9655 100644 --- a/src/sql/rewrite/ob_transform_dblink.cpp +++ b/src/sql/rewrite/ob_transform_dblink.cpp @@ -1368,7 +1368,8 @@ int ObTransformDBlink::inner_pack_link_table(ObDMLStmt *stmt, LinkTableHelper &h helper.is_reverse_link_ ? 0 : helper.dblink_id_))) { LOG_WARN("failed to reverse link table", K(ret)); - } else if (ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), helper.conditions_)) { + } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), + helper.conditions_))) { LOG_WARN("failed to remove item", K(ret)); } else if (OB_FAIL(ObTransformUtils::replace_with_empty_view(ctx_, stmt, @@ -1425,7 +1426,8 @@ int ObTransformDBlink::extract_limit(ObDMLStmt *stmt, ObDMLStmt *&dblink_stmt) || stmt->is_fetch_with_ties() || NULL != stmt->get_limit_percent_expr()) { dblink_stmt = stmt; - } else if (ObTransformUtils::pack_stmt(ctx_, static_cast(stmt), &child_stmt)) { + } else if (OB_FAIL(ObTransformUtils::pack_stmt(ctx_, static_cast(stmt), + &child_stmt))) { LOG_WARN("failed to pack the stmt", K(ret)); } else { stmt->set_limit_offset(child_stmt->get_limit_expr(), child_stmt->get_offset_expr()); diff --git a/src/sql/rewrite/ob_transform_expr_pullup.cpp b/src/sql/rewrite/ob_transform_expr_pullup.cpp index 170cc93fc..f02c7874b 100644 --- a/src/sql/rewrite/ob_transform_expr_pullup.cpp +++ b/src/sql/rewrite/ob_transform_expr_pullup.cpp @@ -546,29 +546,6 @@ int ObTransformExprPullup::search_expr_cannot_pullup(ObRawExpr *expr, return ret; } -int ObTransformExprPullup::adjust_subquery(ObRawExpr *expr, - ObSelectStmt &child, - ObSelectStmt &parent) -{ - int ret = OB_SUCCESS; - if (OB_ISNULL(expr)) { - ret = OB_ERR_UNEXPECTED; - } else if (expr->is_query_ref_expr() - && !ObRawExprUtils::find_expr(parent.get_subquery_exprs(), expr)) { - ObQueryRefRawExpr &query_ref = static_cast(*expr); - if (OB_FAIL(parent.add_subquery_ref(&query_ref))) { - LOG_WARN("fail to add subquery ref", K(ret)); - } - } - - for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); i++) { - if (OB_FAIL(SMART_CALL(adjust_subquery(expr->get_param_expr(i), child, parent)))) { - LOG_WARN("fail to preorder search expr", K(ret)); - } - } - return ret; -} - int ObTransformExprPullup::rewrite_decision_by_hint(ObSelectStmt &parent, ObSelectStmt &child, bool stmt_may_reduce_row_count, @@ -793,8 +770,6 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view, expr_params, new_child_project_columns))) { LOG_WARN("failed to create select item", K(ret)); - } else if (OB_FAIL(child.adjust_subquery_list())) { - LOG_WARN("fail to adjust subquery list", K(ret)); } } @@ -809,8 +784,6 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view, for (int64_t i = 0; OB_SUCC(ret) && i < select_exprs_can_pullup.count(); i++) { if (OB_FAIL(select_exprs_can_pullup.at(i)->formalize(ctx_->session_info_))) { LOG_WARN("fail to formalize expr", K(ret)); - } else if (OB_FAIL(adjust_subquery(select_exprs_can_pullup.at(i), child, parent))) { - LOG_WARN("fail to add subquery ref", K(ret)); } } } @@ -822,6 +795,8 @@ int ObTransformExprPullup::pullup_expr_from_view(TableItem *view, LOG_WARN("fail to replace inner stmt expr", K(ret)); } else if (OB_FAIL(parent.formalize_stmt(ctx_->session_info_))) { LOG_WARN("fail to formalize stmt", K(ret)); + } else if (OB_FAIL(child.formalize_stmt(ctx_->session_info_))) { + LOG_WARN("fail to formalize stmt", K(ret)); } } } diff --git a/src/sql/rewrite/ob_transform_expr_pullup.h b/src/sql/rewrite/ob_transform_expr_pullup.h index e8c6be1fe..f26972ae2 100644 --- a/src/sql/rewrite/ob_transform_expr_pullup.h +++ b/src/sql/rewrite/ob_transform_expr_pullup.h @@ -82,7 +82,6 @@ private: int search_expr_cannot_pullup(ObRawExpr *expr, ObExprNodeMap &expr_map, common::ObIArray &expr_cannot_pullup); - int adjust_subquery(ObRawExpr *expr, ObSelectStmt &child, ObSelectStmt &parent); int is_stmt_may_reduce_row_count(const ObSelectStmt &stmt, bool &is_true); static bool is_view_acceptable_for_rewrite(TableItem &view); diff --git a/src/sql/rewrite/ob_transform_groupby_pullup.cpp b/src/sql/rewrite/ob_transform_groupby_pullup.cpp index eb6f4ace6..c6c489a41 100644 --- a/src/sql/rewrite/ob_transform_groupby_pullup.cpp +++ b/src/sql/rewrite/ob_transform_groupby_pullup.cpp @@ -788,9 +788,7 @@ int ObTransformGroupByPullup::do_groupby_pull_up(ObSelectStmt *stmt, subquery->get_group_exprs().reset(); subquery->get_aggr_items().reset(); subquery->get_having_exprs().reset(); - if (OB_FAIL(subquery->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, table_item))) { + if (OB_FAIL(ObTransformUtils::generate_select_list(ctx_, stmt, table_item))) { LOG_WARN("failed to generate select list", K(ret)); } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("failed to formalize stmt", K(ret)); diff --git a/src/sql/rewrite/ob_transform_join_elimination.cpp b/src/sql/rewrite/ob_transform_join_elimination.cpp index 8ec10790e..16d4f751f 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.cpp +++ b/src/sql/rewrite/ob_transform_join_elimination.cpp @@ -2299,9 +2299,6 @@ int ObTransformJoinElimination::try_remove_semi_info(ObDMLStmt *stmt, LOG_WARN("failed to replace relation expr", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_semi_infos(), semi_info))) { LOG_WARN("failed to remove item", K(ret)); - } else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(child_stmt->get_condition_exprs(), - stmt->get_subquery_exprs()))) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(append(semi_info->semi_conditions_, child_stmt->get_condition_exprs()))) { LOG_WARN("failed to append exprs", K(ret)); } else if (OB_FAIL(trans_semi_condition_exprs(stmt, semi_info))) { diff --git a/src/sql/rewrite/ob_transform_or_expansion.cpp b/src/sql/rewrite/ob_transform_or_expansion.cpp index 9d3f2e13e..b35ecb9a5 100644 --- a/src/sql/rewrite/ob_transform_or_expansion.cpp +++ b/src/sql/rewrite/ob_transform_or_expansion.cpp @@ -2277,6 +2277,7 @@ int ObTransformOrExpansion::adjust_or_expansion_stmt(ObIArray *conds ObRawExprFactory *expr_factory = NULL; ObRawExpr *transformed_expr = NULL; ObSEArray removed_subqueries; + ObSEArray generated_exprs; if (OB_ISNULL(conds_exprs) || OB_ISNULL(ctx_) || OB_ISNULL(session_info = ctx_->session_info_) || OB_ISNULL(expr_factory = ctx_->expr_factory_)) { @@ -2291,54 +2292,28 @@ int ObTransformOrExpansion::adjust_or_expansion_stmt(ObIArray *conds } else if (OB_ISNULL(transformed_expr = conds_exprs->at(expr_pos))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("null transformed expr", K(ret)); - } else if (OB_FAIL(conds_exprs->remove(expr_pos))) { - LOG_WARN("failed to remove condition expr", K(ret)); - } else if (T_OP_OR == transformed_expr->get_expr_type()) { - ObSEArray generated_exprs; - if (OB_FAIL(create_expr_for_or_expr(*transformed_expr, - param_pos, - ctx, - generated_exprs))) { - LOG_WARN("failed to create expr", K(ret)); - } else if (OB_FAIL(append(*conds_exprs, generated_exprs))) { - LOG_WARN("failed to append expr", K(ret)); - } else { /*do nothing*/ } - } else if (T_OP_IN == transformed_expr->get_expr_type()) { - ObSEArray generated_exprs; - if (OB_FAIL(create_expr_for_in_expr(*transformed_expr, - param_pos, - ctx, - generated_exprs))) { - LOG_WARN("failed to create expr", K(ret), K(generated_exprs)); - } else if (OB_FAIL(append(*conds_exprs, generated_exprs))) { - LOG_WARN("failed to append exprs", K(ret)); - } else { /*do nothing*/ } - } else { + } else if (OB_UNLIKELY(T_OP_IN != transformed_expr->get_expr_type() && + T_OP_OR != transformed_expr->get_expr_type())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected expr type", K(transformed_expr->get_expr_type()), K(ret)); - } - if (OB_SUCC(ret)) { - if (OB_FAIL(or_expansion_stmt->formalize_stmt(session_info))) { - LOG_WARN("failed to formalize stmt", K(ret)); - } else { - // clean unused subqueries - ObSEArray relation_exprs; - ObSEArray used_subquery_exprs; - if (OB_FAIL(or_expansion_stmt->get_relation_exprs(relation_exprs))) { - LOG_WARN("failed to get relation exprs"); - } else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(relation_exprs, used_subquery_exprs))) { - LOG_WARN("failed to get query exprs"); - } else { - for (int64_t i = 0; OB_SUCC(ret) && i < or_expansion_stmt->get_subquery_exprs().count(); ++i) { - ObQueryRefRawExpr *expr = or_expansion_stmt->get_subquery_exprs().at(i); - if (ObOptimizerUtil::find_item(used_subquery_exprs, expr)) { - // do nothing - } else if (OB_FAIL(ObOptimizerUtil::remove_item(or_expansion_stmt->get_subquery_exprs(), expr))) { - LOG_WARN("failed to remove item from subquery exprs", K(ret)); - } - } - } - } + } else if (OB_FAIL(conds_exprs->remove(expr_pos))) { + LOG_WARN("failed to remove condition expr", K(ret)); + } else if (T_OP_OR == transformed_expr->get_expr_type() && + OB_FAIL(create_expr_for_or_expr(*transformed_expr, + param_pos, + ctx, + generated_exprs))) { + LOG_WARN("failed to create expr", K(ret)); + } else if (T_OP_IN == transformed_expr->get_expr_type() && + OB_FAIL(create_expr_for_in_expr(*transformed_expr, + param_pos, + ctx, + generated_exprs))) { + LOG_WARN("failed to create expr", K(ret), K(generated_exprs)); + } else if (OB_FAIL(append(*conds_exprs, generated_exprs))) { + LOG_WARN("failed to append expr", K(ret)); + } else if (OB_FAIL(or_expansion_stmt->formalize_stmt(session_info))) { + LOG_WARN("failed to formalize stmt", K(ret)); } return ret; } diff --git a/src/sql/rewrite/ob_transform_pre_process.cpp b/src/sql/rewrite/ob_transform_pre_process.cpp index 2bd8e13a6..395dae684 100644 --- a/src/sql/rewrite/ob_transform_pre_process.cpp +++ b/src/sql/rewrite/ob_transform_pre_process.cpp @@ -2173,8 +2173,6 @@ int ObTransformPreProcess::create_connect_by_view(ObSelectStmt &stmt) } else if (view_stmt->get_select_item_size() == 0 && OB_FAIL(ObTransformUtils::create_dummy_select_item(*view_stmt, ctx_))) { LOG_WARN("failed to create dummy select item", K(ret)); - } else if (OB_FAIL(view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*view_stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } @@ -2183,13 +2181,7 @@ int ObTransformPreProcess::create_connect_by_view(ObSelectStmt &stmt) TableItem *table_item = NULL; ObSEArray columns; if (OB_SUCC(ret)) { - if (OB_FAIL(ObOptimizerUtil::remove_item(stmt.get_subquery_exprs(), - view_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to remove subqueries", K(ret)); - } else if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, - &stmt, - view_stmt, - table_item))) { + if (OB_FAIL(ObTransformUtils::add_new_table_item(ctx_, &stmt, view_stmt, table_item))) { LOG_WARN("failed to add new table item", K(ret)); } else if (OB_ISNULL(table_item)) { ret = OB_ERR_UNEXPECTED; @@ -2337,8 +2329,8 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt) } else if (left_view_stmt->get_select_item_size() == 0 && OB_FAIL(ObTransformUtils::create_dummy_select_item(*left_view_stmt, ctx_))) { LOG_WARN("failed to create dummy select item", K(ret)); - } else if (OB_FAIL(left_view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); + } else if (OB_FAIL(left_view_stmt->formalize_stmt(session_info))) { + LOG_WARN("failed to formalize stmt", K(ret)); } } // 5. copy left stmt to right stmt @@ -2398,10 +2390,6 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt) if (OB_SUCC(ret)) { if (OB_FAIL(left_view_stmt->add_condition_exprs(left_view_stmt->get_start_with_exprs()))) { LOG_WARN("failed to push start with exprs to view", K(ret)); - } else if (OB_FAIL(left_view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(right_view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*left_view_stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(*right_view_stmt))) { @@ -2488,11 +2476,7 @@ int ObTransformPreProcess::create_and_mock_join_view(ObSelectStmt &stmt) // 11. replace expr in parent stmt and formalize if (OB_SUCC(ret)) { - if (OB_FAIL(ObOptimizerUtil::remove_item(stmt.get_subquery_exprs(), - left_view_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to remove subqueries", K(ret)); - } else if (!select_list.empty() - && OB_FAIL(stmt.replace_relation_exprs(select_list, right_columns))) { + if (!select_list.empty() && OB_FAIL(stmt.replace_relation_exprs(select_list, right_columns))) { LOG_WARN("failed to replace inner stmt expr", K(ret)); } else if (OB_FAIL(ObTransformUtils::adjust_pseudo_column_like_exprs(stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); @@ -5233,12 +5217,12 @@ int ObTransformPreProcess::transform_insert_only_merge_into(ObDMLStmt* stmt, ObD LOG_WARN("failed to assign semi infos", K(ret)); } else if (OB_FAIL(select_stmt->replace_relation_exprs(old_column_exprs, new_column_exprs))) { LOG_WARN("failed to replace relation exprs", K(ret)); - } else if (OB_FAIL(select_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(transform_exprs(select_stmt, dummy))) { LOG_WARN("failed to transform exprs", K(ret)); - } else if (OB_FAIL(insert_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); + } else if (OB_FAIL(select_stmt->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); + } else if (OB_FAIL(insert_stmt->formalize_stmt(ctx_->session_info_))) { + LOG_WARN("failed to formalize stmt", K(ret)); } else { out = insert_stmt; } diff --git a/src/sql/rewrite/ob_transform_simplify_set.cpp b/src/sql/rewrite/ob_transform_simplify_set.cpp index cbb7bc350..9d63e58de 100644 --- a/src/sql/rewrite/ob_transform_simplify_set.cpp +++ b/src/sql/rewrite/ob_transform_simplify_set.cpp @@ -74,14 +74,8 @@ int ObTransformSimplifySet::transform_one_stmt(common::ObIArray } } } - if (OB_SUCC(ret)) { - if (!trans_happened) { - // do nothing - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(add_transform_hint(*stmt, NULL))) { - LOG_WARN("failed to add transform hint", K(ret)); - } + if (OB_SUCC(ret) && trans_happened && OB_FAIL(add_transform_hint(*stmt, NULL))) { + LOG_WARN("failed to add transform hint", K(ret)); } return ret; } diff --git a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp index 3e5b1f02a..d0313ea3e 100644 --- a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp +++ b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp @@ -905,15 +905,9 @@ int ObTransformSubqueryCoalesce::coalesce_diff_any_all_exprs(ObDMLStmt *stmt, LOG_WARN("failed to remove item", K(ret)); } else if (OB_FAIL(cond_exprs.push_back(new_any_all_expr))) { LOG_WARN("failed to push back new any all expr", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), any_ref_expr))) { - LOG_WARN("failed to remove subquery ref expr", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), all_ref_expr))) { - LOG_WARN("failed to remove subquery ref expr", K(ret)); } else if (OB_ISNULL(new_any_all_query = get_any_all_query_expr(new_any_all_expr))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("the new any all expr is invalid", K(ret)); - } else if (OB_FAIL(stmt->get_subquery_exprs().push_back(new_any_all_query))) { - LOG_WARN("failed to push back new any all query", K(ret)); } else if (OB_FAIL(stmt->pull_all_expr_relation_id())) { LOG_WARN("failed to form pull up expr id and level", K(ret)); } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { @@ -933,14 +927,13 @@ int ObTransformSubqueryCoalesce::merge_exists_subqueries(TransformParam &trans_p int ret = OB_SUCCESS; ObRawExprFactory *expr_factory = NULL; ObStmtFactory *stmt_factory = NULL; - ObSEArray old_cols; - ObSEArray new_cols; ObSEArray extra_conds; ObQueryRefRawExpr *exist_query_ref = NULL; ObQueryRefRawExpr *not_exist_query_ref = NULL; ObQueryRefRawExpr *new_query_ref = NULL; ObSelectStmt *exist_stmt = NULL; ObSelectStmt *not_exist_stmt = NULL; + ObDMLStmt *tmp_stmt = NULL; ObSelectStmt *new_exist_stmt = NULL; ObSEArray old_exec_params; ObSEArray new_exec_params; @@ -967,85 +960,67 @@ int ObTransformSubqueryCoalesce::merge_exists_subqueries(TransformParam &trans_p LOG_WARN("failed to create query ref expr", K(ret)); } else if (OB_FAIL(new_query_ref->assign(*exist_query_ref))) { LOG_WARN("failed to assign query ref expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::copy_stmt(*stmt_factory, - exist_stmt, - reinterpret_cast(new_exist_stmt)))) { - LOG_WARN("failed to copy exist stmt", K(ret)); - } else if (OB_FAIL(new_exist_stmt->adjust_statement_id(ctx_->allocator_, - ctx_->src_qb_name_, - ctx_->src_hash_val_))) { - LOG_WARN("failed to adjust statement id", K(ret)); + } else if (OB_FAIL(ObTransformUtils::deep_copy_stmt(*stmt_factory, *expr_factory, exist_stmt, + tmp_stmt))) { + LOG_WARN("failed to deep copy stmt", K(ret)); } else { + new_exist_stmt = static_cast(tmp_stmt); new_query_ref->set_ref_stmt(new_exist_stmt); new_exist_expr->get_param_expr(0) = new_query_ref; - } - if (OB_SUCC(ret)) { - if (OB_FAIL(merge_exec_params(not_exist_query_ref, - new_query_ref, - old_exec_params, - new_exec_params))) { - LOG_WARN("failed to merge exec params", K(ret)); - } - } - if (OB_SUCC(ret)) { - - } - for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) { - ColumnItem &col_item = not_exist_stmt->get_column_items().at(i); - ObColumnRefRawExpr *col_expr = not_exist_stmt->get_column_items().at(i).expr_; - ObRawExpr *new_expr = NULL; - TableItem *new_table_item = NULL; - ObRawExpr *error_expr = NULL; - ObRawExpr *empty_expr = NULL; - int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1; - if (idx < 0 || idx >= map_info.table_map_.count() || - map_info.table_map_.at(idx) < 0 || - map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size() || - OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table is not mapped", K(ret), K(idx)); - } else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id(new_table_item->table_id_, - col_item.column_id_))) { - // do nothing - } else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.expr_, new_expr))) { - LOG_WARN("failed to copy expr node", K(ret)); - } else if (OB_NOT_NULL(col_item.default_value_expr_) - && OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_value_expr_, error_expr))) { - LOG_WARN("failed to error expr node", K(ret)); - } else if (OB_NOT_NULL(col_item.default_empty_expr_) - && OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_empty_expr_, empty_expr))) { - LOG_WARN("failed to empty expr node", K(ret)); - } else { - ColumnItem new_col_item; - new_col_item.table_id_ = new_table_item->table_id_; - new_col_item.column_id_ = col_item.column_id_; - new_col_item.column_name_ = col_item.column_name_; - new_col_item.default_value_expr_ = error_expr; - new_col_item.default_empty_expr_ = empty_expr; - new_col_item.expr_ = static_cast(new_expr); - new_col_item.expr_->set_table_id(new_table_item->table_id_); - new_col_item.expr_->set_table_name(new_table_item->table_name_); - new_col_item.is_geo_ = col_item.is_geo_; - new_col_item.col_idx_= col_item.col_idx_; - if (OB_FAIL(new_exist_stmt->add_column_item(new_col_item))) { - LOG_WARN("failed to add column item", K(ret)); - } - } - if (OB_SUCC(ret)) { - if (OB_FAIL(old_cols.push_back(col_expr))) { - LOG_WARN("failed to append column expr", K(ret)); - } else if (OB_FAIL(new_cols.push_back(new_expr))) { - LOG_WARN("failed to append column expr", K(ret)); - } - } - } - - if (OB_SUCC(ret)) { ObRawExprCopier copier(*expr_factory); - if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) { - LOG_WARN("failed to add replace pair", K(ret)); - } else if (OB_FAIL(copier.add_replaced_expr(old_cols, new_cols))) { + if (OB_FAIL(merge_exec_params(not_exist_query_ref, new_query_ref, + old_exec_params, new_exec_params))) { + LOG_WARN("failed to merge exec params", K(ret)); + } else if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) { LOG_WARN("failed to add replace pair", K(ret)); + } else { /* do nothing */ } + for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) { + ColumnItem &col_item = not_exist_stmt->get_column_items().at(i); + ColumnItem new_col_item; + ObRawExpr *new_expr = NULL; + TableItem *new_table_item = NULL; + int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1; + if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() || + map_info.table_map_.at(idx) < 0 || + map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size()) || + OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table is not mapped", K(ret), K(idx)); + } else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id( + new_table_item->table_id_, col_item.column_id_))) { + if (OB_FAIL(copier.add_replaced_expr(col_item.expr_, new_expr))) { + LOG_WARN("failed to add replace pair", K(ret)); + } + } else { /* do nothing */ } + } + for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_column_size(); ++i) { + ColumnItem &col_item = not_exist_stmt->get_column_items().at(i); + ColumnItem new_col_item; + ObRawExpr *new_expr = NULL; + TableItem *new_table_item = NULL; + int64_t idx = not_exist_stmt->get_table_bit_index(col_item.table_id_) - 1; + if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() || + map_info.table_map_.at(idx) < 0 || + map_info.table_map_.at(idx) >= new_exist_stmt->get_table_size()) || + OB_ISNULL(new_table_item = new_exist_stmt->get_table_item(map_info.table_map_.at(idx)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table is not mapped", K(ret), K(idx)); + } else if (OB_NOT_NULL(new_expr = new_exist_stmt->get_column_expr_by_id( + new_table_item->table_id_, col_item.column_id_))) { + /* do nothing */ + } else if (OB_FAIL(new_col_item.deep_copy(copier, col_item))) { + LOG_WARN("failed to deep copy column items", K(ret)); + } else if (OB_ISNULL(new_col_item.expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column item isn't init", K(ret)); + } else { + new_col_item.table_id_ = new_table_item->table_id_; + new_col_item.expr_->set_table_id(new_table_item->table_id_); + new_col_item.expr_->set_table_name(new_table_item->table_name_); + if (OB_FAIL(new_exist_stmt->add_column_item(new_col_item))) { + LOG_WARN("failed to add column item", K(ret)); + } + } } for (int64_t i = 0; OB_SUCC(ret) && i < not_exist_stmt->get_condition_size(); ++i) { ObRawExpr *new_cond_expr = NULL; @@ -1124,14 +1099,13 @@ int ObTransformSubqueryCoalesce::merge_any_all_subqueries(ObQueryRefRawExpr *any int ret = OB_SUCCESS; ObRawExprFactory *expr_factory = NULL; ObStmtFactory *stmt_factory = NULL; - ObSEArray old_cols; - ObSEArray new_cols; ObSEArray extra_conds; ObSEArray old_exec_params; ObSEArray new_exec_params; ObQueryRefRawExpr *new_query_ref = NULL; ObSelectStmt *any_stmt = NULL; ObSelectStmt *all_stmt = NULL; + ObDMLStmt *tmp_stmt = NULL; ObSelectStmt *new_any_stmt = NULL; const ObStmtMapInfo &map_info = trans_param.map_info_; if (OB_ISNULL(ctx_) || @@ -1147,90 +1121,74 @@ int ObTransformSubqueryCoalesce::merge_any_all_subqueries(ObQueryRefRawExpr *any LOG_WARN("any/all exprs are not valid", K(ret), K(expr_factory), K(stmt_factory), K(any_query_ref), K(all_query_ref), K(any_stmt), K(all_stmt)); } else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, - trans_param.any_expr_, - new_any_all_query))) { + trans_param.any_expr_, + new_any_all_query))) { LOG_WARN("failed to copy expr node", K(ret)); } else if (OB_FAIL(expr_factory->create_raw_expr(T_REF_QUERY, new_query_ref))) { LOG_WARN("failed to create query ref expr", K(ret)); } else if (OB_FAIL(new_query_ref->assign(*any_query_ref))) { LOG_WARN("failed to assign query ref expr", K(ret)); - } else if (OB_FAIL(ObTransformUtils::copy_stmt(*stmt_factory, - any_stmt, - reinterpret_cast(new_any_stmt)))) { - LOG_WARN("failed to copy any stmt", K(ret)); - } else if (OB_FAIL(new_any_stmt->adjust_statement_id(ctx_->allocator_, - ctx_->src_qb_name_, - ctx_->src_hash_val_))) { - LOG_WARN("failed to adjust statement id", K(ret)); + } else if (OB_FAIL(ObTransformUtils::deep_copy_stmt(*stmt_factory, *expr_factory, any_stmt, + tmp_stmt))) { + LOG_WARN("failed to deep copy stmt", K(ret)); } else { + new_any_stmt = static_cast(tmp_stmt); new_query_ref->set_ref_stmt(new_any_stmt); new_any_all_query->get_param_expr(1) = new_query_ref; - } - if (OB_SUCC(ret)) { - if (OB_FAIL(merge_exec_params(all_query_ref, - any_query_ref, - old_exec_params, - new_exec_params))) { - LOG_WARN("failed to merge exec params", K(ret)); - } - } - - for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) { - ColumnItem &col_item = all_stmt->get_column_items().at(i); - ObColumnRefRawExpr *col_expr = all_stmt->get_column_items().at(i).expr_; - ObRawExpr *new_expr = NULL; - TableItem *new_table_item = NULL; - ObRawExpr *error_expr = NULL; - ObRawExpr *empty_expr = NULL; - int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1; - if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() || - map_info.table_map_.at(idx) < 0 || - map_info.table_map_.at(idx) >= new_any_stmt->get_table_size() || - OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx))))) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("table is not mapped", K(ret), K(idx)); - } else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id(new_table_item->table_id_, - col_item.column_id_))) { - // do nothing - } else if (OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.expr_, new_expr))) { - LOG_WARN("failed to copy expr node", K(ret)); - } else if (OB_NOT_NULL(col_item.default_value_expr_) - && OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_value_expr_, error_expr))) { - LOG_WARN("failed to error expr node", K(ret)); - } else if (OB_NOT_NULL(col_item.default_empty_expr_) - && OB_FAIL(ObRawExprCopier::copy_expr_node(*expr_factory, col_item.default_empty_expr_, empty_expr))) { - LOG_WARN("failed to empty expr node", K(ret)); - } else { - ColumnItem new_col_item; - new_col_item.table_id_ = new_table_item->table_id_; - new_col_item.column_id_ = col_item.column_id_; - new_col_item.column_name_ = col_item.column_name_; - new_col_item.expr_ = static_cast(new_expr); - new_col_item.expr_->set_table_id(new_table_item->table_id_); - new_col_item.expr_->set_table_name(new_table_item->table_name_); - new_col_item.is_geo_ = col_item.is_geo_; - new_col_item.default_value_expr_ = error_expr; - new_col_item.default_empty_expr_ = empty_expr; - new_col_item.col_idx_= col_item.col_idx_; - if (OB_FAIL(new_any_stmt->add_column_item(new_col_item))) { - LOG_WARN("failed to add column item", K(ret)); - } - } - if (OB_SUCC(ret)) { - if (OB_FAIL(old_cols.push_back(col_expr))) { - LOG_WARN("failed to append column expr", K(ret)); - } else if (OB_FAIL(new_cols.push_back(new_expr))) { - LOG_WARN("failed to append column expr", K(ret)); - } - } - } - - if (OB_SUCC(ret)) { ObRawExprCopier copier(*expr_factory); - if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) { - LOG_WARN("failed to add replace pair", K(ret)); - } else if (OB_FAIL(copier.add_replaced_expr(old_cols, new_cols))) { + if (OB_FAIL(merge_exec_params(all_query_ref, any_query_ref, + old_exec_params, new_exec_params))) { + LOG_WARN("failed to merge exec params", K(ret)); + } else if (OB_FAIL(copier.add_replaced_expr(old_exec_params, new_exec_params))) { LOG_WARN("failed to add replace pair", K(ret)); + } else { /* do nothing */ } + for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) { + ColumnItem &col_item = all_stmt->get_column_items().at(i); + ColumnItem new_col_item; + ObRawExpr *new_expr = NULL; + TableItem *new_table_item = NULL; + int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1; + if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() || + map_info.table_map_.at(idx) < 0 || + map_info.table_map_.at(idx) >= new_any_stmt->get_table_size()) || + OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table is not mapped", K(ret), K(idx)); + } else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id( + new_table_item->table_id_, col_item.column_id_))) { + if (OB_FAIL(copier.add_replaced_expr(col_item.expr_, new_expr))) { + LOG_WARN("failed to add replace pair", K(ret)); + } + } else { /* do nothing */ } + } + for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_column_size(); ++i) { + ColumnItem &col_item = all_stmt->get_column_items().at(i); + ColumnItem new_col_item; + ObRawExpr *new_expr = NULL; + TableItem *new_table_item = NULL; + int64_t idx = all_stmt->get_table_bit_index(col_item.table_id_) - 1; + if (OB_UNLIKELY(idx < 0 || idx >= map_info.table_map_.count() || + map_info.table_map_.at(idx) < 0 || + map_info.table_map_.at(idx) >= new_any_stmt->get_table_size()) || + OB_ISNULL(new_table_item = new_any_stmt->get_table_item(map_info.table_map_.at(idx)))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("table is not mapped", K(ret), K(idx)); + } else if (OB_NOT_NULL(new_expr = new_any_stmt->get_column_expr_by_id( + new_table_item->table_id_, col_item.column_id_))) { + /* do nothing */ + } else if (OB_FAIL(new_col_item.deep_copy(copier, col_item))) { + LOG_WARN("failed to deep copy column items", K(ret)); + } else if (OB_ISNULL(new_col_item.expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("column item isn't init", K(ret)); + } else { + new_col_item.table_id_ = new_table_item->table_id_; + new_col_item.expr_->set_table_id(new_table_item->table_id_); + new_col_item.expr_->set_table_name(new_table_item->table_name_); + if (OB_FAIL(new_any_stmt->add_column_item(new_col_item))) { + LOG_WARN("failed to add column item", K(ret)); + } + } } for (int64_t i = 0; OB_SUCC(ret) && i < all_stmt->get_condition_size(); ++i) { ObRawExpr *new_cond_expr = NULL; diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 71c013cb7..136d0e786 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -7580,6 +7580,8 @@ int ObTransformUtils::pushdown_qualify_filters(ObSelectStmt *stmt) return ret; } +// stmt should call formalize_stmt after generate select_list, +// and ref_query inside ths table has no need to call formalize again int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx, ObDMLStmt *stmt, TableItem *table, @@ -7618,12 +7620,8 @@ int ObTransformUtils::generate_select_list(ObTransformerCtx *ctx, if (OB_FAIL(ret)) { // do nothing - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); - } else if (OB_FAIL(view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*view_stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } @@ -13330,10 +13328,7 @@ int ObTransformUtils::create_view_with_pre_aggregate(ObSelectStmt *stmt, } // 4. link stmt and view_stmt if (OB_SUCC(ret)) { - if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), - view_stmt->get_subquery_exprs()))) { - LOG_WARN("failed to remove subqueries", K(ret)); - } else if (OB_FAIL(add_new_table_item(ctx, stmt, view_stmt, view_table_item))) { + if (OB_FAIL(add_new_table_item(ctx, stmt, view_stmt, view_table_item))) { LOG_WARN("failed to add new table item", K(ret)); } else if (OB_ISNULL(view_table_item)) { ret = OB_ERR_UNEXPECTED; @@ -13358,8 +13353,6 @@ int ObTransformUtils::create_view_with_pre_aggregate(ObSelectStmt *stmt, LOG_WARN("failed to copy and replace stmt expr", K(ret)); } else if (OB_FAIL(stmt->formalize_stmt(session_info))) { LOG_WARN("failed to formalize stmt", K(ret)); - } else if (OB_FAIL(view_stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); } else if (OB_FAIL(adjust_pseudo_column_like_exprs(*view_stmt))) { LOG_WARN("failed to adjust pseudo column like exprs", K(ret)); } diff --git a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp index 3271a7716..4001fb4bc 100644 --- a/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp +++ b/src/sql/rewrite/ob_transform_where_subquery_pullup.cpp @@ -531,8 +531,6 @@ int ObWhereSubQueryPullup::pullup_correlated_subquery_as_view(ObDMLStmt *stmt, LOG_WARN("right_table should not be null", K(ret), K(right_table)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), expr))) { LOG_WARN("failed to remove condition expr", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_ref))) { - LOG_WARN("failed to remove subquery expr", K(ret)); } else { // select * from t1 where exists (select 1 from t2 where t1.c1 = c1 and c2 = 2 limit 1); // for the query contains correlated subquery above, limit 1 should be removed after transform. @@ -594,11 +592,7 @@ int ObWhereSubQueryPullup::pullup_correlated_subquery_as_view(ObDMLStmt *stmt, LOG_WARN("failed to decorrelate semi conditions", K(ret)); } else if (OB_FAIL(generate_semi_info(stmt, expr, right_table, semi_conds, info))) { LOG_WARN("failed to generate semi info", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(subquery->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(subquery->formalize_stmt(ctx_->session_info_))) { + } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("formalize child stmt failed", K(ret)); } } @@ -1017,8 +1011,6 @@ int ObWhereSubQueryPullup::pullup_non_correlated_subquery_as_view(ObDMLStmt *stm LOG_WARN("table_item should not be null", K(ret)); } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_condition_exprs(), expr))) { LOG_WARN("failed to remove condition expr", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), subquery_expr))) { - LOG_WARN("failed to remove subquery expr", K(ret)); } else if (OB_FAIL(ObTransformUtils::create_columns_for_view(ctx_, *table_item, stmt, column_exprs))) { LOG_WARN("failed to create columns for view", K(ret)); @@ -1027,11 +1019,7 @@ int ObWhereSubQueryPullup::pullup_non_correlated_subquery_as_view(ObDMLStmt *stm LOG_WARN("failed to generate new condition exprs", K(ret)); } else if (OB_FAIL(generate_semi_info(stmt, expr, table_item, new_conditions, info))) { LOG_WARN("generate semi info failed", K(ret)); - } else if (OB_FAIL(stmt->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(subquery->adjust_subquery_list())) { - LOG_WARN("failed to adjust subquery list", K(ret)); - } else if (OB_FAIL(subquery->formalize_stmt(ctx_->session_info_))) { + } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) { LOG_WARN("formalize child stmt failed", K(ret)); } return ret; @@ -1419,8 +1407,6 @@ int ObWhereSubQueryPullup::unnest_single_set_subquery(ObDMLStmt *stmt, } else if (OB_FAIL(stmt->get_stmt_hint().merge_stmt_hint(subquery->get_stmt_hint(), LEFT_HINT_DOMINATED))) { LOG_WARN("failed to merge subquery stmt hint", K(ret)); - } else if (OB_FAIL(ObOptimizerUtil::remove_item(stmt->get_subquery_exprs(), query_expr))) { - LOG_WARN("remove expr failed", K(ret)); } else if (OB_FAIL(stmt->replace_relation_exprs(query_refs, select_list))) { LOG_WARN("failed to replace inner stmt expr", K(ret)); } else if (OB_FAIL(stmt->formalize_stmt(ctx_->session_info_))) {