diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 6928835b6a718a88105783437cc34222ab2b55fe..395c11605a3872f4501fd98d375b7ccf5db5f151 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. */