diff --git a/src/test/regress/expected/generated_identity.out b/src/test/regress/expected/generated_identity.out index 23a87af3d..07e3e674d 100644 --- a/src/test/regress/expected/generated_identity.out +++ b/src/test/regress/expected/generated_identity.out @@ -7,334 +7,283 @@ SELECT 1 from citus_add_node('localhost', :master_port, groupId=>0); 1 (1 row) -DROP TABLE IF EXISTS generated_identities_test; --- create a partitioned table for testing. -CREATE TABLE generated_identities_test ( - a int CONSTRAINT myconname GENERATED BY DEFAULT AS IDENTITY, - b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), - c smallint GENERATED BY DEFAULT AS IDENTITY, - d serial, - e bigserial, - f smallserial, - g int -) -PARTITION BY RANGE (a); -CREATE TABLE generated_identities_test_1_5 PARTITION OF generated_identities_test FOR VALUES FROM (1) TO (5); -CREATE TABLE generated_identities_test_5_50 PARTITION OF generated_identities_test FOR VALUES FROM (5) TO (50); --- local tables -SELECT citus_add_local_table_to_metadata('generated_identities_test'); +-- 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_reference_table('smallint_identity_column'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT citus_add_local_table_to_metadata('smallint_identity_column'); citus_add_local_table_to_metadata --------------------------------------------------------------------- (1 row) -\d generated_identities_test - Partitioned table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - a | integer | | not null | generated by default as identity - b | bigint | | not null | generated always as identity - c | smallint | | not null | generated by default as identity - d | integer | | not null | nextval('generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities_test_e_seq'::regclass) - f | smallint | | not null | nextval('generated_identities_test_f_seq'::regclass) - g | integer | | | -Partition key: RANGE (a) -Number of partitions: 2 (Use \d+ to list them.) - -\c - - - :worker_1_port -\d generated_identities.generated_identities_test - Partitioned table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - a | integer | | not null | worker_nextval('generated_identities.generated_identities_test_a_seq'::regclass) - b | bigint | | not null | nextval('generated_identities.generated_identities_test_b_seq'::regclass) - c | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_c_seq'::regclass) - d | integer | | not null | worker_nextval('generated_identities.generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities.generated_identities_test_e_seq'::regclass) - f | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_f_seq'::regclass) - g | integer | | | -Partition key: RANGE (a) -Number of partitions: 2 (Use \d+ to list them.) - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -SELECT undistribute_table('generated_identities_test'); - undistribute_table +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_reference_table('int_identity_column'); +ERROR: cannot complete operation on a table with smallint/int identity column +SELECT citus_add_local_table_to_metadata('int_identity_column'); + citus_add_local_table_to_metadata --------------------------------------------------------------------- (1 row) -SELECT citus_remove_node('localhost', :master_port); - citus_remove_node +DROP TABLE int_identity_column; +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) -SELECT create_distributed_table('generated_identities_test', 'a'); +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 generated_identities_test - Partitioned table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default +\d bigint_identity_column + Table "generated_identities.bigint_identity_column" + Column | Type | Collation | Nullable | Default --------------------------------------------------------------------- - a | integer | | not null | generated by default as identity - b | bigint | | not null | generated always as identity - c | smallint | | not null | generated by default as identity - d | integer | | not null | nextval('generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities_test_e_seq'::regclass) - f | smallint | | not null | nextval('generated_identities_test_f_seq'::regclass) - g | integer | | | -Partition key: RANGE (a) -Number of partitions: 2 (Use \d+ to list them.) + a | bigint | | not null | generated by default as identity + b | integer | | | \c - - - :worker_1_port -\d generated_identities.generated_identities_test - Partitioned table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default +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 | integer | | not null | worker_nextval('generated_identities.generated_identities_test_a_seq'::regclass) - b | bigint | | not null | nextval('generated_identities.generated_identities_test_b_seq'::regclass) - c | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_c_seq'::regclass) - d | integer | | not null | worker_nextval('generated_identities.generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities.generated_identities_test_e_seq'::regclass) - f | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_f_seq'::regclass) - g | integer | | | -Partition key: RANGE (a) -Number of partitions: 2 (Use \d+ to list them.) + 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 generated_identities_test (g) values (1); -insert into generated_identities_test (g) SELECT 2; -INSERT INTO generated_identities_test (g) +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; -SELECT * FROM generated_identities_test ORDER BY 1; - a | b | c | d | e | f | g ---------------------------------------------------------------------- - 1 | 10 | 1 | 1 | 1 | 1 | 1 - 2 | 20 | 2 | 2 | 2 | 2 | 2 - 3 | 30 | 3 | 3 | 3 | 3 | 3 - 4 | 40 | 4 | 4 | 4 | 4 | 4 - 5 | 50 | 5 | 5 | 5 | 5 | 5 - 6 | 60 | 6 | 6 | 6 | 6 | 6 - 7 | 70 | 7 | 7 | 7 | 7 | 7 -(7 rows) - -SELECT undistribute_table('generated_identities_test'); - undistribute_table ---------------------------------------------------------------------- - -(1 row) - -SELECT * FROM generated_identities_test ORDER BY 1; - a | b | c | d | e | f | g ---------------------------------------------------------------------- - 1 | 10 | 1 | 1 | 1 | 1 | 1 - 2 | 20 | 2 | 2 | 2 | 2 | 2 - 3 | 30 | 3 | 3 | 3 | 3 | 3 - 4 | 40 | 4 | 4 | 4 | 4 | 4 - 5 | 50 | 5 | 5 | 5 | 5 | 5 - 6 | 60 | 6 | 6 | 6 | 6 | 6 - 7 | 70 | 7 | 7 | 7 | 7 | 7 -(7 rows) - -\d generated_identities_test - Partitioned table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - a | integer | | not null | generated by default as identity - b | bigint | | not null | generated always as identity - c | smallint | | not null | generated by default as identity - d | integer | | not null | nextval('generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities_test_e_seq'::regclass) - f | smallint | | not null | nextval('generated_identities_test_f_seq'::regclass) - g | integer | | | -Partition key: RANGE (a) -Number of partitions: 2 (Use \d+ to list them.) - -\c - - - :worker_1_port -\d generated_identities.generated_identities_test \c - - - :master_port SET search_path TO generated_identities; SET client_min_messages to ERROR; -INSERT INTO generated_identities_test (g) -SELECT s FROM generate_series(8,10) s; -SELECT * FROM generated_identities_test ORDER BY 1; - a | b | c | d | e | f | g +INSERT INTO partitioned_table (c) +SELECT s FROM generate_series(10,20) s; +INSERT INTO partitioned_table (a,b,c) VALUES (999,999,999); +ERROR: cannot insert a non-DEFAULT value into column "b" +DETAIL: Column "b" is an identity column defined as GENERATED ALWAYS. +HINT: Use OVERRIDING SYSTEM VALUE to override. +INSERT INTO partitioned_table (a,c) VALUES (999,999); +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 --------------------------------------------------------------------- - 1 | 10 | 1 | 1 | 1 | 1 | 1 - 2 | 20 | 2 | 2 | 2 | 2 | 2 - 3 | 30 | 3 | 3 | 3 | 3 | 3 - 4 | 40 | 4 | 4 | 4 | 4 | 4 - 5 | 50 | 5 | 5 | 5 | 5 | 5 - 6 | 60 | 6 | 6 | 6 | 6 | 6 - 7 | 70 | 7 | 7 | 7 | 7 | 7 - 8 | 80 | 8 | 8 | 8 | 8 | 8 - 9 | 90 | 9 | 9 | 9 | 9 | 9 - 10 | 100 | 10 | 10 | 10 | 10 | 10 -(10 rows) - --- distributed table -SELECT create_distributed_table('generated_identities_test', 'a'); - create_distributed_table ---------------------------------------------------------------------- - -(1 row) + 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 + 999 | 120 | 999 + 999 | 999 | 999 +(20 rows) -- alter table .. alter column .. add is unsupported -ALTER TABLE generated_identities_test ALTER COLUMN g ADD GENERATED ALWAYS AS IDENTITY; +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 generated_identities_test ALTER COLUMN b TYPE int; +ALTER TABLE partitioned_table ALTER COLUMN b TYPE int; ERROR: cannot execute ALTER COLUMN command involving identity column -SELECT alter_distributed_table('generated_identities_test', 'g'); - alter_distributed_table ---------------------------------------------------------------------- - -(1 row) - -SELECT alter_distributed_table('generated_identities_test', 'b'); - alter_distributed_table ---------------------------------------------------------------------- - -(1 row) - -SELECT alter_distributed_table('generated_identities_test', 'c'); - alter_distributed_table ---------------------------------------------------------------------- - -(1 row) - -SELECT undistribute_table('generated_identities_test'); - undistribute_table ---------------------------------------------------------------------- - -(1 row) - -SELECT * FROM generated_identities_test ORDER BY g; - a | b | c | d | e | f | g ---------------------------------------------------------------------- - 1 | 10 | 1 | 1 | 1 | 1 | 1 - 2 | 20 | 2 | 2 | 2 | 2 | 2 - 3 | 30 | 3 | 3 | 3 | 3 | 3 - 4 | 40 | 4 | 4 | 4 | 4 | 4 - 5 | 50 | 5 | 5 | 5 | 5 | 5 - 6 | 60 | 6 | 6 | 6 | 6 | 6 - 7 | 70 | 7 | 7 | 7 | 7 | 7 - 8 | 80 | 8 | 8 | 8 | 8 | 8 - 9 | 90 | 9 | 9 | 9 | 9 | 9 - 10 | 100 | 10 | 10 | 10 | 10 | 10 -(10 rows) - --- reference table -DROP TABLE generated_identities_test; -CREATE TABLE generated_identities_test ( - a int GENERATED BY DEFAULT AS IDENTITY, - b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), - c smallint GENERATED BY DEFAULT AS IDENTITY, - d serial, - e bigserial, - f smallserial, - g int +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('generated_identities_test'); +SELECT create_reference_table('reference_table'); create_reference_table --------------------------------------------------------------------- (1 row) -\d generated_identities_test - Table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default +\d reference_table + Table "generated_identities.reference_table" + Column | Type | Collation | Nullable | Default --------------------------------------------------------------------- - a | integer | | not null | generated by default as identity - b | bigint | | not null | generated always as identity - c | smallint | | not null | generated by default as identity - d | integer | | not null | nextval('generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities_test_e_seq'::regclass) - f | smallint | | not null | nextval('generated_identities_test_f_seq'::regclass) - g | integer | | | + 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 -\d generated_identities.generated_identities_test - Table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - a | integer | | not null | worker_nextval('generated_identities.generated_identities_test_a_seq'::regclass) - b | bigint | | not null | nextval('generated_identities.generated_identities_test_b_seq'::regclass) - c | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_c_seq'::regclass) - d | integer | | not null | worker_nextval('generated_identities.generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities.generated_identities_test_e_seq'::regclass) - f | smallint | | not null | worker_nextval('generated_identities.generated_identities_test_f_seq'::regclass) - g | integer | | | - -\c - - - :master_port SET search_path TO generated_identities; -SET client_min_messages to ERROR; -INSERT INTO generated_identities_test (g) -SELECT s FROM generate_series(11,20) s; -SELECT * FROM generated_identities_test ORDER BY g; - a | b | c | d | e | f | g +\d generated_identities.reference_table + Table "generated_identities.reference_table" + Column | Type | Collation | Nullable | Default --------------------------------------------------------------------- - 1 | 10 | 1 | 1 | 1 | 1 | 11 - 2 | 20 | 2 | 2 | 2 | 2 | 12 - 3 | 30 | 3 | 3 | 3 | 3 | 13 - 4 | 40 | 4 | 4 | 4 | 4 | 14 - 5 | 50 | 5 | 5 | 5 | 5 | 15 - 6 | 60 | 6 | 6 | 6 | 6 | 16 - 7 | 70 | 7 | 7 | 7 | 7 | 17 - 8 | 80 | 8 | 8 | 8 | 8 | 18 - 9 | 90 | 9 | 9 | 9 | 9 | 19 - 10 | 100 | 10 | 10 | 10 | 10 | 20 + 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) -SELECT undistribute_table('generated_identities_test'); - undistribute_table ---------------------------------------------------------------------- - -(1 row) - -\d generated_identities_test - Table "generated_identities.generated_identities_test" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - a | integer | | not null | generated by default as identity - b | bigint | | not null | generated always as identity - c | smallint | | not null | generated by default as identity - d | integer | | not null | nextval('generated_identities_test_d_seq'::regclass) - e | bigint | | not null | nextval('generated_identities_test_e_seq'::regclass) - f | smallint | | not null | nextval('generated_identities_test_f_seq'::regclass) - g | integer | | | - -\c - - - :worker_1_port -\d generated_identities.generated_identities_test \c - - - :master_port SET search_path TO generated_identities; SET client_min_messages to ERROR; --- alter table .. add column .. GENERATED .. AS IDENTITY -DROP TABLE IF EXISTS color; -CREATE TABLE color ( - color_name VARCHAR NOT NULL -); -SELECT create_distributed_table('color', 'color_name'); - create_distributed_table +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) -(1 row) - -ALTER TABLE color ADD COLUMN color_id BIGINT GENERATED ALWAYS AS IDENTITY; -INSERT INTO color(color_name) VALUES ('Red'); -ALTER TABLE color ADD COLUMN color_id_1 BIGINT GENERATED ALWAYS AS IDENTITY; -ERROR: Cannot add an identity column because the table is not empty -DROP TABLE color; --- insert data from workers +DROP TABLE reference_table; +-- https://github.com/citusdata/citus/issues/6694 CREATE TABLE color ( color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, color_name VARCHAR NOT NULL @@ -345,181 +294,14 @@ SELECT create_distributed_table('color', 'color_id'); (1 row) -\c - - - :worker_1_port +CREATE USER test; +GRANT INSERT ON color TO test; +GRANT USAGE ON SCHEMA generated_identities TO test; +\c - test - :worker_1_port SET search_path TO generated_identities; SET client_min_messages to ERROR; -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -SELECT undistribute_table('color'); - undistribute_table ---------------------------------------------------------------------- - -(1 row) - -SELECT create_distributed_table('color', 'color_id'); - create_distributed_table ---------------------------------------------------------------------- - -(1 row) - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -INSERT INTO color(color_name) VALUES ('Red'); -SELECT count(*) from color; - count ---------------------------------------------------------------------- - 3 -(1 row) - --- modify sequence & alter table -DROP TABLE color; -CREATE TABLE color ( - color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, - color_name VARCHAR NOT NULL -); -SELECT create_distributed_table('color', 'color_id'); - create_distributed_table ---------------------------------------------------------------------- - -(1 row) - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -SELECT undistribute_table('color'); - undistribute_table ---------------------------------------------------------------------- - -(1 row) - -ALTER SEQUENCE color_color_id_seq RENAME TO myseq; -SELECT create_distributed_table('color', 'color_id'); - create_distributed_table ---------------------------------------------------------------------- - -(1 row) - -\ds+ myseq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- - generated_identities | myseq | sequence | postgres | permanent | 8192 bytes | -(1 row) - -\ds+ color_color_id_seq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- -(0 rows) - -\d color - Table "generated_identities.color" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - color_id | bigint | | not null | generated always as identity - color_name | character varying | | not null | -Indexes: - "color_color_id_key" UNIQUE CONSTRAINT, btree (color_id) - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -\ds+ myseq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- - generated_identities | myseq | sequence | postgres | permanent | 8192 bytes | -(1 row) - -\ds+ color_color_id_seq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- -(0 rows) - -\d color - Table "generated_identities.color" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - color_id | bigint | | not null | nextval('myseq'::regclass) - color_name | character varying | | not null | -Indexes: - "color_color_id_key" UNIQUE CONSTRAINT, btree (color_id) - -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -ALTER SEQUENCE myseq RENAME TO color_color_id_seq; -\ds+ myseq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- -(0 rows) - -\ds+ color_color_id_seq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- - generated_identities | color_color_id_seq | sequence | postgres | permanent | 8192 bytes | -(1 row) - -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -\ds+ myseq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- -(0 rows) - -\ds+ color_color_id_seq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- - generated_identities | color_color_id_seq | sequence | postgres | permanent | 8192 bytes | -(1 row) - -\d color - Table "generated_identities.color" - Column | Type | Collation | Nullable | Default ---------------------------------------------------------------------- - color_id | bigint | | not null | nextval('color_color_id_seq'::regclass) - color_name | character varying | | not null | -Indexes: - "color_color_id_key" UNIQUE CONSTRAINT, btree (color_id) - -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -SELECT alter_distributed_table('co23423lor', shard_count := 6); -ERROR: relation "co23423lor" does not exist -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; -\ds+ color_color_id_seq - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ---------------------------------------------------------------------- - generated_identities | color_color_id_seq | sequence | postgres | permanent | 8192 bytes | -(1 row) - -INSERT INTO color(color_name) VALUES ('Red'); -\c - - - :master_port +INSERT INTO color(color_name) VALUES ('Blue'); +\c - postgres - :master_port SET search_path TO generated_identities; SET client_min_messages to ERROR; DROP SCHEMA generated_identities CASCADE; diff --git a/src/test/regress/sql/generated_identity.sql b/src/test/regress/sql/generated_identity.sql index 004f45b40..965861166 100644 --- a/src/test/regress/sql/generated_identity.sql +++ b/src/test/regress/sql/generated_identity.sql @@ -4,262 +4,167 @@ SET client_min_messages to ERROR; SELECT 1 from citus_add_node('localhost', :master_port, groupId=>0); -DROP TABLE IF EXISTS generated_identities_test; - --- create a partitioned table for testing. -CREATE TABLE generated_identities_test ( - a int CONSTRAINT myconname GENERATED BY DEFAULT AS IDENTITY, - b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), - c smallint GENERATED BY DEFAULT AS IDENTITY, - d serial, - e bigserial, - f smallserial, - g int -) -PARTITION BY RANGE (a); -CREATE TABLE generated_identities_test_1_5 PARTITION OF generated_identities_test FOR VALUES FROM (1) TO (5); -CREATE TABLE generated_identities_test_5_50 PARTITION OF generated_identities_test FOR VALUES FROM (5) TO (50); - --- local tables -SELECT citus_add_local_table_to_metadata('generated_identities_test'); - -\d generated_identities_test - -\c - - - :worker_1_port - -\d generated_identities.generated_identities_test - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -SELECT undistribute_table('generated_identities_test'); - -SELECT citus_remove_node('localhost', :master_port); - -SELECT create_distributed_table('generated_identities_test', 'a'); - -\d generated_identities_test - -\c - - - :worker_1_port - -\d generated_identities.generated_identities_test - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -insert into generated_identities_test (g) values (1); - -insert into generated_identities_test (g) SELECT 2; - -INSERT INTO generated_identities_test (g) -SELECT s FROM generate_series(3,7) s; - -SELECT * FROM generated_identities_test ORDER BY 1; - -SELECT undistribute_table('generated_identities_test'); - -SELECT * FROM generated_identities_test ORDER BY 1; - -\d generated_identities_test - -\c - - - :worker_1_port - -\d generated_identities.generated_identities_test - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -INSERT INTO generated_identities_test (g) -SELECT s FROM generate_series(8,10) s; - -SELECT * FROM generated_identities_test ORDER BY 1; - --- distributed table -SELECT create_distributed_table('generated_identities_test', 'a'); - --- alter table .. alter column .. add is unsupported -ALTER TABLE generated_identities_test ALTER COLUMN g ADD GENERATED ALWAYS AS IDENTITY; - --- alter table .. alter column is unsupported -ALTER TABLE generated_identities_test ALTER COLUMN b TYPE int; - -SELECT alter_distributed_table('generated_identities_test', 'g'); - -SELECT alter_distributed_table('generated_identities_test', 'b'); - -SELECT alter_distributed_table('generated_identities_test', 'c'); - -SELECT undistribute_table('generated_identities_test'); - -SELECT * FROM generated_identities_test ORDER BY g; - --- reference table - -DROP TABLE generated_identities_test; - -CREATE TABLE generated_identities_test ( - a int GENERATED BY DEFAULT AS IDENTITY, - b bigint GENERATED ALWAYS AS IDENTITY (START WITH 10 INCREMENT BY 10), - c smallint GENERATED BY DEFAULT AS IDENTITY, - d serial, - e bigserial, - f smallserial, - g int +-- 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'); +SELECT create_reference_table('smallint_identity_column'); +SELECT citus_add_local_table_to_metadata('smallint_identity_column'); -SELECT create_reference_table('generated_identities_test'); +DROP TABLE smallint_identity_column; -\d generated_identities_test +-- 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'); +SELECT create_reference_table('int_identity_column'); +SELECT citus_add_local_table_to_metadata('int_identity_column'); +DROP TABLE int_identity_column; + +CREATE TABLE bigint_identity_column ( + a bigint GENERATED BY DEFAULT AS IDENTITY, + b int +); +SELECT citus_add_local_table_to_metadata('bigint_identity_column'); +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'); + +\d bigint_identity_column \c - - - :worker_1_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; -\d generated_identities.generated_identities_test +INSERT INTO bigint_identity_column (b) +SELECT s FROM generate_series(1,10) s; + +\d generated_identities.bigint_identity_column \c - - - :master_port SET search_path TO generated_identities; SET client_min_messages to ERROR; -INSERT INTO generated_identities_test (g) +INSERT INTO bigint_identity_column (b) SELECT s FROM generate_series(11,20) s; -SELECT * FROM generated_identities_test ORDER BY g; +SELECT * FROM bigint_identity_column ORDER BY B ASC; -SELECT undistribute_table('generated_identities_test'); +-- table with identity column cannot be altered. +SELECT alter_distributed_table('bigint_identity_column', 'b'); -\d generated_identities_test +-- table with identity column cannot be undistributed. +SELECT undistribute_table('bigint_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'); + +\d partitioned_table \c - - - :worker_1_port +SET search_path TO generated_identities; +SET client_min_messages to ERROR; -\d generated_identities.generated_identities_test +\d generated_identities.partitioned_table + +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; --- alter table .. add column .. GENERATED .. AS IDENTITY -DROP TABLE IF EXISTS color; -CREATE TABLE color ( - color_name VARCHAR NOT NULL -); -SELECT create_distributed_table('color', 'color_name'); -ALTER TABLE color ADD COLUMN color_id BIGINT GENERATED ALWAYS AS IDENTITY; -INSERT INTO color(color_name) VALUES ('Red'); -ALTER TABLE color ADD COLUMN color_id_1 BIGINT GENERATED ALWAYS AS IDENTITY; -DROP TABLE color; +INSERT INTO partitioned_table (c) +SELECT s FROM generate_series(10,20) s; --- insert data from workers +INSERT INTO partitioned_table (a,b,c) VALUES (999,999,999); + +INSERT INTO partitioned_table (a,c) VALUES (999,999); + +INSERT INTO partitioned_table (a,b,c) OVERRIDING SYSTEM VALUE VALUES (999,999,999); + +SELECT * FROM partitioned_table ORDER BY c ASC; + +-- alter table .. alter column .. add is unsupported +ALTER TABLE partitioned_table ALTER COLUMN g ADD GENERATED ALWAYS AS IDENTITY; + +-- alter table .. alter column is unsupported +ALTER TABLE partitioned_table ALTER COLUMN b TYPE int; + +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'); + +\d reference_table + +\c - - - :worker_1_port +SET search_path TO generated_identities; + +\d generated_identities.reference_table + +INSERT INTO reference_table (c) +SELECT s FROM generate_series(1,10) s; + +--on master +select * from reference_table; + +\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; + +DROP TABLE reference_table; + +-- https://github.com/citusdata/citus/issues/6694 CREATE TABLE color ( color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, color_name VARCHAR NOT NULL ); SELECT create_distributed_table('color', 'color_id'); -\c - - - :worker_1_port +CREATE USER test; +GRANT INSERT ON color TO test; +GRANT USAGE ON SCHEMA generated_identities TO test; + +\c - test - :worker_1_port SET search_path TO generated_identities; SET client_min_messages to ERROR; -INSERT INTO color(color_name) VALUES ('Red'); +INSERT INTO color(color_name) VALUES ('Blue'); -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -SELECT undistribute_table('color'); -SELECT create_distributed_table('color', 'color_id'); - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -INSERT INTO color(color_name) VALUES ('Red'); - -SELECT count(*) from color; - --- modify sequence & alter table -DROP TABLE color; - -CREATE TABLE color ( - color_id BIGINT GENERATED ALWAYS AS IDENTITY UNIQUE, - color_name VARCHAR NOT NULL -); -SELECT create_distributed_table('color', 'color_id'); - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -SELECT undistribute_table('color'); - -ALTER SEQUENCE color_color_id_seq RENAME TO myseq; - -SELECT create_distributed_table('color', 'color_id'); -\ds+ myseq -\ds+ color_color_id_seq -\d color - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -\ds+ myseq -\ds+ color_color_id_seq -\d color - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -ALTER SEQUENCE myseq RENAME TO color_color_id_seq; - -\ds+ myseq -\ds+ color_color_id_seq - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -\ds+ myseq -\ds+ color_color_id_seq -\d color - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :master_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -SELECT alter_distributed_table('co23423lor', shard_count := 6); - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :worker_1_port -SET search_path TO generated_identities; -SET client_min_messages to ERROR; - -\ds+ color_color_id_seq - -INSERT INTO color(color_name) VALUES ('Red'); - -\c - - - :master_port +\c - postgres - :master_port SET search_path TO generated_identities; SET client_min_messages to ERROR;