While re-reading heap_update() in connection with that PANIC we're chasing, my attention was drawn to this comment:
/* * Note: beyond this point, use oldtup not otid to refer to old tuple. * otid may very well point at newtup->t_self, which we will overwrite * with the new tuple's location, so there's great risk of confusion if we * use otid anymore. */ This seemingly sage advice is being ignored in one place: CheckForSerializableConflictIn(relation, otid, BufferGetBlockNumber(buffer)); I wonder whether that's a mistake. There'd be only a low probability of our detecting it through testing, I fear. regards, tom lane