88 * Portions Copyright (c) 1994, Regents of the University of California
99 *
1010 * IDENTIFICATION
11- *$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.8 2006/11/12 06:55:53 neilc Exp $
11+ *$PostgreSQL: pgsql/src/backend/access/gin/ginvacuum.c,v 1.9 2006/11/30 16:22:32 teodor Exp $
1212 *-------------------------------------------------------------------------
1313 */
1414
@@ -265,6 +265,12 @@ ginDeletePage(GinVacuumState *gvs, BlockNumber deleteBlkno, BlockNumber leftBlkn
265265}
266266
267267parentPage = BufferGetPage (pBuffer );
268+ #ifdef USE_ASSERT_CHECKING
269+ do {
270+ PostingItem * tod = (PostingItem * )GinDataPageGetItem (parentPage ,myoff );
271+ Assert (PostingItemGetBlockNumber (tod )== deleteBlkno );
272+ }while (0 );
273+ #endif
268274PageDeletePostingItem (parentPage ,myoff );
269275
270276page = BufferGetPage (dBuffer );
@@ -351,7 +357,8 @@ typedef struct DataPageDeleteStack
351357struct DataPageDeleteStack * child ;
352358struct DataPageDeleteStack * parent ;
353359
354- BlockNumber blkno ;
360+ BlockNumber blkno ;/* current block number */
361+ BlockNumber leftBlkno ;/* rightest non-deleted page on left */
355362bool isRoot ;
356363}DataPageDeleteStack ;
357364
@@ -377,7 +384,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
377384me = (DataPageDeleteStack * )palloc0 (sizeof (DataPageDeleteStack ));
378385me -> parent = parent ;
379386parent -> child = me ;
380- me -> blkno = InvalidBlockNumber ;
387+ me -> leftBlkno = InvalidBlockNumber ;
381388}
382389else
383390me = parent -> child ;
@@ -392,6 +399,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
392399{
393400OffsetNumber i ;
394401
402+ me -> blkno = blkno ;
395403for (i = FirstOffsetNumber ;i <=GinPageGetOpaque (page )-> maxoff ;i ++ )
396404{
397405PostingItem * pitem = (PostingItem * )GinDataPageGetItem (page ,i );
@@ -403,13 +411,13 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
403411
404412if (GinPageGetOpaque (page )-> maxoff < FirstOffsetNumber )
405413{
406- if (!(me -> blkno == InvalidBlockNumber && GinPageRightMost (page )))
414+ if (!(me -> leftBlkno == InvalidBlockNumber && GinPageRightMost (page )))
407415{
408416/* we never delete right most branch */
409417Assert (!isRoot );
410418if (GinPageGetOpaque (page )-> maxoff < FirstOffsetNumber )
411419{
412- ginDeletePage (gvs ,blkno ,me -> blkno ,me -> parent -> blkno ,myoff ,me -> parent -> isRoot );
420+ ginDeletePage (gvs ,blkno ,me -> leftBlkno ,me -> parent -> blkno ,myoff ,me -> parent -> isRoot );
413421meDelete = TRUE;
414422}
415423}
@@ -418,7 +426,7 @@ ginScanToDelete(GinVacuumState *gvs, BlockNumber blkno, bool isRoot, DataPageDel
418426ReleaseBuffer (buffer );
419427
420428if (!meDelete )
421- me -> blkno = blkno ;
429+ me -> leftBlkno = blkno ;
422430
423431return meDelete ;
424432}
@@ -438,7 +446,7 @@ ginVacuumPostingTree(GinVacuumState *gvs, BlockNumber rootBlkno)
438446}
439447
440448memset (& root ,0 ,sizeof (DataPageDeleteStack ));
441- root .blkno = rootBlkno ;
449+ root .leftBlkno = InvalidBlockNumber ;
442450root .isRoot = TRUE;
443451
444452vacuum_delay_point ();