]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
This patch fixes one serious bug (runaway INSERT) and a few rare (and
authorBruce Momjian <bruce@momjian.us>
Tue, 30 Jul 2002 16:08:33 +0000 (16:08 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 30 Jul 2002 16:08:33 +0000 (16:08 +0000)
hard to reproduce) error conditions.

Manfred Koizar

src/backend/access/heap/heapam.c
src/backend/utils/time/tqual.c

index 35249188135ce6d1feb2b5b5b78593ddea92c3ef..1abb938fdf8d6be76a31e15bbfa47ae8dea07b31 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.142 2002/07/20 05:16:56 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.143 2002/07/30 16:08:33 momjian Exp $
  *
  *
  * INTERFACE ROUTINES
@@ -1123,11 +1123,14 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
                        CheckMaxObjectId(HeapTupleGetOid(tup));
        }
 
+       tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
        HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
        HeapTupleHeaderSetCmin(tup->t_data, cid);
        HeapTupleHeaderSetXmaxInvalid(tup->t_data);
-       HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId);
-       tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
+       /*
+        * Do *not* set Cmax!  This would overwrite Cmin.
+        */
+       /* HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId); */
        tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
        tup->t_tableOid = relation->rd_id;
 
@@ -2147,7 +2150,11 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
 
        if (redo)
        {
-               htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
+               /*
+                * On redo from WAL we cannot rely on a tqual-routine
+                * to have reset HEAP_MOVED.
+                */
+               htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
                                                          HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
                HeapTupleHeaderSetXmax(htup, record->xl_xid);
                HeapTupleHeaderSetCmax(htup, FirstCommandId);
@@ -2320,7 +2327,11 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
                }
                else
                {
-                       htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
+                       /*
+                        * On redo from WAL we cannot rely on a tqual-routine
+                        * to have reset HEAP_MOVED.
+                        */
+                       htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
                                                         HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
                        HeapTupleHeaderSetXmax(htup, record->xl_xid);
                        HeapTupleHeaderSetCmax(htup, FirstCommandId);
index b1302c2740b336b8aa8b90982c5254f6ab4f6000..bd7693ca37cef3dc6deaedef4fc7906193fbba55 100644 (file)
@@ -16,7 +16,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.57 2002/07/20 04:57:13 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.58 2002/07/30 16:08:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,6 +83,7 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
                                        return false;
                                }
                                tuple->t_infomask |= HEAP_XMIN_COMMITTED;
+                               tuple->t_infomask &= ~HEAP_MOVED;
                        }
                }
                else if (tuple->t_infomask & HEAP_MOVED_IN)