[FEAT MERGE] 4.1 PL/SQL enhence & development

This commit is contained in:
obdev
2023-01-09 08:47:31 +00:00
committed by ob-robot
parent 322032b9ca
commit 08802d94f6
98 changed files with 5260 additions and 2676 deletions

View File

@ -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;
}