summaryrefslogtreecommitdiff
path: root/src/backend
diff options
context:
space:
mode:
authorAlexander Korotkov2025-04-23 17:14:32 +0000
committerAlexander Korotkov2025-04-23 17:26:52 +0000
commitbb78e4267817b5c1f5a8ff5b0b93fe756e514bb0 (patch)
treeb78b178eaadebb58e2a09969f3c643e075785f65 /src/backend
parent9f404d7922e8831dc49bfa225530ba5309900e4e (diff)
Maintain RelIdToTypeIdCacheHash in TypeCacheOpcCallback()
b85a9d046efd introduced a new RelIdToTypeIdCacheHash, whose entries should exist for typecache entries with TCFLAGS_HAVE_PG_TYPE_DATA flag set or any of TCFLAGS_OPERATOR_FLAGS set or tupDesc set. However, TypeCacheOpcCallback(), which resets TCFLAGS_OPERATOR_FLAGS, was forgotten to update RelIdToTypeIdCacheHash. This commit adds a delete_rel_type_cache_if_needed() call to the TypeCacheOpcCallback() function to maintain RelIdToTypeIdCacheHash after resetting TCFLAGS_OPERATOR_FLAGS. Also, this commit fixes the name of the delete_rel_type_cache_if_needed() function in its mentions in the comments. Reported-by: Noah Misch Discussion: https://postgr.es/m/20250411203241.e9.nmisch%40google.com
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/utils/cache/typcache.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c
index ae65a1cce06..e359da09ec9 100644
--- a/src/backend/utils/cache/typcache.c
+++ b/src/backend/utils/cache/typcache.c
@@ -2395,7 +2395,10 @@ InvalidateCompositeTypeCacheEntry(TypeCacheEntry *typentry)
/* Reset equality/comparison/hashing validity information */
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
- /* Call delete_rel_type_cache() if we actually cleared something */
+ /*
+ * Call delete_rel_type_cache_if_needed() if we actually cleared
+ * something.
+ */
if (hadTupDescOrOpclass)
delete_rel_type_cache_if_needed(typentry);
}
@@ -2542,7 +2545,7 @@ TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue)
TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS);
/*
- * Call delete_rel_type_cache() if we cleaned
+ * Call delete_rel_type_cache_if_needed() if we cleaned
* TCFLAGS_HAVE_PG_TYPE_DATA flag previously.
*/
if (hadPgTypeData)
@@ -2576,8 +2579,17 @@ TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue)
hash_seq_init(&status, TypeCacheHash);
while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
{
+ bool hadOpclass = (typentry->flags & TCFLAGS_OPERATOR_FLAGS);
+
/* Reset equality/comparison/hashing validity information */
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
+
+ /*
+ * Call delete_rel_type_cache_if_needed() if we actually cleared some
+ * of TCFLAGS_OPERATOR_FLAGS.
+ */
+ if (hadOpclass)
+ delete_rel_type_cache_if_needed(typentry);
}
}