Unique btree-s:
authorVadim B. Mikheev
Mon, 12 Apr 1999 16:56:08 +0000 (16:56 +0000)
committerVadim B. Mikheev
Mon, 12 Apr 1999 16:56:08 +0000 (16:56 +0000)
/*
 * Have to check is inserted heap tuple deleted one
 * (i.e. just moved to another place by vacuum)!
 */

src/backend/access/nbtree/nbtinsert.c

index a0cec5d85a93160c154a212eb6347185c759a668..308aa9e9a6dd4f594671b008e1318571d9a43697 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.36 1999/03/28 20:31:56 vadim Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.37 1999/04/12 16:56:08 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -100,11 +100,12 @@ l1:
        if (!PageIsEmpty(page) && offset <= maxoff)
        {
            TupleDesc       itupdesc;
-           BTItem          btitem;
+           BTItem          cbti;
            HeapTupleData   htup;
            BTPageOpaque    opaque;
            Buffer          nbuf;
            BlockNumber     blkno;
+           bool            chtup = true;
 
            itupdesc = RelationGetDescr(rel);
            nbuf = InvalidBuffer;
@@ -121,8 +122,22 @@ l1:
             */
            while (_bt_isequal(itupdesc, page, offset, natts, itup_scankey))
            {                   /* they're equal */
-               btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offset));
-               htup.t_self = btitem->bti_itup.t_tid;
+               /*
+                * Have to check is inserted heap tuple deleted one
+                * (i.e. just moved to another place by vacuum)!
+                */
+               if (chtup)
+               {
+                   htup.t_self = btitem->bti_itup.t_tid;
+                   heap_fetch(heapRel, SnapshotDirty, &htup, &buffer);
+                   if (htup.t_data == NULL)    /* YES! */
+                       break;
+                   /* Live tuple was inserted */
+                   ReleaseBuffer(buffer);
+                   chtup = false;
+               }
+               cbti = (BTItem) PageGetItem(page, PageGetItemId(page, offset));
+               htup.t_self = cbti->bti_itup.t_tid;
                heap_fetch(heapRel, SnapshotDirty, &htup, &buffer);
                if (htup.t_data != NULL)    /* it is a duplicate */
                {