From 5032cdf6dd9905fe16b15890e822bef88c2f6142 Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 18 Apr 2024 13:27:11 +0300 Subject: [PATCH v6 4/4] Grammar fix for tests of partition MERGE/SPLIT operations Replace "salesmans" with "salesmen". Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/fdaa003e-919c-cbc9-4f0c-e4546e96bd65%40gmail.com --- src/test/regress/expected/partition_merge.out | 96 +++---- src/test/regress/expected/partition_split.out | 238 +++++++++--------- src/test/regress/sql/partition_merge.sql | 84 +++---- src/test/regress/sql/partition_split.sql | 186 +++++++------- 4 files changed, 302 insertions(+), 302 deletions(-) diff --git a/src/test/regress/expected/partition_merge.out b/src/test/regress/expected/partition_merge.out index 748c8c7a89b..b5744ed4986 100644 --- a/src/test/regress/expected/partition_merge.out +++ b/src/test/regress/expected/partition_merge.out @@ -349,50 +349,50 @@ DROP TABLE sales_date; -- -- Test: merge partitions of partitioned table with triggers -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_20 PARTITION OF salesmans FOR VALUES FROM (10) TO (20); -CREATE TABLE salesmans20_30 PARTITION OF salesmans FOR VALUES FROM (20) TO (30); -CREATE TABLE salesmans30_40 PARTITION OF salesmans FOR VALUES FROM (30) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_20 PARTITION OF salesmen FOR VALUES FROM (10) TO (20); +CREATE TABLE salesmen20_30 PARTITION OF salesmen FOR VALUES FROM (20) TO (30); +CREATE TABLE salesmen30_40 PARTITION OF salesmen FOR VALUES FROM (30) TO (40); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE OR REPLACE FUNCTION after_insert_row_trigger() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN RAISE NOTICE 'trigger(%) called: action = %, when = %, level = %', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL; RETURN NULL; END; $BODY$; -CREATE TRIGGER salesmans_after_insert_statement_trigger +CREATE TRIGGER salesmen_after_insert_statement_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH STATEMENT - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); -CREATE TRIGGER salesmans_after_insert_row_trigger + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); +CREATE TRIGGER salesmen_after_insert_row_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH ROW - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (10, 'May'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT +INSERT INTO salesmen VALUES (10, 'May'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = STATEMENT -- 1 trigger should fire here (row): -INSERT INTO salesmans10_20 VALUES (19, 'Ivanov'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -ALTER TABLE salesmans MERGE PARTITIONS (salesmans10_20, salesmans20_30, salesmans30_40) INTO salesmans10_40; +INSERT INTO salesmen10_20 VALUES (19, 'Ivanov'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +ALTER TABLE salesmen MERGE PARTITIONS (salesmen10_20, salesmen20_30, salesmen30_40) INTO salesmen10_40; -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (20, 'Smirnoff'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT +INSERT INTO salesmen VALUES (20, 'Smirnoff'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = STATEMENT -- 1 trigger should fire here (row): -INSERT INTO salesmans10_40 VALUES (30, 'Ford'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -SELECT * FROM salesmans01_10; +INSERT INTO salesmen10_40 VALUES (30, 'Ford'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +SELECT * FROM salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -SELECT * FROM salesmans10_40; +SELECT * FROM salesmen10_40; salesman_id | salesman_name -------------+--------------- 10 | May @@ -401,31 +401,31 @@ SELECT * FROM salesmans10_40; 30 | Ford (4 rows) -DROP TABLE salesmans; +DROP TABLE salesmen; DROP FUNCTION after_insert_row_trigger(); -- -- Test: merge partitions with deleted columns -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); -- Create partitions with some deleted columns: -CREATE TABLE salesmans10_20(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); -CREATE TABLE salesmans20_30(salesman_id INT PRIMARY KEY, d2 INT, salesman_name VARCHAR(30)); -CREATE TABLE salesmans30_40(salesman_id INT PRIMARY KEY, d3 DATE, salesman_name VARCHAR(30)); -INSERT INTO salesmans10_20 VALUES ('dummy value 1', 19, 'Ivanov'); -INSERT INTO salesmans20_30 VALUES (20, 101, 'Smirnoff'); -INSERT INTO salesmans30_40 VALUES (31, now(), 'Popov'); -ALTER TABLE salesmans10_20 DROP COLUMN d1; -ALTER TABLE salesmans20_30 DROP COLUMN d2; -ALTER TABLE salesmans30_40 DROP COLUMN d3; -ALTER TABLE salesmans ATTACH PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20); -ALTER TABLE salesmans ATTACH PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30); -ALTER TABLE salesmans ATTACH PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (30, 'Ford'); -ALTER TABLE salesmans MERGE PARTITIONS (salesmans10_20, salesmans20_30, salesmans30_40) INTO salesmans10_40; -select * from salesmans; +CREATE TABLE salesmen10_20(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); +CREATE TABLE salesmen20_30(salesman_id INT PRIMARY KEY, d2 INT, salesman_name VARCHAR(30)); +CREATE TABLE salesmen30_40(salesman_id INT PRIMARY KEY, d3 DATE, salesman_name VARCHAR(30)); +INSERT INTO salesmen10_20 VALUES ('dummy value 1', 19, 'Ivanov'); +INSERT INTO salesmen20_30 VALUES (20, 101, 'Smirnoff'); +INSERT INTO salesmen30_40 VALUES (31, now(), 'Popov'); +ALTER TABLE salesmen10_20 DROP COLUMN d1; +ALTER TABLE salesmen20_30 DROP COLUMN d2; +ALTER TABLE salesmen30_40 DROP COLUMN d3; +ALTER TABLE salesmen ATTACH PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20); +ALTER TABLE salesmen ATTACH PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30); +ALTER TABLE salesmen ATTACH PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (30, 'Ford'); +ALTER TABLE salesmen MERGE PARTITIONS (salesmen10_20, salesmen20_30, salesmen30_40) INTO salesmen10_40; +select * from salesmen; salesman_id | salesman_name -------------+--------------- 1 | Poirot @@ -436,13 +436,13 @@ select * from salesmans; 30 | Ford (6 rows) -select * from salesmans01_10; +select * from salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -select * from salesmans10_40; +select * from salesmen10_40; salesman_id | salesman_name -------------+--------------- 19 | Ivanov @@ -452,7 +452,7 @@ select * from salesmans10_40; 30 | Ford (5 rows) -DROP TABLE salesmans; +DROP TABLE salesmen; -- -- Test: merge sub-partitions -- diff --git a/src/test/regress/expected/partition_split.out b/src/test/regress/expected/partition_split.out index 660361cd20e..217e9ba54bb 100644 --- a/src/test/regress/expected/partition_split.out +++ b/src/test/regress/expected/partition_split.out @@ -84,8 +84,8 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'), PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-01')); ERROR: upper bound of partition "sales_apr2022" is greater than upper bound of split partition -LINE 4: ... sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-0... - ^ +LINE 4: PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO... + ^ -- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_feb2022" ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO (PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'), @@ -574,20 +574,20 @@ DROP TABLE sales_range; -- -- Test: split partition with CHECK and FOREIGN KEY CONSTRAINTs on partitioned table -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); -INSERT INTO salesmans VALUES (1, 'Poirot'); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE TABLE sales_range ( -salesman_id INT REFERENCES salesmans(salesman_id), +salesman_id INT REFERENCES salesmen(salesman_id), sales_amount INT CHECK (sales_amount > 1), sales_date DATE) PARTITION BY RANGE (sales_date); CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01'); CREATE TABLE sales_feb_mar_apr2022 PARTITION OF sales_range FOR VALUES FROM ('2022-02-01') TO ('2022-05-01'); CREATE TABLE sales_others PARTITION OF sales_range DEFAULT; SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_feb_mar_apr2022'::regclass::oid; - pg_get_constraintdef | conname | conkey --------------------------------------------------------------+--------------------------------+-------- - CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} - FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1} + pg_get_constraintdef | conname | conkey +------------------------------------------------------------+--------------------------------+-------- + CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} + FOREIGN KEY (salesman_id) REFERENCES salesmen(salesman_id) | sales_range_salesman_id_fkey | {1} (2 rows) ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO @@ -596,24 +596,24 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01')); -- We should see the same CONSTRAINTs as on sales_feb_mar_apr2022 partition SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_feb2022'::regclass::oid; - pg_get_constraintdef | conname | conkey --------------------------------------------------------------+--------------------------------+-------- - CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} - FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1} + pg_get_constraintdef | conname | conkey +------------------------------------------------------------+--------------------------------+-------- + CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} + FOREIGN KEY (salesman_id) REFERENCES salesmen(salesman_id) | sales_range_salesman_id_fkey | {1} (2 rows) SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_mar2022'::regclass::oid; - pg_get_constraintdef | conname | conkey --------------------------------------------------------------+--------------------------------+-------- - CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} - FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1} + pg_get_constraintdef | conname | conkey +------------------------------------------------------------+--------------------------------+-------- + CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} + FOREIGN KEY (salesman_id) REFERENCES salesmen(salesman_id) | sales_range_salesman_id_fkey | {1} (2 rows) SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_apr2022'::regclass::oid; - pg_get_constraintdef | conname | conkey --------------------------------------------------------------+--------------------------------+-------- - CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} - FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1} + pg_get_constraintdef | conname | conkey +------------------------------------------------------------+--------------------------------+-------- + CHECK ((sales_amount > 1)) | sales_range_sales_amount_check | {2} + FOREIGN KEY (salesman_id) REFERENCES salesmen(salesman_id) | sales_range_salesman_id_fkey | {1} (2 rows) -- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_sales_amount_check" @@ -623,23 +623,23 @@ DETAIL: Failing row contains (1, 0, 03-11-2022). -- ERROR: insert or update on table "sales_mar2022" violates foreign key constraint "sales_range_salesman_id_fkey" INSERT INTO sales_range VALUES (-1, 10, '2022-03-11'); ERROR: insert or update on table "sales_mar2022" violates foreign key constraint "sales_range_salesman_id_fkey" -DETAIL: Key (salesman_id)=(-1) is not present in table "salesmans". +DETAIL: Key (salesman_id)=(-1) is not present in table "salesmen". -- ok INSERT INTO sales_range VALUES (1, 10, '2022-03-11'); DROP TABLE sales_range CASCADE; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition on partitioned table in case of existing FOREIGN KEY reference from another table -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE sales (salesman_id INT REFERENCES salesmans(salesman_id), sales_amount INT, sales_date DATE); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (19, 'Ivanov'); -INSERT INTO salesmans VALUES (20, 'Smirnoff'); -INSERT INTO salesmans VALUES (30, 'Ford'); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE sales (salesman_id INT REFERENCES salesmen(salesman_id), sales_amount INT, sales_date DATE); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_40 PARTITION OF salesmen FOR VALUES FROM (10) TO (40); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (19, 'Ivanov'); +INSERT INTO salesmen VALUES (20, 'Smirnoff'); +INSERT INTO salesmen VALUES (30, 'Ford'); INSERT INTO sales VALUES (1, 100, '2022-03-01'); INSERT INTO sales VALUES (1, 110, '2022-03-02'); INSERT INTO sales VALUES (10, 150, '2022-03-01'); @@ -648,13 +648,13 @@ INSERT INTO sales VALUES (19, 200, '2022-03-04'); INSERT INTO sales VALUES (20, 50, '2022-03-12'); INSERT INTO sales VALUES (20, 170, '2022-03-02'); INSERT INTO sales VALUES (30, 30, '2022-03-04'); -SELECT * FROM salesmans01_10; +SELECT * FROM salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -SELECT * FROM salesmans10_40; +SELECT * FROM salesmen10_40; salesman_id | salesman_name -------------+--------------- 10 | May @@ -663,30 +663,30 @@ SELECT * FROM salesmans10_40; 30 | Ford (4 rows) -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); -SELECT * FROM salesmans01_10; +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); +SELECT * FROM salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -SELECT * FROM salesmans10_20; +SELECT * FROM salesmen10_20; salesman_id | salesman_name -------------+--------------- 10 | May 19 | Ivanov (2 rows) -SELECT * FROM salesmans20_30; +SELECT * FROM salesmen20_30; salesman_id | salesman_name -------------+--------------- 20 | Smirnoff (1 row) -SELECT * FROM salesmans30_40; +SELECT * FROM salesmen30_40; salesman_id | salesman_name -------------+--------------- 30 | Ford @@ -695,98 +695,98 @@ SELECT * FROM salesmans30_40; -- ERROR: insert or update on table "sales" violates foreign key constraint "sales_salesman_id_fkey" INSERT INTO sales VALUES (40, 50, '2022-03-04'); ERROR: insert or update on table "sales" violates foreign key constraint "sales_salesman_id_fkey" -DETAIL: Key (salesman_id)=(40) is not present in table "salesmans". +DETAIL: Key (salesman_id)=(40) is not present in table "salesmen". -- ok INSERT INTO sales VALUES (30, 50, '2022-03-04'); DROP TABLE sales CASCADE; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition of partitioned table with triggers -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_40 PARTITION OF salesmen FOR VALUES FROM (10) TO (40); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE OR REPLACE FUNCTION after_insert_row_trigger() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN RAISE NOTICE 'trigger(%) called: action = %, when = %, level = %', TG_ARGV[0], TG_OP, TG_WHEN, TG_LEVEL; RETURN NULL; END; $BODY$; -CREATE TRIGGER salesmans_after_insert_statement_trigger +CREATE TRIGGER salesmen_after_insert_statement_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH STATEMENT - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); -CREATE TRIGGER salesmans_after_insert_row_trigger + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); +CREATE TRIGGER salesmen_after_insert_row_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH ROW - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (10, 'May'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT +INSERT INTO salesmen VALUES (10, 'May'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = STATEMENT -- 1 trigger should fire here (row): -INSERT INTO salesmans10_40 VALUES (19, 'Ivanov'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); +INSERT INTO salesmen10_40 VALUES (19, 'Ivanov'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (20, 'Smirnoff'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = STATEMENT +INSERT INTO salesmen VALUES (20, 'Smirnoff'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = STATEMENT -- 1 trigger should fire here (row): -INSERT INTO salesmans30_40 VALUES (30, 'Ford'); -NOTICE: trigger(salesmans) called: action = INSERT, when = AFTER, level = ROW -SELECT * FROM salesmans01_10; +INSERT INTO salesmen30_40 VALUES (30, 'Ford'); +NOTICE: trigger(salesmen) called: action = INSERT, when = AFTER, level = ROW +SELECT * FROM salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -SELECT * FROM salesmans10_20; +SELECT * FROM salesmen10_20; salesman_id | salesman_name -------------+--------------- 10 | May 19 | Ivanov (2 rows) -SELECT * FROM salesmans20_30; +SELECT * FROM salesmen20_30; salesman_id | salesman_name -------------+--------------- 20 | Smirnoff (1 row) -SELECT * FROM salesmans30_40; +SELECT * FROM salesmen30_40; salesman_id | salesman_name -------------+--------------- 30 | Ford (1 row) -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; DROP FUNCTION after_insert_row_trigger(); -- -- Test: split partition witch identity column -- If split partition column is identity column, columns of new partitions are identity columns too. -- -CREATE TABLE salesmans(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans1_2 PARTITION OF salesmans FOR VALUES FROM (1) TO (2); +CREATE TABLE salesmen(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen1_2 PARTITION OF salesmen FOR VALUES FROM (1) TO (2); -- Create new partition with identity column: -CREATE TABLE salesmans2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30)); -ALTER TABLE salesmans ATTACH PARTITION salesmans2_5 FOR VALUES FROM (2) TO (5); -INSERT INTO salesmans (salesman_name) VALUES ('Poirot'); -INSERT INTO salesmans (salesman_name) VALUES ('Ivanov'); -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid; +CREATE TABLE salesmen2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30)); +ALTER TABLE salesmen ATTACH PARTITION salesmen2_5 FOR VALUES FROM (2) TO (5); +INSERT INTO salesmen (salesman_name) VALUES ('Poirot'); +INSERT INTO salesmen (salesman_name) VALUES ('Ivanov'); +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen1_2'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | @@ -794,51 +794,51 @@ SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND (2 rows) -- Split partition has identity column: -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_5'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen2_5'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -ALTER TABLE salesmans SPLIT PARTITION salesmans2_5 INTO - (PARTITION salesmans2_3 FOR VALUES FROM (2) TO (3), - PARTITION salesmans3_4 FOR VALUES FROM (3) TO (4), - PARTITION salesmans4_5 FOR VALUES FROM (4) TO (5)); -INSERT INTO salesmans (salesman_name) VALUES ('May'); -INSERT INTO salesmans (salesman_name) VALUES ('Ford'); -SELECT * FROM salesmans1_2; +ALTER TABLE salesmen SPLIT PARTITION salesmen2_5 INTO + (PARTITION salesmen2_3 FOR VALUES FROM (2) TO (3), + PARTITION salesmen3_4 FOR VALUES FROM (3) TO (4), + PARTITION salesmen4_5 FOR VALUES FROM (4) TO (5)); +INSERT INTO salesmen (salesman_name) VALUES ('May'); +INSERT INTO salesmen (salesman_name) VALUES ('Ford'); +SELECT * FROM salesmen1_2; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -SELECT * FROM salesmans2_3; +SELECT * FROM salesmen2_3; salesman_id | salesman_name -------------+--------------- 2 | Ivanov (1 row) -SELECT * FROM salesmans3_4; +SELECT * FROM salesmen3_4; salesman_id | salesman_name -------------+--------------- 3 | May (1 row) -SELECT * FROM salesmans4_5; +SELECT * FROM salesmen4_5; salesman_id | salesman_name -------------+--------------- 4 | Ford (1 row) -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen1_2'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | @@ -846,74 +846,74 @@ SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND (2 rows) -- New partitions have identity-columns: -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_3'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen2_3'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans3_4'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen3_4'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans4_5'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen4_5'::regclass::oid; attname | attidentity | attgenerated ---------------+-------------+-------------- salesman_id | a | salesman_name | | (2 rows) -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition with deleted columns -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); -- Create new partition with some deleted columns: -CREATE TABLE salesmans10_40(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, d2 INT, d3 DATE, salesman_name VARCHAR(30)); -INSERT INTO salesmans10_40 VALUES ('dummy value 1', 19, 100, now(), 'Ivanov'); -INSERT INTO salesmans10_40 VALUES ('dummy value 2', 20, 101, now(), 'Smirnoff'); -ALTER TABLE salesmans10_40 DROP COLUMN d1; -ALTER TABLE salesmans10_40 DROP COLUMN d2; -ALTER TABLE salesmans10_40 DROP COLUMN d3; -ALTER TABLE salesmans ATTACH PARTITION salesmans10_40 FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (30, 'Ford'); -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); -select * from salesmans01_10; +CREATE TABLE salesmen10_40(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, d2 INT, d3 DATE, salesman_name VARCHAR(30)); +INSERT INTO salesmen10_40 VALUES ('dummy value 1', 19, 100, now(), 'Ivanov'); +INSERT INTO salesmen10_40 VALUES ('dummy value 2', 20, 101, now(), 'Smirnoff'); +ALTER TABLE salesmen10_40 DROP COLUMN d1; +ALTER TABLE salesmen10_40 DROP COLUMN d2; +ALTER TABLE salesmen10_40 DROP COLUMN d3; +ALTER TABLE salesmen ATTACH PARTITION salesmen10_40 FOR VALUES FROM (10) TO (40); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (30, 'Ford'); +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); +select * from salesmen01_10; salesman_id | salesman_name -------------+--------------- 1 | Poirot (1 row) -select * from salesmans10_20; +select * from salesmen10_20; salesman_id | salesman_name -------------+--------------- 19 | Ivanov 10 | May (2 rows) -select * from salesmans20_30; +select * from salesmen20_30; salesman_id | salesman_name -------------+--------------- 20 | Smirnoff (1 row) -select * from salesmans30_40; +select * from salesmen30_40; salesman_id | salesman_name -------------+--------------- 30 | Ford (1 row) -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split sub-partition -- diff --git a/src/test/regress/sql/partition_merge.sql b/src/test/regress/sql/partition_merge.sql index 6faac959a7c..df737e214ee 100644 --- a/src/test/regress/sql/partition_merge.sql +++ b/src/test/regress/sql/partition_merge.sql @@ -193,14 +193,14 @@ DROP TABLE sales_date; -- -- Test: merge partitions of partitioned table with triggers -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_20 PARTITION OF salesmans FOR VALUES FROM (10) TO (20); -CREATE TABLE salesmans20_30 PARTITION OF salesmans FOR VALUES FROM (20) TO (30); -CREATE TABLE salesmans30_40 PARTITION OF salesmans FOR VALUES FROM (30) TO (40); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_20 PARTITION OF salesmen FOR VALUES FROM (10) TO (20); +CREATE TABLE salesmen20_30 PARTITION OF salesmen FOR VALUES FROM (20) TO (30); +CREATE TABLE salesmen30_40 PARTITION OF salesmen FOR VALUES FROM (30) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE OR REPLACE FUNCTION after_insert_row_trigger() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN @@ -209,70 +209,70 @@ BEGIN END; $BODY$; -CREATE TRIGGER salesmans_after_insert_statement_trigger +CREATE TRIGGER salesmen_after_insert_statement_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH STATEMENT - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -CREATE TRIGGER salesmans_after_insert_row_trigger +CREATE TRIGGER salesmen_after_insert_row_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH ROW - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (10, 'May'); +INSERT INTO salesmen VALUES (10, 'May'); -- 1 trigger should fire here (row): -INSERT INTO salesmans10_20 VALUES (19, 'Ivanov'); +INSERT INTO salesmen10_20 VALUES (19, 'Ivanov'); -ALTER TABLE salesmans MERGE PARTITIONS (salesmans10_20, salesmans20_30, salesmans30_40) INTO salesmans10_40; +ALTER TABLE salesmen MERGE PARTITIONS (salesmen10_20, salesmen20_30, salesmen30_40) INTO salesmen10_40; -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (20, 'Smirnoff'); +INSERT INTO salesmen VALUES (20, 'Smirnoff'); -- 1 trigger should fire here (row): -INSERT INTO salesmans10_40 VALUES (30, 'Ford'); +INSERT INTO salesmen10_40 VALUES (30, 'Ford'); -SELECT * FROM salesmans01_10; -SELECT * FROM salesmans10_40; +SELECT * FROM salesmen01_10; +SELECT * FROM salesmen10_40; -DROP TABLE salesmans; +DROP TABLE salesmen; DROP FUNCTION after_insert_row_trigger(); -- -- Test: merge partitions with deleted columns -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); -- Create partitions with some deleted columns: -CREATE TABLE salesmans10_20(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); -CREATE TABLE salesmans20_30(salesman_id INT PRIMARY KEY, d2 INT, salesman_name VARCHAR(30)); -CREATE TABLE salesmans30_40(salesman_id INT PRIMARY KEY, d3 DATE, salesman_name VARCHAR(30)); +CREATE TABLE salesmen10_20(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); +CREATE TABLE salesmen20_30(salesman_id INT PRIMARY KEY, d2 INT, salesman_name VARCHAR(30)); +CREATE TABLE salesmen30_40(salesman_id INT PRIMARY KEY, d3 DATE, salesman_name VARCHAR(30)); -INSERT INTO salesmans10_20 VALUES ('dummy value 1', 19, 'Ivanov'); -INSERT INTO salesmans20_30 VALUES (20, 101, 'Smirnoff'); -INSERT INTO salesmans30_40 VALUES (31, now(), 'Popov'); +INSERT INTO salesmen10_20 VALUES ('dummy value 1', 19, 'Ivanov'); +INSERT INTO salesmen20_30 VALUES (20, 101, 'Smirnoff'); +INSERT INTO salesmen30_40 VALUES (31, now(), 'Popov'); -ALTER TABLE salesmans10_20 DROP COLUMN d1; -ALTER TABLE salesmans20_30 DROP COLUMN d2; -ALTER TABLE salesmans30_40 DROP COLUMN d3; +ALTER TABLE salesmen10_20 DROP COLUMN d1; +ALTER TABLE salesmen20_30 DROP COLUMN d2; +ALTER TABLE salesmen30_40 DROP COLUMN d3; -ALTER TABLE salesmans ATTACH PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20); -ALTER TABLE salesmans ATTACH PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30); -ALTER TABLE salesmans ATTACH PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40); +ALTER TABLE salesmen ATTACH PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20); +ALTER TABLE salesmen ATTACH PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30); +ALTER TABLE salesmen ATTACH PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (30, 'Ford'); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (30, 'Ford'); -ALTER TABLE salesmans MERGE PARTITIONS (salesmans10_20, salesmans20_30, salesmans30_40) INTO salesmans10_40; +ALTER TABLE salesmen MERGE PARTITIONS (salesmen10_20, salesmen20_30, salesmen30_40) INTO salesmen10_40; -select * from salesmans; -select * from salesmans01_10; -select * from salesmans10_40; +select * from salesmen; +select * from salesmen01_10; +select * from salesmen10_40; -DROP TABLE salesmans; +DROP TABLE salesmen; -- -- Test: merge sub-partitions diff --git a/src/test/regress/sql/partition_split.sql b/src/test/regress/sql/partition_split.sql index 576f9f0f63c..12def95d1d5 100644 --- a/src/test/regress/sql/partition_split.sql +++ b/src/test/regress/sql/partition_split.sql @@ -337,11 +337,11 @@ DROP TABLE sales_range; -- -- Test: split partition with CHECK and FOREIGN KEY CONSTRAINTs on partitioned table -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); -INSERT INTO salesmans VALUES (1, 'Poirot'); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE TABLE sales_range ( -salesman_id INT REFERENCES salesmans(salesman_id), +salesman_id INT REFERENCES salesmen(salesman_id), sales_amount INT CHECK (sales_amount > 1), sales_date DATE) PARTITION BY RANGE (sales_date); @@ -369,22 +369,22 @@ INSERT INTO sales_range VALUES (-1, 10, '2022-03-11'); INSERT INTO sales_range VALUES (1, 10, '2022-03-11'); DROP TABLE sales_range CASCADE; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition on partitioned table in case of existing FOREIGN KEY reference from another table -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE sales (salesman_id INT REFERENCES salesmans(salesman_id), sales_amount INT, sales_date DATE); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE sales (salesman_id INT REFERENCES salesmen(salesman_id), sales_amount INT, sales_date DATE); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_40 PARTITION OF salesmen FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (19, 'Ivanov'); -INSERT INTO salesmans VALUES (20, 'Smirnoff'); -INSERT INTO salesmans VALUES (30, 'Ford'); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (19, 'Ivanov'); +INSERT INTO salesmen VALUES (20, 'Smirnoff'); +INSERT INTO salesmen VALUES (30, 'Ford'); INSERT INTO sales VALUES (1, 100, '2022-03-01'); INSERT INTO sales VALUES (1, 110, '2022-03-02'); @@ -395,18 +395,18 @@ INSERT INTO sales VALUES (20, 50, '2022-03-12'); INSERT INTO sales VALUES (20, 170, '2022-03-02'); INSERT INTO sales VALUES (30, 30, '2022-03-04'); -SELECT * FROM salesmans01_10; -SELECT * FROM salesmans10_40; +SELECT * FROM salesmen01_10; +SELECT * FROM salesmen10_40; -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); -SELECT * FROM salesmans01_10; -SELECT * FROM salesmans10_20; -SELECT * FROM salesmans20_30; -SELECT * FROM salesmans30_40; +SELECT * FROM salesmen01_10; +SELECT * FROM salesmen10_20; +SELECT * FROM salesmen20_30; +SELECT * FROM salesmen30_40; -- ERROR: insert or update on table "sales" violates foreign key constraint "sales_salesman_id_fkey" INSERT INTO sales VALUES (40, 50, '2022-03-04'); @@ -414,17 +414,17 @@ INSERT INTO sales VALUES (40, 50, '2022-03-04'); INSERT INTO sales VALUES (30, 50, '2022-03-04'); DROP TABLE sales CASCADE; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition of partitioned table with triggers -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); -CREATE TABLE salesmans10_40 PARTITION OF salesmans FOR VALUES FROM (10) TO (40); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen10_40 PARTITION OF salesmen FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (1, 'Poirot'); CREATE OR REPLACE FUNCTION after_insert_row_trigger() RETURNS trigger LANGUAGE 'plpgsql' AS $BODY$ BEGIN @@ -433,115 +433,115 @@ BEGIN END; $BODY$; -CREATE TRIGGER salesmans_after_insert_statement_trigger +CREATE TRIGGER salesmen_after_insert_statement_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH STATEMENT - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -CREATE TRIGGER salesmans_after_insert_row_trigger +CREATE TRIGGER salesmen_after_insert_row_trigger AFTER INSERT - ON salesmans + ON salesmen FOR EACH ROW - EXECUTE PROCEDURE after_insert_row_trigger('salesmans'); + EXECUTE PROCEDURE after_insert_row_trigger('salesmen'); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (10, 'May'); +INSERT INTO salesmen VALUES (10, 'May'); -- 1 trigger should fire here (row): -INSERT INTO salesmans10_40 VALUES (19, 'Ivanov'); +INSERT INTO salesmen10_40 VALUES (19, 'Ivanov'); -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); -- 2 triggers should fire here (row + statement): -INSERT INTO salesmans VALUES (20, 'Smirnoff'); +INSERT INTO salesmen VALUES (20, 'Smirnoff'); -- 1 trigger should fire here (row): -INSERT INTO salesmans30_40 VALUES (30, 'Ford'); +INSERT INTO salesmen30_40 VALUES (30, 'Ford'); -SELECT * FROM salesmans01_10; -SELECT * FROM salesmans10_20; -SELECT * FROM salesmans20_30; -SELECT * FROM salesmans30_40; +SELECT * FROM salesmen01_10; +SELECT * FROM salesmen10_20; +SELECT * FROM salesmen20_30; +SELECT * FROM salesmen30_40; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; DROP FUNCTION after_insert_row_trigger(); -- -- Test: split partition witch identity column -- If split partition column is identity column, columns of new partitions are identity columns too. -- -CREATE TABLE salesmans(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans1_2 PARTITION OF salesmans FOR VALUES FROM (1) TO (2); +CREATE TABLE salesmen1_2 PARTITION OF salesmen FOR VALUES FROM (1) TO (2); -- Create new partition with identity column: -CREATE TABLE salesmans2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30)); -ALTER TABLE salesmans ATTACH PARTITION salesmans2_5 FOR VALUES FROM (2) TO (5); +CREATE TABLE salesmen2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30)); +ALTER TABLE salesmen ATTACH PARTITION salesmen2_5 FOR VALUES FROM (2) TO (5); -INSERT INTO salesmans (salesman_name) VALUES ('Poirot'); -INSERT INTO salesmans (salesman_name) VALUES ('Ivanov'); +INSERT INTO salesmen (salesman_name) VALUES ('Poirot'); +INSERT INTO salesmen (salesman_name) VALUES ('Ivanov'); -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid; -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen1_2'::regclass::oid; -- Split partition has identity column: -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_5'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen2_5'::regclass::oid; -ALTER TABLE salesmans SPLIT PARTITION salesmans2_5 INTO - (PARTITION salesmans2_3 FOR VALUES FROM (2) TO (3), - PARTITION salesmans3_4 FOR VALUES FROM (3) TO (4), - PARTITION salesmans4_5 FOR VALUES FROM (4) TO (5)); +ALTER TABLE salesmen SPLIT PARTITION salesmen2_5 INTO + (PARTITION salesmen2_3 FOR VALUES FROM (2) TO (3), + PARTITION salesmen3_4 FOR VALUES FROM (3) TO (4), + PARTITION salesmen4_5 FOR VALUES FROM (4) TO (5)); -INSERT INTO salesmans (salesman_name) VALUES ('May'); -INSERT INTO salesmans (salesman_name) VALUES ('Ford'); +INSERT INTO salesmen (salesman_name) VALUES ('May'); +INSERT INTO salesmen (salesman_name) VALUES ('Ford'); -SELECT * FROM salesmans1_2; -SELECT * FROM salesmans2_3; -SELECT * FROM salesmans3_4; -SELECT * FROM salesmans4_5; +SELECT * FROM salesmen1_2; +SELECT * FROM salesmen2_3; +SELECT * FROM salesmen3_4; +SELECT * FROM salesmen4_5; -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid; -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen1_2'::regclass::oid; -- New partitions have identity-columns: -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_3'::regclass::oid; -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans3_4'::regclass::oid; -SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans4_5'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen2_3'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen3_4'::regclass::oid; +SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmen4_5'::regclass::oid; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split partition with deleted columns -- -CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); +CREATE TABLE salesmen(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id); -CREATE TABLE salesmans01_10 PARTITION OF salesmans FOR VALUES FROM (1) TO (10); +CREATE TABLE salesmen01_10 PARTITION OF salesmen FOR VALUES FROM (1) TO (10); -- Create new partition with some deleted columns: -CREATE TABLE salesmans10_40(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, d2 INT, d3 DATE, salesman_name VARCHAR(30)); +CREATE TABLE salesmen10_40(d1 VARCHAR(30), salesman_id INT PRIMARY KEY, d2 INT, d3 DATE, salesman_name VARCHAR(30)); -INSERT INTO salesmans10_40 VALUES ('dummy value 1', 19, 100, now(), 'Ivanov'); -INSERT INTO salesmans10_40 VALUES ('dummy value 2', 20, 101, now(), 'Smirnoff'); +INSERT INTO salesmen10_40 VALUES ('dummy value 1', 19, 100, now(), 'Ivanov'); +INSERT INTO salesmen10_40 VALUES ('dummy value 2', 20, 101, now(), 'Smirnoff'); -ALTER TABLE salesmans10_40 DROP COLUMN d1; -ALTER TABLE salesmans10_40 DROP COLUMN d2; -ALTER TABLE salesmans10_40 DROP COLUMN d3; +ALTER TABLE salesmen10_40 DROP COLUMN d1; +ALTER TABLE salesmen10_40 DROP COLUMN d2; +ALTER TABLE salesmen10_40 DROP COLUMN d3; -ALTER TABLE salesmans ATTACH PARTITION salesmans10_40 FOR VALUES FROM (10) TO (40); +ALTER TABLE salesmen ATTACH PARTITION salesmen10_40 FOR VALUES FROM (10) TO (40); -INSERT INTO salesmans VALUES (1, 'Poirot'); -INSERT INTO salesmans VALUES (10, 'May'); -INSERT INTO salesmans VALUES (30, 'Ford'); +INSERT INTO salesmen VALUES (1, 'Poirot'); +INSERT INTO salesmen VALUES (10, 'May'); +INSERT INTO salesmen VALUES (30, 'Ford'); -ALTER TABLE salesmans SPLIT PARTITION salesmans10_40 INTO - (PARTITION salesmans10_20 FOR VALUES FROM (10) TO (20), - PARTITION salesmans20_30 FOR VALUES FROM (20) TO (30), - PARTITION salesmans30_40 FOR VALUES FROM (30) TO (40)); +ALTER TABLE salesmen SPLIT PARTITION salesmen10_40 INTO + (PARTITION salesmen10_20 FOR VALUES FROM (10) TO (20), + PARTITION salesmen20_30 FOR VALUES FROM (20) TO (30), + PARTITION salesmen30_40 FOR VALUES FROM (30) TO (40)); -select * from salesmans01_10; -select * from salesmans10_20; -select * from salesmans20_30; -select * from salesmans30_40; +select * from salesmen01_10; +select * from salesmen10_20; +select * from salesmen20_30; +select * from salesmen30_40; -DROP TABLE salesmans CASCADE; +DROP TABLE salesmen CASCADE; -- -- Test: split sub-partition -- 2.39.3 (Apple Git-145)