diff options
-rw-r--r-- | src/backend/access/hash/hash.c | 11 | ||||
-rw-r--r-- | src/backend/access/hash/hashsearch.c | 6 | ||||
-rw-r--r-- | src/include/access/hash.h | 7 |
3 files changed, 16 insertions, 8 deletions
diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index 84a6a74418..ead2821f5c 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.112.2.1 2009/11/01 21:25:32 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/hash/hash.c,v 1.112.2.2 2009/11/01 22:31:02 tgl Exp $ * * NOTES * This file contains only the public interface routines. @@ -251,7 +251,7 @@ hashgettuple(PG_FUNCTION_ARGS) IndexTuple itup; itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); - if (ItemPointerEquals(&scan->xs_ctup.t_self, &itup->t_tid)) + if (ItemPointerEquals(&(so->hashso_heappos), &(itup->t_tid))) break; } if (offnum > maxoffnum) @@ -304,6 +304,9 @@ hashgettuple(PG_FUNCTION_ARGS) if (BufferIsValid(so->hashso_curbuf)) _hash_chgbufaccess(rel, so->hashso_curbuf, HASH_READ, HASH_NOLOCK); + /* Return current heap TID on success */ + scan->xs_ctup.t_self = so->hashso_heappos; + PG_RETURN_BOOL(res); } @@ -345,7 +348,7 @@ hashgetbitmap(PG_FUNCTION_ARGS) if (add_tuple) { /* Note we mark the tuple ID as requiring recheck */ - tbm_add_tuples(tbm, &scan->xs_ctup.t_self, 1, true); + tbm_add_tuples(tbm, &(so->hashso_heappos), 1, true); ntids++; } @@ -375,6 +378,7 @@ hashbeginscan(PG_FUNCTION_ARGS) so->hashso_curbuf = InvalidBuffer; /* set position invalid (this will cause _hash_first call) */ ItemPointerSetInvalid(&(so->hashso_curpos)); + ItemPointerSetInvalid(&(so->hashso_heappos)); scan->opaque = so; @@ -410,6 +414,7 @@ hashrescan(PG_FUNCTION_ARGS) /* set position invalid (this will cause _hash_first call) */ ItemPointerSetInvalid(&(so->hashso_curpos)); + ItemPointerSetInvalid(&(so->hashso_heappos)); } /* Update scan key, if a new one is given */ diff --git a/src/backend/access/hash/hashsearch.c b/src/backend/access/hash/hashsearch.c index fec2f5d78a..153ac6926c 100644 --- a/src/backend/access/hash/hashsearch.c +++ b/src/backend/access/hash/hashsearch.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/hash/hashsearch.c,v 1.57 2009/06/11 14:48:53 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/access/hash/hashsearch.c,v 1.57.2.1 2009/11/01 22:31:02 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -58,7 +58,7 @@ _hash_next(IndexScanDesc scan, ScanDirection dir) _hash_checkpage(rel, buf, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); page = BufferGetPage(buf); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); - scan->xs_ctup.t_self = itup->t_tid; + so->hashso_heappos = itup->t_tid; return true; } @@ -242,7 +242,7 @@ _hash_first(IndexScanDesc scan, ScanDirection dir) _hash_checkpage(rel, buf, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); page = BufferGetPage(buf); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, offnum)); - scan->xs_ctup.t_self = itup->t_tid; + so->hashso_heappos = itup->t_tid; return true; } diff --git a/src/include/access/hash.h b/src/include/access/hash.h index f25a2adf08..7d02f28add 100644 --- a/src/include/access/hash.h +++ b/src/include/access/hash.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/hash.h,v 1.93.2.1 2009/11/01 21:25:33 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/hash.h,v 1.93.2.2 2009/11/01 22:31:02 tgl Exp $ * * NOTES * modeled after Margo Seltzer's hash implementation for unix. @@ -99,8 +99,11 @@ typedef struct HashScanOpaqueData */ Buffer hashso_curbuf; - /* Current position of the scan */ + /* Current position of the scan, as an index TID */ ItemPointerData hashso_curpos; + + /* Current position of the scan, as a heap TID */ + ItemPointerData hashso_heappos; } HashScanOpaqueData; typedef HashScanOpaqueData *HashScanOpaque; |