Hi pghackers:

        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
[EMAIL PROTECTED]
          2008-06-11




-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to