Repair nasty oversight in bt_split: if the index is temporary, we weren't
authorTom Lane <[email protected]>
Fri, 21 Feb 2003 18:24:54 +0000 (18:24 +0000)
committerTom Lane <[email protected]>
Fri, 21 Feb 2003 18:24:54 +0000 (18:24 +0000)
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.

src/backend/access/nbtree/nbtinsert.c

index 99011a5c958cf9e169776da57a063a8baece40f4..ad52b0d3fad0433be84b4dc46662f9fcc8b7d731 100644 (file)
@@ -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;