• Etsuro Fujita's avatar
    Fix handling of multiple AFTER ROW triggers on a foreign table. · 5a20b021
    Etsuro Fujita authored
    AfterTriggerExecute() retrieves a fresh tuple or pair of tuples from a
    tuplestore and then stores the tuple(s) in the passed-in slot(s) if
    AFTER_TRIGGER_FDW_FETCH, while it uses the most-recently-retrieved
    tuple(s) stored in the slot(s) if AFTER_TRIGGER_FDW_REUSE.  This was
    done correctly before 12, but commit ff11e7f4 broke it by mistakenly
    clearing the tuple(s) stored in the slot(s) in that function, leading to
    an assertion failure as reported in bug #16139 from Alexander Lakhin.
    
    Also, fix some other issues with the aforementioned commit in passing:
    
    * For tg_newslot, which is a slot added to the TriggerData struct by the
      commit to store new updated tuples, it didn't ensure the slot was NULL
      if there was no such tuple.
    * The commit failed to update the documentation about the trigger
      interface.
    
    Author: Etsuro Fujita
    Backpatch-through: 12
    Discussion: https://postgr.es/m/16139-94f9ccf0db6119ec%40postgresql.org
    5a20b021
postgres_fdw.sql 106 KB