diff --git a/src/sql/rewrite/ob_transform_query_push_down.cpp b/src/sql/rewrite/ob_transform_query_push_down.cpp index d9ffbf9601..e666108b49 100644 --- a/src/sql/rewrite/ob_transform_query_push_down.cpp +++ b/src/sql/rewrite/ob_transform_query_push_down.cpp @@ -161,6 +161,7 @@ int ObTransformQueryPushDown::need_transform(const common::ObIArrayis_valid_outline_transform(ctx_->trans_list_loc_, - get_hint(table->ref_query_->get_stmt_hint()))) { + } else if (OB_FALSE_IT(myhint = + static_cast(get_hint(table->ref_query_->get_stmt_hint())))) { + // do nothing + } else if (myhint != NULL && + query_hint->is_valid_outline_transform(ctx_->trans_list_loc_, myhint) && + myhint->enable_query_push_down(ctx_->src_qb_name_)) { need_trans = true; } else { OPT_TRACE("outline reject transform"); diff --git a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp index f1fe32788d..e5b4c87fc5 100644 --- a/src/sql/rewrite/ob_transform_subquery_coalesce.cpp +++ b/src/sql/rewrite/ob_transform_subquery_coalesce.cpp @@ -2157,6 +2157,8 @@ int ObTransformSubqueryCoalesce::adjust_assign_exprs(ObUpdateStmt *upd_stmt, int ret = OB_SUCCESS; ObQueryRefRawExpr *coalesce_query_expr = NULL; ObArray all_params; + ObSEArray old_exprs; + ObSEArray new_exprs; if (OB_ISNULL(upd_stmt) || OB_ISNULL(helper) || OB_ISNULL(coalesce_query)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null param", K(ret)); @@ -2194,7 +2196,9 @@ int ObTransformSubqueryCoalesce::adjust_assign_exprs(ObUpdateStmt *upd_stmt, select_exprs, index_map, coalesce_query_expr, - coalesce_query))) { + coalesce_query, + old_exprs, + new_exprs))) { LOG_WARN("failed to extract expr", K(ret)); } } else if (assign.expr_->has_flag(CNT_SUB_QUERY)) { @@ -2203,13 +2207,39 @@ int ObTransformSubqueryCoalesce::adjust_assign_exprs(ObUpdateStmt *upd_stmt, select_exprs, index_map, coalesce_query_expr, - coalesce_query))) { + coalesce_query, + old_exprs, + new_exprs))) { LOG_WARN("failed to extract expr", K(ret)); } } } } } + if (OB_SUCC(ret) && !old_exprs.empty()) { + for (int64_t i = 0; OB_SUCC(ret) && i < upd_stmt->get_update_table_info().count(); ++i) { + ObUpdateTableInfo* table_info = upd_stmt->get_update_table_info().at(i); + if (OB_ISNULL(table_info)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null table info", K(ret), K(i)); + } else { + for (int64_t j = 0; OB_SUCC(ret) && j < table_info->assignments_.count(); ++j) { + ObAssignment &assign = table_info->assignments_.at(j); + if (OB_ISNULL(assign.expr_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect null expr", K(ret)); + } else if (!assign.expr_->has_flag(CNT_ALIAS) && + !assign.expr_->has_flag(CNT_SUB_QUERY)) { + // do nothing + } else if (OB_FAIL(ObTransformUtils::replace_expr(old_exprs, + new_exprs, + assign.expr_))) { + LOG_WARN("failed to replace expr", K(ret)); + } + } + } + } + } return ret; } @@ -2218,12 +2248,12 @@ int ObTransformSubqueryCoalesce::adjust_alias_assign_exprs(ObRawExpr* &assign_ex ObIArray &select_exprs, ObIArray &index_map, ObQueryRefRawExpr *coalesce_query_expr, - ObSelectStmt *coalesce_query) + ObSelectStmt *coalesce_query, + ObIArray &old_exprs, + ObIArray &new_exprs) { int ret = OB_SUCCESS; ObSEArray alias_exprs; - ObSEArray old_exprs; - ObSEArray new_exprs; ObRawExpr *new_expr = NULL; if (OB_ISNULL(assign_expr)) { ret = OB_ERR_UNEXPECTED; @@ -2236,6 +2266,8 @@ int ObTransformSubqueryCoalesce::adjust_alias_assign_exprs(ObRawExpr* &assign_ex if (OB_ISNULL(alias_expr) || OB_ISNULL(alias_expr->get_param_expr(0))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null expr", K(ret)); + } else if (ObOptimizerUtil::find_item(old_exprs, alias_expr)) { + // do noting } else if (alias_expr->is_ref_query_output()) { ObQueryRefRawExpr *query_ref_expr = static_cast(alias_expr->get_param_expr(0)); int64_t select_idx = alias_expr->get_project_index(); @@ -2257,13 +2289,6 @@ int ObTransformSubqueryCoalesce::adjust_alias_assign_exprs(ObRawExpr* &assign_ex } } } - if (OB_SUCC(ret) && !old_exprs.empty()) { - if (OB_FAIL(ObTransformUtils::replace_expr(old_exprs, - new_exprs, - assign_expr))) { - LOG_WARN("failed to replace expr", K(ret)); - } - } return ret; } @@ -2272,12 +2297,12 @@ int ObTransformSubqueryCoalesce::adjust_query_assign_exprs(ObRawExpr* &assign_ex ObIArray &select_exprs, ObIArray &index_map, ObQueryRefRawExpr *coalesce_query_expr, - ObSelectStmt *coalesce_query) + ObSelectStmt *coalesce_query, + ObIArray &old_exprs, + ObIArray &new_exprs) { int ret = OB_SUCCESS; ObSEArray query_ref_exprs; - ObSEArray old_exprs; - ObSEArray new_exprs; ObRawExpr *new_expr = NULL; if (OB_ISNULL(assign_expr)) { ret = OB_ERR_UNEXPECTED; @@ -2290,6 +2315,8 @@ int ObTransformSubqueryCoalesce::adjust_query_assign_exprs(ObRawExpr* &assign_ex if (OB_ISNULL(query_ref_expr)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpect null stmt", K(ret)); + } else if (ObOptimizerUtil::find_item(old_exprs, query_ref_expr)) { + // do noting } else if (OB_FAIL(inner_adjust_assign_exprs(query_ref_expr->get_ref_stmt(), 0, helper, @@ -2307,13 +2334,6 @@ int ObTransformSubqueryCoalesce::adjust_query_assign_exprs(ObRawExpr* &assign_ex LOG_WARN("failed to push back expr", K(ret)); } } - if (OB_SUCC(ret) && !old_exprs.empty()) { - if (OB_FAIL(ObTransformUtils::replace_expr(old_exprs, - new_exprs, - assign_expr))) { - LOG_WARN("failed to replace expr", K(ret)); - } - } return ret; } diff --git a/src/sql/rewrite/ob_transform_subquery_coalesce.h b/src/sql/rewrite/ob_transform_subquery_coalesce.h index 0bdaab0569..ce9fd434eb 100644 --- a/src/sql/rewrite/ob_transform_subquery_coalesce.h +++ b/src/sql/rewrite/ob_transform_subquery_coalesce.h @@ -190,14 +190,18 @@ private: ObIArray &select_exprs, ObIArray &index_map, ObQueryRefRawExpr *coalesce_query_expr, - ObSelectStmt *coalesce_query); + ObSelectStmt *coalesce_query, + ObIArray &old_exprs, + ObIArray &new_exprs); int adjust_query_assign_exprs(ObRawExpr* &assign_expr, StmtCompareHelper *helper, ObIArray &select_exprs, ObIArray &index_map, ObQueryRefRawExpr *coalesce_query_expr, - ObSelectStmt *coalesce_query); + ObSelectStmt *coalesce_query, + ObIArray &old_exprs, + ObIArray &new_exprs); int inner_adjust_assign_exprs(ObSelectStmt *stmt, const int64_t select_idx, diff --git a/src/sql/rewrite/ob_transform_view_merge.cpp b/src/sql/rewrite/ob_transform_view_merge.cpp index faf1a4ba1b..6a866873ea 100644 --- a/src/sql/rewrite/ob_transform_view_merge.cpp +++ b/src/sql/rewrite/ob_transform_view_merge.cpp @@ -153,7 +153,9 @@ int ObTransformViewMerge::check_hint_allowed_merge(ObDMLStmt &stmt, LOG_WARN("unexpected null", K(ret), K(ctx_), K(query_hint)); } else if (query_hint->has_outline_data()) { // outline data allowed merge - if (query_hint->is_valid_outline_transform(ctx_->trans_list_loc_, myhint)) { + if (myhint != NULL && + query_hint->is_valid_outline_transform(ctx_->trans_list_loc_, myhint) && + myhint->enable_view_merge(ctx_->src_qb_name_)) { force_merge = true; } else { force_no_merge = true;