fix view pullup part exprs bug

This commit is contained in:
ChangerR
2022-12-28 13:08:15 +00:00
committed by ob-robot
parent c40dbae25e
commit 02fedb0783
4 changed files with 13 additions and 11 deletions

View File

@ -2172,7 +2172,7 @@ int ObDelUpdResolver::view_pullup_part_exprs()
if (OB_ISNULL(sel_stmt) || OB_ISNULL(t)) { if (OB_ISNULL(sel_stmt) || OB_ISNULL(t)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get select stmt for base table item failed", K(ret)); LOG_WARN("get select stmt for base table item failed", K(ret));
} else if (OB_FAIL(get_pullup_column_map(*stmt, *sel_stmt, t->ref_id_, view_columns, base_columns))) { } else if (OB_FAIL(get_pullup_column_map(*stmt, *sel_stmt, table->table_id_, view_columns, base_columns))) {
// link.zt seems to have problem, base_tid is better to be refined as table_id // link.zt seems to have problem, base_tid is better to be refined as table_id
LOG_WARN("failed to get pullup column map", K(ret)); LOG_WARN("failed to get pullup column map", K(ret));
} else if (OB_FAIL(copier.add_replaced_expr(base_columns, view_columns))) { } else if (OB_FAIL(copier.add_replaced_expr(base_columns, view_columns))) {
@ -2304,7 +2304,8 @@ int ObDelUpdResolver::resolve_check_constraints(const TableItem* table_item,
return ret; return ret;
} }
int ObDelUpdResolver::resolve_view_check_exprs(const TableItem* table_item, int ObDelUpdResolver::resolve_view_check_exprs(uint64_t table_id,
const TableItem* table_item,
const bool cascaded, const bool cascaded,
common::ObIArray<ObRawExpr*> &check_exprs) common::ObIArray<ObRawExpr*> &check_exprs)
{ {
@ -2324,7 +2325,7 @@ int ObDelUpdResolver::resolve_view_check_exprs(const TableItem* table_item,
LOG_WARN("get unexpected null", K(ret), K(del_upd_stmt), K(select_stmt)); LOG_WARN("get unexpected null", K(ret), K(del_upd_stmt), K(select_stmt));
} else if (!cascaded && VIEW_CHECK_OPTION_NONE == } else if (!cascaded && VIEW_CHECK_OPTION_NONE ==
(check_option = select_stmt->get_check_option())) { (check_option = select_stmt->get_check_option())) {
if (OB_FAIL(resolve_view_check_exprs(table_item->view_base_item_, cascaded, check_exprs))) { if (OB_FAIL(resolve_view_check_exprs(table_id, table_item->view_base_item_, cascaded, check_exprs))) {
LOG_WARN("resolve view check exprs failed", K(ret)); LOG_WARN("resolve view check exprs failed", K(ret));
} }
} else { } else {
@ -2337,7 +2338,7 @@ int ObDelUpdResolver::resolve_view_check_exprs(const TableItem* table_item,
// may have problem when a table is used twice by the view. // may have problem when a table is used twice by the view.
if (OB_FAIL(get_pullup_column_map(*del_upd_stmt, if (OB_FAIL(get_pullup_column_map(*del_upd_stmt,
*select_stmt, *select_stmt,
table_item->get_base_table_item().ref_id_, table_id,
view_columns, view_columns,
base_columns))) { base_columns))) {
LOG_WARN("failed to get pullup column map", K(ret)); LOG_WARN("failed to get pullup column map", K(ret));
@ -2352,7 +2353,7 @@ int ObDelUpdResolver::resolve_view_check_exprs(const TableItem* table_item,
} }
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
const bool new_cascaded = cascaded || VIEW_CHECK_OPTION_CASCADED == check_option; const bool new_cascaded = cascaded || VIEW_CHECK_OPTION_CASCADED == check_option;
if (OB_FAIL(resolve_view_check_exprs(table_item->view_base_item_, new_cascaded, check_exprs))) { if (OB_FAIL(resolve_view_check_exprs(table_id, table_item->view_base_item_, new_cascaded, check_exprs))) {
LOG_WARN("resolve view check exprs failed", K(ret)); LOG_WARN("resolve view check exprs failed", K(ret));
} }
} }
@ -2363,14 +2364,14 @@ int ObDelUpdResolver::resolve_view_check_exprs(const TableItem* table_item,
int ObDelUpdResolver::get_pullup_column_map(ObDMLStmt &stmt, int ObDelUpdResolver::get_pullup_column_map(ObDMLStmt &stmt,
ObSelectStmt &sel_stmt, ObSelectStmt &sel_stmt,
uint64_t base_ref_id, uint64_t table_id,
ObIArray<ObRawExpr *> &view_columns, ObIArray<ObRawExpr *> &view_columns,
ObIArray<ObRawExpr *> &base_columns) ObIArray<ObRawExpr *> &base_columns)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_column_size(); ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < stmt.get_column_size(); ++i) {
ColumnItem &parent_column = stmt.get_column_items().at(i); ColumnItem &parent_column = stmt.get_column_items().at(i);
if (parent_column.base_tid_ == base_ref_id) { if (parent_column.table_id_ == table_id) {
for (int64_t j = 0; OB_SUCC(ret) && j < sel_stmt.get_column_size(); ++j) { for (int64_t j = 0; OB_SUCC(ret) && j < sel_stmt.get_column_size(); ++j) {
ColumnItem &child_column = sel_stmt.get_column_items().at(j); ColumnItem &child_column = sel_stmt.get_column_items().at(j);
if (child_column.base_tid_ == parent_column.base_tid_ && if (child_column.base_tid_ == parent_column.base_tid_ &&

View File

@ -151,12 +151,13 @@ protected:
ObIArray<ObRawExpr *> &value_list); ObIArray<ObRawExpr *> &value_list);
int resolve_check_constraints(const TableItem* table_item, int resolve_check_constraints(const TableItem* table_item,
common::ObIArray<ObRawExpr*> &check_exprs); common::ObIArray<ObRawExpr*> &check_exprs);
int resolve_view_check_exprs(const TableItem* table_item, int resolve_view_check_exprs(uint64_t table_id,
const TableItem* table_item,
const bool cascaded, const bool cascaded,
common::ObIArray<ObRawExpr*> &check_exprs); common::ObIArray<ObRawExpr*> &check_exprs);
int get_pullup_column_map(ObDMLStmt &stmt, int get_pullup_column_map(ObDMLStmt &stmt,
ObSelectStmt &sel_stmt, ObSelectStmt &sel_stmt,
uint64_t base_ref_id, uint64_t table_id,
ObIArray<ObRawExpr *> &view_columns, ObIArray<ObRawExpr *> &view_columns,
ObIArray<ObRawExpr *> &base_columns); ObIArray<ObRawExpr *> &base_columns);

View File

@ -844,7 +844,7 @@ int ObInsertResolver::resolve_insert_constraint()
LOG_WARN("get unexpected null", K(ret)); LOG_WARN("get unexpected null", K(ret));
} else { } else {
ObInsertTableInfo &table_info = insert_stmt->get_insert_table_info(); ObInsertTableInfo &table_info = insert_stmt->get_insert_table_info();
if (OB_FAIL(resolve_view_check_exprs(table_item, false, table_info.view_check_exprs_))) { if (OB_FAIL(resolve_view_check_exprs(table_item->table_id_, table_item, false, table_info.view_check_exprs_))) {
LOG_WARN("resolve view check exprs failed", K(ret)); LOG_WARN("resolve view check exprs failed", K(ret));
} else if (OB_FAIL(resolve_check_constraints(table_item, table_info.check_constraint_exprs_))) { } else if (OB_FAIL(resolve_check_constraints(table_item, table_info.check_constraint_exprs_))) {
LOG_WARN("failed to resolve check constraints", K(ret)); LOG_WARN("failed to resolve check constraints", K(ret));

View File

@ -724,7 +724,7 @@ int ObUpdateResolver::resolve_update_constraints()
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("get unexpected null", K(table_item), K(ret)); LOG_WARN("get unexpected null", K(table_item), K(ret));
} else if (!update_stmt->has_instead_of_trigger() && } else if (!update_stmt->has_instead_of_trigger() &&
OB_FAIL(resolve_view_check_exprs(table_item, false, table_info->view_check_exprs_))) { OB_FAIL(resolve_view_check_exprs(table_item->table_id_, table_item, false, table_info->view_check_exprs_))) {
LOG_WARN("failed to resolve view check exprs", K(ret)); LOG_WARN("failed to resolve view check exprs", K(ret));
} else if (OB_FAIL(resolve_check_constraints(table_item, table_info->check_constraint_exprs_))) { } else if (OB_FAIL(resolve_check_constraints(table_item, table_info->check_constraint_exprs_))) {
LOG_WARN("failed to resolve view check exprs", K(ret)); LOG_WARN("failed to resolve view check exprs", K(ret));