fix subquery coalesce cause update 4016
This commit is contained in:
@ -161,6 +161,7 @@ int ObTransformQueryPushDown::need_transform(const common::ObIArray<ObParentDMLS
|
||||
LOG_WARN("unexpected null", K(ret), K(ctx_), K(query_hint));
|
||||
} else if (stmt.get_table_size() == 1) {
|
||||
const TableItem *table = NULL;
|
||||
const ObViewMergeHint *myhint = NULL;
|
||||
if (OB_ISNULL(table = stmt.get_table_item(0))) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("table item is null", K(ret));
|
||||
@ -175,8 +176,12 @@ int ObTransformQueryPushDown::need_transform(const common::ObIArray<ObParentDMLS
|
||||
} else if (!need_trans) {
|
||||
OPT_TRACE("hint reject transform");
|
||||
}
|
||||
} else if (query_hint->is_valid_outline_transform(ctx_->trans_list_loc_,
|
||||
get_hint(table->ref_query_->get_stmt_hint()))) {
|
||||
} else if (OB_FALSE_IT(myhint =
|
||||
static_cast<const ObViewMergeHint*>(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");
|
||||
|
||||
@ -2157,6 +2157,8 @@ int ObTransformSubqueryCoalesce::adjust_assign_exprs(ObUpdateStmt *upd_stmt,
|
||||
int ret = OB_SUCCESS;
|
||||
ObQueryRefRawExpr *coalesce_query_expr = NULL;
|
||||
ObArray<ObExecParamRawExpr *> all_params;
|
||||
ObSEArray<ObRawExpr*, 4> old_exprs;
|
||||
ObSEArray<ObRawExpr*, 4> 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<ObRawExpr*> &select_exprs,
|
||||
ObIArray<int64_t> &index_map,
|
||||
ObQueryRefRawExpr *coalesce_query_expr,
|
||||
ObSelectStmt *coalesce_query)
|
||||
ObSelectStmt *coalesce_query,
|
||||
ObIArray<ObRawExpr*> &old_exprs,
|
||||
ObIArray<ObRawExpr*> &new_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObAliasRefRawExpr*, 4> alias_exprs;
|
||||
ObSEArray<ObRawExpr*, 4> old_exprs;
|
||||
ObSEArray<ObRawExpr*, 4> 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<ObQueryRefRawExpr*>(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<ObRawExpr*> &select_exprs,
|
||||
ObIArray<int64_t> &index_map,
|
||||
ObQueryRefRawExpr *coalesce_query_expr,
|
||||
ObSelectStmt *coalesce_query)
|
||||
ObSelectStmt *coalesce_query,
|
||||
ObIArray<ObRawExpr*> &old_exprs,
|
||||
ObIArray<ObRawExpr*> &new_exprs)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObSEArray<ObQueryRefRawExpr*, 4> query_ref_exprs;
|
||||
ObSEArray<ObRawExpr*, 4> old_exprs;
|
||||
ObSEArray<ObRawExpr*, 4> 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;
|
||||
}
|
||||
|
||||
|
||||
@ -190,14 +190,18 @@ private:
|
||||
ObIArray<ObRawExpr*> &select_exprs,
|
||||
ObIArray<int64_t> &index_map,
|
||||
ObQueryRefRawExpr *coalesce_query_expr,
|
||||
ObSelectStmt *coalesce_query);
|
||||
ObSelectStmt *coalesce_query,
|
||||
ObIArray<ObRawExpr*> &old_exprs,
|
||||
ObIArray<ObRawExpr*> &new_exprs);
|
||||
|
||||
int adjust_query_assign_exprs(ObRawExpr* &assign_expr,
|
||||
StmtCompareHelper *helper,
|
||||
ObIArray<ObRawExpr*> &select_exprs,
|
||||
ObIArray<int64_t> &index_map,
|
||||
ObQueryRefRawExpr *coalesce_query_expr,
|
||||
ObSelectStmt *coalesce_query);
|
||||
ObSelectStmt *coalesce_query,
|
||||
ObIArray<ObRawExpr*> &old_exprs,
|
||||
ObIArray<ObRawExpr*> &new_exprs);
|
||||
|
||||
int inner_adjust_assign_exprs(ObSelectStmt *stmt,
|
||||
const int64_t select_idx,
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user