why copy tuple in the end of trigger when nothing changed in NEW OLD record variable

From: "billy" <billywq(at)163(dot)com>
To: pgsql-hackers(at)postgresql(dot)org <pgsql-hackers(at)postgresql(dot)org>
Subject: why copy tuple in the end of trigger when nothing changed in NEW OLD record variable
Date: 2008-06-11 01:30:45
Message-ID: 484F2E6E.044100.04501@m12-15.163.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

pgsql-hackers,hello:

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 $$
begin
return new;
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.

than execute:

update test set a = 3;

after execution:

/* Copy tuple to upper executor memory */
rettup = SPI_copytuple((HeapTuple) (estate.retval));

we come to function ExecUpdate():

HeapTuple newtuple;
newtuple = ExecBRUpdateTriggers(estate, resultRelInfo,
tupleid, tuple);

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.

        billy
        billywq(at)163(dot)com
          2008-06-11

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2008-06-11 01:41:47 Re: Proposal - improve eqsel estimates by including histogram bucket numdistinct statistics
Previous Message ITAGAKI Takahiro 2008-06-11 01:11:07 Re: Core team statement on replication in PostgreSQL