【xmlbugfix】fix insert/update op returning xmltype, but result is NULL

This commit is contained in:
GroundWu
2023-06-27 04:24:15 +00:00
committed by ob-robot
parent 86313584f5
commit c6a2b9af73
3 changed files with 71 additions and 2 deletions

View File

@ -1071,9 +1071,13 @@ int ObInsertResolver::try_expand_returning_exprs()
CK(column_convert.count() == table_columns.count());
for (int64_t i = 0; OB_SUCC(ret) && i < insert_stmt->get_returning_exprs().count(); i++) {
for (int64_t j = 0; OB_SUCC(ret) && j < table_columns.count(); j++) {
OZ(ObRawExprUtils::replace_ref_column(insert_stmt->get_returning_exprs().at(i),
if (table_columns.at(j)->is_xml_column()) {
// do nothing and will rewrite in trnsform stage
} else {
OZ(ObRawExprUtils::replace_ref_column(insert_stmt->get_returning_exprs().at(i),
table_columns.at(j),
column_convert.at(j)));
}
}
}
}

View File

@ -215,7 +215,9 @@ int ObUpdateResolver::try_expand_returning_exprs()
ObIArray<ObAssignment> &assignments = tables_info.at(0)->assignments_;
ObRawExprCopier copier(*params_.expr_factory_);
for (int64_t i = 0; OB_SUCC(ret) && i < assignments.count(); ++i) {
if (OB_FAIL(copier.add_replaced_expr(assignments.at(i).column_expr_,
if (assignments.at(i).column_expr_->is_xml_column()) {
// skip and will rewite in transform stage
} else if (OB_FAIL(copier.add_replaced_expr(assignments.at(i).column_expr_,
assignments.at(i).expr_))) {
LOG_WARN("failed to add replaced expr", K(ret));
}

View File

@ -6461,6 +6461,7 @@ int ObTransformPreProcess::replace_udt_assignment_exprs(ObDMLStmt *stmt,
}
if (OB_SUCC(ret) && assign.column_expr_->is_xml_column()) {
ObRawExpr *new_value_expr = NULL;
ObRawExpr *old_column_expr = assign.column_expr_;
if (OB_FAIL(transform_udt_column_value_expr(stmt, table_info, value_expr, new_value_expr))){
LOG_WARN("failed to transform udt value exprs", K(ret));
} else if (OB_FAIL(ObRawExprUtils::build_column_conv_expr(*ctx_->expr_factory_,
@ -6480,6 +6481,25 @@ int ObTransformPreProcess::replace_udt_assignment_exprs(ObDMLStmt *stmt,
assign.expr_ = new_value_expr;
}
}
// process returning clause for update
if (OB_SUCC(ret) && stmt->get_stmt_type() == stmt::T_UPDATE) {
ObDelUpdStmt *update_stmt = static_cast<ObDelUpdStmt *>(stmt);
if (update_stmt->is_returning()) {
for (int64_t i = 0; OB_SUCC(ret) && i < update_stmt->get_returning_exprs().count(); i++) {
ObRawExpr *sys_makexml_expr = NULL;
if (OB_ISNULL(hidd_col)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("hidden col is NULL", K(ret), K(i), K(j));
} else if (OB_FAIL(transform_xml_binary(new_value_expr, sys_makexml_expr))) {
LOG_WARN("fail to create sys_makexml expr", K(ret));
} else if (OB_FAIL(ObRawExprUtils::replace_ref_column(update_stmt->get_returning_exprs().at(i),
old_column_expr,
sys_makexml_expr))) {
LOG_WARN("fail to replace xml column in returning exprs", K(ret), K(i));
}
} // end for
}
} //end if: process returning clause
}
}
@ -6694,6 +6714,8 @@ int ObTransformPreProcess::transform_query_udt_columns_exprs(const ObIArray<ObPa
OB_FAIL(scopes.push_back(SCOPE_BASIC_TABLE)) ||
OB_FAIL(scopes.push_back(SCOPE_DICT_FIELDS)) ||
OB_FAIL(scopes.push_back(SCOPE_SHADOW_COLUMN)) ||
((stmt->get_stmt_type() == stmt::T_INSERT || stmt->get_stmt_type() == stmt::T_UPDATE) &&
OB_FAIL(scopes.push_back(SCOPE_RETURNING))) ||
(stmt->get_stmt_type() != stmt::T_MERGE && OB_FAIL(scopes.push_back(SCOPE_INSERT_VECTOR)))) {
LOG_WARN("Fail to create scope array.", K(ret));
}
@ -6941,6 +6963,47 @@ int ObTransformPreProcess::transform_udt_columns(const ObIArray<ObParentDMLStmt>
}
}
}
// process returning exprs
if (OB_SUCC(ret) && insert_stmt->is_returning()) {
ObIArray<ObRawExpr*> &column_convert = insert_stmt->get_column_conv_exprs();
const ObIArray<ObColumnRefRawExpr *> &table_columns = insert_stmt->get_insert_table_info().column_exprs_;
ObSEArray<std::pair<int64_t, int64_t>, 8> xml_col_idxs; // use pair to store xml col idx and its hidden col idx
for (int64_t i = 0; OB_SUCC(ret) && i < table_columns.count(); i++) {
ObColumnRefRawExpr *ref_col = table_columns.at(i);
if (ref_col->is_xml_column()) {
bool is_found = false;
for (int64_t j = 0; OB_SUCC(ret) && !is_found && j < table_columns.count(); j++) {
if (ref_col->get_column_id() != table_columns.at(j)->get_column_id() &&
ref_col->get_udt_set_id() == table_columns.at(j)->get_udt_set_id()) {
is_found = true;
xml_col_idxs.push_back(std::make_pair(i, j));
}
} // end for
if (!is_found) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("failed to find hidden column", K(ret), K(i));
}
}
} // end for
CK(column_convert.count() == table_columns.count());
for (int64_t i = 0; OB_SUCC(ret) && i < insert_stmt->get_returning_exprs().count(); i++) {
for (int64_t j = 0; OB_SUCC(ret) && j < xml_col_idxs.count(); j++) {
ObRawExpr *hidd_col = NULL;
ObRawExpr *sys_makexml_expr = NULL;
if (OB_ISNULL(hidd_col = column_convert.at(xml_col_idxs.at(j).second))) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("hidden col is NULL", K(ret), K(i), K(j));
} else if (OB_FAIL(transform_xml_binary(hidd_col, sys_makexml_expr))) {
LOG_WARN("fail to create expr sys_makexml", K(ret));
} else if (OB_FAIL(ObRawExprUtils::replace_ref_column(insert_stmt->get_returning_exprs().at(i),
table_columns.at(xml_col_idxs.at(j).first),
sys_makexml_expr))) {
LOG_WARN("fail to replace xml column in returning exprs", K(ret), K(i), K(j));
}
}
}
} // end if
}
}
return ret;