On 2018-05-24 16:46:24 -0400, Alvaro Herrera wrote:
> On 2018-May-24, Andres Freund wrote:
>
> > On 2018-05-24 13:08:53 -0400, Alvaro Herrera wrote:
> > > Hmm .. surely
>
> > > xid = HeapTupleHeaderGetXmin(tuple);
> > > xmin_frozen = ((xid == FrozenTransactionId) ||
> > > HeapTupleHeaderXminFrozen(tuple));
> > > - if (TransactionIdIsNormal(xid))
> > > + if (!xmin_frozen && TransactionIdIsNormal(xid))
>
> > I don't think that's necesary - HeapTupleHeaderGetXmin() returns
> > FrozenTransactionId if the tuple is frozen (note the
> > HeapTupleHeaderXminFrozen() within).
>
> Ah, yeah ... I probably thought about this when writing it and removed
> it for that reason.
>
> BTW I think the definition of HeapTupleHeaderXminFrozen is seriously
> confusing, by failing to return true if the xmin is numerically
> FrozenXid (which it'll be if the database was pg_upgraded). I wonder
> about this one in HeapTupleSatisfiesMVCC:
I suggest raising this on -hackers. I agree that it's unfortunate.
Greetings,
Andres Freund