diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-02-21 18:24:54 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-02-21 18:24:54 +0000 |
commit | a78e12f96aad5e89a44d9725c95bda0866a228f3 (patch) | |
tree | 8e25451c0c22f94a4940e26d21b287ea8ed25a1c | |
parent | 2bba78d605d8f71f5e60c63ea66afa43d4e24280 (diff) |
Repair nasty oversight in bt_split: if the index is temporary, we weren't
updating the left-link from the split page's right sibling. This could
result in backwards index scans missing some entries.
Same bug exists in HEAD, will be patched later.
-rw-r--r-- | src/backend/access/nbtree/nbtinsert.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 99011a5c958..ad52b0d3fad 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.96 2002/09/04 20:31:09 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.96.2.1 2003/02/21 18:24:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -699,6 +699,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, oopaque; Buffer sbuf = 0; Page spage = 0; + BTPageOpaque sopaque = 0; Size itemsz; ItemId itemid; BTItem item; @@ -862,6 +863,7 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, { sbuf = _bt_getbuf(rel, ropaque->btpo_next, BT_WRITE); spage = BufferGetPage(sbuf); + sopaque = (BTPageOpaque) PageGetSpecialPointer(spage); } /* @@ -872,6 +874,9 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, */ START_CRIT_SECTION(); + if (!P_RIGHTMOST(ropaque)) + sopaque->btpo_prev = BufferGetBlockNumber(rbuf); + /* XLOG stuff */ if (!rel->rd_istemp) { @@ -922,10 +927,6 @@ _bt_split(Relation rel, Buffer buf, OffsetNumber firstright, if (!P_RIGHTMOST(ropaque)) { - BTPageOpaque sopaque = (BTPageOpaque) PageGetSpecialPointer(spage); - - sopaque->btpo_prev = BufferGetBlockNumber(rbuf); - rdata[2].next = &(rdata[3]); rdata[3].buffer = sbuf; rdata[3].data = NULL; |