why copy tuple in the end of trigger when nothing changed in NEW OLD record variable - Mailing list pgsql-hackers

From billy
Subject why copy tuple in the end of trigger when nothing changed in NEW OLD record variable
Date
Msg-id 484F2E6E.044100.04501@m12-15.163.com
Whole thread Raw
List 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@163.com
          2008-06-11





pgsql-hackers by date:

Previous
From: Gregory Stark
Date:
Subject: Re: Proposal - improve eqsel estimates by including histogram bucket numdistinct statistics
Next
From: "Merlin Moncure"
Date:
Subject: Re: math error or rounding problem Money type