@ -2440,48 +2440,89 @@ drop table at_base_table;
-- a column requiring a default (bug #16038)
-- a column requiring a default (bug #16038)
-- ensure that rewrites aren't silently optimized away, removing the
-- ensure that rewrites aren't silently optimized away, removing the
-- value of the test
-- value of the test
CREATE OR REPLACE FUNCTION evtrig_rewrite_log() RETURNS event_trigger
CREATE FUNCTION check_ddl_rewrite(p_tablename regclass, p_ddl text)
RETURNS boolean
LANGUAGE plpgsql AS $$
LANGUAGE plpgsql AS $$
DECLARE
v_relfilenode oid;
BEGIN
BEGIN
RAISE WARNING 'rewriting table %',
v_relfilenode := relfilenode FROM pg_class WHERE oid = p_tablename;
pg_event_trigger_table_rewrite_oid()::regclass;
EXECUTE p_ddl;
RETURN v_relfilenode <> (SELECT relfilenode FROM pg_class WHERE oid = p_tablename);
END;
END;
$$;
$$;
CREATE EVENT TRIGGER evtrig_rewrite_log ON table_rewrite
EXECUTE PROCEDURE evtrig_rewrite_log();
CREATE TABLE rewrite_test(col text);
CREATE TABLE rewrite_test(col text);
INSERT INTO rewrite_test VALUES ('something');
INSERT INTO rewrite_test VALUES ('something');
INSERT INTO rewrite_test VALUES (NULL);
INSERT INTO rewrite_test VALUES (NULL);
-- empty[12] doesn't need rewrite, but notempty[12]_rewrite will force one
-- empty[12] don't need rewrite, but notempty[12]_rewrite will force one
ALTER TABLE rewrite_test
SELECT check_ddl_rewrite('rewrite_test', $$
ADD COLUMN empty1 text,
ALTER TABLE rewrite_test
ADD COLUMN notempty1_rewrite serial;
ADD COLUMN empty1 text,
WARNING: rewriting table rewrite_test
ADD COLUMN notempty1_rewrite serial;
ALTER TABLE rewrite_test
$$);
ADD COLUMN notempty2_rewrite serial,
check_ddl_rewrite
ADD COLUMN empty2 text;
-------------------
WARNING: rewriting table rewrite_test
t
(1 row)
SELECT check_ddl_rewrite('rewrite_test', $$
ALTER TABLE rewrite_test
ADD COLUMN notempty2_rewrite serial,
ADD COLUMN empty2 text;
$$);
check_ddl_rewrite
-------------------
t
(1 row)
-- also check that fast defaults cause no problem, first without rewrite
-- also check that fast defaults cause no problem, first without rewrite
ALTER TABLE rewrite_test
SELECT check_ddl_rewrite('rewrite_test', $$
ADD COLUMN empty3 text,
ALTER TABLE rewrite_test
ADD COLUMN notempty3_norewrite int default 42;
ADD COLUMN empty3 text,
ALTER TABLE rewrite_test
ADD COLUMN notempty3_norewrite int default 42;
ADD COLUMN notempty4_norewrite int default 42,
$$);
ADD COLUMN empty4 text;
check_ddl_rewrite
-------------------
f
(1 row)
SELECT check_ddl_rewrite('rewrite_test', $$
ALTER TABLE rewrite_test
ADD COLUMN notempty4_norewrite int default 42,
ADD COLUMN empty4 text;
$$);
check_ddl_rewrite
-------------------
f
(1 row)
-- then with rewrite
-- then with rewrite
ALTER TABLE rewrite_test
SELECT check_ddl_rewrite('rewrite_test', $$
ADD COLUMN empty5 text,
ALTER TABLE rewrite_test
ADD COLUMN notempty5_norewrite int default 42,
ADD COLUMN empty5 text,
ADD COLUMN notempty5_rewrite serial;
ADD COLUMN notempty5_norewrite int default 42,
WARNING: rewriting table rewrite_test
ADD COLUMN notempty5_rewrite serial;
ALTER TABLE rewrite_test
$$);
ADD COLUMN notempty6_rewrite serial,
check_ddl_rewrite
ADD COLUMN empty6 text,
-------------------
ADD COLUMN notempty6_norewrite int default 42;
t
WARNING: rewriting table rewrite_test
(1 row)
SELECT check_ddl_rewrite('rewrite_test', $$
ALTER TABLE rewrite_test
ADD COLUMN notempty6_rewrite serial,
ADD COLUMN empty6 text,
ADD COLUMN notempty6_norewrite int default 42;
$$);
check_ddl_rewrite
-------------------
t
(1 row)
-- cleanup
-- cleanup
drop event trigger evtrig_rewrite_log;
DROP FUNCTION check_ddl_rewrite(regclass, text);
drop function evtrig_rewrite_log();
DROP TABLE rewrite_test;
DROP TABLE rewrite_test;
--
--
-- lock levels
-- lock levels