aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeff Davis <jdavis@postgresql.org>2024-07-09 11:27:10 -0700
committerJeff Davis <jdavis@postgresql.org>2024-07-09 11:27:10 -0700
commitd3e076549b99d1130053223adb9c1fa909d75dc0 (patch)
tree5f0367c11ea58b338307b60349b5d4d630a9a9e9 /src
parentce416fadb4b694ba32e228b8296d8f10f39640c0 (diff)
downloadpostgresql-d3e076549b99d1130053223adb9c1fa909d75dc0.tar.gz
postgresql-d3e076549b99d1130053223adb9c1fa909d75dc0.zip
Fix missing invalidations for search_path cache.
Reported-by: Noah Misch Discussion: https://postgr.es/m/20240630223047.1f.nmisch@google.com Backpatch-through: 17
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/namespace.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index a2510cf80c6..43b707699d7 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -230,7 +230,7 @@ static void AccessTempTableNamespace(bool force);
static void InitTempTableNamespace(void);
static void RemoveTempRelations(Oid tempNamespaceId);
static void RemoveTempRelationsCallback(int code, Datum arg);
-static void NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue);
+static void InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue);
static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames,
bool include_out_arguments, int pronargs,
int **argnumbers);
@@ -4749,15 +4749,29 @@ InitializeSearchPath(void)
/*
* In normal mode, arrange for a callback on any syscache invalidation
- * of pg_namespace or pg_authid rows. (Changing a role name may affect
- * the meaning of the special string $user.)
+ * that will affect the search_path cache.
*/
+
+ /* namespace name or ACLs may have changed */
CacheRegisterSyscacheCallback(NAMESPACEOID,
- NamespaceCallback,
+ InvalidationCallback,
(Datum) 0);
+
+ /* role name may affect the meaning of "$user" */
CacheRegisterSyscacheCallback(AUTHOID,
- NamespaceCallback,
+ InvalidationCallback,
+ (Datum) 0);
+
+ /* role membership may affect ACLs */
+ CacheRegisterSyscacheCallback(AUTHMEMROLEMEM,
+ InvalidationCallback,
(Datum) 0);
+
+ /* database owner may affect ACLs */
+ CacheRegisterSyscacheCallback(DATABASEOID,
+ InvalidationCallback,
+ (Datum) 0);
+
/* Force search path to be recomputed on next use */
baseSearchPathValid = false;
searchPathCacheValid = false;
@@ -4765,11 +4779,11 @@ InitializeSearchPath(void)
}
/*
- * NamespaceCallback
+ * InvalidationCallback
* Syscache inval callback function
*/
static void
-NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue)
+InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue)
{
/*
* Force search path to be recomputed on next use, also invalidating the