summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Davis2024-10-08 00:51:14 +0000
committerJeff Davis2024-10-08 00:51:14 +0000
commita9ed7d944965865e5c6b44e58602f621cd185856 (patch)
tree93130529063b8e2718c77409075884f0548dd2b4
parentc3b80a7e98456904a2bf8f06a0cbf10f8dae1e83 (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.c28
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.