From: Jeff Davis Date: Tue, 8 Oct 2024 00:54:19 +0000 (-0700) Subject: Fix search_path cache initialization. X-Git-Tag: REL_17_1~72 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2fe4167bc6f2a446eb3112bab14ae98958e490f4;p=thirdparty%2Fpostgresql.git Fix search_path cache initialization. The cache needs to be available very early, so don't rely on InitializeSearchPath() to initialize the it. Reported-by: Murat Efendioğlu Discussion: https://postgr.es/m/CACbCzujQ4zS8MM1bx-==+tr+D3Hk5G1cjN4XkUQ+Q=cEpwhzqg@mail.gmail.com Backpatch-through: 17 --- diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 43b707699d7..30807f91904 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -305,17 +305,32 @@ static SearchPathCacheEntry *LastSearchPathCacheEntry = NULL; static void spcache_init(void) { - Assert(SearchPathCacheContext); - if (SearchPathCache && searchPathCacheValid && SearchPathCache->members < SPCACHE_RESET_THRESHOLD) return; - /* make sure we don't leave dangling pointers if nsphash_create fails */ + searchPathCacheValid = false; + baseSearchPathValid = false; + + /* + * Make sure we don't leave dangling pointers if a failure happens during + * initialization. + */ SearchPathCache = NULL; LastSearchPathCacheEntry = NULL; - MemoryContextReset(SearchPathCacheContext); + if (SearchPathCacheContext == NULL) + { + /* Make the context we'll keep search path cache hashtable in */ + SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext, + "search_path processing cache", + ALLOCSET_DEFAULT_SIZES); + } + else + { + MemoryContextReset(SearchPathCacheContext); + } + /* arbitrary initial starting size of 16 elements */ SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL); searchPathCacheValid = true; @@ -4742,11 +4757,6 @@ InitializeSearchPath(void) } else { - /* Make the context we'll keep search path cache hashtable in */ - SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext, - "search_path processing cache", - ALLOCSET_DEFAULT_SIZES); - /* * In normal mode, arrange for a callback on any syscache invalidation * that will affect the search_path cache.