mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Avoid some table rewrites for ALTER TABLE .. SET DATA TYPE timestamp.
When the timezone is UTC, timestamptz and timestamp are binary coercible in both directions. Seeb8a18ad485
andc22ecc6562
for the previous attempt in this problem space. Skip the table rewrite; for now, continue to needlessly rewrite any index on an affected column. Reviewed by Simon Riggs and Tom Lane. Discussion: https://postgr.es/m/20190226061450.GA1665944@rfd.leadboat.com
This commit is contained in:
@ -435,7 +435,7 @@ END;
|
||||
$$;
|
||||
create event trigger no_rewrite_allowed on table_rewrite
|
||||
execute procedure test_evtrig_no_rewrite();
|
||||
create table rewriteme (id serial primary key, foo float);
|
||||
create table rewriteme (id serial primary key, foo float, bar timestamptz);
|
||||
insert into rewriteme
|
||||
select x * 1.001 from generate_series(1, 500) as t(x);
|
||||
alter table rewriteme alter column foo type numeric;
|
||||
@ -458,6 +458,15 @@ alter table rewriteme
|
||||
NOTICE: Table 'rewriteme' is being rewritten (reason = 4)
|
||||
-- shouldn't trigger a table_rewrite event
|
||||
alter table rewriteme alter column foo type numeric(12,4);
|
||||
begin;
|
||||
set timezone to 'UTC';
|
||||
alter table rewriteme alter column bar type timestamp;
|
||||
set timezone to '0';
|
||||
alter table rewriteme alter column bar type timestamptz;
|
||||
set timezone to 'Europe/London';
|
||||
alter table rewriteme alter column bar type timestamp; -- does rewrite
|
||||
NOTICE: Table 'rewriteme' is being rewritten (reason = 4)
|
||||
rollback;
|
||||
-- typed tables are rewritten when their type changes. Don't emit table
|
||||
-- name, because firing order is not stable.
|
||||
CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
|
||||
|
@ -329,7 +329,7 @@ $$;
|
||||
create event trigger no_rewrite_allowed on table_rewrite
|
||||
execute procedure test_evtrig_no_rewrite();
|
||||
|
||||
create table rewriteme (id serial primary key, foo float);
|
||||
create table rewriteme (id serial primary key, foo float, bar timestamptz);
|
||||
insert into rewriteme
|
||||
select x * 1.001 from generate_series(1, 500) as t(x);
|
||||
alter table rewriteme alter column foo type numeric;
|
||||
@ -352,6 +352,14 @@ alter table rewriteme
|
||||
|
||||
-- shouldn't trigger a table_rewrite event
|
||||
alter table rewriteme alter column foo type numeric(12,4);
|
||||
begin;
|
||||
set timezone to 'UTC';
|
||||
alter table rewriteme alter column bar type timestamp;
|
||||
set timezone to '0';
|
||||
alter table rewriteme alter column bar type timestamptz;
|
||||
set timezone to 'Europe/London';
|
||||
alter table rewriteme alter column bar type timestamp; -- does rewrite
|
||||
rollback;
|
||||
|
||||
-- typed tables are rewritten when their type changes. Don't emit table
|
||||
-- name, because firing order is not stable.
|
||||
|
Reference in New Issue
Block a user