On Fri, Sep 29, 2023 at 11:04 AM Peter Geoghegan <p...@bowt.ie> wrote: > > But when a HOT update happens the entry in an (logically unchanged) > > index still points to the original heap tid, and that line item is > > updated with a pointer to the new line pointer in the same page. > > It's true that the original root heap tuple (which is never a > heap-only tuple) must have its line pointer changed from LP_NORMAL to > LP_REDIRECT the first time pruning takes place that affects its HOT > chain. But I don't think that referring to the root item as something > along the lines of "an obsolescent/old tuple's line pointer" is > particularly helpful.
To be clear, the existing wording seems correct to me. Even heap-only tuples require line pointers. These line pointers are strictly guaranteed to never be *directly* referenced from indexes (if they are then we'll actually detect it and report data corruption on recent versions). The name "heap-only tuple" quite literally means that the tuple and its line pointer are only represented in the heap, and never in indexes. There is a related rule about what is allowed to happen to any heap-only tuple's line pointer: it can only change from LP_NORMAL to LP_UNUSED (never LP_DEAD or LP_REDIRECT). You can think of a heap-only tuple as "skipping the LP_DEAD step" that regular heap tuples must go through. We don't need LP_DEAD tombstones precisely because there cannot possibly be any references to heap-only tuples in indexes -- so we can't break index scans by going straight from LP_NORMAL to LP_UNUSED for heap-only tuple line pointers. -- Peter Geoghegan