aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access')
-rw-r--r--src/backend/access/nbtree/nbtree.c2
-rw-r--r--src/backend/access/nbtree/nbtscan.c70
-rw-r--r--src/backend/access/nbtree/nbtsearch.c4
3 files changed, 64 insertions, 12 deletions
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 0624bd06a87..142eafec029 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.13 1997/02/12 05:04:17 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.14 1997/02/18 17:13:42 momjian Exp $
*
* NOTES
* This file contains only the public interface routines.
diff --git a/src/backend/access/nbtree/nbtscan.c b/src/backend/access/nbtree/nbtscan.c
index 3de9f39d325..5e23fe13d7b 100644
--- a/src/backend/access/nbtree/nbtscan.c
+++ b/src/backend/access/nbtree/nbtscan.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/Attic/nbtscan.c,v 1.6 1996/11/15 18:37:00 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/Attic/nbtscan.c,v 1.7 1997/02/18 17:13:45 momjian Exp $
*
*
* NOTES
@@ -40,7 +40,10 @@ typedef struct BTScanListData {
typedef BTScanListData *BTScanList;
static BTScanList BTScans = (BTScanList) NULL;
-
+
+static void _bt_scandel(IndexScanDesc scan, int op, BlockNumber blkno, OffsetNumber offno);
+static bool _bt_scantouched(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno);
+
/*
* _bt_regscan() -- register a new scan.
*/
@@ -81,8 +84,12 @@ _bt_dropscan(IndexScanDesc scan)
pfree (chk);
}
+/*
+ * _bt_adjscans() -- adjust all scans in the scan list to compensate
+ * for a given deletion or insertion
+ */
void
-_bt_adjscans(Relation rel, ItemPointer tid)
+_bt_adjscans(Relation rel, ItemPointer tid, int op)
{
BTScanList l;
Oid relid;
@@ -90,13 +97,34 @@ _bt_adjscans(Relation rel, ItemPointer tid)
relid = rel->rd_id;
for (l = BTScans; l != (BTScanList) NULL; l = l->btsl_next) {
if (relid == l->btsl_scan->relation->rd_id)
- _bt_scandel(l->btsl_scan, ItemPointerGetBlockNumber(tid),
+ _bt_scandel(l->btsl_scan, op,
+ ItemPointerGetBlockNumber(tid),
ItemPointerGetOffsetNumber(tid));
}
}
-void
-_bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
+/*
+ * _bt_scandel() -- adjust a single scan
+ *
+ * because each index page is always maintained as an ordered array of
+ * index tuples, the index tuples on a given page shift beneath any
+ * given scan. an index modification "behind" a scan position (i.e.,
+ * same page, lower or equal offset number) will therefore force us to
+ * adjust the scan in the following ways:
+ *
+ * - on insertion, we shift the scan forward by one item.
+ * - on deletion, we shift the scan backward by one item.
+ *
+ * note that:
+ *
+ * - we need not worry about the actual ScanDirection of the scan
+ * itself, since the problem is that the "current" scan position has
+ * shifted.
+ * - modifications "ahead" of our scan position do not change the
+ * array index of the current scan position and so can be ignored.
+ */
+static void
+_bt_scandel(IndexScanDesc scan, int op, BlockNumber blkno, OffsetNumber offno)
{
ItemPointer current;
Buffer buf;
@@ -112,7 +140,17 @@ _bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
if (ItemPointerIsValid(current)
&& ItemPointerGetBlockNumber(current) == blkno
&& ItemPointerGetOffsetNumber(current) >= offno) {
- _bt_step(scan, &buf, BackwardScanDirection);
+ switch (op) {
+ case BT_INSERT:
+ _bt_step(scan, &buf, ForwardScanDirection);
+ break;
+ case BT_DELETE:
+ _bt_step(scan, &buf, BackwardScanDirection);
+ break;
+ default:
+ elog(WARN, "_bt_scandel: bad operation '%d'", op);
+ /*NOTREACHED*/
+ }
so->btso_curbuf = buf;
}
@@ -124,7 +162,17 @@ _bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
tmp = *current;
*current = scan->currentItemData;
scan->currentItemData = tmp;
- _bt_step(scan, &buf, BackwardScanDirection);
+ switch (op) {
+ case BT_INSERT:
+ _bt_step(scan, &buf, ForwardScanDirection);
+ break;
+ case BT_DELETE:
+ _bt_step(scan, &buf, BackwardScanDirection);
+ break;
+ default:
+ elog(WARN, "_bt_scandel: bad operation '%d'", op);
+ /*NOTREACHED*/
+ }
so->btso_mrkbuf = buf;
tmp = *current;
*current = scan->currentItemData;
@@ -132,7 +180,11 @@ _bt_scandel(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
}
}
-bool
+/*
+ * _bt_scantouched() -- check to see if a scan is affected by a given
+ * change to the index
+ */
+static bool
_bt_scantouched(IndexScanDesc scan, BlockNumber blkno, OffsetNumber offno)
{
ItemPointer current;
diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c
index 569a9e7e7f8..94521ff1c0b 100644
--- a/src/backend/access/nbtree/nbtsearch.c
+++ b/src/backend/access/nbtree/nbtsearch.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.13 1997/01/05 10:56:36 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.14 1997/02/18 17:13:48 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -332,7 +332,7 @@ _bt_binsrch(Relation rel,
else if (result < 0)
high = mid - 1;
else
- return (_bt_firsteq(rel, itupdesc, page, keysz, scankey, mid));
+ return (_bt_firsteq(rel, itupdesc, page, keysz, scankey, mid));
}
/*