diff options
author | Peter Geoghegan <pg@bowt.ie> | 2021-03-28 20:10:02 -0700 |
---|---|---|
committer | Peter Geoghegan <pg@bowt.ie> | 2021-03-28 20:10:02 -0700 |
commit | 30aaab26e52144097a1a5bbb0bb66ea1ebc0cb81 (patch) | |
tree | c8ac94fb4fb5c54b94a718893991f3e516d12a9a | |
parent | f58b230ed0dba2a3d396794a2ec84541e321d92d (diff) | |
download | postgresql-30aaab26e52144097a1a5bbb0bb66ea1ebc0cb81.tar.gz postgresql-30aaab26e52144097a1a5bbb0bb66ea1ebc0cb81.zip |
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.
-rw-r--r-- | src/backend/storage/page/bufpage.c | 20 |
1 files 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 |