CREATE SCHEMA undistribute_table; SET search_path TO undistribute_table; SET citus.shard_count TO 4; SET citus.shard_replication_factor TO 1; CREATE TABLE dist_table (id INT, a INT, b TEXT); SELECT create_distributed_table('dist_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO dist_table VALUES (1, 2, 'abc'), (2, 3, 'abcd'), (1, 3, 'abc'); SELECT logicalrelid FROM pg_dist_partition WHERE logicalrelid = 'dist_table'::regclass; logicalrelid --------------------------------------------------------------------- dist_table (1 row) SELECT run_command_on_workers($$SELECT COUNT(*) FROM pg_catalog.pg_class WHERE relname LIKE 'dist\_table\_%'$$); run_command_on_workers --------------------------------------------------------------------- (localhost,57637,t,2) (localhost,57638,t,2) (2 rows) SELECT * FROM dist_table ORDER BY 1, 2, 3; id | a | b --------------------------------------------------------------------- 1 | 2 | abc 1 | 3 | abc 2 | 3 | abcd (3 rows) -- we cannot immediately convert in the same statement, because -- the name->OID conversion happens at parse time. SELECT undistribute_table('dist_table'), create_distributed_table('dist_table', 'a'); NOTICE: creating a new table for undistribute_table.dist_table NOTICE: moving the data of undistribute_table.dist_table NOTICE: dropping the old undistribute_table.dist_table NOTICE: renaming the new table to undistribute_table.dist_table ERROR: relation with OID XXXX does not exist SELECT undistribute_table('dist_table'); NOTICE: creating a new table for undistribute_table.dist_table NOTICE: moving the data of undistribute_table.dist_table NOTICE: dropping the old undistribute_table.dist_table NOTICE: renaming the new table to undistribute_table.dist_table undistribute_table --------------------------------------------------------------------- (1 row) SELECT logicalrelid FROM pg_dist_partition WHERE logicalrelid = 'dist_table'::regclass; logicalrelid --------------------------------------------------------------------- (0 rows) SELECT run_command_on_workers($$SELECT COUNT(*) FROM pg_catalog.pg_class WHERE relname LIKE 'dist\_table\_%'$$); run_command_on_workers --------------------------------------------------------------------- (localhost,57637,t,0) (localhost,57638,t,0) (2 rows) SELECT * FROM dist_table ORDER BY 1, 2, 3; id | a | b --------------------------------------------------------------------- 1 | 2 | abc 1 | 3 | abc 2 | 3 | abcd (3 rows) DROP TABLE dist_table; -- test indexes CREATE TABLE dist_table (id INT, a INT, b TEXT); SELECT create_distributed_table('dist_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO dist_table VALUES (1, 2, 'abc'), (2, 3, 'abcd'), (1, 3, 'abc'); CREATE INDEX index1 ON dist_table (id); SELECT * FROM pg_indexes WHERE tablename = 'dist_table'; schemaname | tablename | indexname | tablespace | indexdef --------------------------------------------------------------------- undistribute_table | dist_table | index1 | | CREATE INDEX index1 ON undistribute_table.dist_table USING btree (id) (1 row) SELECT undistribute_table('dist_table'); NOTICE: creating a new table for undistribute_table.dist_table NOTICE: moving the data of undistribute_table.dist_table NOTICE: dropping the old undistribute_table.dist_table NOTICE: renaming the new table to undistribute_table.dist_table undistribute_table --------------------------------------------------------------------- (1 row) SELECT * FROM pg_indexes WHERE tablename = 'dist_table'; schemaname | tablename | indexname | tablespace | indexdef --------------------------------------------------------------------- undistribute_table | dist_table | index1 | | CREATE INDEX index1 ON undistribute_table.dist_table USING btree (id) (1 row) DROP TABLE dist_table; -- test tables with references -- we expect errors CREATE TABLE referenced_table (id INT PRIMARY KEY, a INT, b TEXT); SELECT create_distributed_table('referenced_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO referenced_table VALUES (1, 2, 'abc'), (2, 3, 'abcd'), (4, 3, 'abc'); CREATE TABLE referencing_table (id INT REFERENCES referenced_table (id), a INT, b TEXT); SELECT create_distributed_table('referencing_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO referencing_table VALUES (4, 6, 'cba'), (1, 1, 'dcba'), (2, 3, 'aaa'); SELECT undistribute_table('referenced_table'); ERROR: cannot complete operation because table referenced_table is referenced by a foreign key HINT: Use cascade option to undistribute all the relations involved in a foreign key relationship with undistribute_table.referenced_table by executing SELECT undistribute_table($$undistribute_table.referenced_table$$, cascade_via_foreign_keys=>true) SELECT undistribute_table('referencing_table'); ERROR: cannot complete operation because table referencing_table has a foreign key HINT: Use cascade option to undistribute all the relations involved in a foreign key relationship with undistribute_table.referencing_table by executing SELECT undistribute_table($$undistribute_table.referencing_table$$, cascade_via_foreign_keys=>true) DROP TABLE referenced_table, referencing_table; -- test partitioned tables CREATE TABLE partitioned_table (id INT, a INT) PARTITION BY RANGE (id); CREATE TABLE partitioned_table_1_5 PARTITION OF partitioned_table FOR VALUES FROM (1) TO (5); CREATE TABLE partitioned_table_6_10 PARTITION OF partitioned_table FOR VALUES FROM (6) TO (10); SELECT create_distributed_table('partitioned_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO partitioned_table VALUES (2, 12), (7, 2); SELECT logicalrelid FROM pg_dist_partition WHERE logicalrelid::regclass::text LIKE 'partitioned\_table%' ORDER BY 1; logicalrelid --------------------------------------------------------------------- partitioned_table partitioned_table_1_5 partitioned_table_6_10 (3 rows) SELECT run_command_on_workers($$SELECT COUNT(*) FROM pg_catalog.pg_class WHERE relname SIMILAR TO 'partitioned\_table%\d{3,}'$$); run_command_on_workers --------------------------------------------------------------------- (localhost,57637,t,6) (localhost,57638,t,6) (2 rows) SELECT inhrelid::regclass FROM pg_catalog.pg_inherits WHERE inhparent = 'partitioned_table'::regclass ORDER BY 1; inhrelid --------------------------------------------------------------------- partitioned_table_1_5 partitioned_table_6_10 (2 rows) SELECT * FROM partitioned_table ORDER BY 1, 2; id | a --------------------------------------------------------------------- 2 | 12 7 | 2 (2 rows) SELECT * FROM partitioned_table_1_5 ORDER BY 1, 2; id | a --------------------------------------------------------------------- 2 | 12 (1 row) SELECT * FROM partitioned_table_6_10 ORDER BY 1, 2; id | a --------------------------------------------------------------------- 7 | 2 (1 row) -- undistributing partitions are not supported SELECT undistribute_table('partitioned_table_1_5'); ERROR: cannot complete operation because table is a partition HINT: the parent table is "partitioned_table" -- we can undistribute partitioned parent tables SELECT undistribute_table('partitioned_table'); NOTICE: converting the partitions of undistribute_table.partitioned_table NOTICE: creating a new table for undistribute_table.partitioned_table_1_5 NOTICE: moving the data of undistribute_table.partitioned_table_1_5 NOTICE: dropping the old undistribute_table.partitioned_table_1_5 NOTICE: renaming the new table to undistribute_table.partitioned_table_1_5 NOTICE: creating a new table for undistribute_table.partitioned_table_6_10 NOTICE: moving the data of undistribute_table.partitioned_table_6_10 NOTICE: dropping the old undistribute_table.partitioned_table_6_10 NOTICE: renaming the new table to undistribute_table.partitioned_table_6_10 NOTICE: creating a new table for undistribute_table.partitioned_table NOTICE: dropping the old undistribute_table.partitioned_table NOTICE: renaming the new table to undistribute_table.partitioned_table undistribute_table --------------------------------------------------------------------- (1 row) SELECT logicalrelid FROM pg_dist_partition WHERE logicalrelid::regclass::text LIKE 'partitioned\_table%' ORDER BY 1; logicalrelid --------------------------------------------------------------------- (0 rows) SELECT run_command_on_workers($$SELECT COUNT(*) FROM pg_catalog.pg_class WHERE relname SIMILAR TO 'partitioned\_table%\d{3,}'$$); run_command_on_workers --------------------------------------------------------------------- (localhost,57637,t,0) (localhost,57638,t,0) (2 rows) SELECT inhrelid::regclass FROM pg_catalog.pg_inherits WHERE inhparent = 'partitioned_table'::regclass ORDER BY 1; inhrelid --------------------------------------------------------------------- partitioned_table_1_5 partitioned_table_6_10 (2 rows) SELECT * FROM partitioned_table ORDER BY 1, 2; id | a --------------------------------------------------------------------- 2 | 12 7 | 2 (2 rows) SELECT * FROM partitioned_table_1_5 ORDER BY 1, 2; id | a --------------------------------------------------------------------- 2 | 12 (1 row) SELECT * FROM partitioned_table_6_10 ORDER BY 1, 2; id | a --------------------------------------------------------------------- 7 | 2 (1 row) DROP TABLE partitioned_table; -- test tables with sequences CREATE TABLE seq_table (id INT, a bigserial); SELECT create_distributed_table('seq_table', 'id'); create_distributed_table --------------------------------------------------------------------- (1 row) SELECT objid::regclass AS "Sequence Name" FROM pg_depend WHERE refobjid = 'seq_table'::regclass::oid AND classid = 'pg_class'::regclass::oid; Sequence Name --------------------------------------------------------------------- seq_table_a_seq (1 row) INSERT INTO seq_table (id) VALUES (5), (9), (3); SELECT * FROM seq_table ORDER BY a; id | a --------------------------------------------------------------------- 5 | 1 9 | 2 3 | 3 (3 rows) SELECT undistribute_table('seq_table'); NOTICE: creating a new table for undistribute_table.seq_table NOTICE: moving the data of undistribute_table.seq_table NOTICE: dropping the old undistribute_table.seq_table NOTICE: renaming the new table to undistribute_table.seq_table undistribute_table --------------------------------------------------------------------- (1 row) SELECT objid::regclass AS "Sequence Name" FROM pg_depend WHERE refobjid = 'seq_table'::regclass::oid AND classid = 'pg_class'::regclass::oid; Sequence Name --------------------------------------------------------------------- seq_table_a_seq (1 row) INSERT INTO seq_table (id) VALUES (7), (1), (8); SELECT * FROM seq_table ORDER BY a; id | a --------------------------------------------------------------------- 5 | 1 9 | 2 3 | 3 7 | 4 1 | 5 8 | 6 (6 rows) DROP TABLE seq_table; --test tables with views CREATE TABLE view_table (a int, b int, c int); SELECT create_distributed_table('view_table', 'a'); create_distributed_table --------------------------------------------------------------------- (1 row) INSERT INTO view_table VALUES (1, 2, 3), (2, 4, 6), (3, 6, 9); CREATE SCHEMA another_schema; CREATE VIEW undis_view1 AS SELECT a, b FROM view_table; CREATE VIEW undis_view2 AS SELECT a, c FROM view_table; CREATE VIEW another_schema.undis_view3 AS SELECT b, c FROM undis_view1 JOIN undis_view2 ON undis_view1.a = undis_view2.a; SELECT schemaname, viewname, viewowner, definition FROM pg_views WHERE viewname LIKE 'undis\_view%' ORDER BY viewname; schemaname | viewname | viewowner | definition --------------------------------------------------------------------- undistribute_table | undis_view1 | postgres | SELECT view_table.a, + | | | view_table.b + | | | FROM view_table; undistribute_table | undis_view2 | postgres | SELECT view_table.a, + | | | view_table.c + | | | FROM view_table; another_schema | undis_view3 | postgres | SELECT undis_view1.b, + | | | undis_view2.c + | | | FROM (undis_view1 + | | | JOIN undis_view2 ON ((undis_view1.a = undis_view2.a))); (3 rows) SELECT * FROM another_schema.undis_view3 ORDER BY 1, 2; b | c --------------------------------------------------------------------- 2 | 3 4 | 6 6 | 9 (3 rows) SELECT undistribute_table('view_table'); NOTICE: creating a new table for undistribute_table.view_table NOTICE: moving the data of undistribute_table.view_table NOTICE: dropping the old undistribute_table.view_table NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to view undis_view1 drop cascades to view undis_view2 drop cascades to view another_schema.undis_view3 CONTEXT: SQL statement "DROP TABLE undistribute_table.view_table CASCADE" NOTICE: renaming the new table to undistribute_table.view_table undistribute_table --------------------------------------------------------------------- (1 row) SELECT schemaname, viewname, viewowner, definition FROM pg_views WHERE viewname LIKE 'undis\_view%' ORDER BY viewname; schemaname | viewname | viewowner | definition --------------------------------------------------------------------- undistribute_table | undis_view1 | postgres | SELECT view_table.a, + | | | view_table.b + | | | FROM view_table; undistribute_table | undis_view2 | postgres | SELECT view_table.a, + | | | view_table.c + | | | FROM view_table; another_schema | undis_view3 | postgres | SELECT undis_view1.b, + | | | undis_view2.c + | | | FROM (undis_view1 + | | | JOIN undis_view2 ON ((undis_view1.a = undis_view2.a))); (3 rows) SELECT * FROM another_schema.undis_view3 ORDER BY 1, 2; b | c --------------------------------------------------------------------- 2 | 3 4 | 6 6 | 9 (3 rows) DROP TABLE view_table CASCADE; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to view undis_view1 drop cascades to view undis_view2 drop cascades to view another_schema.undis_view3 DROP SCHEMA undistribute_table, another_schema CASCADE;