]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Repair nasty oversight in bt_split: if the index is temporary, we weren't
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 21 Feb 2003 18:24:54 +0000 (18:24 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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;