From a9ed7d944965865e5c6b44e58602f621cd185856 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Mon, 7 Oct 2024 17:51:14 -0700 Subject: [PATCH] Fix search_path cache initialization. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/backend/catalog/namespace.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 43b707699d..30807f9190 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.