From b72cd87fa6895c6c0c79ebc061f2157fe930ba65 Mon Sep 17 00:00:00 2001 From: JinmaoLi Date: Wed, 27 Nov 2024 04:15:24 +0000 Subject: [PATCH] fix generated column resolve bug for updatable view --- src/sql/resolver/dml/ob_del_upd_resolver.cpp | 19 ++++++++++++++----- src/sql/resolver/dml/ob_del_upd_resolver.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.cpp b/src/sql/resolver/dml/ob_del_upd_resolver.cpp index 3b8f9836e..ab54e789e 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.cpp +++ b/src/sql/resolver/dml/ob_del_upd_resolver.cpp @@ -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)); } diff --git a/src/sql/resolver/dml/ob_del_upd_resolver.h b/src/sql/resolver/dml/ob_del_upd_resolver.h index 230e8cb0d..6028dc935 100644 --- a/src/sql/resolver/dml/ob_del_upd_resolver.h +++ b/src/sql/resolver/dml/ob_del_upd_resolver.h @@ -178,6 +178,7 @@ protected: ObIArray &base_columns); int view_pullup_column_ref_exprs_recursively(ObRawExpr *&expr, + uint64_t view_table_id, uint64_t base_table_id, const ObDMLStmt *stmt);