Fix Xmax freeze conditions

I broke this in 0ac5ad5134; previously, freezing a tuple marked with an
IS_MULTI xmax was not necessary.

Per brokenness report from Jeff Janes.
This commit is contained in:
Alvaro Herrera 2013-02-08 01:27:54 -03:00
parent 335c5e9206
commit 5766228bc6
1 changed files with 5 additions and 4 deletions

View File

@ -5113,10 +5113,11 @@ heap_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid,
* cutoff; it doesn't remove dead members of a very old multixact.
*/
xid = HeapTupleHeaderGetRawXmax(tuple);
if (TransactionIdIsNormal(xid) &&
(((!(tuple->t_infomask & HEAP_XMAX_IS_MULTI) &&
TransactionIdPrecedes(xid, cutoff_xid))) ||
MultiXactIdPrecedes(xid, cutoff_multi)))
if ((tuple->t_infomask & HEAP_XMAX_IS_MULTI) ?
(MultiXactIdIsValid(xid) &&
MultiXactIdPrecedes(xid, cutoff_multi)) :
(TransactionIdIsNormal(xid) &&
TransactionIdPrecedes(xid, cutoff_xid)))
{
HeapTupleHeaderSetXmax(tuple, InvalidTransactionId);