aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gin/ginget.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-01-10 21:08:36 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-01-10 21:08:36 +0000
commit43a57cf3657faba593ba72c3d67f3397ae84c60d (patch)
treee50237232552428843286cc0e39d85e560629f98 /src/backend/access/gin/ginget.c
parent3b34e98242446bcc2827f081e72342cc7af57574 (diff)
downloadpostgresql-43a57cf3657faba593ba72c3d67f3397ae84c60d.tar.gz
postgresql-43a57cf3657faba593ba72c3d67f3397ae84c60d.zip
Revise the TIDBitmap API to support multiple concurrent iterations over a
bitmap. This is extracted from Greg Stark's posix_fadvise patch; it seems worth committing separately, since it's potentially useful independently of posix_fadvise.
Diffstat (limited to 'src/backend/access/gin/ginget.c')
-rw-r--r--src/backend/access/gin/ginget.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c
index d4559815340..182981498c1 100644
--- a/src/backend/access/gin/ginget.c
+++ b/src/backend/access/gin/ginget.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.21 2009/01/01 17:23:34 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.22 2009/01/10 21:08:36 tgl Exp $
*-------------------------------------------------------------------------
*/
@@ -290,6 +290,7 @@ startScanEntry(Relation index, GinState *ginstate, GinScanEntry entry)
entry->list = NULL;
entry->nlist = 0;
entry->partialMatch = NULL;
+ entry->partialMatchIterator = NULL;
entry->partialMatchResult = NULL;
entry->reduceResult = FALSE;
entry->predictNumberResult = 0;
@@ -311,6 +312,9 @@ startScanEntry(Relation index, GinState *ginstate, GinScanEntry entry)
*/
if ( entry->partialMatch )
{
+ if (entry->partialMatchIterator)
+ tbm_end_iterate(entry->partialMatchIterator);
+ entry->partialMatchIterator = NULL;
tbm_free( entry->partialMatch );
entry->partialMatch = NULL;
}
@@ -323,7 +327,7 @@ startScanEntry(Relation index, GinState *ginstate, GinScanEntry entry)
if ( entry->partialMatch && !tbm_is_empty(entry->partialMatch) )
{
- tbm_begin_iterate(entry->partialMatch);
+ entry->partialMatchIterator = tbm_begin_iterate(entry->partialMatch);
entry->isFinished = FALSE;
}
}
@@ -534,11 +538,13 @@ entryGetItem(Relation index, GinScanEntry entry)
{
if ( entry->partialMatchResult == NULL || entry->offset >= entry->partialMatchResult->ntuples )
{
- entry->partialMatchResult = tbm_iterate( entry->partialMatch );
+ entry->partialMatchResult = tbm_iterate( entry->partialMatchIterator );
if ( entry->partialMatchResult == NULL )
{
ItemPointerSet(&entry->curItem, InvalidBlockNumber, InvalidOffsetNumber);
+ tbm_end_iterate(entry->partialMatchIterator);
+ entry->partialMatchIterator = NULL;
entry->isFinished = TRUE;
break;
}