diff --git a/src/common/backend/catalog/dependency.cpp b/src/common/backend/catalog/dependency.cpp index f45fc1312..9ae1da807 100644 --- a/src/common/backend/catalog/dependency.cpp +++ b/src/common/backend/catalog/dependency.cpp @@ -2659,9 +2659,33 @@ char* getObjectDescription(const ObjectAddress* object) break; case OCLASS_PROC: - signature = format_procedure(object->objectId); - appendStringInfo(&buffer, _("function %s"), signature); - pfree_ext(signature); + if (enable_plpgsql_gsdependency()) { + MemoryContext save_context = CurrentMemoryContext; + PG_TRY(); + { + signature = format_procedure(object->objectId); + appendStringInfo(&buffer, _("function %s"), signature); + pfree_ext(signature); + } + PG_CATCH(); + { + ErrorData* edata = &t_thrd.log_cxt.errordata[t_thrd.log_cxt.errordata_stack_depth]; + if (edata->sqlerrcode == ERRCODE_CACHE_LOOKUP_FAILED) { + MemoryContextSwitchTo(save_context); + signature = get_func_name(object->objectId); + appendStringInfo(&buffer, _("function %s"), signature); + pfree_ext(signature); + FlushErrorState(); + } else { + PG_RE_THROW(); + } + } + PG_END_TRY(); + } else { + signature = format_procedure(object->objectId); + appendStringInfo(&buffer, _("function %s"), signature); + pfree_ext(signature); + } break; case OCLASS_PACKAGE: diff --git a/src/common/backend/utils/adt/regproc.cpp b/src/common/backend/utils/adt/regproc.cpp index c5e4713fd..bf0d63699 100644 --- a/src/common/backend/utils/adt/regproc.cpp +++ b/src/common/backend/utils/adt/regproc.cpp @@ -364,7 +364,7 @@ char * format_procedure_no_visible(Oid procedure_oid) { char* result = NULL; HeapTuple proctup; - proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procedure_oid)); + proctup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procedure_oid)); if (HeapTupleIsValid(proctup)) { Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup); char* proname = NameStr(procform->proname); @@ -383,7 +383,7 @@ char * format_procedure_no_visible(Oid procedure_oid) } appendStringInfoChar(&buf, ')'); result = buf.data; - ReleaseSysCache(proctup); + heap_freetuple(proctup); } else { /* If OID doesn't match any pg_proc entry, return it numerically */ result = (char*)palloc(NAMEDATALEN); @@ -406,7 +406,7 @@ format_procedure_internal(Oid procedure_oid, bool force_qualify) char* result = NULL; HeapTuple proctup; - proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(procedure_oid)); + proctup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procedure_oid)); if (HeapTupleIsValid(proctup)) { Form_pg_proc procform = (Form_pg_proc)GETSTRUCT(proctup); @@ -443,7 +443,7 @@ format_procedure_internal(Oid procedure_oid, bool force_qualify) result = buf.data; - ReleaseSysCache(proctup); + heap_freetuple(proctup); } else { /* If OID doesn't match any pg_proc entry, return it numerically */ result = (char*)palloc(NAMEDATALEN); diff --git a/src/common/backend/utils/gsplsql/gsobject_dependencies.cpp b/src/common/backend/utils/gsplsql/gsobject_dependencies.cpp index 7a0dec7fa..c0a57548b 100644 --- a/src/common/backend/utils/gsplsql/gsobject_dependencies.cpp +++ b/src/common/backend/utils/gsplsql/gsobject_dependencies.cpp @@ -300,7 +300,7 @@ Oid gsplsql_get_proc_oid(const char* schemaName, const char* packageName, const } ReleaseSysCacheList(catlist); FreeStringInfo(&procNameStr); - ereport(ERROR, (errmodule(MOD_PLSQL), errmsg("function %s does not exist", name))); + ereport(WARNING, (errmodule(MOD_PLSQL), errmsg("function %s does not exist", name))); return InvalidOid; } @@ -347,7 +347,7 @@ Oid gsplsql_get_proc_oid(const char* schemaName, const char* packageName, const } } ReleaseSysCacheList(catlist); - ereport(ERROR, (errmodule(MOD_PLSQL), errmsg("function %s does not exist", name))); + ereport(WARNING, (errmodule(MOD_PLSQL), errmsg("function %s does not exist", name))); return InvalidOid; } diff --git a/src/gausskernel/optimizer/commands/functioncmds.cpp b/src/gausskernel/optimizer/commands/functioncmds.cpp index a62451b94..d715dcdba 100644 --- a/src/gausskernel/optimizer/commands/functioncmds.cpp +++ b/src/gausskernel/optimizer/commands/functioncmds.cpp @@ -1632,7 +1632,7 @@ void RemoveFunctionById(Oid funcOid) #ifndef ENABLE_MULTIPLE_NODES GsDependObjDesc func_head_obj; - if (t_thrd.proc->workingVersionNum >= SUPPORT_GS_DEPENDENCY_VERSION_NUM) { + if (enable_plpgsql_gsdependency_guc()) { Oid pro_namespace = procedureStruct->pronamespace; bool is_null; Datum pro_package_id_datum = SysCacheGetAttr(PROCOID, tup, Anum_pg_proc_packageid, &is_null); @@ -1681,7 +1681,7 @@ void RemoveFunctionById(Oid funcOid) pfree_ext(funcName); #endif #ifndef ENABLE_MULTIPLE_NODES - if (t_thrd.proc->workingVersionNum >= SUPPORT_GS_DEPENDENCY_VERSION_NUM) { + if (enable_plpgsql_gsdependency_guc()) { CommandCounterIncrement(); func_head_obj.type = GSDEPEND_OBJECT_TYPE_PROCHEAD; gsplsql_remove_dependencies_object(&func_head_obj); diff --git a/src/gausskernel/optimizer/commands/typecmds.cpp b/src/gausskernel/optimizer/commands/typecmds.cpp index 099778782..c4c792ea3 100644 --- a/src/gausskernel/optimizer/commands/typecmds.cpp +++ b/src/gausskernel/optimizer/commands/typecmds.cpp @@ -649,7 +649,7 @@ void RemoveTypeById(Oid typeOid) { #ifndef ENABLE_MULTIPLE_NODES GsDependObjDesc ref_obj; - if (t_thrd.proc->workingVersionNum >= SUPPORT_GS_DEPENDENCY_VERSION_NUM) { + if (enable_plpgsql_gsdependency_guc()) { gsplsql_init_gs_depend_obj_desc(&ref_obj); char relkind = get_rel_relkind(typeOid); if (relkind == RELKIND_COMPOSITE_TYPE || relkind == '\0') { @@ -700,29 +700,26 @@ void RemoveTypeById(Oid typeOid) heap_close(relation, RowExclusiveLock); #ifndef ENABLE_MULTIPLE_NODES - if (t_thrd.proc->workingVersionNum >= SUPPORT_GS_DEPENDENCY_VERSION_NUM && NULL != ref_obj.name) { + if (enable_plpgsql_gsdependency_guc() && NULL != ref_obj.name) { CommandCounterIncrement(); + (void)gsplsql_remove_ref_dependency(&ref_obj); ref_obj.refPosType = GSDEPEND_REFOBJ_POS_IN_TYPE; - gsplsql_remove_type_gs_dependency(&ref_obj); - if (enable_plpgsql_gsdependency_guc()) { - ref_obj.type = GSDEPEND_OBJECT_TYPE_TYPE; - (void)gsplsql_remove_ref_dependency(&ref_obj); - Oid pkg_oid = GetTypePackageOid(typeOid); - if (OidIsValid(pkg_oid)) { - bool invalid_pkg = true; - if (NULL != u_sess->plsql_cxt.curr_compile_context && - NULL != u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package) { - invalid_pkg = pkg_oid == - u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package->pkg_oid; - } - if (invalid_pkg) { - bool is_spec = ref_obj.name[0] != '$'; - SetPgObjectValid(pkg_oid, is_spec ? OBJECT_TYPE_PKGSPEC : OBJECT_TYPE_PKGBODY, false); - if (is_spec) { - SetPgObjectValid(pkg_oid, OBJECT_TYPE_PKGBODY, false); - } - gsplsql_set_pkg_func_status(GetPackageNamespace(pkg_oid), pkg_oid, false); + (void)gsplsql_remove_gs_dependency(&ref_obj); + Oid pkg_oid = GetTypePackageOid(typeOid); + if (OidIsValid(pkg_oid)) { + bool invalid_pkg = true; + if (NULL != u_sess->plsql_cxt.curr_compile_context && + NULL != u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package) { + invalid_pkg = pkg_oid == + u_sess->plsql_cxt.curr_compile_context->plpgsql_curr_compile_package->pkg_oid; + } + if (invalid_pkg) { + bool is_spec = ref_obj.name[0] != '$'; + SetPgObjectValid(pkg_oid, is_spec ? OBJECT_TYPE_PKGSPEC : OBJECT_TYPE_PKGBODY, false); + if (is_spec) { + SetPgObjectValid(pkg_oid, OBJECT_TYPE_PKGBODY, false); } + gsplsql_set_pkg_func_status(GetPackageNamespace(pkg_oid), pkg_oid, false); } } pfree_ext(ref_obj.schemaName); diff --git a/src/test/regress/expected/plpgsql_depend/plpgsql_recompile.out b/src/test/regress/expected/plpgsql_depend/plpgsql_recompile.out index db25c0bec..52234c823 100644 --- a/src/test/regress/expected/plpgsql_depend/plpgsql_recompile.out +++ b/src/test/regress/expected/plpgsql_depend/plpgsql_recompile.out @@ -466,6 +466,51 @@ INFO: call p_in: (1,"(1,zhang,M,1)") drop type r1; drop table stu; drop procedure test_proc; +-- test 7 +set behavior_compat_options = 'plpgsql_dependency'; +create or replace package pkg1 is +type tttt is record (col1 int, col2 text); +procedure p1(param pkg2.tqqq); +end pkg1; +/ +WARNING: Type tqqq does not exist. +WARNING: The header information of function p1 is not defined. +CONTEXT: compilation of PL/pgSQL package near line 1 +WARNING: Package created with compilation erors. +create or replace package pkg2 is +type tqqq is record (col1 int, col2 text, col3 varchar); +procedure p1(param pkg1.tttt); +end pkg2; +/ +--?.* +WARNING: Package created with compilation erors. +create or replace package body pkg2 is +procedure p1(param pkg1.tttt) is +begin +RAISE INFO 'call param: %', param; +end; +end pkg2; +/ +--?.* +WARNING: Package Body created with compilation erors. +call pkg2.p1((1,'a')); +INFO: call param: (1,a) + p1 +---- + +(1 row) + +set behavior_compat_options =''; +drop package pkg1; +--?.* +set behavior_compat_options = 'plpgsql_dependency'; +drop package pkg2; +NOTICE: drop cascades to function p1 +WARNING: The oid of the input parameter type of function p1 does not exist. +WARNING: function p1 does not exist +WARNING: function p1(plpgsql_recompile.pkg2.tqqq) does not exist +WARNING: function p1 does not exist +WARNING: function p1(plpgsql_recompile.pkg2.tqqq) does not exist -- clean drop schema plpgsql_recompile_new cascade; drop schema plpgsql_recompile cascade; diff --git a/src/test/regress/sql/plpgsql_depend/plpgsql_recompile.sql b/src/test/regress/sql/plpgsql_depend/plpgsql_recompile.sql index 254346521..ba1724b27 100644 --- a/src/test/regress/sql/plpgsql_depend/plpgsql_recompile.sql +++ b/src/test/regress/sql/plpgsql_depend/plpgsql_recompile.sql @@ -256,6 +256,32 @@ drop type r1; drop table stu; drop procedure test_proc; +-- test 7 +set behavior_compat_options = 'plpgsql_dependency'; +create or replace package pkg1 is +type tttt is record (col1 int, col2 text); +procedure p1(param pkg2.tqqq); +end pkg1; +/ +create or replace package pkg2 is +type tqqq is record (col1 int, col2 text, col3 varchar); +procedure p1(param pkg1.tttt); +end pkg2; +/ +create or replace package body pkg2 is +procedure p1(param pkg1.tttt) is +begin +RAISE INFO 'call param: %', param; +end; +end pkg2; +/ + +call pkg2.p1((1,'a')); +set behavior_compat_options =''; +drop package pkg1; +set behavior_compat_options = 'plpgsql_dependency'; +drop package pkg2; + -- clean drop schema plpgsql_recompile_new cascade; drop schema plpgsql_recompile cascade;