处理issue:关闭编译依赖后,无法删除package

This commit is contained in:
lukeman
2024-03-28 17:01:37 +08:00
committed by yaoxin
parent 4e9a5b43ba
commit 0c7b9176bf
7 changed files with 124 additions and 32 deletions

View File

@ -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:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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