-- -- MULTI_NAME_LENGTHS -- ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 225000; ALTER SEQUENCE pg_catalog.pg_dist_jobid_seq RESTART 225000; SET citus.multi_shard_commit_protocol = '2pc'; -- Verify that a table name > 56 characters gets hashed properly. CREATE TABLE too_long_12345678901234567890123456789012345678901234567890 ( col1 integer not null, col2 integer not null); SELECT master_create_distributed_table('too_long_12345678901234567890123456789012345678901234567890', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('too_long_12345678901234567890123456789012345678901234567890', '2', '2'); master_create_worker_shards ----------------------------- (1 row) \c - - - :worker_1_port \d too_long_* Table "public.too_long_12345678901234567890123456789012345678_e0119164_225000" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null Table "public.too_long_12345678901234567890123456789012345678_e0119164_225001" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null \c - - - :master_port -- Verify that the UDF works and rejects bad arguments. SELECT shard_name(NULL, 666666); ERROR: object_name cannot be null SELECT shard_name(0, 666666); ERROR: object_name does not reference a valid relation SELECT shard_name('too_long_12345678901234567890123456789012345678901234567890'::regclass, 666666); shard_name ----------------------------------------------------------------- too_long_12345678901234567890123456789012345678_e0119164_666666 (1 row) SELECT shard_name('too_long_12345678901234567890123456789012345678901234567890'::regclass, NULL); ERROR: shard_id cannot be null SELECT shard_name('too_long_12345678901234567890123456789012345678901234567890'::regclass, -21); ERROR: shard_id cannot be zero or negative value DROP TABLE too_long_12345678901234567890123456789012345678901234567890 CASCADE; -- Table to use for rename checks. CREATE TABLE name_lengths ( col1 integer not null, col2 integer not null, constraint constraint_a UNIQUE (col1) ); SELECT master_create_distributed_table('name_lengths', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('name_lengths', '2', '2'); master_create_worker_shards ----------------------------- (1 row) -- Verify that we CAN add columns with "too-long names", because -- the columns' names are not extended in the corresponding shard tables. ALTER TABLE name_lengths ADD COLUMN float_col_12345678901234567890123456789012345678901234567890 FLOAT; 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 name_lengths ADD COLUMN date_col_12345678901234567890123456789012345678901234567890 DATE; ALTER TABLE name_lengths ADD COLUMN int_col_12345678901234567890123456789012345678901234567890 INTEGER DEFAULT 1; -- Placeholders for unsupported ALTER TABLE to add constraints with implicit names that are likely too long ALTER TABLE name_lengths ADD UNIQUE (float_col_12345678901234567890123456789012345678901234567890); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. ALTER TABLE name_lengths ADD EXCLUDE (int_col_12345678901234567890123456789012345678901234567890 WITH =); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. ALTER TABLE name_lengths ADD CHECK (date_col_12345678901234567890123456789012345678901234567890 > '2014-01-01'::date); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. \c - - - :worker_1_port \d name_lengths_* Table "public.name_lengths_225002" Column | Type | Modifiers --------------------------------------------------------------+------------------+----------- col1 | integer | not null col2 | integer | not null float_col_12345678901234567890123456789012345678901234567890 | double precision | date_col_12345678901234567890123456789012345678901234567890 | date | int_col_12345678901234567890123456789012345678901234567890 | integer | default 1 Indexes: "constraint_a_225002" UNIQUE CONSTRAINT, btree (col1) Table "public.name_lengths_225003" Column | Type | Modifiers --------------------------------------------------------------+------------------+----------- col1 | integer | not null col2 | integer | not null float_col_12345678901234567890123456789012345678901234567890 | double precision | date_col_12345678901234567890123456789012345678901234567890 | date | int_col_12345678901234567890123456789012345678901234567890 | integer | default 1 Indexes: "constraint_a_225003" UNIQUE CONSTRAINT, btree (col1) \c - - - :master_port -- Placeholders for unsupported add constraints with EXPLICIT names that are too long ALTER TABLE name_lengths ADD CONSTRAINT nl_unique_12345678901234567890123456789012345678901234567890 UNIQUE (float_col_12345678901234567890123456789012345678901234567890); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. ALTER TABLE name_lengths ADD CONSTRAINT nl_exclude_12345678901234567890123456789012345678901234567890 EXCLUDE (int_col_12345678901234567890123456789012345678901234567890 WITH =); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. ALTER TABLE name_lengths ADD CONSTRAINT nl_checky_12345678901234567890123456789012345678901234567890 CHECK (date_col_12345678901234567890123456789012345678901234567890 >= '2014-01-01'::date); ERROR: cannot create constraint DETAIL: Citus cannot execute ADD CONSTRAINT command other than ADD CONSTRAINT FOREIGN KEY. \c - - - :worker_1_port \d nl_* \c - - - :master_port -- Placeholders for RENAME operations ALTER TABLE name_lengths RENAME TO name_len_12345678901234567890123456789012345678901234567890; ERROR: renaming distributed tables or their objects is currently unsupported ALTER TABLE name_lengths RENAME CONSTRAINT unique_12345678901234567890123456789012345678901234567890 TO unique2_12345678901234567890123456789012345678901234567890; ERROR: renaming distributed tables or their objects is currently unsupported -- Verify that CREATE INDEX on already distributed table has proper shard names. CREATE INDEX tmp_idx_12345678901234567890123456789012345678901234567890 ON name_lengths(col2); 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' \c - - - :worker_1_port \d tmp_idx_* Index "public.tmp_idx_123456789012345678901234567890123456789_5e470afa_225002" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225002" Index "public.tmp_idx_123456789012345678901234567890123456789_5e470afa_225003" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225003" \c - - - :master_port -- Verify that a new index name > 63 characters is auto-truncated -- by the parser/rewriter before further processing, just as in Postgres. CREATE INDEX tmp_idx_123456789012345678901234567890123456789012345678901234567890 ON name_lengths(col2); NOTICE: identifier "tmp_idx_123456789012345678901234567890123456789012345678901234567890" will be truncated to "tmp_idx_1234567890123456789012345678901234567890123456789012345" 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' \c - - - :worker_1_port \d tmp_idx_* Index "public.tmp_idx_123456789012345678901234567890123456789_599636aa_225002" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225002" Index "public.tmp_idx_123456789012345678901234567890123456789_599636aa_225003" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225003" Index "public.tmp_idx_123456789012345678901234567890123456789_5e470afa_225002" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225002" Index "public.tmp_idx_123456789012345678901234567890123456789_5e470afa_225003" Column | Type | Definition --------+---------+------------ col2 | integer | col2 btree, for table "public.name_lengths_225003" \c - - - :master_port -- Verify that distributed tables with too-long names -- for CHECK constraints are no trouble. CREATE TABLE sneaky_name_lengths ( col1 integer not null, col2 integer not null, int_col_12345678901234567890123456789012345678901234567890 integer not null, CHECK (int_col_12345678901234567890123456789012345678901234567890 > 100) ); SELECT master_create_distributed_table('sneaky_name_lengths', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('sneaky_name_lengths', '2', '2'); master_create_worker_shards ----------------------------- (1 row) DROP TABLE sneaky_name_lengths CASCADE; CREATE TABLE sneaky_name_lengths ( int_col_123456789012345678901234567890123456789012345678901234 integer UNIQUE not null, col2 integer not null, CONSTRAINT checky_12345678901234567890123456789012345678901234567890 CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100) ); \d sneaky_name_lengths* Table "public.sneaky_name_lengths" Column | Type | Modifiers ----------------------------------------------------------------+---------+----------- int_col_123456789012345678901234567890123456789012345678901234 | integer | not null col2 | integer | not null Indexes: "sneaky_name_lengths_int_col_1234567890123456789012345678901_key" UNIQUE CONSTRAINT, btree (int_col_123456789012345678901234567890123456789012345678901234) Check constraints: "checky_12345678901234567890123456789012345678901234567890" CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100) Index "public.sneaky_name_lengths_int_col_1234567890123456789012345678901_key" Column | Type | Definition ----------------------------------------------------------------+---------+---------------------------------------------------------------- int_col_123456789012345678901234567890123456789012345678901234 | integer | int_col_123456789012345678901234567890123456789012345678901234 unique, btree, for table "public.sneaky_name_lengths" SELECT master_create_distributed_table('sneaky_name_lengths', 'int_col_123456789012345678901234567890123456789012345678901234', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('sneaky_name_lengths', '2', '2'); master_create_worker_shards ----------------------------- (1 row) \c - - - :worker_1_port \d sneaky_name_lengths* Table "public.sneaky_name_lengths_225006" Column | Type | Modifiers ----------------------------------------------------------------+---------+----------- int_col_123456789012345678901234567890123456789012345678901234 | integer | not null col2 | integer | not null Indexes: "sneaky_name_lengths_int_col_1234567890123456789_6402d2cd_225006" UNIQUE CONSTRAINT, btree (int_col_123456789012345678901234567890123456789012345678901234) Check constraints: "checky_12345678901234567890123456789012345678901234567890" CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100) Table "public.sneaky_name_lengths_225007" Column | Type | Modifiers ----------------------------------------------------------------+---------+----------- int_col_123456789012345678901234567890123456789012345678901234 | integer | not null col2 | integer | not null Indexes: "sneaky_name_lengths_int_col_1234567890123456789_6402d2cd_225007" UNIQUE CONSTRAINT, btree (int_col_123456789012345678901234567890123456789012345678901234) Check constraints: "checky_12345678901234567890123456789012345678901234567890" CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100) Index "public.sneaky_name_lengths_int_col_1234567890123456789_6402d2cd_225006" Column | Type | Definition ----------------------------------------------------------------+---------+---------------------------------------------------------------- int_col_123456789012345678901234567890123456789012345678901234 | integer | int_col_123456789012345678901234567890123456789012345678901234 unique, btree, for table "public.sneaky_name_lengths_225006" Index "public.sneaky_name_lengths_int_col_1234567890123456789_6402d2cd_225007" Column | Type | Definition ----------------------------------------------------------------+---------+---------------------------------------------------------------- int_col_123456789012345678901234567890123456789012345678901234 | integer | int_col_123456789012345678901234567890123456789012345678901234 unique, btree, for table "public.sneaky_name_lengths_225007" \c - - - :master_port DROP TABLE sneaky_name_lengths CASCADE; -- verify that named constraint with too-long name gets hashed properly CREATE TABLE sneaky_name_lengths ( col1 integer not null, col2 integer not null, int_col_12345678901234567890123456789012345678901234567890 integer not null, constraint unique_12345678901234567890123456789012345678901234567890 UNIQUE (col1) ); SELECT master_create_distributed_table('sneaky_name_lengths', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('sneaky_name_lengths', '2', '2'); master_create_worker_shards ----------------------------- (1 row) \c - - - :worker_1_port \d sneaky_name_lengths* Table "public.sneaky_name_lengths_225008" Column | Type | Modifiers ------------------------------------------------------------+---------+----------- col1 | integer | not null col2 | integer | not null int_col_12345678901234567890123456789012345678901234567890 | integer | not null Indexes: "unique_1234567890123456789012345678901234567890_a5986f27_225008" UNIQUE CONSTRAINT, btree (col1) Table "public.sneaky_name_lengths_225009" Column | Type | Modifiers ------------------------------------------------------------+---------+----------- col1 | integer | not null col2 | integer | not null int_col_12345678901234567890123456789012345678901234567890 | integer | not null Indexes: "unique_1234567890123456789012345678901234567890_a5986f27_225009" UNIQUE CONSTRAINT, btree (col1) \c - - - :master_port DROP TABLE sneaky_name_lengths CASCADE; -- Verify that much larger shardIds are handled properly ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 2250000000000; CREATE TABLE too_long_12345678901234567890123456789012345678901234567890 ( col1 integer not null, col2 integer not null); SELECT master_create_distributed_table('too_long_12345678901234567890123456789012345678901234567890', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards('too_long_12345678901234567890123456789012345678901234567890', '2', '2'); master_create_worker_shards ----------------------------- (1 row) \c - - - :worker_1_port \d too_long_* Table "public.too_long_1234567890123456789012345678901_e0119164_2250000000000" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null Table "public.too_long_1234567890123456789012345678901_e0119164_2250000000001" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null \c - - - :master_port DROP TABLE too_long_12345678901234567890123456789012345678901234567890 CASCADE; -- Verify that multi-byte boundaries are respected for databases with UTF8 encoding. CREATE TABLE U&"elephant_!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D" UESCAPE '!' ( col1 integer not null PRIMARY KEY, col2 integer not null); SELECT master_create_distributed_table(U&'elephant_!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D' UESCAPE '!', 'col1', 'hash'); master_create_distributed_table --------------------------------- (1 row) SELECT master_create_worker_shards(U&'elephant_!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D' UESCAPE '!', '2', '2'); master_create_worker_shards ----------------------------- (1 row) \c - - - :worker_1_port \d elephant_* Index "public.elephant_слонслонслонсло_14d34928_2250000000002" Column | Type | Definition --------+---------+------------ col1 | integer | col1 primary key, btree, for table "public.elephant_слонслонслонсло_c8b737c2_2250000000002" Index "public.elephant_слонслонслонсло_14d34928_2250000000003" Column | Type | Definition --------+---------+------------ col1 | integer | col1 primary key, btree, for table "public.elephant_слонслонслонсло_c8b737c2_2250000000003" Table "public.elephant_слонслонслонсло_c8b737c2_2250000000002" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null Indexes: "elephant_слонслонслонсло_14d34928_2250000000002" PRIMARY KEY, btree (col1) Table "public.elephant_слонслонслонсло_c8b737c2_2250000000003" Column | Type | Modifiers --------+---------+----------- col1 | integer | not null col2 | integer | not null Indexes: "elephant_слонслонслонсло_14d34928_2250000000003" PRIMARY KEY, btree (col1) \c - - - :master_port -- Clean up. DROP TABLE name_lengths CASCADE; DROP TABLE U&"elephant_!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D!0441!043B!043E!043D" UESCAPE '!' CASCADE;