aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/nbtree/nbtscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/nbtree/nbtscan.c')
-rw-r--r--src/backend/access/nbtree/nbtscan.c224
1 files changed, 0 insertions, 224 deletions
diff --git a/src/backend/access/nbtree/nbtscan.c b/src/backend/access/nbtree/nbtscan.c
deleted file mode 100644
index e07914b3440..00000000000
--- a/src/backend/access/nbtree/nbtscan.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*-------------------------------------------------------------------------
- *
- * btscan.c
- * manage scans on btrees.
- *
- * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- *
- * IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/Attic/nbtscan.c,v 1.33 2001/01/24 19:42:48 momjian Exp $
- *
- *
- * NOTES
- * Because we can be doing an index scan on a relation while we update
- * it, we need to avoid missing data that moves around in the index.
- * Insertions and page splits are no problem because _bt_restscan()
- * can figure out where the current item moved to, but if a deletion
- * happens at or before the current scan position, we'd better do
- * something to stay in sync.
- *
- * The routines in this file handle the problem for deletions issued
- * by the current backend. Currently, that's all we need, since
- * deletions are only done by VACUUM and it gets an exclusive lock.
- *
- * The scheme is to manage a list of active scans in the current backend.
- * Whenever we remove a record from an index, we check the list of active
- * scans to see if any has been affected. A scan is affected only if it
- * is on the same relation, and the same page, as the update.
- *
- *-------------------------------------------------------------------------
- */
-
-#include "postgres.h"
-
-#include "access/nbtree.h"
-
-typedef struct BTScanListData
-{
- IndexScanDesc btsl_scan;
- struct BTScanListData *btsl_next;
-} BTScanListData;
-
-typedef BTScanListData *BTScanList;
-
-static BTScanList BTScans = (BTScanList) NULL;
-
-static void _bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno);
-
-/*
- * AtEOXact_nbtree() --- clean up nbtree subsystem at xact abort or commit.
- *
- * This is here because it needs to touch this module's static var BTScans.
- */
-void
-AtEOXact_nbtree(void)
-{
-
- /*
- * Note: these actions should only be necessary during xact abort; but
- * they can't hurt during a commit.
- */
-
- /*
- * Reset the active-scans list to empty. We do not need to free the
- * list elements, because they're all palloc()'d, so they'll go away
- * at end of transaction anyway.
- */
- BTScans = NULL;
-
- /* If we were building a btree, we ain't anymore. */
- BuildingBtree = false;
-}
-
-/*
- * _bt_regscan() -- register a new scan.
- */
-void
-_bt_regscan(IndexScanDesc scan)
-{
- BTScanList new_el;
-
- new_el = (BTScanList) palloc(sizeof(BTScanListData));
- new_el->btsl_scan = scan;
- new_el->btsl_next = BTScans;
- BTScans = new_el;
-}
-
-/*
- * _bt_dropscan() -- drop a scan from the scan list
- */
-void
-_bt_dropscan(IndexScanDesc scan)
-{
- BTScanList chk,
- last;
-
- last = (BTScanList) NULL;
- for (chk = BTScans;
- chk != (BTScanList) NULL && chk->btsl_scan != scan;
- chk = chk->btsl_next)
- last = chk;
-
- if (chk == (BTScanList) NULL)
- elog(ERROR, "btree scan list trashed; can't find 0x%p", (void *) scan);
-
- if (last == (BTScanList) NULL)
- BTScans = chk->btsl_next;
- else
- last->btsl_next = chk->btsl_next;
-
- pfree(chk);
-}
-
-/*
- * _bt_adjscans() -- adjust all scans in the scan list to compensate
- * for a given deletion
- */
-void
-_bt_adjscans(Relation rel, ItemPointer tid)
-{
- BTScanList l;
- Oid relid;
-
- relid = RelationGetRelid(rel);
- for (l = BTScans; l != (BTScanList) NULL; l = l->btsl_next)
- {
- if (relid == RelationGetRelid(l->btsl_scan->relation))
- _bt_scandel(l->btsl_scan,
- ItemPointerGetBlockNumber(tid),
- ItemPointerGetOffsetNumber(tid));
- }
-}
-
-/*
- * _bt_scandel() -- adjust a single scan on deletion
- *
- */
-static void
-_bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
-{
- ItemPointer current;
- Buffer buf;
- BTScanOpaque so;
- OffsetNumber start;
- Page page;
- BTPageOpaque opaque;
-
- so = (BTScanOpaque) scan->opaque;
- buf = so->btso_curbuf;
-
- current = &(scan->currentItemData);
- if (ItemPointerIsValid(current)
- && ItemPointerGetBlockNumber(current) == blkno
- && ItemPointerGetOffsetNumber(current) >= offno)
- {
- page = BufferGetPage(buf);
- opaque = (BTPageOpaque) PageGetSpecialPointer(page);
- start = P_FIRSTDATAKEY(opaque);
- if (ItemPointerGetOffsetNumber(current) == start)
- ItemPointerSetInvalid(&(so->curHeapIptr));
- else
- {
-
- /*
- * We have to lock buffer before _bt_step and unlock it after
- * that.
- */
- LockBuffer(buf, BT_READ);
- _bt_step(scan, &buf, BackwardScanDirection);
- if (ItemPointerIsValid(current))
- {
- Page pg = BufferGetPage(buf);
- BTItem btitem = (BTItem) PageGetItem(pg,
- PageGetItemId(pg, ItemPointerGetOffsetNumber(current)));
-
- so->curHeapIptr = btitem->bti_itup.t_tid;
- LockBuffer(buf, BUFFER_LOCK_UNLOCK);
- }
- }
- }
-
- current = &(scan->currentMarkData);
- if (ItemPointerIsValid(current)
- && ItemPointerGetBlockNumber(current) == blkno
- && ItemPointerGetOffsetNumber(current) >= offno)
- {
- page = BufferGetPage(so->btso_mrkbuf);
- opaque = (BTPageOpaque) PageGetSpecialPointer(page);
- start = P_FIRSTDATAKEY(opaque);
-
- if (ItemPointerGetOffsetNumber(current) == start)
- ItemPointerSetInvalid(&(so->mrkHeapIptr));
- else
- {
- ItemPointerData tmp;
-
- tmp = *current;
- *current = scan->currentItemData;
- scan->currentItemData = tmp;
- so->btso_curbuf = so->btso_mrkbuf;
- so->btso_mrkbuf = buf;
- buf = so->btso_curbuf;
- LockBuffer(buf, BT_READ); /* as above */
-
- _bt_step(scan, &buf, BackwardScanDirection);
-
- so->btso_curbuf = so->btso_mrkbuf;
- so->btso_mrkbuf = buf;
- tmp = *current;
- *current = scan->currentItemData;
- scan->currentItemData = tmp;
- if (ItemPointerIsValid(current))
- {
- Page pg = BufferGetPage(buf);
- BTItem btitem = (BTItem) PageGetItem(pg,
- PageGetItemId(pg, ItemPointerGetOffsetNumber(current)));
-
- so->mrkHeapIptr = btitem->bti_itup.t_tid;
- LockBuffer(buf, BUFFER_LOCK_UNLOCK); /* as above */
- }
- }
- }
-}