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

Поиск
Список
Период
Сортировка
От 汪琦
Тема why copy tuple in the end of trigger when nothing changed in NEW, OLD record variable
Дата
Msg-id 484E4E80.048232.25430@m5-81.163.com
обсуждение исходный текст
Список pgsql-hackers
hello, everyone: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.


        billywq@163.com
          2008-06-10





В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Dave Page"
Дата:
Сообщение: Timezone abbreviations - out but not in?
Следующее
От: "Merlin Moncure"
Дата:
Сообщение: Re: libpq support for arrays and composites