Hi all,
While reviewing the syscache code, I have bumped into the following
funny bit in objectaddress.c:
if (oidCacheId > 0)
{
if (locktup)
tuple = SearchSysCacheLockedCopy1(oidCacheId,
ObjectIdGetDatum(objectId));
else
tuple = SearchSysCacheCopy1(oidCacheId,
ObjectIdGetDatum(objectId));
if (!HeapTupleIsValid(tuple)) /* should not happen */
return NULL;
}This is wrong, because SysCacheIdentifier starts at 0. This has no consequence currently, because the first value in the enum is AGGFNOID, something that we don't rely on for object type lookups. Even if this code had the idea to use an ID of 0, the logic would just get back to a systable lookup, that would still work, that's just less efficient. Simple patch attached, planned for a backpatch quickly as I am playing with a different patch that reworks a bit this code. Regards, -- Michael
diff --git a/src/backend/catalog/objectaddress.c
b/src/backend/catalog/objectaddress.c
index 02af64b82c68..198caf641a5e 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -2808,7 +2808,7 @@ get_catalog_object_by_oid_extended(Relation catalog,
Oid classId = RelationGetRelid(catalog);
int oidCacheId = get_object_catcache_oid(classId);
- if (oidCacheId > 0)
+ if (oidCacheId >= 0)
{
if (locktup)
tuple = SearchSysCacheLockedCopy1(oidCacheId,
signature.asc
Description: PGP signature
