mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Maintain RelIdToTypeIdCacheHash in TypeCacheOpcCallback()
b85a9d046e
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
This commit is contained in:
16
src/backend/utils/cache/typcache.c
vendored
16
src/backend/utils/cache/typcache.c
vendored
@ -2395,7 +2395,10 @@ InvalidateCompositeTypeCacheEntry(TypeCacheEntry *typentry)
|
|||||||
/* Reset equality/comparison/hashing validity information */
|
/* Reset equality/comparison/hashing validity information */
|
||||||
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
|
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)
|
if (hadTupDescOrOpclass)
|
||||||
delete_rel_type_cache_if_needed(typentry);
|
delete_rel_type_cache_if_needed(typentry);
|
||||||
}
|
}
|
||||||
@ -2542,7 +2545,7 @@ TypeCacheTypCallback(Datum arg, int cacheid, uint32 hashvalue)
|
|||||||
TCFLAGS_CHECKED_DOMAIN_CONSTRAINTS);
|
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.
|
* TCFLAGS_HAVE_PG_TYPE_DATA flag previously.
|
||||||
*/
|
*/
|
||||||
if (hadPgTypeData)
|
if (hadPgTypeData)
|
||||||
@ -2576,8 +2579,17 @@ TypeCacheOpcCallback(Datum arg, int cacheid, uint32 hashvalue)
|
|||||||
hash_seq_init(&status, TypeCacheHash);
|
hash_seq_init(&status, TypeCacheHash);
|
||||||
while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
|
while ((typentry = (TypeCacheEntry *) hash_seq_search(&status)) != NULL)
|
||||||
{
|
{
|
||||||
|
bool hadOpclass = (typentry->flags & TCFLAGS_OPERATOR_FLAGS);
|
||||||
|
|
||||||
/* Reset equality/comparison/hashing validity information */
|
/* Reset equality/comparison/hashing validity information */
|
||||||
typentry->flags &= ~TCFLAGS_OPERATOR_FLAGS;
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user