Fix missing invalidations for search_path cache.
authorJeff Davis <jdavis@postgresql.org>
Tue, 9 Jul 2024 18:27:17 +0000 (11:27 -0700)
committerJeff Davis <jdavis@postgresql.org>
Tue, 9 Jul 2024 19:37:05 +0000 (12:37 -0700)
Reported-by: Noah Misch
Discussion: https://postgr.es/m/20240630223047.1f.nmisch@google.com
Backpatch-through: 17

src/backend/catalog/namespace.c

index a2510cf80c6fadf2bdd6320e7119c62ddf63ec15..43b707699d72f7df14930ccf944e9e600c38c6dd 100644 (file)
@@ -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