diff options
author | Andrew Gierth <rhodiumtoad@postgresql.org> | 2017-06-28 18:59:01 +0100 |
---|---|---|
committer | Andrew Gierth <rhodiumtoad@postgresql.org> | 2017-06-28 18:59:01 +0100 |
commit | c46c0e5202e8cfe750c6629db7852fdb15d528f3 (patch) | |
tree | 710f0377e15e9ddad018d53fbd09aade535136d6 /src/backend/executor | |
parent | 501ed02cf6f4f60c3357775eb07578aebc912d3a (diff) | |
download | postgresql-c46c0e5202e8cfe750c6629db7852fdb15d528f3.tar.gz postgresql-c46c0e5202e8cfe750c6629db7852fdb15d528f3.zip |
Fix transition tables for wCTEs.
The original coding didn't handle this case properly; each separate
DML substatement needs its own set of transitions.
Patch by Thomas Munro
Discussion: https://postgr.es/m/CAL9smLCDQ%3D2o024rBgtD4WihzX8B3C6u_oSQ2K3%2BR5grJrV0bg%40mail.gmail.com
Diffstat (limited to 'src/backend/executor')
-rw-r--r-- | src/backend/executor/execReplication.c | 6 | ||||
-rw-r--r-- | src/backend/executor/nodeModifyTable.c | 16 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 36960eaa7e8..bc53d07c7db 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -419,6 +419,12 @@ ExecSimpleRelationInsert(EState *estate, TupleTableSlot *slot) ExecARInsertTriggers(estate, resultRelInfo, tuple, recheckIndexes, NULL); + /* + * XXX we should in theory pass a TransitionCaptureState object to the + * above to capture transition tuples, but after statement triggers + * don't actually get fired by replication yet anyway + */ + list_free(recheckIndexes); } } diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index f2534f20622..8d17425abea 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1442,14 +1442,18 @@ fireASTriggers(ModifyTableState *node) case CMD_INSERT: if (node->mt_onconflict == ONCONFLICT_UPDATE) ExecASUpdateTriggers(node->ps.state, - resultRelInfo); - ExecASInsertTriggers(node->ps.state, resultRelInfo); + resultRelInfo, + node->mt_transition_capture); + ExecASInsertTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); break; case CMD_UPDATE: - ExecASUpdateTriggers(node->ps.state, resultRelInfo); + ExecASUpdateTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); break; case CMD_DELETE: - ExecASDeleteTriggers(node->ps.state, resultRelInfo); + ExecASDeleteTriggers(node->ps.state, resultRelInfo, + node->mt_transition_capture); break; default: elog(ERROR, "unknown operation"); @@ -2304,6 +2308,10 @@ ExecEndModifyTable(ModifyTableState *node) { int i; + /* Free transition tables */ + if (node->mt_transition_capture != NULL) + DestroyTransitionCaptureState(node->mt_transition_capture); + /* * Allow any FDWs to shut down */ |