Hi,

When I read function "EvalPlanQual", I found the following code:

  if (heap_fetch(relation, &SnapshotDirty, &tuple, &buffer, true, NULL))
  {
   /*
    * If xmin isn't what we're expecting, the slot must have been
    * recycled and reused for an unrelated tuple. This implies that
    * the latest version of the row was deleted, so we need do
    * nothing.  (Should be safe to examine xmin without getting
    * buffer's content lock, since xmin never changes in an existing
    * tuple.)
    */
   if (!TransactionIdEquals(HeapTupleHeaderGetXmin(tuple.t_data),
          priorXmax))
   {
    ReleaseBuffer(buffer);
    return NULL;
   }

AFAICS, when Vacuum decides to reclaim any version V of a tuple T, there 
must be none concurrent transactions that are accessing or will access any 
versions before V, because HeapTupleSatisfiesVacuum ensures this.

If I'm right, then my doubt is: how can the branch "if 
(!TransactionIdEquals(HeapTupleHeaderGetXmin(tuple.t_data), priorXmax))" 
happen? Is this a dead branch?

If not, can anyone give an example to explain how does this happen?

Thanks a lot.




-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to