diff --git a/src/pl/ob_pl.cpp b/src/pl/ob_pl.cpp index 64a6a635c..7dcc011f0 100644 --- a/src/pl/ob_pl.cpp +++ b/src/pl/ob_pl.cpp @@ -1380,7 +1380,7 @@ int ObPLContext::set_default_database(ObPLFunction &routine, bool need_set_db = true; // in mysql mode, only system packages with invoker's right do not need set db - // in oracle mode, set db by if the routine is invoker's right + // in oracle mode, set db by if the routine is definer's right if (lib::is_oracle_mode() || get_tenant_id_by_object_id(routine.get_package_id()) == OB_SYS_TENANT_ID) { need_set_db = !routine.is_invoker_right(); diff --git a/src/pl/pl_cache/ob_pl_cache.cpp b/src/pl/pl_cache/ob_pl_cache.cpp index 93610e54a..828972f71 100644 --- a/src/pl/pl_cache/ob_pl_cache.cpp +++ b/src/pl/pl_cache/ob_pl_cache.cpp @@ -1291,5 +1291,47 @@ int64_t ObPLObjectSet::get_mem_size() return value_mem_size; } +int ObPLCacheCtx::adjust_definer_database_id() +{ + int ret = OB_SUCCESS; + ObLibCacheNameSpace ns = key_.namespace_; + uint64_t key_id = key_.key_id_; +#define TRANS_DB_ID(type) \ +do { \ + OZ(schema_guard_->get_##type##_info(get_tenant_id_by_object_id(key_id), \ + key_id, tmp_##type##_info)); \ + CK(OB_NOT_NULL(tmp_##type##_info)); \ + if (OB_FAIL(ret)) { \ + } else if (!tmp_##type##_info->is_invoker_right()) { \ + key_.db_id_ = tmp_##type##_info->get_database_id(); \ + } \ +} while (0) + switch (ns) { + case NS_PRCR: + case NS_SFC: { + // proc/func + const ObRoutineInfo* tmp_routine_info = NULL; + TRANS_DB_ID(routine); + break; + } + case NS_PKG: { + // package/udt/trigger + if (ObUDTObjectType::is_object_id_masked(key_id)) { + // TODO: udt info need set is_invoker_right flag + LOG_WARN("udt can not adjust db id for definer, will create new cache node", K(key_id)); + } else { + const ObPackageInfo* tmp_package_info = NULL; + TRANS_DB_ID(package); + } + break; + } + default: { + // do nothing + } + } +#undef TRANS_DB_ID + return ret; +} + } } diff --git a/src/pl/pl_cache/ob_pl_cache.h b/src/pl/pl_cache/ob_pl_cache.h index 9218bab4f..3804084b5 100644 --- a/src/pl/pl_cache/ob_pl_cache.h +++ b/src/pl/pl_cache/ob_pl_cache.h @@ -380,6 +380,7 @@ struct ObPLCacheCtx : public ObILibCacheCtx ParamStore *cache_params_; ObString raw_sql_; int64_t compile_time_; // pl object cost time of compile + int adjust_definer_database_id(); }; diff --git a/src/pl/pl_cache/ob_pl_cache_mgr.cpp b/src/pl/pl_cache/ob_pl_cache_mgr.cpp index 026117775..e5c096e65 100644 --- a/src/pl/pl_cache/ob_pl_cache_mgr.cpp +++ b/src/pl/pl_cache/ob_pl_cache_mgr.cpp @@ -85,6 +85,9 @@ int ObPLCacheMgr::get_pl_cache(ObPlanCache *lib_cache, ObCacheObjGuard& guard, O if (OB_NOT_NULL(pc_ctx.session_info_) && false == pc_ctx.session_info_->get_local_ob_enable_pl_cache()) { // do nothing + } else if (OB_FAIL(pc_ctx.adjust_definer_database_id())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("reset db_id failed!", K(ret)); } else if (OB_FAIL(get_pl_object(lib_cache, pc_ctx, guard))) { PL_CACHE_LOG(DEBUG, "fail to get plan", K(ret)); } else if (OB_ISNULL(guard.get_cache_obj())) { @@ -176,6 +179,9 @@ int ObPLCacheMgr::add_pl_cache(ObPlanCache *lib_cache, ObILibCacheObject *pl_obj } if (OB_FAIL(ret)) { } else if (FALSE_IT(pc_ctx.key_.namespace_ = ns)) { + } else if (OB_FAIL(pc_ctx.adjust_definer_database_id())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("reset db_id failed!", K(ret)); } else if (OB_FAIL(add_pl_object(lib_cache, pc_ctx, pl_object))) { if (!is_not_supported_err(ret) && OB_SQL_PC_PLAN_DUPLICATE != ret) {