diff options
author | Etsuro Fujita <efujita@postgresql.org> | 2019-12-10 18:00:30 +0900 |
---|---|---|
committer | Etsuro Fujita <efujita@postgresql.org> | 2019-12-10 18:00:30 +0900 |
commit | 5a20b0219e7684788a1b63e812dd44b31361b259 (patch) | |
tree | e4bde3390e3ee82a90a5cf19f748aeec8be2506e /doc/src | |
parent | 28e6a2fd6358c1b75ce2f4e7cb3fcff979dbe539 (diff) | |
download | postgresql-5a20b0219e7684788a1b63e812dd44b31361b259.tar.gz postgresql-5a20b0219e7684788a1b63e812dd44b31361b259.zip |
Fix handling of multiple AFTER ROW triggers on a foreign table.
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 ff11e7f4b 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
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/trigger.sgml | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml index f62f420c192..ba94acad696 100644 --- a/doc/src/sgml/trigger.sgml +++ b/doc/src/sgml/trigger.sgml @@ -511,8 +511,8 @@ typedef struct TriggerData HeapTuple tg_trigtuple; HeapTuple tg_newtuple; Trigger *tg_trigger; - Buffer tg_trigtuplebuf; - Buffer tg_newtuplebuf; + TupleTableSlot *tg_trigslot; + TupleTableSlot *tg_newslot; Tuplestorestate *tg_oldtable; Tuplestorestate *tg_newtable; } TriggerData; @@ -714,21 +714,21 @@ typedef struct Trigger </varlistentry> <varlistentry> - <term><structfield>tg_trigtuplebuf</structfield></term> + <term><structfield>tg_trigslot</structfield></term> <listitem> <para> - The buffer containing <structfield>tg_trigtuple</structfield>, or <symbol>InvalidBuffer</symbol> if there - is no such tuple or it is not stored in a disk buffer. + The slot containing <structfield>tg_trigtuple</structfield>, + or a <symbol>NULL</symbol> pointer if there is no such tuple. </para> </listitem> </varlistentry> <varlistentry> - <term><structfield>tg_newtuplebuf</structfield></term> + <term><structfield>tg_newslot</structfield></term> <listitem> <para> - The buffer containing <structfield>tg_newtuple</structfield>, or <symbol>InvalidBuffer</symbol> if there - is no such tuple or it is not stored in a disk buffer. + The slot containing <structfield>tg_newtuple</structfield>, + or a <symbol>NULL</symbol> pointer if there is no such tuple. </para> </listitem> </varlistentry> |