8000 Maintain RelIdToTypeIdCacheHash in TypeCacheOpcCallback() · petergeoghegan/postgres@bb78e42 · GitHub
[go: up one dir, main page]

Skip to content

Commit bb78e42

Browse files
committed
Maintain RelIdToTypeIdCacheHash in TypeCacheOpcCallback()
b85a9d0 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
1 parent 9f404d7 commit bb78e42

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/backend/utils/cache/typcache.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,7 +2395,10 @@ InvalidateCompositeTypeCacheEntry(TypeCacheEntry *typentry)
23952395
/* Reset equality/comparison/hashing validity information */
23962396
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
23972397

2398-
/* Call delete_rel_type_cache() if we actually cleared something */
2398+
/*
2399+
* Call delete_rel_type_cache_if_needed() if we actually cleared
2400+
* something.
2401+
*/
23992402
if (hadTupDescOrOpclass)
24002403
delete_rel_type_cache_if_needed(typentry);
24012404
}
@@ -2542,7 +2545,7 @@ TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue)
25422545
TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS);
25432546

25442547
/*
2545-
* Call delete_rel_type_cache() if we cleaned
2548+
* Call delete_rel_type_cache_if_needed() if we cleaned
25462549
* TCFLAGS_HAVE_PG_TYPE_DATA flag previously.
25472550
*/
25482551
if (hadPgTypeData)
@@ -2576,8 +2579,17 @@ TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue)
25762579
hash_seq_init(&status, TypeCacheHash);
25772580
while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
25782581
{
2582+
bool hadOpclass = (typentry->flags & TCFLAGS_OPERATOR_FLAGS);
2583+
25792584
/* Reset equality/comparison/hashing validity information */
25802585
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
2586+
2587+
/*
2588+
* Call delete_rel_type_cache_if_needed() if we actually cleared some
2589+
* of TCFLAGS_OPERATOR_FLAGS.
2590+
*/
2591+
if (hadOpclass)
2592+
delete_rel_type_cache_if_needed(typentry);
25812593
}
25822594
}
25832595

0 commit comments

Comments
 (0)
0