* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.8 2006/11/12 06:55:53 neilc Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.9 2006/11/30 16:22:32 teodor Exp $
*-------------------------------------------------------------------------
*/
}
parentPage = BufferGetPage(pBuffer);
+#ifdef USE_ASSERT_CHECKING
+ do {
+ PostingItem *tod=(PostingItem *) GinDataPageGetItem(parentPage, myoff);
+ Assert( PostingItemGetBlockNumber(tod) == deleteBlkno );
+ } while(0);
+#endif
PageDeletePostingItem(parentPage, myoff);
page = BufferGetPage(dBuffer);
struct DataPageDeleteStack *child;
struct DataPageDeleteStack *parent;
- BlockNumber blkno;
+ BlockNumber blkno; /* current block number */
+ BlockNumber leftBlkno; /* rightest non-deleted page on left */
bool isRoot;
} DataPageDeleteStack;
me = (DataPageDeleteStack *) palloc0(sizeof(DataPageDeleteStack));
me->parent = parent;
parent->child = me;
- me->blkno = InvalidBlockNumber;
+ me->leftBlkno = InvalidBlockNumber;
}
else
me = parent->child;
{
OffsetNumber i;
+ me->blkno = blkno;
for (i = FirstOffsetNumber; i <= GinPageGetOpaque(page)->maxoff; i++)
{
PostingItem *pitem = (PostingItem *) GinDataPageGetItem(page, i);
if (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber)
{
- if (!(me->blkno == InvalidBlockNumber && GinPageRightMost(page)))
+ if (!(me->leftBlkno == InvalidBlockNumber && GinPageRightMost(page)))
{
/* we never delete right most branch */
Assert(!isRoot);
if (GinPageGetOpaque(page)->maxoff < FirstOffsetNumber)
{
- ginDeletePage(gvs, blkno, me->blkno, me->parent->blkno, myoff, me->parent->isRoot);
+ ginDeletePage(gvs, blkno, me->leftBlkno, me->parent->blkno, myoff, me->parent->isRoot);
meDelete = TRUE;
}
}
ReleaseBuffer(buffer);
if (!meDelete)
- me->blkno = blkno;
+ me->leftBlkno = blkno;
return meDelete;
}
}
memset(&root, 0, sizeof(DataPageDeleteStack));
- root.blkno = rootBlkno;
+ root.leftBlkno = InvalidBlockNumber;
root.isRoot = TRUE;
vacuum_delay_point();