处理issue:关闭编译依赖后,无法删除package
This commit is contained in:
@ -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:
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user