From 30aaab26e52144097a1a5bbb0bb66ea1ebc0cb81 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sun, 28 Mar 2021 20:10:02 -0700 Subject: [PATCH] PageAddItemExtended(): Add LP_UNUSED assertion. Assert that LP_UNUSED items have no storage. If it's worth having defensive code in non-assert builds then it's worth having an assertion as well. --- src/backend/storage/page/bufpage.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 9ac556b4ae0..5d5989c2f52 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -250,14 +250,18 @@ PageAddItemExtended(Page page, /* if no free slot, we'll put it at limit (1st open slot) */ if (PageHasFreeLinePointers(phdr)) { - /* - * Look for "recyclable" (unused) ItemId. We check for no storage - * as well, just to be paranoid --- unused items should never have - * storage. - */ + /* Look for "recyclable" (unused) ItemId */ for (offsetNumber = 1; offsetNumber < limit; offsetNumber++) { itemId = PageGetItemId(phdr, offsetNumber); + + /* + * We check for no storage as well, just to be paranoid; + * unused items should never have storage. Assert() that the + * invariant is respected too. + */ + Assert(ItemIdIsUsed(itemId) || !ItemIdHasStorage(itemId)); + if (!ItemIdIsUsed(itemId) && !ItemIdHasStorage(itemId)) break; } @@ -676,7 +680,9 @@ compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorte * * This routine is usable for heap pages only, but see PageIndexMultiDelete. * - * As a side effect, the page's PD_HAS_FREE_LINES hint bit is updated. + * Caller had better have a super-exclusive lock on page's buffer. As a side + * effect the page's PD_HAS_FREE_LINES hint bit will be set or unset as + * needed. */ void PageRepairFragmentation(Page page) @@ -771,7 +777,7 @@ PageRepairFragmentation(Page page) compactify_tuples(itemidbase, nstorage, page, presorted); } - /* Set hint bit for PageAddItem */ + /* Set hint bit for PageAddItemExtended */ if (nunused > 0) PageSetHasFreeLinePointers(page); else