From: Heikki Linnakangas Date: Mon, 13 Feb 2012 08:14:49 +0000 (+0200) Subject: Fix heap_multi_insert to set t_self field in the caller's tuples. X-Git-Tag: REL9_2_BETA1~433 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21b16342750d6623f3c78f639f07bf3b66b49417;p=postgresql Fix heap_multi_insert to set t_self field in the caller's tuples. If tuples were toasted, heap_multi_insert didn't update the ctid on the original tuples. This caused a failure if there was an after trigger (including a foreign key), on the table, and a tuple got toasted. Per off-list report and test case from Ted Phelps --- diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 99a431a95f..c910863e27 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -2291,6 +2291,14 @@ heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples, CacheInvalidateHeapTuple(relation, heaptuples[i], NULL); } + /* + * Copy t_self fields back to the caller's original tuples. This does + * nothing for untoasted tuples (tuples[i] == heaptuples[i)], but it's + * probably faster to always copy than check. + */ + for (i = 0; i < ntuples; i++) + tuples[i]->t_self = heaptuples[i]->t_self; + pgstat_count_heap_insert(relation, ntuples); }