From f714fa6fdb860c89b3bb8bc54465a43e24bf9496 Mon Sep 17 00:00:00 2001 From: John Naylor Date: Tue, 9 Aug 2022 12:37:22 +0700 Subject: [PATCH v11 3/4] Use optimized linear search for testing if relations have a syscache XXX: not for commit just yet --- src/backend/utils/cache/syscache.c | 69 +++--------------------------- 1 file changed, 5 insertions(+), 64 deletions(-) diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 1912b12146..d354161c54 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -76,6 +76,7 @@ #include "catalog/pg_type.h" #include "catalog/pg_user_mapping.h" #include "lib/qunique.h" +#include "port/pg_lfind.h" #include "utils/catcache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -1044,16 +1045,14 @@ static CatCache *SysCache[SysCacheSize]; static bool CacheInitialized = false; -/* Sorted array of OIDs of tables that have caches on them */ +/* Array of OIDs of tables that have caches on them */ static Oid SysCacheRelationOid[SysCacheSize]; static int SysCacheRelationOidSize; -/* Sorted array of OIDs of tables and indexes used by caches */ +/* Array of OIDs of tables and indexes used by caches */ static Oid SysCacheSupportingRelOid[SysCacheSize * 2]; static int SysCacheSupportingRelOidSize; -static int oid_compare(const void *a, const void *b); - /* * InitCatalogCache - initialize the caches @@ -1100,19 +1099,6 @@ InitCatalogCache(void) Assert(SysCacheRelationOidSize <= lengthof(SysCacheRelationOid)); Assert(SysCacheSupportingRelOidSize <= lengthof(SysCacheSupportingRelOid)); - /* Sort and de-dup OID arrays, so we can use binary search. */ - pg_qsort(SysCacheRelationOid, SysCacheRelationOidSize, - sizeof(Oid), oid_compare); - SysCacheRelationOidSize = - qunique(SysCacheRelationOid, SysCacheRelationOidSize, sizeof(Oid), - oid_compare); - - pg_qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, - sizeof(Oid), oid_compare); - SysCacheSupportingRelOidSize = - qunique(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, - sizeof(Oid), oid_compare); - CacheInitialized = true; } @@ -1552,22 +1538,7 @@ RelationInvalidatesSnapshotsOnly(Oid relid) bool RelationHasSysCache(Oid relid) { - int low = 0, - high = SysCacheRelationOidSize - 1; - - while (low <= high) - { - int middle = low + (high - low) / 2; - - if (SysCacheRelationOid[middle] == relid) - return true; - if (SysCacheRelationOid[middle] < relid) - low = middle + 1; - else - high = middle - 1; - } - - return false; + return pg_lfind32(relid, SysCacheRelationOid, SysCacheRelationOidSize); } /* @@ -1577,35 +1548,5 @@ RelationHasSysCache(Oid relid) bool RelationSupportsSysCache(Oid relid) { - int low = 0, - high = SysCacheSupportingRelOidSize - 1; - - while (low <= high) - { - int middle = low + (high - low) / 2; - - if (SysCacheSupportingRelOid[middle] == relid) - return true; - if (SysCacheSupportingRelOid[middle] < relid) - low = middle + 1; - else - high = middle - 1; - } - - return false; -} - - -/* - * OID comparator for pg_qsort - */ -static int -oid_compare(const void *a, const void *b) -{ - Oid oa = *((const Oid *) a); - Oid ob = *((const Oid *) b); - - if (oa == ob) - return 0; - return (oa > ob) ? 1 : -1; + return pg_lfind32(relid, SysCacheSupportingRelOid, SysCacheSupportingRelOidSize); } -- 2.36.1