diff -Ncr ../base/src/backend/storage/page/bufpage.c src/backend/storage/page/bufpage.c *** ../base/src/backend/storage/page/bufpage.c Sat Nov 29 20:51:57 2003 --- src/backend/storage/page/bufpage.c Wed Jun 2 22:26:12 2004 *************** *** 151,158 **** if (offsetNumber < limit) { itemId = PageGetItemId(phdr, offsetNumber); ! if (((*itemId).lp_flags & LP_USED) || ! ((*itemId).lp_len != 0)) { elog(WARNING, "will not overwrite a used ItemId"); return InvalidOffsetNumber; --- 151,158 ---- if (offsetNumber < limit) { itemId = PageGetItemId(phdr, offsetNumber); ! if ((itemId->lp_flags & LP_USED) || ! (itemId->lp_len != 0)) { elog(WARNING, "will not overwrite a used ItemId"); return InvalidOffsetNumber; *************** *** 172,179 **** for (offsetNumber = 1; offsetNumber < limit; offsetNumber++) { itemId = PageGetItemId(phdr, offsetNumber); ! if ((((*itemId).lp_flags & LP_USED) == 0) && ! ((*itemId).lp_len == 0)) break; } /* if no free slot, we'll put it at limit (1st open slot) */ --- 172,179 ---- for (offsetNumber = 1; offsetNumber < limit; offsetNumber++) { itemId = PageGetItemId(phdr, offsetNumber); ! if (((itemId->lp_flags & LP_USED) == 0) && ! (itemId->lp_len == 0)) break; } /* if no free slot, we'll put it at limit (1st open slot) */ *************** *** 214,222 **** (limit - offsetNumber) * sizeof(ItemIdData)); /* set the item pointer */ ! (*itemId).lp_off = upper; ! (*itemId).lp_len = size; ! (*itemId).lp_flags = flags; /* copy the item's data onto the page */ memcpy((char *) page + upper, item, size); --- 214,222 ---- (limit - offsetNumber) * sizeof(ItemIdData)); /* set the item pointer */ ! itemId->lp_off = upper; ! itemId->lp_len = size; ! itemId->lp_flags = flags; /* copy the item's data onto the page */ memcpy((char *) page + upper, item, size); *************** *** 278,296 **** /* * sorting support for PageRepairFragmentation */ ! struct itemIdSortData { int offsetindex; /* linp array index */ int itemoff; /* page offset of item data */ Size alignedlen; /* MAXALIGN(item data len) */ ! }; static int itemoffcompare(const void *itemidp1, const void *itemidp2) { /* Sort in decreasing itemoff order */ ! return ((struct itemIdSortData *) itemidp2)->itemoff - ! ((struct itemIdSortData *) itemidp1)->itemoff; } /* --- 278,297 ---- /* * sorting support for PageRepairFragmentation */ ! typedef struct itemIdSortData { int offsetindex; /* linp array index */ int itemoff; /* page offset of item data */ Size alignedlen; /* MAXALIGN(item data len) */ ! } itemIdSortData; ! typedef itemIdSortData *itemIdSort; static int itemoffcompare(const void *itemidp1, const void *itemidp2) { /* Sort in decreasing itemoff order */ ! return ((itemIdSort) itemidp2)->itemoff - ! ((itemIdSort) itemidp1)->itemoff; } /* *************** *** 309,316 **** Offset pd_lower = ((PageHeader) page)->pd_lower; Offset pd_upper = ((PageHeader) page)->pd_upper; Offset pd_special = ((PageHeader) page)->pd_special; ! struct itemIdSortData *itemidbase, ! *itemidptr; ItemId lp; int nline, nused; --- 310,317 ---- Offset pd_lower = ((PageHeader) page)->pd_lower; Offset pd_upper = ((PageHeader) page)->pd_upper; Offset pd_special = ((PageHeader) page)->pd_special; ! itemIdSort itemidbase, ! itemidptr; ItemId lp; int nline, nused; *************** *** 340,348 **** for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! if ((*lp).lp_flags & LP_DELETE) /* marked for deletion */ ! (*lp).lp_flags &= ~(LP_USED | LP_DELETE); ! if ((*lp).lp_flags & LP_USED) nused++; else if (unused) unused[i - nused] = (OffsetNumber) i; --- 341,349 ---- for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! if (lp->lp_flags & LP_DELETE) /* marked for deletion */ ! lp->lp_flags &= ~(LP_USED | LP_DELETE); ! if (lp->lp_flags & LP_USED) nused++; else if (unused) unused[i - nused] = (OffsetNumber) i; *************** *** 354,390 **** for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! (*lp).lp_len = 0; /* indicate unused & deallocated */ } ((PageHeader) page)->pd_upper = pd_special; } else { /* nused != 0 */ /* Need to compact the page the hard way */ ! itemidbase = (struct itemIdSortData *) ! palloc(sizeof(struct itemIdSortData) * nused); itemidptr = itemidbase; totallen = 0; for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! if ((*lp).lp_flags & LP_USED) { itemidptr->offsetindex = i; ! itemidptr->itemoff = (*lp).lp_off; if (itemidptr->itemoff < (int) pd_upper || itemidptr->itemoff >= (int) pd_special) ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("corrupted item pointer: %u", itemidptr->itemoff))); ! itemidptr->alignedlen = MAXALIGN((*lp).lp_len); totallen += itemidptr->alignedlen; itemidptr++; } else { ! (*lp).lp_len = 0; /* indicate unused & deallocated */ } } --- 355,390 ---- for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! lp->lp_len = 0; /* indicate unused & deallocated */ } ((PageHeader) page)->pd_upper = pd_special; } else { /* nused != 0 */ /* Need to compact the page the hard way */ ! itemidbase = (itemIdSort) palloc(sizeof(itemIdSortData) * nused); itemidptr = itemidbase; totallen = 0; for (i = 0; i < nline; i++) { lp = PageGetItemId(page, i + 1); ! if (lp->lp_flags & LP_USED) { itemidptr->offsetindex = i; ! itemidptr->itemoff = lp->lp_off; if (itemidptr->itemoff < (int) pd_upper || itemidptr->itemoff >= (int) pd_special) ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("corrupted item pointer: %u", itemidptr->itemoff))); ! itemidptr->alignedlen = MAXALIGN(lp->lp_len); totallen += itemidptr->alignedlen; itemidptr++; } else { ! lp->lp_len = 0; /* indicate unused & deallocated */ } } *************** *** 395,401 **** (unsigned int) totallen, pd_special - pd_lower))); /* sort itemIdSortData array into decreasing itemoff order */ ! qsort((char *) itemidbase, nused, sizeof(struct itemIdSortData), itemoffcompare); /* compactify page */ --- 395,401 ---- (unsigned int) totallen, pd_special - pd_lower))); /* sort itemIdSortData array into decreasing itemoff order */ ! qsort((char *) itemidbase, nused, sizeof(itemIdSortData), itemoffcompare); /* compactify page */ *************** *** 408,414 **** memmove((char *) page + upper, (char *) page + itemidptr->itemoff, itemidptr->alignedlen); ! (*lp).lp_off = upper; } ((PageHeader) page)->pd_upper = upper; --- 408,414 ---- memmove((char *) page + upper, (char *) page + itemidptr->itemoff, itemidptr->alignedlen); ! lp->lp_off = upper; } ((PageHeader) page)->pd_upper = upper; *************** *** 538,545 **** nline--; /* there's one less than when we started */ for (i = 1; i <= nline; i++) { ! if (PageGetItemId(phdr, i)->lp_off <= offset) ! PageGetItemId(phdr, i)->lp_off += size; } } } --- 538,546 ---- nline--; /* there's one less than when we started */ for (i = 1; i <= nline; i++) { ! ItemId ii = PageGetItemId(phdr, i); ! if (ii->lp_off <= offset) ! ii->lp_off += size; } } }