]> granicus.if.org Git - postgresql/commitdiff
_bt_updateitem is returned in code, but works only if sizes of keys
authorVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 6 Dec 1996 09:45:30 +0000 (09:45 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Fri, 6 Dec 1996 09:45:30 +0000 (09:45 +0000)
are equal.

src/backend/access/nbtree/nbtinsert.c

index c1cedd33bdaaaef907a521f483ea24b495a767b6..77410b8568da4ffc5e42f6787218c38e5598f4df 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.7 1996/11/13 20:47:11 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.8 1996/12/06 09:45:30 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -31,10 +31,7 @@ static OffsetNumber _bt_findsplitloc(Relation rel, Page page, OffsetNumber start
 static void _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf);
 static OffsetNumber _bt_pgaddtup(Relation rel, Buffer buf, int keysz, ScanKey itup_scankey, Size itemsize, BTItem btitem, BTItem afteritem);
 static bool _bt_goesonpg(Relation rel, Buffer buf, Size keysz, ScanKey scankey, BTItem afteritem);
-
-#if 0
 static void _bt_updateitem(Relation rel, Size keysz, Buffer buf, Oid bti_oid, BTItem newItem);
-#endif
 
 /*
  *  _bt_doinsert() -- Handle insertion of a single btitem in the tree.
@@ -265,6 +262,8 @@ _bt_insertonpg(Relation rel,
            
            if (_bt_itemcmp(rel, keysz, stack->bts_btitem, new_item,
                            BTGreaterStrategyNumber)) {
+               ppageop = (BTPageOpaque) PageGetSpecialPointer(page);
+               Assert (P_LEFTMOST(ppageop));
                lowLeftItem =
                    (BTItem) PageGetItem(page,
                                         PageGetItemId(page, P_FIRSTKEY));
@@ -278,56 +277,80 @@ _bt_insertonpg(Relation rel,
                /* because it's bigger than what was there before).       */
                 /*                                  --djm 8/21/96         */
 
-               /* _bt_updateitem(rel, keysz, pbuf, stack->bts_btitem->bti_oid,
-                              lowLeftItem); */
-               
-               /* get the parent page */
-               ppage = BufferGetPage(pbuf);
-               ppageop = (BTPageOpaque) PageGetSpecialPointer(ppage);
+               /* 
+                * but it works for items with the same size and so why don't
+                * use it for them ? - vadim 12/05/96
+                */
+               if ( DOUBLEALIGN (IndexTupleDSize (lowLeftItem->bti_itup)) ==
+                               DOUBLEALIGN (IndexTupleDSize (stack->bts_btitem->bti_itup)) ) 
+                       {
+                   _bt_updateitem(rel, keysz, pbuf, 
+                               stack->bts_btitem->bti_oid, lowLeftItem);
+                   _bt_relbuf(rel, buf, BT_WRITE);
+                   _bt_relbuf(rel, rbuf, BT_WRITE);
+               }
+               else
+               {
+                   /* get the parent page */
+                   ppage = BufferGetPage(pbuf);
+                   ppageop = (BTPageOpaque) PageGetSpecialPointer(ppage);
 
-               /* figure out which key is leftmost (if the parent page   */
-               /* is rightmost, too, it must be the root)                */
-               if(P_RIGHTMOST(ppageop)) {
-                   leftmost_offset = P_HIKEY;
-               } else {
-                   leftmost_offset = P_FIRSTKEY;
-           }
-                       PageIndexTupleDelete(ppage, leftmost_offset);
+                   /* 
+                    * figure out which key is leftmost (if the parent page
+                    * is rightmost, too, it must be the root)
+                    */
+                   if(P_RIGHTMOST(ppageop)) {
+                       leftmost_offset = P_HIKEY;
+                   } else {
+                       leftmost_offset = P_FIRSTKEY;
+                   }
+                           PageIndexTupleDelete(ppage, leftmost_offset);
                
-               /* don't write anything out yet--we still have the write  */
-               /* lock, and now we call another _bt_insertonpg to        */
-               /* insert the correct leftmost key                        */
+                  /* 
+                   * don't write anything out yet--we still have the write
+                   * lock, and now we call another _bt_insertonpg to
+                   * insert the correct leftmost key
+                   */
 
-               /* make a new leftmost item, using the tuple data from    */
-               /* lowLeftItem.  point it to the left child.              */
-               /* update it on the stack at the same time.               */
-               bknum = BufferGetBlockNumber(buf);
-               pfree(stack->bts_btitem);
-               stack->bts_btitem = _bt_formitem(&(lowLeftItem->bti_itup));
-               ItemPointerSet(&(stack->bts_btitem->bti_itup.t_tid), 
+                   /* 
+                    * make a new leftmost item, using the tuple data from
+                    * lowLeftItem.  point it to the left child.
+                    * update it on the stack at the same time.
+                    */
+                   bknum = BufferGetBlockNumber(buf);
+                   pfree(stack->bts_btitem);
+                   stack->bts_btitem = _bt_formitem(&(lowLeftItem->bti_itup));
+                   ItemPointerSet(&(stack->bts_btitem->bti_itup.t_tid), 
                               bknum, P_HIKEY);
                
-               /* unlock the children before doing this */
-               _bt_relbuf(rel, buf, BT_WRITE);
-               _bt_relbuf(rel, rbuf, BT_WRITE);
+                   /* unlock the children before doing this */
+                   _bt_relbuf(rel, buf, BT_WRITE);
+                   _bt_relbuf(rel, rbuf, BT_WRITE);
                
-               /* a regular _bt_binsrch should find the right place to   */
-               /* put the new entry, since it should be lower than any   */
-               /* other key on the page, therefore set afteritem to NULL */
-               newskey = _bt_mkscankey(rel, &(stack->bts_btitem->bti_itup));
-               newres = _bt_insertonpg(rel, pbuf, stack->bts_parent,
+                   /* 
+                    * a regular _bt_binsrch should find the right place to
+                    * put the new entry, since it should be lower than any
+                    * other key on the page, therefore set afteritem to NULL
+                    */
+                   newskey = _bt_mkscankey(rel, &(stack->bts_btitem->bti_itup));
+                   newres = _bt_insertonpg(rel, pbuf, stack->bts_parent,
                                        keysz, newskey, stack->bts_btitem,
                                        NULL);
 
-               pfree(newres);
-               pfree(newskey);
+                   pfree(newres);
+                   pfree(newskey);
            
-               /* we have now lost our lock on the parent buffer, and    */
-               /* need to get it back.                                   */
-               pbuf = _bt_getstackbuf(rel, stack, BT_WRITE);
-           } else {
-           _bt_relbuf(rel, buf, BT_WRITE);
-           _bt_relbuf(rel, rbuf, BT_WRITE);
+                   /* 
+                    * we have now lost our lock on the parent buffer, and
+                    * need to get it back.
+                    */
+                   pbuf = _bt_getstackbuf(rel, stack, BT_WRITE);
+               }
+           }
+           else
+           {
+               _bt_relbuf(rel, buf, BT_WRITE);
+               _bt_relbuf(rel, rbuf, BT_WRITE);
            }
            
            newskey = _bt_mkscankey(rel, &(new_item->bti_itup));
@@ -872,8 +895,6 @@ _bt_itemcmp(Relation rel,
     return (true);
 }
 
-#if 0
-/* gone since updating in place doesn't work in general --djm 11/13/96 */
 /*
  *     _bt_updateitem() -- updates the key of the item identified by the
  *                         oid with the key of newItem (done in place if
@@ -912,18 +933,23 @@ _bt_updateitem(Relation rel,
        elog(FATAL, "_bt_getstackbuf was lying!!");
     }
     
+    /*
+     * It's  defined by caller (_bt_insertonpg)
+     */
+    /*
     if(IndexTupleDSize(newItem->bti_itup) >
        IndexTupleDSize(item->bti_itup)) {
        elog(NOTICE, "trying to overwrite a smaller value with a bigger one in _bt_updateitem");
        elog(WARN, "this is not good.");
     }
+     */
 
     oldIndexTuple = &(item->bti_itup);
     newIndexTuple = &(newItem->bti_itup);
 
        /* keep the original item pointer */
-       ItemPointerCopy(&(oldIndexTuple->t_tid), &itemPtrData);
-       CopyIndexTuple(newIndexTuple, &oldIndexTuple);
-       ItemPointerCopy(&itemPtrData, &(oldIndexTuple->t_tid));
+    ItemPointerCopy(&(oldIndexTuple->t_tid), &itemPtrData);
+    CopyIndexTuple(newIndexTuple, &oldIndexTuple);
+    ItemPointerCopy(&itemPtrData, &(oldIndexTuple->t_tid));
+    
 }
-#endif