From ceb438ed8c39bc647e0b0c33cf7d2d7ab2f21b2d Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Tue, 30 Jul 2002 16:08:33 +0000
Subject: [PATCH] This patch fixes one serious bug (runaway INSERT) and a few
 rare (and hard to reproduce) error conditions.

Manfred Koizar
---
 src/backend/access/heap/heapam.c | 21 ++++++++++++++++-----
 src/backend/utils/time/tqual.c   |  3 ++-
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 35249188135..1abb938fdf8 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -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);
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index b1302c2740b..bd7693ca37c 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -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)
-- 
GitLab