From 58f8182a4e434af06804e43fbcadfcf0450b9caf Mon Sep 17 00:00:00 2001 From: yinyj17 Date: Thu, 17 Aug 2023 10:24:48 +0000 Subject: [PATCH] fix join elimination bug --- .../rewrite/ob_transform_join_elimination.cpp | 42 +++++++++++-------- .../rewrite/ob_transform_join_elimination.h | 2 +- src/sql/rewrite/ob_transform_utils.cpp | 13 ++---- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/sql/rewrite/ob_transform_join_elimination.cpp b/src/sql/rewrite/ob_transform_join_elimination.cpp index 9a686c12fe..17e2c09d67 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.cpp +++ b/src/sql/rewrite/ob_transform_join_elimination.cpp @@ -494,15 +494,15 @@ int ObTransformJoinElimination::adjust_table_items(ObDMLStmt *stmt, stmt_map_info.select_item_map_, column_map))) { LOG_WARN("failed to reverse select items map", K(ret)); + } else if (OB_FAIL(create_missing_select_items(source_stmt, target_stmt, + column_map, + stmt_map_info.table_map_))) { + LOG_WARN("failed to create missing select items", K(ret)); } else if (OB_FAIL(ObTransformUtils::merge_table_items(stmt, source_table, target_table, &column_map))) { LOG_WARN("failed to merge table items", K(ret)); - } else if (OB_FAIL(create_missing_select_items(source_stmt, target_stmt, - column_map, - stmt_map_info.table_map_))) { - LOG_WARN("failed to create missing select items", K(ret)); } else { /*do nothing*/ } } else { /*do nothing*/ } @@ -511,7 +511,7 @@ int ObTransformJoinElimination::adjust_table_items(ObDMLStmt *stmt, int ObTransformJoinElimination::create_missing_select_items(ObSelectStmt *source_stmt, ObSelectStmt *target_stmt, - const ObIArray &column_map, + ObIArray &column_map, const ObIArray &table_map) { int ret = OB_SUCCESS; @@ -527,11 +527,14 @@ int ObTransformJoinElimination::create_missing_select_items(ObSelectStmt *source ObSEArray new_exprs; ObSEArray old_exprs; ObSEArray miss_select_items; + ObSEArray miss_select_item_idx_array; for (int64_t i = 0; OB_SUCC(ret) && i < target_stmt->get_select_item_size(); i++) { if (OB_INVALID_ID != column_map.at(i)) { /*do nothing*/ } else if (OB_FAIL(miss_select_items.push_back(&target_stmt->get_select_item(i)))) { LOG_WARN("failed to push back select item", K(ret)); + } else if (OB_FAIL(miss_select_item_idx_array.push_back(i))) { + LOG_WARN("failed to push back select item idx", K(ret)); } else { /*do nothing*/ } } @@ -579,7 +582,15 @@ int ObTransformJoinElimination::create_missing_select_items(ObSelectStmt *source } else if (OB_FAIL(ObTransformUtils::extract_query_ref_expr(miss_select_items.at(i)->expr_, source_stmt->get_subquery_exprs()))) { LOG_WARN("failed to extract query ref exprs", K(ret)); - } else { /*do nothing*/ } + } else { + int64_t miss_select_item_idx = miss_select_item_idx_array.at(i); + if (OB_UNLIKELY(miss_select_item_idx < 0 || miss_select_item_idx >= column_map.count())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get unexpected idx", K(miss_select_item_idx), K(column_map), K(ret)); + } else { + column_map.at(miss_select_item_idx) = source_stmt->get_select_item_size() - 1; + } + } } } return ret; @@ -2050,7 +2061,6 @@ int ObTransformJoinElimination::adjust_source_table(ObDMLStmt *source_stmt, target_column_items))) { LOG_WARN("failed to get column items", K(ret)); } else { - int64_t miss_output_count = 0; uint64_t source_table_id = source_table->table_id_; uint64_t target_table_id = target_table->table_id_; ColumnItem new_col; @@ -2074,16 +2084,12 @@ int ObTransformJoinElimination::adjust_source_table(ObDMLStmt *source_stmt, ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected array count", K(output_id), K(output_map->count()), K(ret)); - } else if (OB_INVALID_ID != output_map->at(output_id)) { - column_id = output_map->at(output_id) + OB_APP_MIN_COLUMN_ID; - source_col = source_stmt->get_column_item_by_id(source_table_id, - column_id); - } else if (OB_ISNULL(source_table->ref_query_)) { + } else if (OB_UNLIKELY(OB_INVALID_ID == output_map->at(output_id))) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); + LOG_WARN("invalid output idx", K(output_id), K(ret)); } else { - column_id = source_table->ref_query_->get_select_item_size() + OB_APP_MIN_COLUMN_ID + miss_output_count; - ++miss_output_count; + column_id = output_map->at(output_id) + OB_APP_MIN_COLUMN_ID; + source_col = source_stmt->get_column_item_by_id(source_table_id, column_id); } } if (OB_FAIL(ret) || NULL != source_col) { // add new column to source_stmt @@ -2175,12 +2181,12 @@ int ObTransformJoinElimination::convert_target_table_column_exprs(ObDMLStmt *sou stmt_map_infos.at(i).select_item_map_, column_map))) { LOG_WARN("failed to reverse select items map", K(ret)); - } else if (OB_FAIL(adjust_source_table(source_stmt, target_stmt, source_table, target_table, - &column_map, source_col_exprs, target_col_exprs))) { - LOG_WARN("failed to merge table items", K(ret)); } else if (OB_FAIL(create_missing_select_items(source_ref_query, target_ref_query, column_map, stmt_map_infos.at(i).table_map_))) { + } else if (OB_FAIL(adjust_source_table(source_stmt, target_stmt, source_table, target_table, + &column_map, source_col_exprs, target_col_exprs))) { + LOG_WARN("failed to merge table items", K(ret)); LOG_WARN("failed to create missing select items", K(ret)); } } diff --git a/src/sql/rewrite/ob_transform_join_elimination.h b/src/sql/rewrite/ob_transform_join_elimination.h index b277b5bc49..c98575079c 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.h +++ b/src/sql/rewrite/ob_transform_join_elimination.h @@ -237,7 +237,7 @@ private: int create_missing_select_items(ObSelectStmt *source_stmt, ObSelectStmt *target_stmt, - const ObIArray &column_map, + ObIArray &column_map, const ObIArray &table_map); /** * @brief trans_table_item diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index fc90f0332d..a6d7674368 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -5344,7 +5344,6 @@ int ObTransformUtils::merge_table_items(ObDMLStmt *stmt, target_column_items))) { LOG_WARN("failed to get column items", K(ret)); } else { - int64_t miss_output_count = 0; uint64_t source_table_id = source_table->table_id_; uint64_t target_table_id = target_table->table_id_; for (int64_t i = 0; OB_SUCC(ret) && i < target_column_items.count(); ++i) { @@ -5367,16 +5366,12 @@ int ObTransformUtils::merge_table_items(ObDMLStmt *stmt, ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected array count", K(output_id), K(output_map->count()), K(ret)); - } else if (OB_INVALID_ID != output_map->at(output_id)) { - column_id = output_map->at(output_id) + OB_APP_MIN_COLUMN_ID; - source_col = stmt->get_column_item_by_id(source_table_id, - column_id); - } else if (OB_ISNULL(source_table->ref_query_)) { + } else if (OB_UNLIKELY(OB_INVALID_ID == output_map->at(output_id))) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("get unexpected null", K(ret)); + LOG_WARN("invalid output idx", K(output_id), K(ret)); } else { - column_id = source_table->ref_query_->get_select_item_size() + OB_APP_MIN_COLUMN_ID + miss_output_count; - ++miss_output_count; + column_id = output_map->at(output_id) + OB_APP_MIN_COLUMN_ID; + source_col = stmt->get_column_item_by_id(source_table_id, column_id); } } if (OB_FAIL(ret)) {