I wrote: > Yeah, it's on my to-do list for this CF, but I expect it's going to > take some concentrated study and other things keep intruding :-(.
I've started to look at this seriously, and I wanted to make a note about something that I think we should try to do, but there seems little hope of shoehorning it in for v14. That "something" is that ideally, the ModifyTable node should pass only the updated column values to the table AM or FDW, and let that lower-level code worry about reconstructing a full tuple by re-fetching the unmodified columns. When I first proposed this concept, I'd imagined that maybe we could avoid the additional tuple read that this implementation requires by combining it with the tuple access that a heap UPDATE must do anyway to lock and outdate the target tuple. Another example of a possible win is Andres' comment upthread that a columnar-storage AM would really rather deal only with the modified columns. Also, the patch as it stands asks FDWs to supply all columns in a whole-row junk var, which is something that might become unnecessary. However, there are big stumbling blocks in the way. ModifyTable is responsible for applying CHECK constraints, which may require looking at the values of not-modified columns. An even bigger problem is that per-row triggers currently expect to be given the whole proposed row (and to be able to change columns not already marked for update). We could imagine redefining the trigger APIs to reduce the overhead here, but that's certainly not going to happen in time for v14. So for now I think we have to stick with Amit's design of reconstructing the full updated tuple at the outset in ModifyTable, and then proceeding pretty much as updates have done in the past. But there's more we can do later. regards, tom lane