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