fast default vs triggers
От | Andrew Dunstan |
---|---|
Тема | fast default vs triggers |
Дата | |
Msg-id | 224e4807-395d-9fc5-2934-d5f85130f1f0@2ndQuadrant.com обсуждение исходный текст |
Ответы |
Re: fast default vs triggers
|
Список | pgsql-hackers |
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. cheers andrew -- Andrew Dunstan https://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
В списке pgsql-hackers по дате отправления: