aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2021-03-28 20:10:02 -0700
committerPeter Geoghegan <pg@bowt.ie>2021-03-28 20:10:02 -0700
commit30aaab26e52144097a1a5bbb0bb66ea1ebc0cb81 (patch)
treec8ac94fb4fb5c54b94a718893991f3e516d12a9a
parentf58b230ed0dba2a3d396794a2ec84541e321d92d (diff)
downloadpostgresql-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.c20
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