Fixed, patch attached.

--
Teodor Sigaev                                   E-mail: [EMAIL PROTECTED]
                                                   WWW: http://www.sigaev.ru/
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;
-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to