On Tue, Jun 6, 2017 at 11:54 PM, Robert Haas <robertmh...@gmail.com> wrote: > On Mon, Jun 5, 2017 at 2:51 AM, Amit Kapila <amit.kapil...@gmail.com> wrote: >>> Greg/Amit's idea of using the CTID field rather than an infomask bit >>> seems like a possibly promising approach. Not everything that needs >>> bit-space can use the CTID field, so using it is a little less likely >>> to conflict with something else we want to do in the future than using >>> a precious infomask bit. However, I'm worried about this: >>> >>> /* Make sure there is no forward chain link in t_ctid */ >>> tp.t_data->t_ctid = tp.t_self; >>> >>> The comment does not say *why* we need to make sure that there is no >>> forward chain link, but it implies that some code somewhere in the >>> system does or at one time did depend on no forward link existing. >> >> I think it is to ensure that EvalPlanQual mechanism gets invoked in >> the right case. The visibility routine will return HeapTupleUpdated >> both when the tuple is deleted or updated (updated - has a newer >> version of the tuple), so we use ctid to decide if we need to follow >> the tuple chain for a newer version of the tuple. > > That would explain why need to make sure that there *is* a forward > chain link in t_ctid for an update, but it doesn't explain why we need > to make sure that there *isn't* a forward link for delete. >
As far as I understand, it is to ensure that for deleted rows, nothing more needs to be done. For example, see the below check in ExecUpdate/ExecDelete. if (!ItemPointerEquals(tupleid, &hufd.ctid)) { .. } .. Also a similar check in ExecLockRows. Now for deleted rows, if the t_ctid wouldn't point to itself, then in the mentioned functions, we were not in a position to conclude that the row is deleted. -- With Regards, Amit Kapila. EnterpriseDB: http://www.enterprisedb.com -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers