mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Minor fixes for search path cache code.
Avoid leaving a dangling pointer in the unlikely event that nsphash_create fails. Improve comments, and fix formatting by adding typedefs.list entries. Discussion: https://postgr.es/m/3972900.1704145107@sss.pgh.pa.us
This commit is contained in:
		
							parent
							
								
									371b07e894
								
							
						
					
					
						commit
						ae6bc39317
					
				| @ -156,6 +156,11 @@ static Oid	namespaceUser = InvalidOid; | ||||
| 
 | ||||
| /* The above four values are valid only if baseSearchPathValid */ | ||||
| static bool baseSearchPathValid = true; | ||||
| 
 | ||||
| /*
 | ||||
|  * Storage for search path cache.  Clear searchPathCacheValid as a simple | ||||
|  * way to invalidate *all* the cache entries, not just the active one. | ||||
|  */ | ||||
| static bool searchPathCacheValid = false; | ||||
| static MemoryContext SearchPathCacheContext = NULL; | ||||
| 
 | ||||
| @ -163,7 +168,7 @@ typedef struct SearchPathCacheKey | ||||
| { | ||||
| 	const char *searchPath; | ||||
| 	Oid			roleid; | ||||
| }			SearchPathCacheKey; | ||||
| } SearchPathCacheKey; | ||||
| 
 | ||||
| typedef struct SearchPathCacheEntry | ||||
| { | ||||
| @ -176,7 +181,7 @@ typedef struct SearchPathCacheEntry | ||||
| 
 | ||||
| 	/* needed for simplehash */ | ||||
| 	char		status; | ||||
| }			SearchPathCacheEntry; | ||||
| } SearchPathCacheEntry; | ||||
| 
 | ||||
| /*
 | ||||
|  * myTempNamespace is InvalidOid until and unless a TEMP namespace is set up | ||||
| @ -281,8 +286,8 @@ spcachekey_equal(SearchPathCacheKey a, SearchPathCacheKey b) | ||||
|  */ | ||||
| #define SPCACHE_RESET_THRESHOLD		256 | ||||
| 
 | ||||
| static nsphash_hash * SearchPathCache = NULL; | ||||
| static SearchPathCacheEntry * LastSearchPathCacheEntry = NULL; | ||||
| static nsphash_hash *SearchPathCache = NULL; | ||||
| static SearchPathCacheEntry *LastSearchPathCacheEntry = NULL; | ||||
| 
 | ||||
| /*
 | ||||
|  * Create or reset search_path cache as necessary. | ||||
| @ -296,8 +301,11 @@ spcache_init(void) | ||||
| 		SearchPathCache->members < SPCACHE_RESET_THRESHOLD) | ||||
| 		return; | ||||
| 
 | ||||
| 	MemoryContextReset(SearchPathCacheContext); | ||||
| 	/* make sure we don't leave dangling pointers if nsphash_create fails */ | ||||
| 	SearchPathCache = NULL; | ||||
| 	LastSearchPathCacheEntry = NULL; | ||||
| 
 | ||||
| 	MemoryContextReset(SearchPathCacheContext); | ||||
| 	/* arbitrary initial starting size of 16 elements */ | ||||
| 	SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL); | ||||
| 	searchPathCacheValid = true; | ||||
| @ -325,8 +333,8 @@ spcache_lookup(const char *searchPath, Oid roleid) | ||||
| 		}; | ||||
| 
 | ||||
| 		entry = nsphash_lookup(SearchPathCache, cachekey); | ||||
| 
 | ||||
| 		LastSearchPathCacheEntry = entry; | ||||
| 		if (entry) | ||||
| 			LastSearchPathCacheEntry = entry; | ||||
| 		return entry; | ||||
| 	} | ||||
| } | ||||
| @ -4267,7 +4275,7 @@ recomputeNamespacePath(void) | ||||
| { | ||||
| 	Oid			roleid = GetUserId(); | ||||
| 	bool		pathChanged; | ||||
| 	const		SearchPathCacheEntry *entry; | ||||
| 	const SearchPathCacheEntry *entry; | ||||
| 
 | ||||
| 	/* Do nothing if path is already valid. */ | ||||
| 	if (baseSearchPathValid && namespaceUser == roleid) | ||||
| @ -4635,9 +4643,7 @@ check_search_path(char **newval, void **extra, GucSource source) | ||||
| 	 * schemas that don't exist; and often, we are not inside a transaction | ||||
| 	 * here and so can't consult the system catalogs anyway.  So now, the only | ||||
| 	 * requirement is syntactic validity of the identifier list. | ||||
| 	 */ | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * | ||||
| 	 * Checking only the syntactic validity also allows us to use the search | ||||
| 	 * path cache (if available) to avoid calling SplitIdentifierString() on | ||||
| 	 * the same string repeatedly. | ||||
| @ -4667,19 +4673,10 @@ check_search_path(char **newval, void **extra, GucSource source) | ||||
| 		list_free(namelist); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * We used to try to check that the named schemas exist, but there are | ||||
| 	 * many valid use-cases for having search_path settings that include | ||||
| 	 * schemas that don't exist; and often, we are not inside a transaction | ||||
| 	 * here and so can't consult the system catalogs anyway.  So now, the only | ||||
| 	 * requirement is syntactic validity of the identifier list. | ||||
| 	 */ | ||||
| 
 | ||||
| 	pfree(rawname); | ||||
| 	list_free(namelist); | ||||
| 
 | ||||
| 	/* create empty cache entry */ | ||||
| 	/* OK to create empty cache entry */ | ||||
| 	if (use_cache) | ||||
| 		(void) spcache_insert(searchPath, roleid); | ||||
| 
 | ||||
| @ -4732,8 +4729,9 @@ InitializeSearchPath(void) | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		SearchPathCacheContext = AllocSetContextCreate( | ||||
| 													   TopMemoryContext, "search_path processing cache", | ||||
| 		/* Make the context we'll keep search path cache hashtable in */ | ||||
| 		SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext, | ||||
| 													   "search_path processing cache", | ||||
| 													   ALLOCSET_DEFAULT_SIZES); | ||||
| 
 | ||||
| 		/*
 | ||||
|  | ||||
| @ -2480,6 +2480,8 @@ ScanState | ||||
| ScanTypeControl | ||||
| ScannerCallbackState | ||||
| SchemaQuery | ||||
| SearchPathCacheEntry | ||||
| SearchPathCacheKey | ||||
| SearchPathMatcher | ||||
| SecBuffer | ||||
| SecBufferDesc | ||||
| @ -3515,6 +3517,7 @@ needs_fmgr_hook_type | ||||
| network_sortsupport_state | ||||
| nodeitem | ||||
| normal_rand_fctx | ||||
| nsphash_hash | ||||
| ntile_context | ||||
| numeric | ||||
| object_access_hook_type | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user