diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index fd8c2c446e..028b7b5ce1 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -13401,11 +13401,7 @@ int ObLogPlan::fill_join_filter_info(JoinFilterInfo &join_filter_info) ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); } else { - join_filter_info.pushdown_filter_table_.qb_name_ = qb_name; - join_filter_info.pushdown_filter_table_.table_name_ = table_item->get_object_name(); - if (table_item->is_basic_table()) { - join_filter_info.pushdown_filter_table_.db_name_ = table_item->database_name_; - } + join_filter_info.pushdown_filter_table_.set_table(*table_item); } return ret; } diff --git a/src/sql/optimizer/ob_logical_operator.cpp b/src/sql/optimizer/ob_logical_operator.cpp index 154ef9c0de..755d46a0d5 100644 --- a/src/sql/optimizer/ob_logical_operator.cpp +++ b/src/sql/optimizer/ob_logical_operator.cpp @@ -1402,23 +1402,13 @@ int ObLogicalOperator::print_used_hint(PlanText &plan_text) int ObLogicalOperator::print_outline_table(PlanText &plan_text, const TableItem *table_item) const { int ret = OB_SUCCESS; - char *buf = plan_text.buf_; - int64_t &buf_len = plan_text.buf_len_; - int64_t &pos = plan_text.pos_; + ObTableInHint table_hint; if (OB_ISNULL(table_item)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected NULL", K(ret), K(table_item)); - } else if (table_item->is_basic_table() && !table_item->database_name_.empty() && - OB_FAIL(BUF_PRINTF("\"%.*s\".", - table_item->database_name_.length(), - table_item->database_name_.ptr()))) { - LOG_WARN("fail to print db name", K(ret), K(buf), K(buf_len), K(pos)); - } else if (OB_FAIL(BUF_PRINTF("\"%.*s\"@\"%.*s\"", - table_item->get_object_name().length(), - table_item->get_object_name().ptr(), - table_item->qb_name_.length(), - table_item->qb_name_.ptr()))) { - LOG_WARN("fail to print buffer", K(ret), K(buf), K(buf_len), K(pos)); + } else if (OB_FALSE_IT(table_hint.set_table(*table_item))) { + } else if (OB_FAIL(table_hint.print_table_in_hint(plan_text))) { + LOG_WARN("failed to print table hint", K(ret)); } return ret; } diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index 51b2491e24..71a82785ef 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -364,7 +364,11 @@ struct TableItem const common::ObString &get_table_name() const { return alias_name_.empty() ? table_name_ : alias_name_; } const common::ObString &get_object_name() const { - return alias_name_.empty() ? (synonym_name_.empty() ? get_table_name() : synonym_name_) : alias_name_; + return alias_name_.empty() ? (synonym_name_.empty() ? table_name_ : synonym_name_) : alias_name_; + } + const common::ObString &get_object_db_name() const + { + return synonym_name_.empty() ? database_name_ : synonym_db_name_; } const TableItem &get_base_table_item() const { diff --git a/src/sql/resolver/dml/ob_hint.cpp b/src/sql/resolver/dml/ob_hint.cpp index 8f74c0d406..ccb43c9ae0 100644 --- a/src/sql/resolver/dml/ob_hint.cpp +++ b/src/sql/resolver/dml/ob_hint.cpp @@ -1226,8 +1226,7 @@ int ObHint::create_push_down_hint(ObIAllocator *allocator, ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected null", K(ret)); } else if (all_tables.at(i)->is_match_table_item(cs_type, source_table)) { - all_tables.at(i)->db_name_ = target_table.database_name_; - all_tables.at(i)->table_name_ = target_table.get_object_name(); + all_tables.at(i)->set_table(target_table); } } if (OB_SUCC(ret)) { @@ -2716,7 +2715,7 @@ int ObTableInHint::print_table_in_hint(PlanText &plan_text, bool ObTableInHint::is_match_table_item(ObCollationType cs_type, const TableItem &table_item) const { return 0 == ObCharset::strcmp(cs_type, table_name_, table_item.get_object_name()) && - (db_name_.empty() || 0 == ObCharset::strcmp(cs_type, db_name_, table_item.database_name_)); + (db_name_.empty() || 0 == ObCharset::strcmp(cs_type, db_name_, table_item.get_object_db_name())); } bool ObTableInHint::is_match_physical_table_item(ObCollationType cs_type, const TableItem &table_item) const @@ -2802,6 +2801,7 @@ bool ObTableInHint::is_match_table_items(ObCollationType cs_type, void ObTableInHint::set_table(const TableItem& table) { qb_name_.assign_ptr(table.qb_name_.ptr(), table.qb_name_.length()); + db_name_.reset(); // for alias table or generated table, db_name_ should be empty if (!table.alias_name_.empty()) { table_name_.assign_ptr(table.alias_name_.ptr(), table.alias_name_.length()); } else if (table.is_synonym()) { diff --git a/src/sql/resolver/dml/ob_hint.h b/src/sql/resolver/dml/ob_hint.h index 95df31ca8f..c4d2d47fc3 100644 --- a/src/sql/resolver/dml/ob_hint.h +++ b/src/sql/resolver/dml/ob_hint.h @@ -433,6 +433,8 @@ struct ObTableInHint const common::ObString &table_name) : qb_name_(qb_name), db_name_(db_name), table_name_(table_name) { } + ObTableInHint(const TableItem& table) + { set_table(table); } int assign(const ObTableInHint &other); bool is_match_table_item(ObCollationType cs_type, const TableItem &table_item) const; bool is_match_physical_table_item(ObCollationType cs_type, const TableItem &table_item) const; diff --git a/src/sql/resolver/dml/ob_sql_hint.cpp b/src/sql/resolver/dml/ob_sql_hint.cpp index 367db77000..80d656bef9 100644 --- a/src/sql/resolver/dml/ob_sql_hint.cpp +++ b/src/sql/resolver/dml/ob_sql_hint.cpp @@ -960,9 +960,7 @@ int ObQueryHint::fill_tables(const TableItem &table, ObIArray &hi || OB_FAIL(tables.push_back(join_table->right_table_))) { LOG_WARN("failed to push back", K(ret)); } - } else if (OB_FAIL(hint_tables.push_back(ObTableInHint(cur_table->qb_name_, - cur_table->database_name_, - cur_table->get_object_name())))) { + } else if (OB_FAIL(hint_tables.push_back(ObTableInHint(*cur_table)))) { LOG_WARN("failed to push back", K(ret)); } } diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 0a8bd750b5..ec43afe39e 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -12762,8 +12762,7 @@ int ObTransformUtils::get_sorted_table_hint(ObSEArray &tables, if (OB_ISNULL(table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(table_hints.push_back( - ObTableInHint(table->qb_name_, table->database_name_, table->get_object_name())))) { + } else if (OB_FAIL(table_hints.push_back(ObTableInHint(*table)))) { LOG_WARN("failed to push back hint table", K(ret)); } } diff --git a/src/sql/rewrite/ob_transform_win_magic.cpp b/src/sql/rewrite/ob_transform_win_magic.cpp index 467e4e15a8..a471a20b8a 100644 --- a/src/sql/rewrite/ob_transform_win_magic.cpp +++ b/src/sql/rewrite/ob_transform_win_magic.cpp @@ -103,8 +103,7 @@ int ObTransformWinMagic::construct_transform_hint(ObDMLStmt &stmt, void *trans_p if (OB_ISNULL(table)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(hint->get_tb_name_list().push_back(ObTableInHint(table->qb_name_, - table->database_name_, table->get_object_name())))) { + } else if (OB_FAIL(hint->get_tb_name_list().push_back(ObTableInHint(*table)))) { LOG_WARN("failed to push back hint table", K(ret)); } }