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

Поиск
Список
Период
Сортировка
От billy
Тема why copy tuple in the end of trigger when nothing changed in NEW OLD record variable
Дата
Msg-id 484F2E6E.044100.04501@m12-15.163.com
обсуждение исходный текст
Список 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 по дате отправления:

Предыдущее
От: Gregory Stark
Дата:
Сообщение: Re: Proposal - improve eqsel estimates by including histogram bucket numdistinct statistics
Следующее
От: "Merlin Moncure"
Дата:
Сообщение: Re: math error or rounding problem Money type