On 09/20/2018 09:04 AM, Tomas Vondra wrote:


On 09/19/2018 10:35 PM, Andrew Dunstan wrote:


On 09/18/2018 03:36 PM, Andrew Dunstan wrote:


Tomas Vondra has pointed out to me that there's an issue with triggers not getting expanded tuples for columns with fast defaults. Here is an example that shows the issue:


   andrew=# create table blurfl (id int);
   CREATE TABLE
   andrew=# insert into blurfl select x from generate_series(1,5) x;
   INSERT 0 5
   andrew=# alter table blurfl add column x int default 100;
   ALTER TABLE
   andrew=# create or replace function showmej() returns trigger
   language plpgsql as $$ declare j json; begin j := to_json(old);
   raise notice 'old x: %', j->>'x'; return new; end; $$;
   CREATE FUNCTION
   andrew=# create trigger show_x before update on blurfl for each row
   execute procedure showmej();
   CREATE TRIGGER
   andrew=# update blurfl set id = id where id = 1;
   NOTICE:  old x: <NULL>
   UPDATE 1
   andrew=# update blurfl set id = id where id = 1;
   NOTICE:  old x: 100
   UPDATE 1
   andrew=#


The error is fixed with this patch:


   diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
   index 2436692..f34a72a 100644
   --- a/src/backend/commands/trigger.c
   +++ b/src/backend/commands/trigger.c
   @@ -3396,7 +3396,11 @@ ltrmark:;
            LockBuffer(buffer, BUFFER_LOCK_UNLOCK);
        }
        -   result = heap_copytuple(&tuple);
   +   if (HeapTupleHeaderGetNatts(tuple.t_data) < relation->rd_att->natts)
   +       result = heap_expand_tuple(&tuple, relation->rd_att);
   +   else
   +       result = heap_copytuple(&tuple);
   +
        ReleaseBuffer(buffer);
             return result;

I'm going to re-check the various places that this might have been missed. I guess it belongs on the open items list.






I haven't found anything further that is misbehaving. I paid particular attention to indexes and index-only scans.

I propose to commit this along with an appropriate regression test.


Seems reasonable to me.



This exposed a further issue with nulls in certain positions. A fix for both issues, and some regression tests, has been committed.

Thanks to Tomas for his help.

cheers

andrew

--
Andrew Dunstan                https://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services


Reply via email to