Chapman Flack <c...@anastigmatix.net> writes: > On 04/10/2018 10:17 PM, Jan Wieck wrote: >> If your session has a transaction snapshot that protects the old toast >> slices from being vacuumed away, you are fine.
> That harks back to my earlier (naïve?) thought that, as long as > my lazy datum doesn't have to outlive the transaction, lazy > detoasting might Just Work. > Tom seems to say otherwise, in > https://www.postgresql.org/message-id/23711.1522559987%40sss.pgh.pa.us > The message of the commit he mentions there includes: > I believe this code was all right when written, because our > management of a session's exposed xmin was such that the TOAST > references were safe until end of transaction. But that's > no longer true now that we can advance or clear our PGXACT.xmin > intra-transaction. > So perhaps my original thought really would have Just Worked, > in PG versions before that changed? When did that change, btw? When snapmgr.c came in, which seems to have been 8.4. The core of the problem now is that in a READ COMMITTED transaction, we may not be holding any snapshot at all between statements. So if you're hanging onto a toast pointer across statements you're at risk. On the other hand, it's also arguable that you shouldn't be interested in dereferencing such a pointer later than the statement in which it was read, precisely because it no longer represents accessible data. So maybe we need to take two steps back and talk about the semantics of what you're doing. regards, tom lane