From: | Tomas Vondra <tomas(dot)vondra(at)2ndquadrant(dot)com> |
---|---|
To: | Andrew Dunstan <andrew(dot)dunstan(at)2ndquadrant(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: fast default vs triggers |
Date: | 2018-09-20 13:04:57 |
Message-ID: | 707763bd-28c1-3153-57c5-6cfab2999126@2ndquadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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.
regards
--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Stephen Frost | 2018-09-20 13:07:21 | Re: Query is over 2x slower with jit=on |
Previous Message | Alexander Korotkov | 2018-09-20 12:52:51 | Re: [HACKERS] Bug in to_timestamp(). |