diff --git a/src/test/regress/expected/generated_identity.out b/src/test/regress/expected/generated_identity.out index 65ea4d7c1..0baf0d31d 100644 --- a/src/test/regress/expected/generated_identity.out +++ b/src/test/regress/expected/generated_identity.out @@ -1,3 +1,4 @@ +-- This test file has an alternative output because of error messages vary for PG13 CREATE SCHEMA generated_identities; SET search_path TO generated_identities; SET client_min_messages to ERROR; diff --git a/src/test/regress/expected/generated_identity_0.out b/src/test/regress/expected/generated_identity_0.out new file mode 100644 index 000000000..fff175e42 --- /dev/null +++ b/src/test/regress/expected/generated_identity_0.out @@ -0,0 +1,402 @@ +-- This test file has an alternative output because of error messages vary for PG13 +CREATE SCHEMA generated_identities; +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +SET citus.shard_replication_factor TO 1; +SELECT 1 from citus_add_node('localhost', :master_port, groupId=>0); + ?column? +--------------------------------------------------------------------- + 1 +(1 row) + +-- smallint identity column can not be distributed +CREATE TABLE smallint_identity_column ( + a smallint GENERATED BY DEFAULT AS IDENTITY +); +SELECT create_distributed_table('smallint_identity_column', 'a'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT create_distributed_table_concurrently('smallint_identity_column', 'a'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT create_reference_table('smallint_identity_column'); +ERROR: cannot complete operation on a table with identity column +SELECT citus_add_local_table_to_metadata('smallint_identity_column'); + citus_add_local_table_to_metadata +--------------------------------------------------------------------- + +(1 row) + +DROP TABLE smallint_identity_column; +-- int identity column can not be distributed +CREATE TABLE int_identity_column ( + a int GENERATED BY DEFAULT AS IDENTITY +); +SELECT create_distributed_table('int_identity_column', 'a'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT create_distributed_table_concurrently('int_identity_column', 'a'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT create_reference_table('int_identity_column'); +ERROR: cannot complete operation on a table with identity column +SELECT citus_add_local_table_to_metadata('int_identity_column'); + citus_add_local_table_to_metadata +--------------------------------------------------------------------- + +(1 row) + +DROP TABLE int_identity_column; +RESET citus.shard_replication_factor; +CREATE TABLE bigint_identity_column ( + a bigint GENERATED BY DEFAULT AS IDENTITY, + b int +); +SELECT citus_add_local_table_to_metadata('bigint_identity_column'); + citus_add_local_table_to_metadata +--------------------------------------------------------------------- + +(1 row) + +DROP TABLE bigint_identity_column; +CREATE TABLE bigint_identity_column ( + a bigint GENERATED BY DEFAULT AS IDENTITY, + b int +); +SELECT create_distributed_table('bigint_identity_column', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +\d bigint_identity_column + Table "generated_identities.bigint_identity_column" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | integer | | | + +\c - - - :worker_1_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +INSERT INTO bigint_identity_column (b) +SELECT s FROM generate_series(1,10) s; +\d generated_identities.bigint_identity_column + Table "generated_identities.bigint_identity_column" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | integer | | | + +\c - - - :master_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +INSERT INTO bigint_identity_column (b) +SELECT s FROM generate_series(11,20) s; +SELECT * FROM bigint_identity_column ORDER BY B ASC; + a | b +--------------------------------------------------------------------- + 3940649673949185 | 1 + 3940649673949186 | 2 + 3940649673949187 | 3 + 3940649673949188 | 4 + 3940649673949189 | 5 + 3940649673949190 | 6 + 3940649673949191 | 7 + 3940649673949192 | 8 + 3940649673949193 | 9 + 3940649673949194 | 10 + 1 | 11 + 2 | 12 + 3 | 13 + 4 | 14 + 5 | 15 + 6 | 16 + 7 | 17 + 8 | 18 + 9 | 19 + 10 | 20 +(20 rows) + +-- table with identity column cannot be altered. +SELECT alter_distributed_table('bigint_identity_column', 'b'); +ERROR: cannot complete operation on a table with identity column +-- table with identity column cannot be undistributed. +SELECT undistribute_table('bigint_identity_column'); +ERROR: cannot complete operation on a table with identity column +DROP TABLE bigint_identity_column; +-- create a partitioned table for testing. +CREATE TABLE partitioned_table ( + a bigint CONSTRAINT myconname GENERATED BY DEFAULT AS IDENTITY (START WITH 10 INCREMENT BY 10), + b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), + c int +) +PARTITION BY RANGE (c); +CREATE TABLE partitioned_table_1_50 PARTITION OF partitioned_table FOR VALUES FROM (1) TO (50); +CREATE TABLE partitioned_table_50_500 PARTITION OF partitioned_table FOR VALUES FROM (50) TO (1000); +SELECT create_distributed_table('partitioned_table', 'a'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +\d partitioned_table + Partitioned table "generated_identities.partitioned_table" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | bigint | | not null | generated always as identity + c | integer | | | +Partition key: RANGE (c) +Number of partitions: 2 (Use \d+ to list them.) + +\c - - - :worker_1_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +\d generated_identities.partitioned_table + Partitioned table "generated_identities.partitioned_table" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | bigint | | not null | generated always as identity + c | integer | | | +Partition key: RANGE (c) +Number of partitions: 2 (Use \d+ to list them.) + +insert into partitioned_table (c) values (1); +insert into partitioned_table (c) SELECT 2; +INSERT INTO partitioned_table (c) +SELECT s FROM generate_series(3,7) s; +\c - - - :master_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +INSERT INTO partitioned_table (c) +SELECT s FROM generate_series(10,20) s; +INSERT INTO partitioned_table (a,c) VALUES (998,998); +INSERT INTO partitioned_table (a,b,c) OVERRIDING SYSTEM VALUE VALUES (999,999,999); +SELECT * FROM partitioned_table ORDER BY c ASC; + a | b | c +--------------------------------------------------------------------- + 3940649673949185 | 3940649673949185 | 1 + 3940649673949195 | 3940649673949195 | 2 + 3940649673949205 | 3940649673949205 | 3 + 3940649673949215 | 3940649673949215 | 4 + 3940649673949225 | 3940649673949225 | 5 + 3940649673949235 | 3940649673949235 | 6 + 3940649673949245 | 3940649673949245 | 7 + 10 | 10 | 10 + 20 | 20 | 11 + 30 | 30 | 12 + 40 | 40 | 13 + 50 | 50 | 14 + 60 | 60 | 15 + 70 | 70 | 16 + 80 | 80 | 17 + 90 | 90 | 18 + 100 | 100 | 19 + 110 | 110 | 20 + 998 | 120 | 998 + 999 | 999 | 999 +(20 rows) + +-- alter table .. alter column .. add is unsupported +ALTER TABLE partitioned_table ALTER COLUMN g ADD GENERATED ALWAYS AS IDENTITY; +ERROR: alter table command is currently unsupported +DETAIL: Only ADD|DROP COLUMN, SET|DROP NOT NULL, SET|DROP DEFAULT, ADD|DROP|VALIDATE CONSTRAINT, SET (), RESET (), ENABLE|DISABLE|NO FORCE|FORCE ROW LEVEL SECURITY, ATTACH|DETACH PARTITION and TYPE subcommands are supported. +-- alter table .. alter column is unsupported +ALTER TABLE partitioned_table ALTER COLUMN b TYPE int; +ERROR: cannot execute ALTER COLUMN command involving identity column +DROP TABLE partitioned_table; +-- create a table for reference table testing. +CREATE TABLE reference_table ( + a bigint CONSTRAINT myconname GENERATED BY DEFAULT AS IDENTITY (START WITH 10 INCREMENT BY 10), + b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10) UNIQUE, + c int +); +SELECT create_reference_table('reference_table'); + create_reference_table +--------------------------------------------------------------------- + +(1 row) + +\d reference_table + Table "generated_identities.reference_table" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | bigint | | not null | generated always as identity + c | integer | | | +Indexes: + "reference_table_b_key" UNIQUE CONSTRAINT, btree (b) + +\c - - - :worker_1_port +SET search_path TO generated_identities; +\d generated_identities.reference_table + Table "generated_identities.reference_table" + Column | Type | Collation | Nullable | Default +--------------------------------------------------------------------- + a | bigint | | not null | generated by default as identity + b | bigint | | not null | generated always as identity + c | integer | | | +Indexes: + "reference_table_b_key" UNIQUE CONSTRAINT, btree (b) + +INSERT INTO reference_table (c) +SELECT s FROM generate_series(1,10) s; +--on master +select * from reference_table; + a | b | c +--------------------------------------------------------------------- + 3940649673949185 | 3940649673949185 | 1 + 3940649673949195 | 3940649673949195 | 2 + 3940649673949205 | 3940649673949205 | 3 + 3940649673949215 | 3940649673949215 | 4 + 3940649673949225 | 3940649673949225 | 5 + 3940649673949235 | 3940649673949235 | 6 + 3940649673949245 | 3940649673949245 | 7 + 3940649673949255 | 3940649673949255 | 8 + 3940649673949265 | 3940649673949265 | 9 + 3940649673949275 | 3940649673949275 | 10 +(10 rows) + +\c - - - :master_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +INSERT INTO reference_table (c) +SELECT s FROM generate_series(11,20) s; +SELECT * FROM reference_table ORDER BY c ASC; + a | b | c +--------------------------------------------------------------------- + 3940649673949185 | 3940649673949185 | 1 + 3940649673949195 | 3940649673949195 | 2 + 3940649673949205 | 3940649673949205 | 3 + 3940649673949215 | 3940649673949215 | 4 + 3940649673949225 | 3940649673949225 | 5 + 3940649673949235 | 3940649673949235 | 6 + 3940649673949245 | 3940649673949245 | 7 + 3940649673949255 | 3940649673949255 | 8 + 3940649673949265 | 3940649673949265 | 9 + 3940649673949275 | 3940649673949275 | 10 + 10 | 10 | 11 + 20 | 20 | 12 + 30 | 30 | 13 + 40 | 40 | 14 + 50 | 50 | 15 + 60 | 60 | 16 + 70 | 70 | 17 + 80 | 80 | 18 + 90 | 90 | 19 + 100 | 100 | 20 +(20 rows) + +DROP TABLE reference_table; +CREATE TABLE color ( + color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, + color_name VARCHAR NOT NULL +); +-- https://github.com/citusdata/citus/issues/6694 +CREATE USER identity_test_user; +GRANT INSERT ON color TO identity_test_user; +GRANT USAGE ON SCHEMA generated_identities TO identity_test_user; +SET ROLE identity_test_user; +SELECT create_distributed_table('color', 'color_id'); +ERROR: must be owner of table color +SET ROLE postgres; +SET citus.shard_replication_factor TO 1; +SELECT create_distributed_table_concurrently('color', 'color_id'); + create_distributed_table_concurrently +--------------------------------------------------------------------- + +(1 row) + +RESET citus.shard_replication_factor; +\c - identity_test_user - :worker_1_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +INSERT INTO color(color_name) VALUES ('Blue'); +\c - postgres - :master_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +DROP TABLE Color; +CREATE TABLE color ( + color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, + color_name VARCHAR NOT NULL +) USING columnar; +SELECT create_distributed_table('color', 'color_id'); + create_distributed_table +--------------------------------------------------------------------- + +(1 row) + +INSERT INTO color(color_name) VALUES ('Blue'); +\d+ color + Table "generated_identities.color" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------------------------------------------------------------------- + color_id | bigint | | not null | generated always as identity | plain | | + color_name | character varying | | not null | | extended | | +Indexes: + "color_color_id_key" UNIQUE CONSTRAINT, btree (color_id) + +\c - - - :worker_1_port +SET search_path TO generated_identities; +\d+ color + Table "generated_identities.color" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------------------------------------------------------------------- + color_id | bigint | | not null | generated always as identity | plain | | + color_name | character varying | | not null | | extended | | +Indexes: + "color_color_id_key" UNIQUE CONSTRAINT, btree (color_id) + +INSERT INTO color(color_name) VALUES ('Red'); +-- alter sequence .. restart +ALTER SEQUENCE color_color_id_seq RESTART WITH 1000; +ERROR: Altering a distributed sequence is currently not supported. +-- override system value +INSERT INTO color(color_id, color_name) VALUES (1, 'Red'); +ERROR: cannot insert a non-DEFAULT value into column "color_id" +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO color(color_id, color_name) VALUES (NULL, 'Red'); +ERROR: cannot insert a non-DEFAULT value into column "color_id" +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO color(color_id, color_name) OVERRIDING SYSTEM VALUE VALUES (1, 'Red'); +ERROR: duplicate key value violates unique constraint "color_color_id_key_xxxxxx" +DETAIL: Key (color_id)=(1) already exists. +CONTEXT: while executing command on localhost:xxxxx +-- update null or custom value +UPDATE color SET color_id = NULL; +ERROR: column "color_id" can only be updated to DEFAULT +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +UPDATE color SET color_id = 1; +ERROR: column "color_id" can only be updated to DEFAULT +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +\c - postgres - :master_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; +-- alter table .. add column .. GENERATED .. AS IDENTITY +ALTER TABLE color ADD COLUMN color_id BIGINT GENERATED ALWAYS AS IDENTITY; +ERROR: cannot execute ADD COLUMN commands involving identity columns when metadata is synchronized to workers +-- alter sequence .. restart +ALTER SEQUENCE color_color_id_seq RESTART WITH 1000; +ERROR: Altering a distributed sequence is currently not supported. +-- override system value +INSERT INTO color(color_id, color_name) VALUES (1, 'Red'); +ERROR: cannot insert a non-DEFAULT value into column "color_id" +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO color(color_id, color_name) VALUES (NULL, 'Red'); +ERROR: cannot insert a non-DEFAULT value into column "color_id" +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO color(color_id, color_name) OVERRIDING SYSTEM VALUE VALUES (1, 'Red'); +ERROR: duplicate key value violates unique constraint "color_color_id_key_xxxxxx" +DETAIL: Key (color_id)=(1) already exists. +CONTEXT: while executing command on localhost:xxxxx +-- update null or custom value +UPDATE color SET color_id = NULL; +ERROR: column "color_id" can only be updated to DEFAULT +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +UPDATE color SET color_id = 1; +ERROR: column "color_id" can only be updated to DEFAULT +DETAIL: Column "color_id" is an identity column defined as GENERATED ALWAYS. +DROP SCHEMA generated_identities CASCADE; +DROP USER identity_test_user; \ No newline at end of file diff --git a/src/test/regress/sql/generated_identity.sql b/src/test/regress/sql/generated_identity.sql index fe7de1f69..ad43ee695 100644 --- a/src/test/regress/sql/generated_identity.sql +++ b/src/test/regress/sql/generated_identity.sql @@ -1,3 +1,5 @@ +-- This test file has an alternative output because of error messages vary for PG13 + CREATE SCHEMA generated_identities; SET search_path TO generated_identities; SET client_min_messages to ERROR;