Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit ceb438e

Browse files
committed
This patch fixes one serious bug (runaway INSERT) and a few rare (and
hard to reproduce) error conditions. Manfred Koizar
1 parent bf7d8e4 commit ceb438e

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

src/backend/access/heap/heapam.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.142 2002/07/20 05:16:56 momjian Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.143 2002/07/30 16:08:33 momjian Exp $
1212
*
1313
*
1414
* INTERFACE ROUTINES
@@ -1123,11 +1123,14 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
11231123
CheckMaxObjectId(HeapTupleGetOid(tup));
11241124
}
11251125

1126+
tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
11261127
HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
11271128
HeapTupleHeaderSetCmin(tup->t_data, cid);
11281129
HeapTupleHeaderSetXmaxInvalid(tup->t_data);
1129-
HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId);
1130-
tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
1130+
/*
1131+
* Do *not* set Cmax! This would overwrite Cmin.
1132+
*/
1133+
/* HeapTupleHeaderSetCmax(tup->t_data, FirstCommandId); */
11311134
tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
11321135
tup->t_tableOid = relation->rd_id;
11331136

@@ -2147,7 +2150,11 @@ heap_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record)
21472150

21482151
if (redo)
21492152
{
2150-
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
2153+
/*
2154+
* On redo from WAL we cannot rely on a tqual-routine
2155+
* to have reset HEAP_MOVED.
2156+
*/
2157+
htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
21512158
HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
21522159
HeapTupleHeaderSetXmax(htup, record->xl_xid);
21532160
HeapTupleHeaderSetCmax(htup, FirstCommandId);
@@ -2320,7 +2327,11 @@ heap_xlog_update(bool redo, XLogRecPtr lsn, XLogRecord *record, bool move)
23202327
}
23212328
else
23222329
{
2323-
htup->t_infomask &= ~(HEAP_XMAX_COMMITTED |
2330+
/*
2331+
* On redo from WAL we cannot rely on a tqual-routine
2332+
* to have reset HEAP_MOVED.
2333+
*/
2334+
htup->t_infomask &= ~(HEAP_MOVED | HEAP_XMAX_COMMITTED |
23242335
HEAP_XMAX_INVALID | HEAP_MARKED_FOR_UPDATE);
23252336
HeapTupleHeaderSetXmax(htup, record->xl_xid);
23262337
HeapTupleHeaderSetCmax(htup, FirstCommandId);

src/backend/utils/time/tqual.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
* Portions Copyright (c) 1994, Regents of the University of California
1717
*
1818
* IDENTIFICATION
19-
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.57 2002/07/20 04:57:13 momjian Exp $
19+
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.58 2002/07/30 16:08:33 momjian Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -83,6 +83,7 @@ HeapTupleSatisfiesItself(HeapTupleHeader tuple)
8383
return false;
8484
}
8585
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
86+
tuple->t_infomask &= ~HEAP_MOVED;
8687
}
8788
}
8889
else if (tuple->t_infomask & HEAP_MOVED_IN)

0 commit comments

Comments
 (0)