diff options
author | Jeff Davis | 2024-10-08 00:51:14 +0000 |
---|---|---|
committer | Jeff Davis | 2024-10-08 00:51:14 +0000 |
commit | a9ed7d944965865e5c6b44e58602f621cd185856 (patch) | |
tree | 93130529063b8e2718c77409075884f0548dd2b4 | |
parent | c3b80a7e98456904a2bf8f06a0cbf10f8dae1e83 (diff) |
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
-rw-r--r-- | src/backend/catalog/namespace.c | 28 |
1 files changed, 19 insertions, 9 deletions
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. |