]> granicus.if.org Git - postgresql/commitdiff
Fix COPY's handling of transition tables with indexes.
authorAndrew Gierth <rhodiumtoad@postgresql.org>
Mon, 10 Jul 2017 10:40:08 +0000 (11:40 +0100)
committerAndrew Gierth <rhodiumtoad@postgresql.org>
Mon, 10 Jul 2017 10:40:08 +0000 (11:40 +0100)
Commit c46c0e5202e8cfe750c6629db7852fdb15d528f3 failed to pass the
TransitionCaptureState object to ExecARInsertTriggers() in the case
where it's using heap_multi_insert and there are indexes.  Repair.

Thomas Munro, from a report by David Fetter
Discussion: https://postgr.es/m/20170708084213.GA14720%40fetter.org

src/backend/commands/copy.c
src/test/regress/expected/triggers.out
src/test/regress/sql/triggers.sql

index f391828e74fe44ce020b3e50c3b3fbbf43139377..fc5f4f66ead1ff92bec1d01f6a66a4c28875dd46 100644 (file)
@@ -2915,7 +2915,7 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
                                                                          estate, false, NULL, NIL);
                        ExecARInsertTriggers(estate, resultRelInfo,
                                                                 bufferedTuples[i],
-                                                                recheckIndexes, NULL);
+                                                                recheckIndexes, cstate->transition_capture);
                        list_free(recheckIndexes);
                }
        }
index aaee30219ad2d710d09eccf13449944fa32b622e..ac132b042d598f104fda067835d1bd706800f595 100644 (file)
@@ -2156,6 +2156,11 @@ NOTICE:  trigger = child3_delete_trig, old table = (CCC,42,foo)
 -- are really inserted into the parent)
 copy parent (a, b) from stdin;
 NOTICE:  trigger = parent_insert_trig, new table = (AAA,42), (BBB,42), (CCC,42)
+-- same behavior for copy if there is an index (interesting because rows are
+-- captured by a different code path in copy.c if there are indexes)
+create index on parent(b);
+copy parent (a, b) from stdin;
+NOTICE:  trigger = parent_insert_trig, new table = (DDD,42)
 -- DML affecting parent sees tuples collected from children even if
 -- there is no transition table trigger on the children
 drop trigger child1_insert_trig on child1;
@@ -2168,7 +2173,7 @@ drop trigger child3_insert_trig on child3;
 drop trigger child3_update_trig on child3;
 drop trigger child3_delete_trig on child3;
 delete from parent;
-NOTICE:  trigger = parent_delete_trig, old table = (AAA,42), (BBB,42), (CCC,42)
+NOTICE:  trigger = parent_delete_trig, old table = (AAA,42), (BBB,42), (CCC,42), (DDD,42)
 drop table child1, child2, child3, parent;
 --
 -- Verify prohibition of row triggers with transition triggers on
index 659a5a1422bcd0914b59926a6887f190e6500c69..b10159a1cf2a3938ea9c51c0259b30ffcb1f721b 100644 (file)
@@ -1661,6 +1661,13 @@ BBB      42
 CCC    42
 \.
 
+-- same behavior for copy if there is an index (interesting because rows are
+-- captured by a different code path in copy.c if there are indexes)
+create index on parent(b);
+copy parent (a, b) from stdin;
+DDD    42
+\.
+
 -- DML affecting parent sees tuples collected from children even if
 -- there is no transition table trigger on the children
 drop trigger child1_insert_trig on child1;