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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy