Hi, Simon! The new error message looks better. But I believe it is better to use "parameters" instead of "options" as it is called "storage parameters" in the documentation. I also believe it is better to report error in partitioned_table_reloptions() (thanks to Japin Li for mentioning this function) as it also fixes the error message in the following situation:
test=# CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a); CREATE TABLE test=# ALTER TABLE parted_col_comment SET (fillfactor=100); ERROR: unrecognized parameter "fillfactor" I attached the new versions of patches. I'm not sure about the errcode. May be it is better to report error with ERRCODE_INVALID_OBJECT_DEFINITION for CREATE TABLE and with ERRCODE_WRONG_OBJECT_TYPE for ALTER TABLE (as when you try "ALTER TABLE partitioned INHERIT nonpartitioned;" an ERROR with ERRCODE_WRONG_OBJECT_TYPE is reported). Then either the desired code should be passed to partitioned_table_reloptions() or similar checks and ereport calls should be placed in two different places. I'm not sure whether it is a good idea to change the code in one of these ways just to change the error code. Best regards, Karina Litskevich Postgres Professional: http://postgrespro.com/
From 6407538f0bfd3eb56f5a4574d8893f9494f2a810 Mon Sep 17 00:00:00 2001 From: Karina Litskevich <l_karink...@mail.ru> Date: Fri, 14 Oct 2022 17:48:27 +0300 Subject: [PATCH v2 2/2] better error message for setting parameters for partitioned table --- src/backend/access/common/reloptions.c | 13 ++++++------- src/test/regress/expected/alter_table.out | 3 ++- src/test/regress/expected/create_table.out | 3 ++- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 6458a9c276..75d6ff5040 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -1984,13 +1984,12 @@ build_local_reloptions(local_relopts *relopts, Datum options, bool validate) bytea * partitioned_table_reloptions(Datum reloptions, bool validate) { - /* - * There are no options for partitioned tables yet, but this is able to do - * some validation. - */ - return (bytea *) build_reloptions(reloptions, validate, - RELOPT_KIND_PARTITIONED, - 0, NULL, 0); + if (validate && reloptions) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot specify storage parameters for a partitioned table"), + errhint("specify storage parameters on leaf partitions instead")); + return NULL; } /* diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index cec7bfa1f1..a719ef22c7 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3803,7 +3803,8 @@ ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); ERROR: cannot alter column "b" because it is part of the partition key of relation "partitioned" -- specifying storage parameters for partitioned tables is not supported ALTER TABLE partitioned SET (fillfactor=100); -ERROR: unrecognized parameter "fillfactor" +ERROR: cannot specify storage parameters for a partitioned table +HINT: specify storage parameters on leaf partitions instead -- partitioned table cannot participate in regular inheritance CREATE TABLE nonpartitioned ( a int, diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 45c1a0a23e..f16be87729 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -989,7 +989,8 @@ Number of partitions: 0 DROP TABLE parted_col_comment; -- specifying storage parameters for partitioned tables is not supported CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a) WITH (fillfactor=100); -ERROR: unrecognized parameter "fillfactor" +ERROR: cannot specify storage parameters for a partitioned table +HINT: specify storage parameters on leaf partitions instead -- list partitioning on array type column CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); -- 2.25.1
From 580566815bc5abd6193f86ddbd55fac1ac941873 Mon Sep 17 00:00:00 2001 From: Karina Litskevich <l_karink...@mail.ru> Date: Fri, 14 Oct 2022 16:22:57 +0300 Subject: [PATCH v2 1/2] test parameters for partitioned table --- src/test/regress/expected/alter_table.out | 3 +++ src/test/regress/expected/create_table.out | 3 +++ src/test/regress/sql/alter_table.sql | 3 +++ src/test/regress/sql/create_table.sql | 3 +++ 4 files changed, 12 insertions(+) diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 346f594ad0..cec7bfa1f1 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3801,6 +3801,9 @@ ALTER TABLE partitioned DROP COLUMN b; ERROR: cannot drop column "b" because it is part of the partition key of relation "partitioned" ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); ERROR: cannot alter column "b" because it is part of the partition key of relation "partitioned" +-- specifying storage parameters for partitioned tables is not supported +ALTER TABLE partitioned SET (fillfactor=100); +ERROR: unrecognized parameter "fillfactor" -- partitioned table cannot participate in regular inheritance CREATE TABLE nonpartitioned ( a int, diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 4407a017a9..45c1a0a23e 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -987,6 +987,9 @@ Partition key: LIST (a) Number of partitions: 0 DROP TABLE parted_col_comment; +-- specifying storage parameters for partitioned tables is not supported +CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a) WITH (fillfactor=100); +ERROR: unrecognized parameter "fillfactor" -- list partitioning on array type column CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 9f773aeeb9..5a71961f02 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2325,6 +2325,9 @@ ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); ALTER TABLE partitioned DROP COLUMN b; ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); +-- specifying storage parameters for partitioned tables is not supported +ALTER TABLE partitioned SET (fillfactor=100); + -- partitioned table cannot participate in regular inheritance CREATE TABLE nonpartitioned ( a int, diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 5175f404f7..93ccf77d4a 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -652,6 +652,9 @@ SELECT obj_description('parted_col_comment'::regclass); \d+ parted_col_comment DROP TABLE parted_col_comment; +-- specifying storage parameters for partitioned tables is not supported +CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a) WITH (fillfactor=100); + -- list partitioning on array type column CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); -- 2.25.1