diff -c -r src.orig/backend/access/gist/gistget.c src/backend/access/gist/gistget.c *** src.orig/backend/access/gist/gistget.c 2008-10-22 12:07:39.000000000 +0400 --- src/backend/access/gist/gistget.c 2008-10-22 15:13:23.000000000 +0400 *************** *** 49,55 **** for (offset = FirstOffsetNumber; offset <= maxoff; offset = OffsetNumberNext(offset)) { ! IndexTuple ituple = (IndexTuple) PageGetItem(p, PageGetItemId(p, offset)); if (ItemPointerEquals(&(ituple->t_tid), iptr)) { --- 49,55 ---- for (offset = FirstOffsetNumber; offset <= maxoff; offset = OffsetNumberNext(offset)) { ! IndexTuple ituple = (IndexTuple) PageGetItem(p, PageGetItemId(p, offset)); if (ItemPointerEquals(&(ituple->t_tid), iptr)) { *************** *** 157,163 **** { while( ntids < maxtids && so->curPageData < so->nPageData ) { ! tids[ ntids ] = scan->xs_ctup.t_self = so->pageData[ so->curPageData ]; so->curPageData ++; ntids++; --- 157,167 ---- { while( ntids < maxtids && so->curPageData < so->nPageData ) { ! tids[ ntids ] = scan->xs_ctup.t_self = so->pageData[ so->curPageData ].heapPtr; ! ItemPointerSet(&(so->curpos), ! BufferGetBlockNumber(so->curbuf), ! so->pageData[ so->curPageData ].pageOffset); ! so->curPageData ++; ntids++; *************** *** 251,258 **** { while( ntids < maxtids && so->curPageData < so->nPageData ) { ! tids[ ntids ] = scan->xs_ctup.t_self = so->pageData[ so->curPageData ]; so->curPageData ++; ntids++; } --- 255,267 ---- { while( ntids < maxtids && so->curPageData < so->nPageData ) { ! tids[ ntids ] = scan->xs_ctup.t_self = ! so->pageData[ so->curPageData ].heapPtr; + ItemPointerSet(&(so->curpos), + BufferGetBlockNumber(so->curbuf), + so->pageData[ so->curPageData ].pageOffset); + so->curPageData ++; ntids++; } *************** *** 297,309 **** * we can efficiently resume the index scan later. */ - ItemPointerSet(&(so->curpos), - BufferGetBlockNumber(so->curbuf), n); - if (!(ignore_killed_tuples && ItemIdIsDead(PageGetItemId(p, n)))) { it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); ! so->pageData[ so->nPageData ] = it->t_tid; so->nPageData ++; } } --- 306,316 ---- * we can efficiently resume the index scan later. */ if (!(ignore_killed_tuples && ItemIdIsDead(PageGetItemId(p, n)))) { it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); ! so->pageData[ so->nPageData ].heapPtr = it->t_tid; ! so->pageData[ so->nPageData ].pageOffset = n; so->nPageData ++; } } diff -c -r src.orig/backend/access/gist/gistscan.c src/backend/access/gist/gistscan.c *** src.orig/backend/access/gist/gistscan.c 2008-10-22 12:07:39.000000000 +0400 --- src/backend/access/gist/gistscan.c 2008-10-22 14:55:58.000000000 +0400 *************** *** 163,169 **** so->markNPageData = so->nPageData; so->markCurPageData = so->curPageData; if ( so->markNPageData > 0 ) ! memcpy( so->markPageData, so->pageData, sizeof(ItemPointerData) * so->markNPageData ); PG_RETURN_VOID(); } --- 163,169 ---- so->markNPageData = so->nPageData; so->markCurPageData = so->curPageData; if ( so->markNPageData > 0 ) ! memcpy( so->markPageData, so->pageData, sizeof(MatchedItemPtr) * so->markNPageData ); PG_RETURN_VOID(); } *************** *** 217,223 **** so->nPageData = so->markNPageData; so->curPageData = so->markNPageData; if ( so->markNPageData > 0 ) ! memcpy( so->pageData, so->markPageData, sizeof(ItemPointerData) * so->markNPageData ); PG_RETURN_VOID(); } --- 217,223 ---- so->nPageData = so->markNPageData; so->curPageData = so->markNPageData; if ( so->markNPageData > 0 ) ! memcpy( so->pageData, so->markPageData, sizeof(MatchedItemPtr) * so->markNPageData ); PG_RETURN_VOID(); } diff -c -r src.orig/include/access/gist_private.h src/include/access/gist_private.h *** src.orig/include/access/gist_private.h 2008-10-22 12:07:50.000000000 +0400 --- src/include/access/gist_private.h 2008-10-22 15:00:24.000000000 +0400 *************** *** 60,65 **** --- 60,71 ---- TupleDesc tupdesc; } GISTSTATE; + typedef struct MatchedItemPtr + { + ItemPointerData heapPtr; + OffsetNumber pageOffset; /* offset in index page */ + } MatchedItemPtr; + /* * When we're doing a scan, we need to keep track of the parent stack * for the marked and current items. *************** *** 77,86 **** Buffer markbuf; ItemPointerData markpos; ! ItemPointerData pageData[BLCKSZ/sizeof(IndexTupleData)]; OffsetNumber nPageData; OffsetNumber curPageData; ! ItemPointerData markPageData[BLCKSZ/sizeof(IndexTupleData)]; OffsetNumber markNPageData; OffsetNumber markCurPageData; } GISTScanOpaqueData; --- 83,92 ---- Buffer markbuf; ItemPointerData markpos; ! MatchedItemPtr pageData[BLCKSZ/sizeof(IndexTupleData)]; OffsetNumber nPageData; OffsetNumber curPageData; ! MatchedItemPtr markPageData[BLCKSZ/sizeof(IndexTupleData)]; OffsetNumber markNPageData; OffsetNumber markCurPageData; } GISTScanOpaqueData;