diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 896e14101f..e14c365f78 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -4093,7 +4093,6 @@ int ObSql::parser_and_check(const ObString &outlined_stmt, int ret = OB_SUCCESS; ObIAllocator &allocator = pc_ctx.allocator_; ObSQLSessionInfo *session = exec_ctx.get_my_session(); - ObPhysicalPlanCtx *pctx = exec_ctx.get_physical_plan_ctx(); bool is_stack_overflow = false; bool is_show_variables = false; @@ -4648,12 +4647,15 @@ int ObSql::need_add_plan(const ObPlanCacheCtx &pc_ctx, bool &need_add_plan) { int ret = OB_SUCCESS; + result.get_exec_context().get_stmt_factory()->get_query_ctx(); if (false == need_add_plan) { //do nothing } else if (!is_enable_pc || !pc_ctx.should_add_plan_) { need_add_plan = false; - } else if (OB_NOT_NULL(result.get_physical_plan()) && - result.get_physical_plan()->has_link_table()) { + } else if (OB_ISNULL(result.get_exec_context().get_stmt_factory()) || OB_ISNULL(result.get_exec_context().get_stmt_factory()->get_query_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected null ptr", K(ret), KP(result.get_exec_context().get_stmt_factory())); + } else if (result.get_exec_context().get_stmt_factory()->get_query_ctx()->has_dblink()) { need_add_plan = false; } return ret; diff --git a/src/sql/ob_sql_context.h b/src/sql/ob_sql_context.h index 70cbc16f28..2a5963f612 100644 --- a/src/sql/ob_sql_context.h +++ b/src/sql/ob_sql_context.h @@ -687,7 +687,8 @@ public: res_map_rule_param_idx_(common::OB_INVALID_INDEX), root_stmt_(NULL), optimizer_features_enable_version_(0), - udf_flag_(0) + udf_flag_(0), + has_dblink_(false) { } TO_STRING_KV(N_PARAM_NUM, question_marks_count_, @@ -733,6 +734,7 @@ public: root_stmt_ = NULL; udf_flag_ = 0; optimizer_features_enable_version_ = 0; + has_dblink_ = false; } int64_t get_new_stmt_id() { return stmt_count_++; } @@ -758,6 +760,8 @@ public: void set_is_prepare_stmt(bool is_prepare) { is_prepare_stmt_ = is_prepare; } bool has_nested_sql() const { return has_nested_sql_; } void set_has_nested_sql(bool has_nested_sql) { has_nested_sql_ = has_nested_sql; } + bool has_dblink() const { return has_dblink_; } + void set_has_dblink(bool v) { has_dblink_ = v; } void set_timezone_info(const common::ObTimeZoneInfo *tz_info) { tz_info_ = tz_info; } const common::ObTimeZoneInfo *get_timezone_info() const { return tz_info_; } int add_local_session_vars(ObIAllocator *alloc, const ObLocalSessionVar &local_session_var, int64_t &idx); @@ -825,6 +829,7 @@ public: int8_t reserved_:5; }; }; + bool has_dblink_; }; } /* ns sql*/ } /* ns oceanbase */ diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 3858a40e52..81758e9806 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -8229,13 +8229,20 @@ int ObDMLResolver::resolve_table_relation_factor(const ParseNode *node, { int ret = OB_SUCCESS; bool has_dblink_node = false; + ObQueryCtx *query_ctx = NULL; if (OB_ISNULL(session_info_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("session info is NULL", K(ret)); + } else if (OB_ISNULL(get_stmt()) || OB_ISNULL(query_ctx = get_stmt()->get_query_ctx())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("Stmt and query ctx should not be NULL. ", K(ret), K(get_stmt()), K(query_ctx)); } else if (OB_FAIL(resolve_dblink_name(node, tenant_id, dblink_name, is_reverse_link, has_dblink_node))) { LOG_WARN("resolve dblink name failed", K(ret)); } else { - LOG_DEBUG("resolve dblink name", K(dblink_name), K(is_reverse_link)); + LOG_WARN("resolve dblink name", K(has_dblink_node), K(dblink_name), K(is_reverse_link)); + if (has_dblink_node) { + query_ctx->set_has_dblink(true); + } if (!is_reverse_link && dblink_name.empty()) { if (OB_FAIL(resolve_table_relation_factor_normal(node, tenant_id, database_id, table_name, synonym_name,