mirror of https://github.com/citusdata/citus.git
422 lines
16 KiB
Plaintext
422 lines
16 KiB
Plaintext
-- 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);
|
|
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;
|
|
UPDATE mx_ddl_table SET version=0.1 WHERE version IS NULL;
|
|
-- 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)
|
|
|
|
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
|
relname LIKE 'ddl_test%_index';
|
|
relname | Column | Type | Definition
|
|
---------------------------------------------------------------------
|
|
ddl_test_index | value | integer | value
|
|
ddl_test_concurrent_index | value | integer | value
|
|
(2 rows)
|
|
|
|
\c - - - :worker_1_port
|
|
-- make sure we don't break the following tests by hiding the shard names
|
|
SET citus.override_table_visibility TO FALSE;
|
|
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)
|
|
|
|
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
|
relname LIKE 'ddl_test%_index';
|
|
relname | Column | Type | Definition
|
|
---------------------------------------------------------------------
|
|
ddl_test_index | value | integer | value
|
|
ddl_test_concurrent_index | value | integer | value
|
|
(2 rows)
|
|
|
|
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)
|
|
|
|
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
|
relname LIKE 'ddl_test%_index_1220088';
|
|
relname | Column | Type | Definition
|
|
---------------------------------------------------------------------
|
|
ddl_test_index_1220088 | value | integer | value
|
|
ddl_test_concurrent_index_1220088 | value | integer | value
|
|
(2 rows)
|
|
|
|
\c - - - :worker_2_port
|
|
-- make sure we don't break the following tests by hiding the shard names
|
|
SET citus.override_table_visibility TO FALSE;
|
|
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)
|
|
|
|
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
|
relname LIKE 'ddl_test%_index';
|
|
relname | Column | Type | Definition
|
|
---------------------------------------------------------------------
|
|
ddl_test_index | value | integer | value
|
|
ddl_test_concurrent_index | value | integer | value
|
|
(2 rows)
|
|
|
|
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)
|
|
|
|
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
|
relname LIKE 'ddl_test%_index_1220089';
|
|
relname | Column | Type | Definition
|
|
---------------------------------------------------------------------
|
|
ddl_test_index_1220089 | value | integer | value
|
|
ddl_test_concurrent_index_1220089 | value | integer | value
|
|
(2 rows)
|
|
|
|
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;
|
|
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;
|
|
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
|
|
CREATE INDEX ddl_test_index ON mx_ddl_table(value);
|
|
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;
|
|
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;
|
|
ERROR: cannot execute ALTER COLUMN TYPE .. command because the column involves a default coming from a sequence
|
|
ALTER TABLE mx_sequence ALTER value TYPE INT;
|
|
ERROR: cannot execute ALTER COLUMN TYPE .. command because the column involves a default coming from a sequence
|
|
-- test distributed tables owned by extension
|
|
CREATE TABLE seg_test (x int);
|
|
INSERT INTO seg_test VALUES (42);
|
|
-- pretend this table belongs to an extension
|
|
CREATE EXTENSION seg;
|
|
ALTER EXTENSION seg ADD TABLE seg_test;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
\c - - - :worker_1_port
|
|
-- pretend the extension created the table on the worker as well
|
|
CREATE TABLE seg_test (x int);
|
|
ALTER EXTENSION seg ADD TABLE seg_test;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
\c - - - :worker_2_port
|
|
-- pretend the extension created the table on the worker as well
|
|
CREATE TABLE seg_test (x int);
|
|
ALTER EXTENSION seg ADD TABLE seg_test;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
\c - - - :master_port
|
|
-- sync table metadata, but skip CREATE TABLE
|
|
SET citus.shard_replication_factor TO 1;
|
|
SET citus.shard_count TO 4;
|
|
SELECT create_distributed_table('seg_test', 'x');
|
|
NOTICE: Copying data from local table...
|
|
NOTICE: copying the data has completed
|
|
DETAIL: The local data in the table is no longer visible, but is still on disk.
|
|
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$public.seg_test$$)
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
\c - - - :worker_1_port
|
|
-- should be able to see contents from worker
|
|
SELECT * FROM seg_test;
|
|
x
|
|
---------------------------------------------------------------------
|
|
42
|
|
(1 row)
|
|
|
|
\c - - - :master_port
|
|
-- test metadata sync in the presence of an extension-owned table
|
|
SELECT start_metadata_sync_to_node('localhost', :worker_1_port);
|
|
start_metadata_sync_to_node
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
\c - - - :worker_1_port
|
|
-- should be able to see contents from worker
|
|
SELECT * FROM seg_test;
|
|
x
|
|
---------------------------------------------------------------------
|
|
42
|
|
(1 row)
|
|
|
|
\c - - - :master_port
|
|
CREATE SCHEMA ext_owned_tables;
|
|
SET search_path TO ext_owned_tables;
|
|
CREATE sequence my_seq_ext_1;
|
|
SELECT run_command_on_workers($$CREATE sequence ext_owned_tables.my_seq_ext_1;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"CREATE SEQUENCE")
|
|
(localhost,57638,t,"CREATE SEQUENCE")
|
|
(2 rows)
|
|
|
|
CREATE sequence my_seq_ext_2;
|
|
SELECT run_command_on_workers($$CREATE sequence ext_owned_tables.my_seq_ext_2;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"CREATE SEQUENCE")
|
|
(localhost,57638,t,"CREATE SEQUENCE")
|
|
(2 rows)
|
|
|
|
-- test distributed tables owned by extension
|
|
CREATE TABLE seg_test (x int, y bigserial, z int default nextval('my_seq_ext_1'));
|
|
SELECT run_command_on_workers($$CREATE TABLE ext_owned_tables.seg_test (x int, y bigserial, z int default nextval('ext_owned_tables.my_seq_ext_1'))$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"CREATE TABLE")
|
|
(localhost,57638,t,"CREATE TABLE")
|
|
(2 rows)
|
|
|
|
INSERT INTO seg_test VALUES (42);
|
|
CREATE TABLE tcn_test (x int, y bigserial, z int default nextval('my_seq_ext_2'));
|
|
SELECT run_command_on_workers($$CREATE TABLE ext_owned_tables.tcn_test (x int, y bigserial, z int default nextval('ext_owned_tables.my_seq_ext_2'));$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"CREATE TABLE")
|
|
(localhost,57638,t,"CREATE TABLE")
|
|
(2 rows)
|
|
|
|
INSERT INTO tcn_test VALUES (42);
|
|
-- pretend this table belongs to an extension
|
|
ALTER EXTENSION seg ADD TABLE ext_owned_tables.seg_test;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
ALTER EXTENSION seg ADD SEQUENCE ext_owned_tables.my_seq_ext_1;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
SELECT run_command_on_workers($$ALTER EXTENSION seg ADD TABLE ext_owned_tables.seg_test;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"ALTER EXTENSION")
|
|
(localhost,57638,t,"ALTER EXTENSION")
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers($$ALTER EXTENSION seg ADD SEQUENCE ext_owned_tables.my_seq_ext_1;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"ALTER EXTENSION")
|
|
(localhost,57638,t,"ALTER EXTENSION")
|
|
(2 rows)
|
|
|
|
CREATE EXTENSION tcn;
|
|
ALTER EXTENSION tcn ADD TABLE ext_owned_tables.tcn_test;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
ALTER EXTENSION tcn ADD SEQUENCE ext_owned_tables.my_seq_ext_2;
|
|
NOTICE: Citus does not propagate adding/dropping member objects
|
|
HINT: You can add/drop the member objects on the workers as well.
|
|
SELECT run_command_on_workers($$ALTER EXTENSION tcn ADD TABLE ext_owned_tables.tcn_test;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"ALTER EXTENSION")
|
|
(localhost,57638,t,"ALTER EXTENSION")
|
|
(2 rows)
|
|
|
|
SELECT run_command_on_workers($$ALTER EXTENSION tcn ADD SEQUENCE ext_owned_tables.my_seq_ext_2;$$);
|
|
run_command_on_workers
|
|
---------------------------------------------------------------------
|
|
(localhost,57637,t,"ALTER EXTENSION")
|
|
(localhost,57638,t,"ALTER EXTENSION")
|
|
(2 rows)
|
|
|
|
SELECT create_reference_table('seg_test');
|
|
NOTICE: Copying data from local table...
|
|
NOTICE: copying the data has completed
|
|
DETAIL: The local data in the table is no longer visible, but is still on disk.
|
|
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$ext_owned_tables.seg_test$$)
|
|
create_reference_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT create_distributed_table('tcn_test', 'x');
|
|
NOTICE: Copying data from local table...
|
|
NOTICE: copying the data has completed
|
|
DETAIL: The local data in the table is no longer visible, but is still on disk.
|
|
HINT: To remove the local data, run: SELECT truncate_local_data_after_distributing_table($$ext_owned_tables.tcn_test$$)
|
|
create_distributed_table
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- test metadata re-sync in the presence of an extension-owned table
|
|
-- and serial/sequences
|
|
SELECT start_metadata_sync_to_node('localhost', :worker_1_port);
|
|
start_metadata_sync_to_node
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT start_metadata_sync_to_node('localhost', :worker_1_port);
|
|
start_metadata_sync_to_node
|
|
---------------------------------------------------------------------
|
|
|
|
(1 row)
|
|
|
|
-- also drops table on both worker and master
|
|
SET client_min_messages TO ERROR;
|
|
DROP SCHEMA ext_owned_tables CASCADE;
|