From 10739902aaafa214e4a9df161bea280a7139d34b Mon Sep 17 00:00:00 2001
From: Melanie Plageman <melanieplageman@gmail.com>
Date: Tue, 14 Jul 2026 14:24:16 -0400
Subject: [PATCH] heap_update

---
 src/backend/access/heap/heapam.c | 57 ++++++++++++++++++--------------
 1 file changed, 32 insertions(+), 25 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index fd8ca72728f..e445ea35096 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4270,38 +4270,45 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup,
 	 * cases, it's possible that PD_ALL_VISIBLE was set but the corresponding
 	 * visibility map bits were already clear.
 	 */
-	if (clear_all_visible)
-	{
-		if (visibilitymap_clear_locked(relation, block,
-									   vmbuffer, VISIBILITYMAP_VALID_BITS))
-		{
-			/*
-			 * When old and new heap blocks' VM bits are on the same VM page,
-			 * that page is registered in the WAL record only once. If both
-			 * heap pages were PD_ALL_VISIBLE and either VM bit needs
-			 * clearing, we register the VM buffer as
-			 * HEAP_UPDATE_BLKREF_VM_NEW.
-			 */
-			if (clear_all_visible_new && vmbuffer == vmbuffer_new)
-				vmbuffer_new_modified = true;
-			else
-				vmbuffer_modified = true;
-		}
-
-		PageClearAllVisible(page);
-	}
-	if (clear_all_visible_new)
+	if (clear_all_visible && clear_all_visible_new &&
+		vmbuffer_new == vmbuffer)
 	{
 		/*
-		 * If both heap blocks' VM bits are on the same VM buffer, this will
-		 * clear the new heap block's VM bits from the shared vmbuffer.
+		 * When old and new heap blocks' VM bits are on the same VM page, that
+		 * page is registered in the WAL record only once. If both heap pages
+		 * were PD_ALL_VISIBLE and either VM bit needs clearing, we register
+		 * the VM buffer as HEAP_UPDATE_BLKREF_VM_NEW.
 		 */
-		if (visibilitymap_clear_locked(relation, BufferGetBlockNumber(newbuf),
-									   vmbuffer_new, VISIBILITYMAP_VALID_BITS))
+		if (visibilitymap_clear(relation, block,
+								vmbuffer_new, VISIBILITYMAP_VALID_BITS))
+			vmbuffer_new_modified = true;
+
+		if (visibilitymap_clear(relation, BufferGetBlockNumber(newbuf),
+								vmbuffer_new, VISIBILITYMAP_VALID_BITS))
 			vmbuffer_new_modified = true;
 
+		PageClearAllVisible(page);
 		PageClearAllVisible(newpage);
 	}
+	else
+	{
+		if (clear_all_visible)
+		{
+			if (visibilitymap_clear(relation, block,
+									vmbuffer, VISIBILITYMAP_VALID_BITS))
+				vmbuffer_modified = true;
+
+			PageClearAllVisible(page);
+		}
+		if (clear_all_visible_new)
+		{
+			if (visibilitymap_clear(relation, BufferGetBlockNumber(newbuf),
+									vmbuffer_new, VISIBILITYMAP_VALID_BITS))
+				vmbuffer_new_modified = true;
+
+			PageClearAllVisible(newpage);
+		}
+	}
 
 	if (newbuf != buffer)
 		MarkBufferDirty(newbuf);
-- 
2.47.3

