mirror of https://github.com/citusdata/citus.git
636 lines
29 KiB
Plaintext
636 lines
29 KiB
Plaintext
-- regression tests regarding foreign key
|
|
-- drops cascading into undistributing Citus
|
|
-- local tables to Postgres local tables
|
|
CREATE SCHEMA drop_fkey_cascade;
|
|
SET search_path TO drop_fkey_cascade;
|
|
SET client_min_messages TO WARNING;
|
|
SET citus.next_shard_id TO 1810000;
|
|
SELECT 1 FROM master_add_node('localhost', :master_port, groupId => 0);
|
|
?column?
|
|
---------------------------------------------------------------------
|
|
1
|
|
(1 row)
|
|
|
|
-- show that DROP CONSTRAINT cascades to undistributing citus_local_table
|
|
CREATE TABLE citus_local_table(l1 int);
|
|
SELECT citus_add_local_table_to_metadata('citus_local_table');
|
|
citus_add_local_table_to_metadata
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE reference_table(r1 int primary key);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
ALTER TABLE citus_local_table ADD CONSTRAINT fkey_local_to_ref FOREIGN KEY(l1) REFERENCES reference_table(r1) ON DELETE CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
citus_local_table | n | c
|
|
reference_table | n | t
|
|
(2 rows)
|
|
|
|
CREATE OR REPLACE FUNCTION drop_constraint_cascade_via_perform_deletion(IN table_name regclass, IN constraint_name text)
|
|
RETURNS VOID
|
|
LANGUAGE C STRICT
|
|
AS 'citus', $$drop_constraint_cascade_via_perform_deletion$$;
|
|
BEGIN;
|
|
SELECT drop_constraint_cascade_via_perform_deletion('citus_local_table', 'fkey_local_to_ref');
|
|
drop_constraint_cascade_via_perform_deletion
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- we dropped constraint without going through utility hook,
|
|
-- so we should still see citus_local_table
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
citus_local_table | n | c
|
|
reference_table | n | t
|
|
(2 rows)
|
|
|
|
ROLLBACK;
|
|
ALTER TABLE citus_local_table DROP CONSTRAINT fkey_local_to_ref;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
DROP TABLE citus_local_table, reference_table;
|
|
-- show that DROP COLUMN cascades to undistributing citus_local_table
|
|
CREATE TABLE reference_table(r1 int primary key, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
ALTER TABLE reference_table DROP COLUMN r1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
DROP TABLE citus_local_table, reference_table;
|
|
-- show that DROP COLUMN that cascades into drop foreign key undistributes local table
|
|
CREATE TABLE reference_table(r1 int primary key, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
ALTER TABLE citus_local_table DROP COLUMN l1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
DROP TABLE citus_local_table, reference_table;
|
|
-- show that PRIMARY KEY that cascades into drop foreign key undistributes local table
|
|
CREATE TABLE reference_table(r1 int primary key, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
ALTER TABLE reference_table DROP CONSTRAINT reference_table_pkey CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
-- show that DROP UNIQUE INDEX that cascades into drop foreign key undistributes local table
|
|
DROP TABLE citus_local_table, reference_table;
|
|
CREATE TABLE reference_table(r1 int, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE UNIQUE INDEX ref_unique ON reference_table(r1);
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
DROP INDEX ref_unique CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
-- show that UNIQUE CONSTRAINT that cascades into drop foreign key undistributes local table
|
|
DROP TABLE citus_local_table, reference_table;
|
|
CREATE TABLE reference_table(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
ALTER TABLE reference_table DROP CONSTRAINT reference_table_r1_key CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
-- show that DROP TABLE that cascades into drop foreign key undistributes local table
|
|
DROP TABLE citus_local_table, reference_table;
|
|
CREATE TABLE reference_table(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
DROP TABLE reference_table CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- show that UNIQUE CONSTRAINT that cascades into drop foreign key undistributes local table
|
|
DROP TABLE citus_local_table;
|
|
CREATE TABLE reference_table(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
ALTER TABLE reference_table DROP CONSTRAINT reference_table_r1_key CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table | n | t
|
|
(1 row)
|
|
|
|
-- show that DROP SCHEMA that cascades into drop foreign key undistributes local table
|
|
DROP TABLE citus_local_table, reference_table;
|
|
CREATE SCHEMA ref_table_drop_schema;
|
|
CREATE TABLE ref_table_drop_schema.reference_table(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('ref_table_drop_schema.reference_table');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES ref_table_drop_schema.reference_table(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'ref_table_drop_schema.reference_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
ref_table_drop_schema.reference_table | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
DROP SCHEMA ref_table_drop_schema CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- drop column cascade that doesn't cascade into citus local table
|
|
DROP TABLE IF EXISTS citus_local_table, reference_table_1, reference_table_2;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE reference_table_2(r1 int UNIQUE REFERENCES reference_table_1(r1), r2 int);
|
|
SELECT create_reference_table('reference_table_2');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table_2(r1), l2 int);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
ALTER TABLE reference_table_1 DROP COLUMN r1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
-- local table has multiple foreign keys to two tables
|
|
-- drop one at a time
|
|
DROP TABLE IF EXISTS citus_local_table, reference_table_1, reference_table_2;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE reference_table_2(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_2');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table_1(r1), l2 int REFERENCES reference_table_2(r1));
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
DROP TABLE reference_table_1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(2 rows)
|
|
|
|
CREATE TABLE distributed_table (d1 int);
|
|
SELECT create_distributed_table('distributed_table', 'd1');
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- drop an unrelated distributed table too
|
|
DROP TABLE reference_table_2, distributed_table CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- local table has multiple foreign keys to two tables
|
|
-- drop both at the same time
|
|
DROP TABLE IF EXISTS citus_local_table, reference_table_1, reference_table_2;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE reference_table_2(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_2');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table_1(r1), l2 int REFERENCES reference_table_2(r1));
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
DROP TABLE reference_table_1, reference_table_2 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- local table has multiple foreign keys to two tables
|
|
-- drop one at a time
|
|
DROP TABLE IF EXISTS citus_local_table, reference_table_1, reference_table_2;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE reference_table_2(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_2');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table(l1 int REFERENCES reference_table_1(r1), l2 int REFERENCES reference_table_2(r1));
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
BEGIN;
|
|
ALTER TABLE citus_local_table DROP CONSTRAINT citus_local_table_l1_fkey;
|
|
SAVEPOINT sp1;
|
|
-- this should undistribute citus_local_table
|
|
ALTER TABLE citus_local_table DROP CONSTRAINT citus_local_table_l2_fkey;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
(2 rows)
|
|
|
|
ROLLBACK TO SAVEPOINT sp1;
|
|
-- rollback'ed second drop constraint, so we should still see citus_local_table
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
citus_local_table | n | c
|
|
(3 rows)
|
|
|
|
-- this should undistribute citus_local_table again
|
|
ALTER TABLE citus_local_table DROP CONSTRAINT citus_local_table_l2_fkey;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('citus_local_table'::regclass, 'reference_table_1'::regclass, 'reference_table_2'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
reference_table_2 | n | t
|
|
(2 rows)
|
|
|
|
COMMIT;
|
|
-- a single drop column cascades into multiple undistributes
|
|
DROP TABLE IF EXISTS citus_local_table_1, citus_local_table_2, reference_table_1;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table_1(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE);
|
|
CREATE TABLE citus_local_table_2(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE REFERENCES citus_local_table_1(l2));
|
|
CREATE TABLE citus_local_table_3(l1 int REFERENCES reference_table_1(r1), l2 int REFERENCES citus_local_table_2(l2));
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass, 'citus_local_table_2'::regclass, 'citus_local_table_3'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
citus_local_table_1 | n | c
|
|
citus_local_table_2 | n | c
|
|
citus_local_table_3 | n | c
|
|
(4 rows)
|
|
|
|
ALTER TABLE reference_table_1 DROP COLUMN r1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass, 'citus_local_table_2'::regclass, 'citus_local_table_3'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
(1 row)
|
|
|
|
-- a single drop table cascades into multiple undistributes
|
|
DROP TABLE IF EXISTS citus_local_table_1, citus_local_table_2, citus_local_table_3, citus_local_table_2, reference_table_1;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table_1(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE);
|
|
CREATE TABLE citus_local_table_2(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE REFERENCES citus_local_table_1(l2));
|
|
CREATE TABLE citus_local_table_3(l1 int REFERENCES reference_table_1(r1), l2 int REFERENCES citus_local_table_2(l2));
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass, 'citus_local_table_2'::regclass, 'citus_local_table_3'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
citus_local_table_1 | n | c
|
|
citus_local_table_2 | n | c
|
|
citus_local_table_3 | n | c
|
|
(4 rows)
|
|
|
|
-- test DROP OWNED BY
|
|
-- Citus does not support "ALTER TABLE OWNER TO" commands. Also, not to deal with tests output
|
|
-- difference between community and enterprise, let's disable enable_ddl_propagation here.
|
|
SET citus.enable_ddl_propagation to OFF;
|
|
CREATE USER another_user;
|
|
SELECT run_command_on_workers('CREATE USER another_user');
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"CREATE ROLE")
|
|
(localhost,57638,t,"CREATE ROLE")
|
|
(2 rows)
|
|
|
|
ALTER TABLE reference_table_1 OWNER TO another_user;
|
|
SELECT run_command_on_placements('reference_table_1', 'ALTER TABLE %s OWNER TO another_user');
|
|
run_command_on_placements
|
|
---------------------------------------------------------------------
|
|
(localhost,57636,1810039,t,"ALTER TABLE")
|
|
(localhost,57637,1810039,t,"ALTER TABLE")
|
|
(localhost,57638,1810039,t,"ALTER TABLE")
|
|
(3 rows)
|
|
|
|
SET citus.enable_ddl_propagation to ON;
|
|
BEGIN;
|
|
DROP OWNED BY another_user cascade;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ( 'citus_local_table_1'::regclass, 'citus_local_table_2'::regclass, 'citus_local_table_3'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
ROLLBACK;
|
|
DROP TABLE reference_table_1 CASCADE;
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ( 'citus_local_table_1'::regclass, 'citus_local_table_2'::regclass, 'citus_local_table_3'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
(0 rows)
|
|
|
|
-- dropping constraints inside a plpgsql procedure should be fine
|
|
DROP TABLE IF EXISTS citus_local_table_1, reference_table_1 CASCADE;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table_1(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
citus_local_table_1 | n | c
|
|
(2 rows)
|
|
|
|
CREATE OR REPLACE FUNCTION drop_constraint_via_func()
|
|
RETURNS void LANGUAGE plpgsql AS $$
|
|
BEGIN
|
|
ALTER TABLE citus_local_table_1 DROP CONSTRAINT citus_local_table_1_l1_fkey;
|
|
END;$$;
|
|
BEGIN;
|
|
SELECT drop_constraint_via_func();
|
|
drop_constraint_via_func
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
(1 row)
|
|
|
|
ROLLBACK;
|
|
create or replace procedure drop_constraint_via_proc()
|
|
language plpgsql
|
|
as $$
|
|
DECLARE
|
|
res INT := 0;
|
|
begin
|
|
ALTER TABLE citus_local_table_1 DROP CONSTRAINT citus_local_table_1_l1_fkey;
|
|
commit;
|
|
end;$$;
|
|
call drop_constraint_via_proc();
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
(1 row)
|
|
|
|
-- even if the procedure is called from another procedure
|
|
DROP TABLE IF EXISTS citus_local_table_1, reference_table_1 CASCADE;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table_1(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
citus_local_table_1 | n | c
|
|
(2 rows)
|
|
|
|
create or replace procedure drop_constraint_via_proc_top_level()
|
|
language plpgsql
|
|
as $$
|
|
DECLARE
|
|
res INT := 0;
|
|
begin
|
|
CALL drop_constraint_via_proc();
|
|
commit;
|
|
end;$$;
|
|
CALL drop_constraint_via_proc_top_level();
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
(1 row)
|
|
|
|
-- even if the procedure is called from an exception handler
|
|
DROP TABLE IF EXISTS citus_local_table_1, reference_table_1 CASCADE;
|
|
CREATE TABLE reference_table_1(r1 int UNIQUE, r2 int);
|
|
SELECT create_reference_table('reference_table_1');
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
CREATE TABLE citus_local_table_1(l1 int REFERENCES reference_table_1(r1), l2 int UNIQUE);
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
citus_local_table_1 | n | c
|
|
(2 rows)
|
|
|
|
create or replace procedure drop_constraint_via_proc_exception()
|
|
language plpgsql
|
|
as $$
|
|
DECLARE
|
|
res INT := 0;
|
|
begin
|
|
PERFORM 1/0;
|
|
EXCEPTION
|
|
when others then
|
|
CALL drop_constraint_via_proc();
|
|
commit;
|
|
end;$$;
|
|
CALL drop_constraint_via_proc_exception();
|
|
SELECT logicalrelid, partmethod, repmodel FROM pg_dist_partition WHERE logicalrelid IN ('reference_table_1'::regclass, 'citus_local_table_1'::regclass) ORDER BY logicalrelid;
|
|
logicalrelid | partmethod | repmodel
|
|
---------------------------------------------------------------------
|
|
reference_table_1 | n | t
|
|
(1 row)
|
|
|
|
DROP SCHEMA drop_fkey_cascade CASCADE;
|