[FEAT MERGE] 4.1 PL/SQL enhence & development
This commit is contained in:
@ -27,6 +27,7 @@
|
||||
#include "observer/ob_server_struct.h"
|
||||
#include "observer/ob_req_time_service.h"
|
||||
#include "lib/file/file_directory_utils.h"
|
||||
#include "pl/pl_cache/ob_pl_cache_mgr.h"
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
@ -859,7 +860,7 @@ int ObPLPackageManager::load_package_body(const ObPLResolveCtx &resolve_ctx,
|
||||
HEAP_VARS_2((ObPLPackageAST, package_spec_ast, resolve_ctx.allocator_),
|
||||
(ObPLPackageAST, package_body_ast, resolve_ctx.allocator_)) {
|
||||
ObString source;
|
||||
if (package_spec_info.is_for_trigger() && lib::is_oracle_mode()) {
|
||||
if (package_spec_info.is_for_trigger()) {
|
||||
OZ (ObTriggerInfo::gen_package_source(package_spec_info.get_tenant_id(),
|
||||
package_spec_info.get_package_id(),
|
||||
source,
|
||||
@ -1278,26 +1279,29 @@ int ObPLPackageManager::add_package_to_plan_cache(const ObPLResolveCtx &resolve_
|
||||
int64_t tenant_id = resolve_ctx.session_info_.get_effective_tenant_id();
|
||||
uint64_t package_id = package->get_id();
|
||||
ObString sql("package");
|
||||
ObArenaAllocator allocator(ObModIds::OB_PL_TEMP);
|
||||
// empty plan ctx
|
||||
ObPhysicalPlanCtx phy_plan_ctx(resolve_ctx.allocator_);
|
||||
HEAP_VAR(ObExecContext, exec_ctx, allocator) {
|
||||
exec_ctx.set_physical_plan_ctx(&phy_plan_ctx);
|
||||
exec_ctx.set_my_session(&resolve_ctx.session_info_);
|
||||
ObSqlCtx sql_ctx;
|
||||
sql_ctx.session_info_ = &resolve_ctx.session_info_;
|
||||
sql_ctx.schema_guard_ = &resolve_ctx.schema_guard_;
|
||||
(void)ObSQLUtils::md5(sql,sql_ctx.sql_id_, (int32_t)sizeof(sql_ctx.sql_id_));
|
||||
ObPlanCacheCtx pc_ctx(sql, false, resolve_ctx.allocator_, sql_ctx, exec_ctx, tenant_id);
|
||||
pc_ctx.fp_result_.reset();
|
||||
pc_ctx.fp_result_.pc_key_.key_id_ = package_id;
|
||||
pc_ctx.fp_result_.pc_key_.namespace_ = ObLibCacheNameSpace::NS_PKG;
|
||||
pc_ctx.fp_result_.pc_key_.sessid_ =
|
||||
(get_tenant_id_by_object_id(package_id) != OB_SYS_TENANT_ID && resolve_ctx.session_info_.is_pl_debug_on())
|
||||
? resolve_ctx.session_info_.get_sessid() : 0;
|
||||
//ObArenaAllocator allocator(ObModIds::OB_PL_TEMP);
|
||||
|
||||
//HEAP_VAR(ObExecContext, exec_ctx, allocator) {
|
||||
|
||||
uint64_t database_id = OB_INVALID_ID;
|
||||
resolve_ctx.session_info_.get_database_id(database_id);
|
||||
|
||||
ObPLCacheCtx pc_ctx;
|
||||
pc_ctx.session_info_ = &resolve_ctx.session_info_;
|
||||
pc_ctx.schema_guard_ = &resolve_ctx.schema_guard_;
|
||||
(void)ObSQLUtils::md5(sql,pc_ctx.sql_id_, (int32_t)sizeof(pc_ctx.sql_id_));
|
||||
int64_t sys_schema_version = OB_INVALID_VERSION;
|
||||
int64_t tenant_schema_version = OB_INVALID_VERSION;
|
||||
if (OB_FAIL(resolve_ctx.schema_guard_.get_schema_version(tenant_id, tenant_schema_version))
|
||||
|
||||
pc_ctx.key_.namespace_ = ObLibCacheNameSpace::NS_PKG;
|
||||
pc_ctx.key_.db_id_ = database_id;
|
||||
pc_ctx.key_.key_id_ = package_id;
|
||||
pc_ctx.key_.sessid_ =
|
||||
(get_tenant_id_by_object_id(package_id) != OB_SYS_TENANT_ID && resolve_ctx.session_info_.is_pl_debug_on())
|
||||
? resolve_ctx.session_info_.get_sessid() : 0;
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_FAIL(resolve_ctx.schema_guard_.get_schema_version(tenant_id, tenant_schema_version))
|
||||
|| OB_FAIL(resolve_ctx.schema_guard_.get_schema_version(OB_SYS_TENANT_ID, sys_schema_version))) {
|
||||
LOG_WARN("fail to get schema version", K(ret), K(tenant_id));
|
||||
} else {
|
||||
@ -1306,7 +1310,7 @@ int ObPLPackageManager::add_package_to_plan_cache(const ObPLResolveCtx &resolve_
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(plan_cache->add_pl_cache(package, pc_ctx))) {
|
||||
} else if (OB_FAIL(ObPLCacheMgr::add_pl_cache(resolve_ctx.session_info_.get_plan_cache(), package, pc_ctx))) {
|
||||
if (OB_SQL_PC_PLAN_DUPLICATE == ret) {
|
||||
LOG_INFO("package has been added by others, need not add again", K(package_id), K(ret));
|
||||
ret = OB_SUCCESS;
|
||||
@ -1323,10 +1327,10 @@ int ObPLPackageManager::add_package_to_plan_cache(const ObPLResolveCtx &resolve_
|
||||
}
|
||||
} else {
|
||||
LOG_INFO("add pl package to plan cache success",
|
||||
K(ret), K(package_id), K(package->get_dependency_table()), K(pc_ctx.fp_result_));
|
||||
K(ret), K(package_id), K(package->get_dependency_table()), K(pc_ctx.key_));
|
||||
}
|
||||
exec_ctx.set_physical_plan_ctx(NULL);
|
||||
}
|
||||
//exec_ctx.set_physical_plan_ctx(NULL);
|
||||
//}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@ -1337,7 +1341,6 @@ int ObPLPackageManager::get_package_from_plan_cache(const ObPLResolveCtx &resolv
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
package = NULL;
|
||||
ObPlanCache *plan_cache = NULL;
|
||||
bool is_overflow = false;
|
||||
if (OB_FAIL(check_stack_overflow(is_overflow))) {
|
||||
LOG_WARN("failed to check stack overflow", K(ret));
|
||||
@ -1347,33 +1350,34 @@ int ObPLPackageManager::get_package_from_plan_cache(const ObPLResolveCtx &resolv
|
||||
}
|
||||
if (OB_FAIL(ret)) {
|
||||
// do nothing
|
||||
} else if (OB_ISNULL(plan_cache = resolve_ctx.session_info_.get_plan_cache())) {
|
||||
ret = OB_ERR_UNEXPECTED;
|
||||
LOG_WARN("plan cache is null", K(ret));
|
||||
} else {
|
||||
ObString sql("package");
|
||||
SMART_VAR(ObExecContext, exec_ctx, resolve_ctx.allocator_) {
|
||||
exec_ctx.set_my_session(&resolve_ctx.session_info_);
|
||||
ObSqlCtx sql_ctx;
|
||||
sql_ctx.session_info_ = &resolve_ctx.session_info_;
|
||||
sql_ctx.schema_guard_ = &resolve_ctx.schema_guard_;
|
||||
(void)ObSQLUtils::md5(sql,sql_ctx.sql_id_, (int32_t)sizeof(sql_ctx.sql_id_));
|
||||
ObPlanCacheCtx pc_ctx(sql, false, resolve_ctx.allocator_, sql_ctx, exec_ctx, resolve_ctx.session_info_.get_effective_tenant_id());
|
||||
pc_ctx.fp_result_.reset();
|
||||
pc_ctx.fp_result_.pc_key_.key_id_ = package_id;
|
||||
pc_ctx.fp_result_.pc_key_.namespace_ = ObLibCacheNameSpace::NS_PKG;
|
||||
pc_ctx.fp_result_.pc_key_.sessid_ =
|
||||
//SMART_VAR(ObExecContext, exec_ctx, resolve_ctx.allocator_) {
|
||||
|
||||
uint64_t database_id = OB_INVALID_ID;
|
||||
resolve_ctx.session_info_.get_database_id(database_id);
|
||||
|
||||
ObPLCacheCtx pc_ctx;
|
||||
pc_ctx.session_info_ = &resolve_ctx.session_info_;
|
||||
pc_ctx.schema_guard_ = &resolve_ctx.schema_guard_;
|
||||
(void)ObSQLUtils::md5(sql,pc_ctx.sql_id_, (int32_t)sizeof(pc_ctx.sql_id_));
|
||||
pc_ctx.key_.namespace_ = ObLibCacheNameSpace::NS_PKG;
|
||||
pc_ctx.key_.db_id_ = database_id;
|
||||
pc_ctx.key_.key_id_ = package_id;
|
||||
pc_ctx.key_.sessid_ =
|
||||
(get_tenant_id_by_object_id(package_id) != OB_SYS_TENANT_ID && resolve_ctx.session_info_.is_pl_debug_on())
|
||||
? resolve_ctx.session_info_.get_sessid() : 0;
|
||||
|
||||
// get package from plan cache
|
||||
ObCacheObjGuard* cacheobj_guard = NULL;
|
||||
void* buf = NULL;
|
||||
if (OB_ISNULL(buf = resolve_ctx.package_guard_.alloc_.alloc(sizeof(ObCacheObjGuard)))) {
|
||||
if (OB_FAIL(ret)) {
|
||||
} else if (OB_ISNULL(buf = resolve_ctx.package_guard_.alloc_.alloc(sizeof(ObCacheObjGuard)))) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
LOG_WARN("failed to allocate memory.", K(ret));
|
||||
} else if (FALSE_IT(cacheobj_guard = new (buf)ObCacheObjGuard(GET_PKG_HANDLE))) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(plan_cache->get_pl_package(*cacheobj_guard, pc_ctx))) {
|
||||
} else if (OB_FAIL(ObPLCacheMgr::get_pl_cache(resolve_ctx.session_info_.get_plan_cache(), *cacheobj_guard, pc_ctx))) {
|
||||
LOG_INFO("get pl package from plan cache failed", K(ret), K(package_id));
|
||||
if (OB_ERR_UNEXPECTED != ret) {
|
||||
ret = OB_SUCCESS;
|
||||
@ -1390,7 +1394,7 @@ int ObPLPackageManager::get_package_from_plan_cache(const ObPLResolveCtx &resolv
|
||||
LOG_DEBUG("get package from plan cache success", K(ret), K(package_id));
|
||||
}
|
||||
} else {}
|
||||
}
|
||||
//}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user