diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c new file mode 100644 index bcf9871..c8edd67 *** a/src/backend/access/heap/heapam.c --- b/src/backend/access/heap/heapam.c *************** heap_insert(Relation relation, HeapTuple *** 2189,2195 **** RelationPutHeapTuple(relation, buffer, heaptup, (options & HEAP_INSERT_SPECULATIVE) != 0); ! if (PageIsAllVisible(BufferGetPage(buffer))) { all_visible_cleared = true; PageClearAllVisible(BufferGetPage(buffer)); --- 2189,2195 ---- RelationPutHeapTuple(relation, buffer, heaptup, (options & HEAP_INSERT_SPECULATIVE) != 0); ! if (PageIsAllVisible(BufferGetPage(buffer)) && !(options & HEAP_INSERT_FROZEN)) { all_visible_cleared = true; PageClearAllVisible(BufferGetPage(buffer)); *************** heap_multi_insert(Relation relation, Hea *** 2490,2496 **** log_heap_new_cid(relation, heaptup); } ! if (PageIsAllVisible(page)) { all_visible_cleared = true; PageClearAllVisible(page); --- 2490,2496 ---- log_heap_new_cid(relation, heaptup); } ! if (PageIsAllVisible(BufferGetPage(buffer)) && !(options & HEAP_INSERT_FROZEN)) { all_visible_cleared = true; PageClearAllVisible(page); diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c new file mode 100644 index 6db73bf..8b3c43e *** a/src/backend/access/heap/hio.c --- b/src/backend/access/heap/hio.c *************** RelationGetBufferForTuple(Relation relat *** 486,491 **** --- 486,498 ---- PageInit(page, BufferGetPageSize(buffer), 0); + /* + * If the tuple intended for the new page will be frozen upon insertion, + * mark the page is all visible ab initio. + */ + if (options & HEAP_INSERT_FROZEN) + PageSetAllVisible(page); + if (len > PageGetHeapFreeSpace(page)) { /* We should not get here given the test at the top */