Report a more useful error for reloptions on a partitioned table.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 9 Nov 2022 17:28:34 +0000 (12:28 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 9 Nov 2022 17:28:34 +0000 (12:28 -0500)
Previously, trying to set storage parameters on a partitioned table
always led to "unrecognized parameter foo", because the code expected
there might be some valid parameters; but there aren't any.  The docs
make clear that it's intended that there never will be any, so let's
replace this useless search with a more to-the-point message.

Simon Riggs and Karina Litskevich

Discussion: https://postgr.es/m/CANbhV-H=eZ9kTR9mUgKGK0Qv9uXP=U+dQg3rinQHfTdFMhBA2A@mail.gmail.com

src/backend/access/common/reloptions.c
src/test/regress/expected/alter_table.out
src/test/regress/expected/create_table.out
src/test/regress/sql/alter_table.sql
src/test/regress/sql/create_table.sql

index 6458a9c27698a7e106b6932119bbee25123b0818..75b7344891a829198721801c3fd38214e2301bc0 100644 (file)
@@ -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_WRONG_OBJECT_TYPE),
+               errmsg("cannot specify storage parameters for a partitioned table"),
+               errhint("Specify storage parameters for its leaf partitions, instead."));
+   return NULL;
 }
 
 /*
index 346f594ad026e65278e23d57e8df9c0a225c6e9d..cab49ec0a8f50a45953fc5dc4f7a9b4811803a5f 100644 (file)
@@ -3801,6 +3801,10 @@ 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:  cannot specify storage parameters for a partitioned table
+HINT:  Specify storage parameters for its leaf partitions, instead.
 -- partitioned table cannot participate in regular inheritance
 CREATE TABLE nonpartitioned (
    a int,
index 4407a017a9f4d370604f3d2dd19c5627da758e37..5eace915a7971b112198dea6e47ddee1ae69503f 100644 (file)
@@ -987,6 +987,10 @@ 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:  cannot specify storage parameters for a partitioned table
+HINT:  Specify storage parameters for its 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}');
index 9f773aeeb94c4436bd1334f55ea993cd20ad5e06..5a71961f02d78df4ddb22fb67f232afc3542a317 100644 (file)
@@ -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,
index 5175f404f77eba9b170946953d1a594a8312caf0..93ccf77d4a143b311987b2a64ec181510f1c9e83 100644 (file)
@@ -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}');