-- Tests related to distributed DDL commands on mx cluster SELECT * FROM mx_ddl_table ORDER BY key; key | value -----+------- 1 | 10 2 | 11 3 | 21 4 | 37 5 | 60 6 | 100 10 | 200 11 | 230 (8 rows) -- CREATE INDEX CREATE INDEX ddl_test_index ON mx_ddl_table(value); NOTICE: using one-phase commit for distributed DDL commands HINT: You can enable two-phase commit for extra safety with: SET citus.multi_shard_commit_protocol TO '2pc' CREATE INDEX CONCURRENTLY ddl_test_concurrent_index ON mx_ddl_table(value); -- ADD COLUMN ALTER TABLE mx_ddl_table ADD COLUMN version INTEGER; -- SET DEFAULT ALTER TABLE mx_ddl_table ALTER COLUMN version SET DEFAULT 1; SELECT master_modify_multiple_shards('UPDATE mx_ddl_table SET version=0.1 WHERE version IS NULL'); master_modify_multiple_shards ------------------------------- 8 (1 row) -- SET NOT NULL ALTER TABLE mx_ddl_table ALTER COLUMN version SET NOT NULL; -- See that the changes are applied on coordinator, worker tables and shards SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers ---------+---------+-------------------- key | integer | not null value | integer | version | integer | not null default 1 (3 rows) \d ddl_test*_index Index "public.ddl_test_concurrent_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" Index "public.ddl_test_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" \c - - - :worker_1_port SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers ---------+---------+-------------------- key | integer | not null value | integer | version | integer | not null default 1 (3 rows) \d ddl_test*_index Index "public.ddl_test_concurrent_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" Index "public.ddl_test_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table_1220088'::regclass; Column | Type | Modifiers ---------+---------+-------------------- key | integer | not null value | integer | version | integer | not null default 1 (3 rows) \d ddl_test*_index_1220088 Index "public.ddl_test_concurrent_index_1220088" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table_1220088" Index "public.ddl_test_index_1220088" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table_1220088" \c - - - :worker_2_port SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers ---------+---------+-------------------- key | integer | not null value | integer | version | integer | not null default 1 (3 rows) \d ddl_test*_index Index "public.ddl_test_concurrent_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" Index "public.ddl_test_index" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table" SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table_1220089'::regclass; Column | Type | Modifiers ---------+---------+-------------------- key | integer | not null value | integer | version | integer | not null default 1 (3 rows) \d ddl_test*_index_1220089 Index "public.ddl_test_concurrent_index_1220089" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table_1220089" Index "public.ddl_test_index_1220089" Column | Type | Definition --------+---------+------------ value | integer | value btree, for table "public.mx_ddl_table_1220089" INSERT INTO mx_ddl_table VALUES (37, 78, 2); INSERT INTO mx_ddl_table VALUES (38, 78); -- Switch to the coordinator \c - - - :master_port -- SET DATA TYPE ALTER TABLE mx_ddl_table ALTER COLUMN version SET DATA TYPE double precision; NOTICE: using one-phase commit for distributed DDL commands HINT: You can enable two-phase commit for extra safety with: SET citus.multi_shard_commit_protocol TO '2pc' INSERT INTO mx_ddl_table VALUES (78, 83, 2.1); \c - - - :worker_1_port SELECT * FROM mx_ddl_table ORDER BY key; key | value | version -----+-------+--------- 1 | 10 | 0 2 | 11 | 0 3 | 21 | 0 4 | 37 | 0 5 | 60 | 0 6 | 100 | 0 10 | 200 | 0 11 | 230 | 0 37 | 78 | 2 38 | 78 | 1 78 | 83 | 2.1 (11 rows) -- Switch to the coordinator \c - - - :master_port -- DROP INDEX DROP INDEX ddl_test_index; NOTICE: using one-phase commit for distributed DDL commands HINT: You can enable two-phase commit for extra safety with: SET citus.multi_shard_commit_protocol TO '2pc' DROP INDEX CONCURRENTLY ddl_test_concurrent_index; -- DROP DEFAULT ALTER TABLE mx_ddl_table ALTER COLUMN version DROP DEFAULT; -- DROP NOT NULL ALTER TABLE mx_ddl_table ALTER COLUMN version DROP NOT NULL; -- DROP COLUMN ALTER TABLE mx_ddl_table DROP COLUMN version; -- See that the changes are applied on coordinator, worker tables and shards SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers --------+---------+----------- key | integer | not null value | integer | (2 rows) \di ddl_test*_index List of relations Schema | Name | Type | Owner | Table --------+------+------+-------+------- (0 rows) \c - - - :worker_1_port SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers --------+---------+----------- key | integer | not null value | integer | (2 rows) \di ddl_test*_index List of relations Schema | Name | Type | Owner | Table --------+------+------+-------+------- (0 rows) SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table_1220088'::regclass; Column | Type | Modifiers --------+---------+----------- key | integer | not null value | integer | (2 rows) \di ddl_test*_index_1220088 List of relations Schema | Name | Type | Owner | Table --------+------+------+-------+------- (0 rows) \c - - - :worker_2_port SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table'::regclass; Column | Type | Modifiers --------+---------+----------- key | integer | not null value | integer | (2 rows) \di ddl_test*_index List of relations Schema | Name | Type | Owner | Table --------+------+------+-------+------- (0 rows) SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='mx_ddl_table_1220089'::regclass; Column | Type | Modifiers --------+---------+----------- key | integer | not null value | integer | (2 rows) \di ddl_test*_index_1220089 List of relations Schema | Name | Type | Owner | Table --------+------+------+-------+------- (0 rows) -- Show that DDL commands are done within a two-phase commit transaction \c - - - :master_port SET client_min_messages TO debug2; CREATE INDEX ddl_test_index ON mx_ddl_table(value); DEBUG: building index "ddl_test_index" on table "mx_ddl_table" NOTICE: using one-phase commit for distributed DDL commands HINT: You can enable two-phase commit for extra safety with: SET citus.multi_shard_commit_protocol TO '2pc' RESET client_min_messages; DROP INDEX ddl_test_index; -- show that sequences owned by mx tables result in unique values SET citus.shard_replication_factor TO 1; SET citus.shard_count TO 4; SET citus.replication_model TO streaming; CREATE TABLE mx_sequence(key INT, value BIGSERIAL); SELECT create_distributed_table('mx_sequence', 'key'); create_distributed_table -------------------------- (1 row) \c - - - :worker_1_port SELECT last_value AS worker_1_lastval FROM mx_sequence_value_seq \gset \c - - - :worker_2_port SELECT last_value AS worker_2_lastval FROM mx_sequence_value_seq \gset \c - - - :master_port -- don't look at the actual values because they rely on the groupids of the nodes -- which can change depending on the tests which have run before this one SELECT :worker_1_lastval = :worker_2_lastval; ?column? ---------- f (1 row) -- the type of sequences can't be changed ALTER TABLE mx_sequence ALTER value TYPE BIGINT; NOTICE: using one-phase commit for distributed DDL commands HINT: You can enable two-phase commit for extra safety with: SET citus.multi_shard_commit_protocol TO '2pc' ALTER TABLE mx_sequence ALTER value TYPE INT;