On 22/01/17 18:50, Thom Brown wrote: > Hi, > > There's an issue which I haven't seen documented as expected > behaviour, where replicating data to a table which has a foreign key > results in a replication failure. This produces the following log > entries: > > LOG: starting logical replication worker for subscription "contacts_sub" > LOG: logical replication apply for subscription "contacts_sub" has started > ERROR: AfterTriggerSaveEvent() called outside of query > LOG: worker process: logical replication worker for subscription > 16408 (PID 19201) exited with exit code 1 > >
Hi, thanks for report. Looks like I missed AfterTriggerBeginQuery/AfterTriggerEndQuery when moving the executor stuff around. Attached should fix it. -- Petr Jelinek http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
From b6d5a1830da5412520cb50287ee71ea312f689d6 Mon Sep 17 00:00:00 2001 From: Petr Jelinek <pjmodos@pjmodos.net> Date: Sun, 22 Jan 2017 23:16:57 +0100 Subject: [PATCH] Fix after trigger execution in logical replication --- src/backend/replication/logical/worker.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 7d86736..6229bef 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -176,6 +176,9 @@ create_estate_for_relation(LogicalRepRelMapEntry *rel) if (resultRelInfo->ri_TrigDesc) estate->es_trig_tuple_slot = ExecInitExtraTupleSlot(estate); + /* Prepare to catch AFTER triggers. */ + AfterTriggerBeginQuery(); + return estate; } @@ -536,6 +539,10 @@ apply_handle_insert(StringInfo s) /* Cleanup. */ ExecCloseIndices(estate->es_result_relation_info); PopActiveSnapshot(); + + /* Handle queued AFTER triggers. */ + AfterTriggerEndQuery(estate); + ExecResetTupleTable(estate->es_tupleTable, false); FreeExecutorState(estate); @@ -676,6 +683,10 @@ apply_handle_update(StringInfo s) /* Cleanup. */ ExecCloseIndices(estate->es_result_relation_info); PopActiveSnapshot(); + + /* Handle queued AFTER triggers. */ + AfterTriggerEndQuery(estate); + EvalPlanQualEnd(&epqstate); ExecResetTupleTable(estate->es_tupleTable, false); FreeExecutorState(estate); @@ -763,6 +774,10 @@ apply_handle_delete(StringInfo s) /* Cleanup. */ ExecCloseIndices(estate->es_result_relation_info); PopActiveSnapshot(); + + /* Handle queued AFTER triggers. */ + AfterTriggerEndQuery(estate); + EvalPlanQualEnd(&epqstate); ExecResetTupleTable(estate->es_tupleTable, false); FreeExecutorState(estate); -- 2.7.4
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers