diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 6928835b6a..395c11605a 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -639,7 +639,8 @@ get_object_address_relobject(ObjectType objtype, List *objname, * Caller is expecting to get back the relation, even though we * didn't end up using it to find the rule. */ - relation = heap_open(reloid, AccessShareLock); + if (OidIsValid(address.objectId)) + relation = heap_open(reloid, AccessShareLock); } else { @@ -677,6 +678,14 @@ get_object_address_relobject(ObjectType objtype, List *objname, address.objectId = InvalidOid; address.objectSubId = 0; } + + /* Avoid relcache leak when object not found. */ + if (!OidIsValid(address.objectId)) + { + heap_close(relation, AccessShareLock); + relation = NULL; /* department of accident prevention */ + return address; + } } /* Done. */