Datum gistendscan(PG_FUNCTION_ARGS) { IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); GISTScanOpaque so; so = (GISTScanOpaque) scan->opaque; 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); } PG_RETURN_VOID(); }
Datum gistrestrpos(PG_FUNCTION_ARGS) { IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); GISTScanOpaque so; GISTSearchStack *o, *n, *tmp; scan->currentItemData = scan->currentMarkData; so = (GISTScanOpaque) scan->opaque; 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(MatchedItemPtr) * so->markNPageData ); PG_RETURN_VOID(); }
Datum gistrescan(PG_FUNCTION_ARGS) { IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ScanKey key = (ScanKey) PG_GETARG_POINTER(1); GISTScanOpaque so; int i; /* * Clear all the pointers. */ ItemPointerSetInvalid(&scan->currentItemData); ItemPointerSetInvalid(&scan->currentMarkData); so = (GISTScanOpaque) scan->opaque; if (so != NULL) { /* rescan an existing indexscan --- reset state */ gistfreestack(so->stack); gistfreestack(so->markstk); so->stack = so->markstk = NULL; so->flags = 0x0; /* 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->tempCxt = createTempGistContext(); so->curbuf = so->markbuf = InvalidBuffer; so->giststate = (GISTSTATE *) palloc(sizeof(GISTSTATE)); initGISTstate(so->giststate, scan->indexRelation); scan->opaque = so; } so->nPageData = so->curPageData = 0; /* Update scan key, if a new one is given */ if (key && scan->numberOfKeys > 0) { memmove(scan->keyData, key, scan->numberOfKeys * sizeof(ScanKeyData)); /* * Modify the scan key so that all the Consistent method is called for * all comparisons. The original operator is passed to the Consistent * function in the form of its strategy number, which is available * from the sk_strategy field, and its subtype from the sk_subtype * field. */ for (i = 0; i < scan->numberOfKeys; i++) scan->keyData[i].sk_func = so->giststate->consistentFn[scan->keyData[i].sk_attno - 1]; } PG_RETURN_VOID(); }
Datum gistrescan(PG_FUNCTION_ARGS) { IndexScanDesc scan = (IndexScanDesc) PG_GETARG_POINTER(0); ScanKey key = (ScanKey) PG_GETARG_POINTER(1); GISTScanOpaque so; int i; so = (GISTScanOpaque) scan->opaque; if (so != NULL) { /* rescan an existing indexscan --- reset state */ gistfreestack(so->stack); so->stack = NULL; /* drop pins on buffers -- no locks held */ if (BufferIsValid(so->curbuf)) { ReleaseBuffer(so->curbuf); so->curbuf = InvalidBuffer; } } else { /* initialize opaque data */ so = (GISTScanOpaque) palloc(sizeof(GISTScanOpaqueData)); so->stack = NULL; so->tempCxt = createTempGistContext(); so->curbuf = InvalidBuffer; so->giststate = (GISTSTATE *) palloc(sizeof(GISTSTATE)); initGISTstate(so->giststate, scan->indexRelation); scan->opaque = so; } /* * Clear all the pointers. */ ItemPointerSetInvalid(&so->curpos); so->nPageData = so->curPageData = 0; so->qual_ok = true; /* Update scan key, if a new one is given */ if (key && scan->numberOfKeys > 0) { memmove(scan->keyData, key, scan->numberOfKeys * sizeof(ScanKeyData)); /* * Modify the scan key so that all the Consistent method is called for * all comparisons. The original operator is passed to the Consistent * function in the form of its strategy number, which is available * from the sk_strategy field, and its subtype from the sk_subtype * field. * * Next, if any of keys is a NULL and that key is not marked with * SK_SEARCHNULL/SK_SEARCHNOTNULL then nothing can be found (ie, we * assume all indexable operators are strict). */ for (i = 0; i < scan->numberOfKeys; i++) { ScanKey skey = &(scan->keyData[i]); skey->sk_func = so->giststate->consistentFn[skey->sk_attno - 1]; if (skey->sk_flags & SK_ISNULL) { if (!(skey->sk_flags & (SK_SEARCHNULL | SK_SEARCHNOTNULL))) so->qual_ok = false; } } } PG_RETURN_VOID(); }