fix generated column resolve bug for updatable view

This commit is contained in:
JinmaoLi 2024-11-27 04:15:24 +00:00 committed by ob-robot
parent 62404095c0
commit b72cd87fa6
2 changed files with 15 additions and 5 deletions

View File

@ -2387,6 +2387,7 @@ int ObDelUpdResolver::view_pullup_special_column_exprs()
if (dml_stmt->has_instead_of_trigger()) {
sel_stmt = t->ref_query_;
} else {
// find the base table item for updatable view recursively
while (NULL != t && (t->is_generated_table() || t->is_temp_table())) {
sel_stmt = t->ref_query_;
t = t->view_base_item_;
@ -2424,7 +2425,9 @@ int ObDelUpdResolver::view_pullup_special_column_exprs()
ref_expr))) {
LOG_WARN("failed to copy dependant expr", K(ret));
} else if (OB_FAIL(view_pullup_column_ref_exprs_recursively(ref_expr,
tid, dml_stmt))){
view_column_item->table_id_,
tid,
dml_stmt))){
LOG_WARN("view pull up generated column exprs recursively failed", K(ret));
} else {
view_column_item->expr_->set_dependant_expr(ref_expr);
@ -2649,7 +2652,9 @@ int ObDelUpdResolver::resolve_check_constraints(const TableItem* table_item,
ret = OB_ERR_UNEXPECTED;
LOG_WARN("check constraint expr is null", K(ret));
} else if (OB_FAIL(view_pullup_column_ref_exprs_recursively(expr,
table_item->get_base_table_item().ref_id_, dml_stmt))) {
table_item->table_id_,
table_item->get_base_table_item().ref_id_,
dml_stmt))) {
LOG_WARN("view pullup column_ref_exprs recursively failed", K(ret));
} else if (expr->get_expr_type() == T_FUN_SYS_IS_JSON &&
expr->get_param_count() == 5 &&
@ -2755,6 +2760,7 @@ int ObDelUpdResolver::get_pullup_column_map(ObDMLStmt &stmt,
}
int ObDelUpdResolver::view_pullup_column_ref_exprs_recursively(ObRawExpr *&expr,
uint64_t view_table_id,
uint64_t base_table_id,
const ObDMLStmt *stmt)
{
@ -2776,8 +2782,9 @@ int ObDelUpdResolver::view_pullup_column_ref_exprs_recursively(ObRawExpr *&expr,
if (OB_ISNULL(column_item) || OB_ISNULL(column_item->expr_)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("column expr null");
} else if (base_table_id == column_item->base_tid_ &&
ref_expr->get_column_id() == column_item->base_cid_) {
} else if (column_item->table_id_ == view_table_id &&
base_table_id == column_item->base_tid_ &&
ref_expr->get_column_id() == column_item->base_cid_) {
expr = column_item->expr_;
found = true;
}
@ -2785,7 +2792,9 @@ int ObDelUpdResolver::view_pullup_column_ref_exprs_recursively(ObRawExpr *&expr,
} else {
for (int i = 0; OB_SUCC(ret) && i < expr->get_param_count(); i++) {
ObRawExpr *&t_expr = expr->get_param_expr(i);
if (OB_FAIL(SMART_CALL(view_pullup_column_ref_exprs_recursively(t_expr, base_table_id,
if (OB_FAIL(SMART_CALL(view_pullup_column_ref_exprs_recursively(t_expr,
view_table_id,
base_table_id,
stmt)))) {
LOG_WARN("generated column expr pull up failed", K(ret));
}

View File

@ -178,6 +178,7 @@ protected:
ObIArray<ObRawExpr *> &base_columns);
int view_pullup_column_ref_exprs_recursively(ObRawExpr *&expr,
uint64_t view_table_id,
uint64_t base_table_id,
const ObDMLStmt *stmt);