From 568b45a826a0995e0148895a5bf1b45734410d1a Mon Sep 17 00:00:00 2001 From: zl0 Date: Mon, 24 Jan 2022 14:22:20 +0800 Subject: [PATCH] fix stmt compare bug --- src/sql/rewrite/ob_stmt_comparer.cpp | 1 + src/sql/rewrite/ob_transform_join_elimination.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sql/rewrite/ob_stmt_comparer.cpp b/src/sql/rewrite/ob_stmt_comparer.cpp index 555847cb77..f83cce0165 100644 --- a/src/sql/rewrite/ob_stmt_comparer.cpp +++ b/src/sql/rewrite/ob_stmt_comparer.cpp @@ -279,6 +279,7 @@ int ObStmtComparer::check_stmt_containment( } else if (first_sel->is_set_stmt() || second_sel->is_set_stmt() || first_sel->has_recusive_cte() || second_sel->has_recusive_cte() || first_sel->has_hierarchical_query() || second_sel->has_hierarchical_query() || first_sel->is_contains_assignment() || + first_sel->get_semi_info_size() > 0 || second_sel->get_semi_info_size() > 0 || second_sel->is_contains_assignment()) { /*do nothing*/ } else if (first_sel->get_from_item_size() != second_sel->get_from_item_size()) { diff --git a/src/sql/rewrite/ob_transform_join_elimination.cpp b/src/sql/rewrite/ob_transform_join_elimination.cpp index dfc0ab9e99..e5097612bd 100644 --- a/src/sql/rewrite/ob_transform_join_elimination.cpp +++ b/src/sql/rewrite/ob_transform_join_elimination.cpp @@ -357,8 +357,13 @@ int ObTransformJoinElimination::create_missing_select_items(ObSelectStmt* source for (int64_t i = 0; OB_SUCC(ret) && i < table_map.count(); i++) { TableItem* temp_source_table = NULL; TableItem* temp_target_table = NULL; - if (OB_ISNULL(temp_source_table = source_stmt->get_table_item(i)) || - OB_ISNULL(temp_target_table = target_stmt->get_table_item(table_map.at(i)))) { + int64_t idx = table_map.at(i); + if (idx < 0 || idx >= target_stmt->get_table_size() || + i >= source_stmt->get_table_size()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpect table idx", K(ret)); + } else if (OB_ISNULL(temp_source_table = source_stmt->get_table_item(i)) || + OB_ISNULL(temp_target_table = target_stmt->get_table_item(idx))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(temp_source_table), K(temp_target_table), K(ret)); } else if ((temp_source_table->is_basic_table() && temp_target_table->is_basic_table()) || -- GitLab