Doubts about EvalPlanQual - Mailing list pgsql-hackers

From Jacky Leng
Subject Doubts about EvalPlanQual
Date
Msg-id gniqee$18cb$1@news.hub.org
Whole thread Raw
Responses Re: Doubts about EvalPlanQual  (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>)
List pgsql-hackers
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,
theslot must have been   * recycled and reused for an unrelated tuple. This implies that   * the latest version of the
rowwas deleted, so we need do   * nothing.  (Should be safe to examine xmin without getting   * buffer's content lock,
sincexmin 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.





pgsql-hackers by date:

Previous
From: Pavel Stehule
Date:
Subject: Re: WIP: hooking parser
Next
From: Heikki Linnakangas
Date:
Subject: Re: Doubts about EvalPlanQual