diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index c4619a6146..746de42af5 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.19 2008/09/04 11:47:05 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginget.c,v 1.20 2008/10/20 13:39:44 teodor Exp $ *------------------------------------------------------------------------- */ @@ -582,54 +582,6 @@ entryGetItem(Relation index, GinScanEntry entry) return entry->isFinished; } -/* - * restart from saved position. Actually it's needed only for - * partial match. function is called only by ginrestpos() - */ -void -ginrestartentry(GinScanEntry entry) -{ - ItemPointerData stopItem = entry->curItem; - bool savedReduceResult; - - if ( entry->master || entry->partialMatch == NULL ) - return; /* entry is slave or not a partial match type*/ - - if ( entry->isFinished ) - return; /* entry was finished before ginmarkpos() call */ - - if ( ItemPointerGetBlockNumber(&stopItem) == InvalidBlockNumber ) - return; /* entry wasn't began before ginmarkpos() call */ - - /* - * Reset iterator - */ - tbm_begin_iterate( entry->partialMatch ); - entry->partialMatchResult = NULL; - entry->offset = 0; - - /* - * Temporary reset reduceResult flag to guarantee refinding - * of curItem - */ - savedReduceResult = entry->reduceResult; - entry->reduceResult = FALSE; - - do - { - /* - * We can use null instead of index because - * partial match doesn't use it - */ - if ( entryGetItem( NULL, entry ) == false ) - elog(ERROR, "cannot refind scan position"); /* must not be here! */ - } while( compareItemPointers( &stopItem, &entry->curItem ) != 0 ); - - Assert( entry->isFinished == FALSE ); - - entry->reduceResult = savedReduceResult; -} - /* * Sets key->curItem to new found heap item pointer for one scan key * Returns isFinished, ie TRUE means we did NOT get a new item pointer! diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c index 7a1cac08cd..675e819268 100644 --- a/src/backend/access/gin/ginscan.c +++ b/src/backend/access/gin/ginscan.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.18 2008/09/04 11:47:05 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/ginscan.c,v 1.19 2008/10/20 13:39:44 teodor Exp $ *------------------------------------------------------------------------- */ @@ -114,7 +114,7 @@ resetScanKeys(GinScanKey keys, uint32 nkeys) #endif static void -freeScanKeys(GinScanKey keys, uint32 nkeys, bool removeRes) +freeScanKeys(GinScanKey keys, uint32 nkeys) { uint32 i, j; @@ -130,14 +130,13 @@ freeScanKeys(GinScanKey keys, uint32 nkeys, bool removeRes) { if (key->scanEntry[j].buffer != InvalidBuffer) ReleaseBuffer(key->scanEntry[j].buffer); - if (removeRes && key->scanEntry[j].list) + if (key->scanEntry[j].list) pfree(key->scanEntry[j].list); - if (removeRes && key->scanEntry[j].partialMatch) + if (key->scanEntry[j].partialMatch) tbm_free(key->scanEntry[j].partialMatch); } - if (removeRes) - pfree(key->entryRes); + pfree(key->entryRes); pfree(key->scanEntry); } @@ -233,11 +232,10 @@ ginrescan(PG_FUNCTION_ARGS) } else { - freeScanKeys(so->keys, so->nkeys, TRUE); - freeScanKeys(so->markPos, so->nkeys, FALSE); + freeScanKeys(so->keys, so->nkeys); } - so->markPos = so->keys = NULL; + so->keys = NULL; if (scankey && scan->numberOfKeys > 0) { @@ -257,8 +255,7 @@ ginendscan(PG_FUNCTION_ARGS) if (so != NULL) { - freeScanKeys(so->keys, so->nkeys, TRUE); - freeScanKeys(so->markPos, so->nkeys, FALSE); + freeScanKeys(so->keys, so->nkeys); MemoryContextDelete(so->tempCtx); @@ -268,60 +265,16 @@ ginendscan(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } -static GinScanKey -copyScanKeys(GinScanKey keys, uint32 nkeys, bool restart) -{ - GinScanKey newkeys; - uint32 i, - j; - - newkeys = (GinScanKey) palloc(sizeof(GinScanKeyData) * nkeys); - memcpy(newkeys, keys, sizeof(GinScanKeyData) * nkeys); - - for (i = 0; i < nkeys; i++) - { - newkeys[i].scanEntry = (GinScanEntry) palloc(sizeof(GinScanEntryData) * keys[i].nentries); - memcpy(newkeys[i].scanEntry, keys[i].scanEntry, sizeof(GinScanEntryData) * keys[i].nentries); - - for (j = 0; j < keys[i].nentries; j++) - { - if (keys[i].scanEntry[j].buffer != InvalidBuffer) - IncrBufferRefCount(keys[i].scanEntry[j].buffer); - if (keys[i].scanEntry[j].master) - { - int masterN = keys[i].scanEntry[j].master - keys[i].scanEntry; - - newkeys[i].scanEntry[j].master = newkeys[i].scanEntry + masterN; - } - - if ( restart ) - ginrestartentry( &keys[i].scanEntry[j] ); - } - } - - return newkeys; -} - Datum ginmarkpos(PG_FUNCTION_ARGS) { - IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GinScanOpaque so = (GinScanOpaque) scan->opaque; - - freeScanKeys(so->markPos, so->nkeys, FALSE); - so->markPos = copyScanKeys(so->keys, so->nkeys, FALSE); - + elog(ERROR, "GIN does not support mark/restore"); PG_RETURN_VOID(); } Datum ginrestrpos(PG_FUNCTION_ARGS) { - IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GinScanOpaque so = (GinScanOpaque) scan->opaque; - - freeScanKeys(so->keys, so->nkeys, FALSE); - so->keys = copyScanKeys(so->markPos, so->nkeys, TRUE); - + elog(ERROR, "GIN does not support mark/restore"); PG_RETURN_VOID(); } diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index 574eeff7ff..a9a5845578 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.76 2008/10/17 17:02:21 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistget.c,v 1.77 2008/10/20 13:39:44 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -494,16 +494,6 @@ gistfindnext(IndexScanDesc scan, OffsetNumber n, ScanDirection dir) */ oldcxt = MemoryContextSwitchTo(so->tempCxt); - /* - * If we modified the index during the scan, we may have a pointer to a - * ghost tuple, before the scan. If this is the case, back up one. - */ - if (so->flags & GS_CURBEFORE) - { - so->flags &= ~GS_CURBEFORE; - n = OffsetNumberPrev(n); - } - while (n >= FirstOffsetNumber && n <= maxoff) { it = (IndexTuple) PageGetItem(p, PageGetItemId(p, n)); diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index 6dba277b18..4e529b6199 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.72 2008/10/17 17:02:21 teodor Exp $ + * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.73 2008/10/20 13:39:44 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -49,30 +49,21 @@ gistrescan(PG_FUNCTION_ARGS) { /* rescan an existing indexscan --- reset state */ gistfreestack(so->stack); - gistfreestack(so->markstk); - so->stack = so->markstk = NULL; - so->flags = 0x0; + so->stack = NULL; /* drop pins on buffers -- no locks held */ if (BufferIsValid(so->curbuf)) { ReleaseBuffer(so->curbuf); so->curbuf = InvalidBuffer; } - if (BufferIsValid(so->markbuf)) - { - ReleaseBuffer(so->markbuf); - so->markbuf = InvalidBuffer; - } - } else { /* initialize opaque data */ so = (GISTScanOpaque) palloc(sizeof(GISTScanOpaqueData)); - so->stack = so->markstk = NULL; - so->flags = 0x0; + so->stack = NULL; so->tempCxt = createTempGistContext(); - so->curbuf = so->markbuf = InvalidBuffer; + so->curbuf = InvalidBuffer; so->giststate = (GISTSTATE *) palloc(sizeof(GISTSTATE)); initGISTstate(so->giststate, scan->indexRelation); @@ -83,7 +74,6 @@ gistrescan(PG_FUNCTION_ARGS) * Clear all the pointers. */ ItemPointerSetInvalid(&so->curpos); - ItemPointerSetInvalid(&so->markpos); so->nPageData = so->curPageData = 0; /* Update scan key, if a new one is given */ @@ -119,108 +109,14 @@ gistrescan(PG_FUNCTION_ARGS) Datum gistmarkpos(PG_FUNCTION_ARGS) { - IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GISTScanOpaque so; - GISTSearchStack *o, - *n, - *tmp; - - so = (GISTScanOpaque) scan->opaque; - so->markpos = so->curpos; - if (so->flags & GS_CURBEFORE) - so->flags |= GS_MRKBEFORE; - else - so->flags &= ~GS_MRKBEFORE; - - o = NULL; - n = so->stack; - - /* copy the parent stack from the current item data */ - while (n != NULL) - { - tmp = (GISTSearchStack *) palloc(sizeof(GISTSearchStack)); - tmp->lsn = n->lsn; - tmp->parentlsn = n->parentlsn; - tmp->block = n->block; - tmp->next = o; - o = tmp; - n = n->next; - } - - gistfreestack(so->markstk); - so->markstk = o; - - /* Update markbuf: make sure to bump ref count on curbuf */ - if (BufferIsValid(so->markbuf)) - { - ReleaseBuffer(so->markbuf); - so->markbuf = InvalidBuffer; - } - if (BufferIsValid(so->curbuf)) - { - IncrBufferRefCount(so->curbuf); - so->markbuf = so->curbuf; - } - - so->markNPageData = so->nPageData; - so->markCurPageData = so->curPageData; - if ( so->markNPageData > 0 ) - memcpy( so->markPageData, so->pageData, sizeof(ItemResult) * so->markNPageData ); - + elog(ERROR, "GiST does not support mark/restore"); PG_RETURN_VOID(); } Datum gistrestrpos(PG_FUNCTION_ARGS) { - IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); - GISTScanOpaque so; - GISTSearchStack *o, - *n, - *tmp; - - so = (GISTScanOpaque) scan->opaque; - so->curpos = so->markpos; - if (so->flags & GS_MRKBEFORE) - so->flags |= GS_CURBEFORE; - else - so->flags &= ~GS_CURBEFORE; - - o = NULL; - n = so->markstk; - - /* copy the parent stack from the current item data */ - while (n != NULL) - { - tmp = (GISTSearchStack *) palloc(sizeof(GISTSearchStack)); - tmp->lsn = n->lsn; - tmp->parentlsn = n->parentlsn; - tmp->block = n->block; - tmp->next = o; - o = tmp; - n = n->next; - } - - gistfreestack(so->stack); - so->stack = o; - - /* Update curbuf: be sure to bump ref count on markbuf */ - if (BufferIsValid(so->curbuf)) - { - ReleaseBuffer(so->curbuf); - so->curbuf = InvalidBuffer; - } - if (BufferIsValid(so->markbuf)) - { - IncrBufferRefCount(so->markbuf); - so->curbuf = so->markbuf; - } - - so->nPageData = so->markNPageData; - so->curPageData = so->markNPageData; - if ( so->markNPageData > 0 ) - memcpy( so->pageData, so->markPageData, sizeof(ItemResult) * so->markNPageData ); - + elog(ERROR, "GiST does not support mark/restore"); PG_RETURN_VOID(); } @@ -235,14 +131,11 @@ gistendscan(PG_FUNCTION_ARGS) if (so != NULL) { gistfreestack(so->stack); - gistfreestack(so->markstk); if (so->giststate != NULL) freeGISTstate(so->giststate); /* drop pins on buffers -- we aren't holding any locks */ if (BufferIsValid(so->curbuf)) ReleaseBuffer(so->curbuf); - if (BufferIsValid(so->markbuf)) - ReleaseBuffer(so->markbuf); MemoryContextDelete(so->tempCxt); pfree(scan->opaque); } diff --git a/src/include/access/gin.h b/src/include/access/gin.h index de29cff86b..57cb8a345a 100644 --- a/src/include/access/gin.h +++ b/src/include/access/gin.h @@ -4,7 +4,7 @@ * * Copyright (c) 2006-2008, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/include/access/gin.h,v 1.24 2008/07/13 21:50:04 tgl Exp $ + * $PostgreSQL: pgsql/src/include/access/gin.h,v 1.25 2008/10/20 13:39:44 teodor Exp $ *-------------------------------------------------------------------------- */ @@ -426,8 +426,6 @@ typedef struct GinScanOpaqueData uint32 nkeys; bool isVoidRes; /* true if ginstate.extractQueryFn guarantees * that nothing will be found */ - - GinScanKey markPos; } GinScanOpaqueData; typedef GinScanOpaqueData *GinScanOpaque; @@ -449,7 +447,6 @@ extern PGDLLIMPORT int GinFuzzySearchLimit; extern Datum gingetbitmap(PG_FUNCTION_ARGS); extern Datum gingettuple(PG_FUNCTION_ARGS); -extern void ginrestartentry(GinScanEntry entry); /* ginvacuum.c */ extern Datum ginbulkdelete(PG_FUNCTION_ARGS); diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h index 5b628c93c6..2d942e54b4 100644 --- a/src/include/access/gist_private.h +++ b/src/include/access/gist_private.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.33 2008/10/17 17:02:21 teodor Exp $ + * $PostgreSQL: pgsql/src/include/access/gist_private.h,v 1.34 2008/10/20 13:39:44 teodor Exp $ * *------------------------------------------------------------------------- */ @@ -72,21 +72,15 @@ typedef struct GISTScanOpaqueData { GISTSearchStack *stack; GISTSearchStack *markstk; - uint16 flags; bool qual_ok; /* false if qual can never be satisfied */ GISTSTATE *giststate; MemoryContext tempCxt; Buffer curbuf; ItemPointerData curpos; - Buffer markbuf; - ItemPointerData markpos; ItemResult pageData[BLCKSZ/sizeof(IndexTupleData)]; OffsetNumber nPageData; OffsetNumber curPageData; - ItemResult markPageData[BLCKSZ/sizeof(IndexTupleData)]; - OffsetNumber markNPageData; - OffsetNumber markCurPageData; } GISTScanOpaqueData; typedef GISTScanOpaqueData *GISTScanOpaque; @@ -225,15 +219,6 @@ typedef struct ItemPointerData key; } GISTInsertState; -/* - * When we're doing a scan and updating a tree at the same time, the - * updates may affect the scan. We use the flags entry of the scan's - * opaque space to record our actual position in response to updates - * that we can't handle simply by adjusting pointers. - */ -#define GS_CURBEFORE ((uint16) (1 << 0)) -#define GS_MRKBEFORE ((uint16) (1 << 1)) - /* root page of a gist index */ #define GIST_ROOT_BLKNO 0