mirror of https://github.com/citusdata/citus.git
244 lines
10 KiB
Plaintext
244 lines
10 KiB
Plaintext
--
|
|
-- UPGRADE_DISTRIBUTED_TRIGGERS_AFTER
|
|
--
|
|
-- In PG15, Renaming triggers on partitioned tables
|
|
-- recurses to renaming the triggers on the partitions as well.
|
|
-- Relevant PG commit:
|
|
-- 80ba4bb383538a2ee846fece6a7b8da9518b6866
|
|
--
|
|
-- this test is relevant only for pg14-15 upgrade
|
|
--
|
|
SHOW server_version \gset
|
|
SELECT substring(:'server_version', '\d+')::int = 15 AND EXISTS (SELECT * FROM pg_namespace WHERE nspname = 'upgrade_distributed_triggers') AS is_14_15_pg_upgrade
|
|
\gset
|
|
\if :is_14_15_pg_upgrade
|
|
\else
|
|
\q
|
|
\endif
|
|
SET search_path TO upgrade_distributed_triggers, public;
|
|
SET citus.shard_count TO 4;
|
|
SET citus.enable_unsafe_triggers TO true;
|
|
SELECT run_command_on_workers('ALTER SYSTEM SET citus.enable_unsafe_triggers TO true;');
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,"ALTER SYSTEM")
|
|
(localhost,10202,t,"ALTER SYSTEM")
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers('SELECT pg_reload_conf();');
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,t)
|
|
(localhost,10202,t,t)
|
|
(2 rows)
|
|
|
|
-- after PG15 upgrade, all child triggers have the same name with the parent triggers
|
|
-- check that the workers are also updated
|
|
SELECT * FROM sale_triggers ORDER BY 1, 2;
|
|
tgname | tgrelid | tgenabled
|
|
---------------------------------------------------------------------
|
|
another_renamed_trigger | sale | O
|
|
another_renamed_trigger | sale_newyork | O
|
|
another_renamed_trigger | sale_california | O
|
|
not_renamed_trigger | sale | O
|
|
not_renamed_trigger | sale_newyork | O
|
|
not_renamed_trigger | sale_california | O
|
|
renamed_record_sale_trigger | sale | O
|
|
renamed_record_sale_trigger | sale_newyork | O
|
|
renamed_record_sale_trigger | sale_california | O
|
|
truncate_trigger_xxxxxxx | sale | O
|
|
truncate_trigger_xxxxxxx | sale_newyork | O
|
|
truncate_trigger_xxxxxxx | sale_california | O
|
|
(12 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
sale | renamed_record_sale_trigger
|
|
sale_california | renamed_record_sale_trigger
|
|
sale_newyork | renamed_record_sale_trigger
|
|
(3 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,0)
|
|
(localhost,10202,t,0)
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,9)
|
|
(localhost,10202,t,9)
|
|
(2 rows)
|
|
|
|
-- create another partition to verify that all is safe and sound
|
|
CREATE TABLE sale_alabama PARTITION OF sale FOR VALUES IN ('AL');
|
|
SELECT * FROM sale_triggers ORDER BY 1, 2;
|
|
tgname | tgrelid | tgenabled
|
|
---------------------------------------------------------------------
|
|
another_renamed_trigger | sale | O
|
|
another_renamed_trigger | sale_newyork | O
|
|
another_renamed_trigger | sale_california | O
|
|
another_renamed_trigger | sale_alabama | O
|
|
not_renamed_trigger | sale | O
|
|
not_renamed_trigger | sale_newyork | O
|
|
not_renamed_trigger | sale_california | O
|
|
not_renamed_trigger | sale_alabama | O
|
|
renamed_record_sale_trigger | sale | O
|
|
renamed_record_sale_trigger | sale_newyork | O
|
|
renamed_record_sale_trigger | sale_california | O
|
|
renamed_record_sale_trigger | sale_alabama | O
|
|
truncate_trigger_xxxxxxx | sale | O
|
|
truncate_trigger_xxxxxxx | sale_newyork | O
|
|
truncate_trigger_xxxxxxx | sale_california | O
|
|
truncate_trigger_xxxxxxx | sale_alabama | O
|
|
(16 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
sale | renamed_record_sale_trigger
|
|
sale_alabama | renamed_record_sale_trigger
|
|
sale_california | renamed_record_sale_trigger
|
|
sale_newyork | renamed_record_sale_trigger
|
|
(4 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,0)
|
|
(localhost,10202,t,0)
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,12)
|
|
(localhost,10202,t,12)
|
|
(2 rows)
|
|
|
|
-- drop a trigger to verify that all is safe and sound
|
|
DROP TRIGGER another_renamed_trigger ON sale;
|
|
SELECT * FROM sale_triggers ORDER BY 1, 2;
|
|
tgname | tgrelid | tgenabled
|
|
---------------------------------------------------------------------
|
|
not_renamed_trigger | sale | O
|
|
not_renamed_trigger | sale_newyork | O
|
|
not_renamed_trigger | sale_california | O
|
|
not_renamed_trigger | sale_alabama | O
|
|
renamed_record_sale_trigger | sale | O
|
|
renamed_record_sale_trigger | sale_newyork | O
|
|
renamed_record_sale_trigger | sale_california | O
|
|
renamed_record_sale_trigger | sale_alabama | O
|
|
truncate_trigger_xxxxxxx | sale | O
|
|
truncate_trigger_xxxxxxx | sale_newyork | O
|
|
truncate_trigger_xxxxxxx | sale_california | O
|
|
truncate_trigger_xxxxxxx | sale_alabama | O
|
|
(12 rows)
|
|
|
|
-- rename a trigger - note that it also renames the triggers on the partitions
|
|
ALTER TRIGGER "renamed_record_sale_trigger" ON "sale" RENAME TO "final_renamed_record_sale_trigger";
|
|
SELECT * FROM sale_triggers ORDER BY 1, 2;
|
|
tgname | tgrelid | tgenabled
|
|
---------------------------------------------------------------------
|
|
final_renamed_record_sale_trigger | sale | O
|
|
final_renamed_record_sale_trigger | sale_newyork | O
|
|
final_renamed_record_sale_trigger | sale_california | O
|
|
final_renamed_record_sale_trigger | sale_alabama | O
|
|
not_renamed_trigger | sale | O
|
|
not_renamed_trigger | sale_newyork | O
|
|
not_renamed_trigger | sale_california | O
|
|
not_renamed_trigger | sale_alabama | O
|
|
truncate_trigger_xxxxxxx | sale | O
|
|
truncate_trigger_xxxxxxx | sale_newyork | O
|
|
truncate_trigger_xxxxxxx | sale_california | O
|
|
truncate_trigger_xxxxxxx | sale_alabama | O
|
|
(12 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
SELECT tgrelid::regclass::text, tgname FROM pg_trigger WHERE tgname like 'final_renamed_record_sale_trigger%' ORDER BY 1,2;
|
|
tgrelid | tgname
|
|
---------------------------------------------------------------------
|
|
sale | final_renamed_record_sale_trigger
|
|
sale_alabama | final_renamed_record_sale_trigger
|
|
sale_california | final_renamed_record_sale_trigger
|
|
sale_newyork | final_renamed_record_sale_trigger
|
|
(4 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'renamed_record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,0)
|
|
(localhost,10202,t,0)
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'final_renamed_record_sale_trigger%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,12)
|
|
(localhost,10202,t,12)
|
|
(2 rows)
|
|
|
|
DROP TRIGGER final_renamed_record_sale_trigger ON sale;
|
|
-- create another trigger and rename it
|
|
CREATE TRIGGER yet_another_trigger
|
|
AFTER INSERT OR UPDATE OR DELETE ON sale
|
|
FOR EACH ROW EXECUTE FUNCTION upgrade_distributed_triggers.record_sale();
|
|
ALTER TRIGGER "yet_another_trigger" ON "sale" RENAME TO "renamed_yet_another_trigger";
|
|
SELECT * FROM sale_triggers ORDER BY 1, 2;
|
|
tgname | tgrelid | tgenabled
|
|
---------------------------------------------------------------------
|
|
not_renamed_trigger | sale | O
|
|
not_renamed_trigger | sale_newyork | O
|
|
not_renamed_trigger | sale_california | O
|
|
not_renamed_trigger | sale_alabama | O
|
|
renamed_yet_another_trigger | sale | O
|
|
renamed_yet_another_trigger | sale_newyork | O
|
|
renamed_yet_another_trigger | sale_california | O
|
|
renamed_yet_another_trigger | sale_alabama | O
|
|
truncate_trigger_xxxxxxx | sale | O
|
|
truncate_trigger_xxxxxxx | sale_newyork | O
|
|
truncate_trigger_xxxxxxx | sale_california | O
|
|
truncate_trigger_xxxxxxx | sale_alabama | O
|
|
(12 rows)
|
|
|
|
-- after upgrade to PG15, test that we can't rename a distributed clone trigger
|
|
ALTER TRIGGER "renamed_yet_another_trigger" ON "sale_alabama" RENAME TO "another_trigger_name";
|
|
ERROR: cannot rename trigger "renamed_yet_another_trigger" on table "sale_alabama"
|
|
HINT: Rename the trigger on the partitioned table "sale" instead.
|
|
SELECT count(*) FROM pg_trigger WHERE tgname like 'another_trigger_name%';
|
|
count
|
|
---------------------------------------------------------------------
|
|
0
|
|
(1 row)
|
|
|
|
SELECT run_command_on_workers($$SELECT count(*) FROM pg_trigger WHERE tgname like 'another_trigger_name%';$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,10201,t,0)
|
|
(localhost,10202,t,0)
|
|
(2 rows)
|
|
|
|
DROP SCHEMA upgrade_distributed_triggers CASCADE;
|
|
NOTICE: drop cascades to 4 other objects
|
|
DETAIL: drop cascades to function record_sale()
|
|
drop cascades to table sale
|
|
drop cascades to table record_sale
|
|
drop cascades to view sale_triggers
|