From: Melanie Plageman Date: Fri, 17 Jul 2026 20:47:33 +0000 (-0400) Subject: Turn visibilitymap_clear() Assert back into an error X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3180ce3d7a836e7fbcf8946a0e0be9f263353481;p=thirdparty%2Fpostgresql.git Turn visibilitymap_clear() Assert back into an error Commit ed62d26caca fixed a bug in clearing the visibility map and, while doing so, made some incidental changes to visibilitymap_clear(). One of them replaced the error thrown when the wrong buffer is passed to visibilitymap_clear() with an Assert(). While anyone adding a new visibilitymap_clear() caller should be running assert-enabled builds, visibilitymap_set() still reports the same wrong-buffer condition with an elog(ERROR), so visibilitymap_clear() should also do so for consistency. This change was also unrelated to the bug fix and is better made as a separate commit. Restore the error. Reported-by: Fujii Masao Discussion: https://postgr.es/m/CAHGQGwF_PzOv5y7ucFh7Fqqqa8ar83zYwvWugqarRD6%2B7GCtEQ%40mail.gmail.com Backpatch-through: 19 --- diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c index c382b25e192..bf016dd4c2e 100644 --- a/src/backend/access/heap/visibilitymap.c +++ b/src/backend/access/heap/visibilitymap.c @@ -153,9 +153,7 @@ visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags { int mapByte = HEAPBLK_TO_MAPBYTE(heapBlk); int mapOffset = HEAPBLK_TO_OFFSET(heapBlk); -#ifdef USE_ASSERT_CHECKING BlockNumber mapBlock = HEAPBLK_TO_MAPBLOCK(heapBlk); -#endif uint8 mask = flags << mapOffset; Page page; char *map; @@ -169,7 +167,9 @@ visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags elog(DEBUG1, "vm_clear %s %d", RelationGetRelationName(rel), heapBlk); #endif - Assert(BufferIsValid(vmbuf) && BufferGetBlockNumber(vmbuf) == mapBlock); + if (!BufferIsValid(vmbuf) || BufferGetBlockNumber(vmbuf) != mapBlock) + elog(ERROR, "wrong buffer passed to visibilitymap_clear"); + Assert(BufferIsLockedByMeInMode(vmbuf, BUFFER_LOCK_EXCLUSIVE)); page = BufferGetPage(vmbuf);