version 8.3.0 in function plpgsql_exec_trigger.
in a trigger, if NEW is returned as the result and we do nothing to NEW.
for example, we have a table like this:
create table test (a int);
insert into test values(1);
and a trigger like:
create or replace function test_trigger() returns trigger as $$
end; $$language plpgsql;
create trigger before_update_test before update
on test for each row execute procedure test_trigger();
in this trigger, we don't change the value of NEW.
update test set a = 3;
/* Copy tuple to upper executor memory */
rettup = SPI_copytuple((HeapTuple) (estate.retval));
we come to function ExecUpdate():
newtuple = ExecBRUpdateTriggers(estate, resultRelInfo,
Since the trigger's return value is copied to another memory address, the newtuple is impossible equal to the oldtuple.
so the following condition:
if (newtuple != tuple) /* modified by Trigger(s) */
is FALSE for ever.
I think we can add some judgment conditions in function plpgsql_exec_trigger() to avoid this problem.