]> granicus.if.org Git - postgresql/commitdiff
Unique btree-s:
authorVadim B. Mikheev <vadim4o@yahoo.com>
Mon, 12 Apr 1999 16:56:08 +0000 (16:56 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
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 */
                                {