mirror of https://github.com/citusdata/citus.git
321 lines
17 KiB
Plaintext
321 lines
17 KiB
Plaintext
--
|
||
-- MULTI_NAME_LENGTHS
|
||
--
|
||
ALTER SEQUENCE pg_catalog.pg_dist_shardid_seq RESTART 225000;
|
||
SET citus.multi_shard_commit_protocol = '2pc';
|
||
SET citus.shard_count TO 2;
|
||
-- 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
|
||
\dt too_long_*
|
||
List of relations
|
||
Schema | Name | Type | Owner
|
||
--------+-----------------------------------------------------------------+-------+----------
|
||
public | too_long_12345678901234567890123456789012345678_e0119164_225000 | table | postgres
|
||
public | too_long_12345678901234567890123456789012345678_e0119164_225001 | table | postgres
|
||
(2 rows)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
-- Verify that the UDF works and rejects bad arguments.
|
||
SELECT shard_name(NULL, 666666);
|
||
shard_name
|
||
------------
|
||
|
||
(1 row)
|
||
|
||
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);
|
||
shard_name
|
||
------------
|
||
|
||
(1 row)
|
||
|
||
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 create_distributed_table('name_lengths', 'col1', 'hash');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(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;
|
||
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 without a name on a distributed table
|
||
ALTER TABLE name_lengths ADD EXCLUDE (int_col_12345678901234567890123456789012345678901234567890 WITH =);
|
||
ERROR: cannot create constraint without a name on a distributed table
|
||
ALTER TABLE name_lengths ADD CHECK (date_col_12345678901234567890123456789012345678901234567890 > '2014-01-01'::date);
|
||
ERROR: cannot create constraint without a name on a distributed table
|
||
\c - - - :worker_1_port
|
||
SELECT "Column", "Type", "Modifiers" FROM table_desc WHERE relid='public.name_lengths_225002'::regclass;
|
||
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
|
||
(5 rows)
|
||
|
||
\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 on "name_lengths"
|
||
DETAIL: Distributed relations cannot have UNIQUE, EXCLUDE, or PRIMARY KEY constraints that do not include the partition column (with an equality operator if EXCLUDE).
|
||
ALTER TABLE name_lengths ADD CONSTRAINT nl_exclude_12345678901234567890123456789012345678901234567890 EXCLUDE (int_col_12345678901234567890123456789012345678901234567890 WITH =);
|
||
ERROR: cannot create constraint on "name_lengths"
|
||
DETAIL: Distributed relations cannot have UNIQUE, EXCLUDE, or PRIMARY KEY constraints that do not include the partition column (with an equality operator if EXCLUDE).
|
||
ALTER TABLE name_lengths ADD CONSTRAINT nl_checky_12345678901234567890123456789012345678901234567890 CHECK (date_col_12345678901234567890123456789012345678901234567890 >= '2014-01-01'::date);
|
||
\c - - - :worker_1_port
|
||
SELECT "Constraint", "Definition" FROM table_checks WHERE relid='public.name_lengths_225002'::regclass;
|
||
Constraint | Definition
|
||
-----------------------------------------------------------------+-------------------------------------------------------------------------------------------
|
||
nl_checky_1234567890123456789012345678901234567_b16df46d_225002 | CHECK (date_col_12345678901234567890123456789012345678901234567890 >= '01-01-2014'::date)
|
||
(1 row)
|
||
|
||
\c - - - :master_port
|
||
-- Placeholders for RENAME operations
|
||
ALTER TABLE name_lengths RENAME TO name_len_12345678901234567890123456789012345678901234567890;
|
||
ERROR: shard name name_len_12345678901234567890123456789012345678_fcd8ab6f_225002 exceeds 63 characters
|
||
CONTEXT: while executing command on localhost:57638
|
||
ALTER TABLE name_lengths RENAME CONSTRAINT unique_12345678901234567890123456789012345678901234567890 TO unique2_12345678901234567890123456789012345678901234567890;
|
||
ERROR: renaming constraints belonging to distributed tables is currently unsupported
|
||
-- Verify that CREATE INDEX on already distributed table has proper shard names.
|
||
CREATE INDEX tmp_idx_12345678901234567890123456789012345678901234567890 ON name_lengths(col2);
|
||
\c - - - :worker_1_port
|
||
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
||
relname LIKE 'tmp_idx_%';
|
||
relname | Column | Type | Definition
|
||
-----------------------------------------------------------------+--------+---------+------------
|
||
tmp_idx_123456789012345678901234567890123456789_5e470afa_225003 | col2 | integer | col2
|
||
tmp_idx_123456789012345678901234567890123456789_5e470afa_225002 | col2 | integer | col2
|
||
(2 rows)
|
||
|
||
\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"
|
||
\c - - - :worker_1_port
|
||
SELECT "relname", "Column", "Type", "Definition" FROM index_attrs WHERE
|
||
relname LIKE 'tmp_idx_%';
|
||
relname | Column | Type | Definition
|
||
-----------------------------------------------------------------+--------+---------+------------
|
||
tmp_idx_123456789012345678901234567890123456789_5e470afa_225003 | col2 | integer | col2
|
||
tmp_idx_123456789012345678901234567890123456789_5e470afa_225002 | col2 | integer | col2
|
||
tmp_idx_123456789012345678901234567890123456789_599636aa_225003 | col2 | integer | col2
|
||
tmp_idx_123456789012345678901234567890123456789_599636aa_225002 | col2 | integer | col2
|
||
(4 rows)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
-- 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 create_distributed_table('sneaky_name_lengths', 'col1', 'hash');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(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)
|
||
);
|
||
\di public.sneaky_name_lengths*
|
||
List of relations
|
||
Schema | Name | Type | Owner | Table
|
||
--------+-----------------------------------------------------------------+-------+----------+---------------------
|
||
public | sneaky_name_lengths_int_col_1234567890123456789012345678901_key | index | postgres | sneaky_name_lengths
|
||
(1 row)
|
||
|
||
SELECT "Constraint", "Definition" FROM table_checks WHERE relid='public.sneaky_name_lengths'::regclass;
|
||
Constraint | Definition
|
||
-----------------------------------------------------------+------------------------------------------------------------------------------
|
||
checky_12345678901234567890123456789012345678901234567890 | CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100)
|
||
(1 row)
|
||
|
||
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
|
||
\di public.sneaky*225006
|
||
List of relations
|
||
Schema | Name | Type | Owner | Table
|
||
--------+-----------------------------------------------------------------+-------+----------+----------------------------
|
||
public | sneaky_name_lengths_int_col_1234567890123456789_6402d2cd_225006 | index | postgres | sneaky_name_lengths_225006
|
||
(1 row)
|
||
|
||
SELECT "Constraint", "Definition" FROM table_checks WHERE relid='public.sneaky_name_lengths_225006'::regclass;
|
||
Constraint | Definition
|
||
-----------------------------------------------------------+------------------------------------------------------------------------------
|
||
checky_12345678901234567890123456789012345678901234567890 | CHECK (int_col_123456789012345678901234567890123456789012345678901234 > 100)
|
||
(1 row)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
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 create_distributed_table('sneaky_name_lengths', 'col1', 'hash');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(1 row)
|
||
|
||
\c - - - :worker_1_port
|
||
\di unique*225008
|
||
List of relations
|
||
Schema | Name | Type | Owner | Table
|
||
--------+-----------------------------------------------------------------+-------+----------+----------------------------
|
||
public | unique_1234567890123456789012345678901234567890_a5986f27_225008 | index | postgres | sneaky_name_lengths_225008
|
||
(1 row)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
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 create_distributed_table('too_long_12345678901234567890123456789012345678901234567890', 'col1', 'hash');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(1 row)
|
||
|
||
\c - - - :worker_1_port
|
||
\dt *225000000000*
|
||
List of relations
|
||
Schema | Name | Type | Owner
|
||
--------+-----------------------------------------------------------------+-------+----------
|
||
public | too_long_1234567890123456789012345678901_e0119164_2250000000000 | table | postgres
|
||
public | too_long_1234567890123456789012345678901_e0119164_2250000000001 | table | postgres
|
||
(2 rows)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
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 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');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(1 row)
|
||
|
||
-- Verify that quoting is used in shard_name
|
||
SELECT shard_name(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 '!'::regclass, min(shardid))
|
||
FROM pg_dist_shard
|
||
WHERE logicalrelid = 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 '!'::regclass;
|
||
shard_name
|
||
---------------------------------------------------
|
||
"elephant_слонслонслонсло_c8b737c2_2250000000002"
|
||
(1 row)
|
||
|
||
\c - - - :worker_1_port
|
||
\dt public.elephant_*
|
||
List of relations
|
||
Schema | Name | Type | Owner
|
||
--------+-------------------------------------------------+-------+----------
|
||
public | elephant_слонслонслонсло_c8b737c2_2250000000002 | table | postgres
|
||
public | elephant_слонслонслонсло_c8b737c2_2250000000003 | table | postgres
|
||
(2 rows)
|
||
|
||
\di public.elephant_*
|
||
List of relations
|
||
Schema | Name | Type | Owner | Table
|
||
--------+-------------------------------------------------+-------+----------+-------------------------------------------------
|
||
public | elephant_слонслонслонсло_14d34928_2250000000002 | index | postgres | elephant_слонслонслонсло_c8b737c2_2250000000002
|
||
public | elephant_слонслонслонсло_14d34928_2250000000003 | index | postgres | elephant_слонслонслонсло_c8b737c2_2250000000003
|
||
(2 rows)
|
||
|
||
\c - - - :master_port
|
||
SET citus.shard_count TO 2;
|
||
SET citus.shard_replication_factor TO 2;
|
||
-- Verify that shard_name UDF supports schemas
|
||
CREATE SCHEMA multi_name_lengths;
|
||
CREATE TABLE multi_name_lengths.too_long_12345678901234567890123456789012345678901234567890 (
|
||
col1 integer not null,
|
||
col2 integer not null);
|
||
SELECT create_distributed_table('multi_name_lengths.too_long_12345678901234567890123456789012345678901234567890', 'col1', 'hash');
|
||
create_distributed_table
|
||
--------------------------
|
||
|
||
(1 row)
|
||
|
||
SELECT shard_name('multi_name_lengths.too_long_12345678901234567890123456789012345678901234567890'::regclass, min(shardid))
|
||
FROM pg_dist_shard
|
||
WHERE logicalrelid = 'multi_name_lengths.too_long_12345678901234567890123456789012345678901234567890'::regclass;
|
||
shard_name
|
||
------------------------------------------------------------------------------------
|
||
multi_name_lengths.too_long_1234567890123456789012345678901_e0119164_2250000000004
|
||
(1 row)
|
||
|
||
DROP TABLE multi_name_lengths.too_long_12345678901234567890123456789012345678901234567890;
|
||
-- 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;
|