public inbox for [email protected]  
help / color / mirror / Atom feed
From: Peter Smith <[email protected]>
To: PostgreSQL Hackers <[email protected]>
Subject: Add missing period to HINT messages
Date: Thu, 9 Apr 2026 09:30:42 +1000
Message-ID: <CAHut+PvikGr4AtoFSs=jq=hmTybVF2NCMEZ57-sjwbGudfuqsQ@mail.gmail.com> (raw)

Hi,

According to the error message style guide [1], "Detail and hint
messages: Use complete sentences, and end each with a period."

I found there is a small group of HINT messages not following that period rule.

PSA a patch that fixes the missing period. In passing, also fixed a
typo in a hint message /msut/must/.

~~~

On further inspection, lots of these affected messages don't even seem
grammatically correct to me.

I did not modify them, but here are examples of what I mean.

e.g.
"ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have
sub-partitions."
/don't have/that don't have/

e.g.
"ALTER TABLE ... SPLIT PARTITION can only split partitions don't have
sub-partitions."
/don't have/that don't have/

e.g.
"To split DEFAULT partition one of the new partition must be DEFAULT."
missing word? -- "To split the DEFAULT partition"
should be plural? -- "one of the new partitions"

e.g.
"%s require combined bounds of new partitions must exactly match the
bound of the split partition."
/require/requires/ ?
/match the bound/match the bounds/

======
[1] https://www.postgresql.org/docs/devel/error-style-guide.html#ERROR-STYLE-GUIDE-GRAMMAR-PUNCTUATION

Kind Regards,
Peter Smith.
Fujitsu Australia


Attachments:

  [application/octet-stream] v1-0001-Add-missing-period-to-HINT-messages.patch (17.7K, 2-v1-0001-Add-missing-period-to-HINT-messages.patch)
  download | inline diff:
From 14b39e0c5c6735f1b513e5d3549ea0ece77a7040 Mon Sep 17 00:00:00 2001
From: Peter Smith <[email protected]>
Date: Thu, 9 Apr 2026 09:11:59 +1000
Subject: [PATCH v1] Add missing period to HINT messages

---
 src/backend/parser/parse_utilcmd.c            | 14 +++++++-------
 src/backend/partitioning/partbounds.c         | 12 ++++++------
 src/test/regress/expected/partition_merge.out | 12 ++++++------
 src/test/regress/expected/partition_split.out | 18 +++++++++---------
 src/test/regress/sql/partition_split.sql      |  2 +-
 5 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 347f0259e5d..37071502a9f 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -3536,8 +3536,8 @@ checkPartition(Relation rel, Oid partRelOid, bool isMerge)
 				errcode(ERRCODE_WRONG_OBJECT_TYPE),
 				errmsg("\"%s\" is not a table", RelationGetRelationName(partRel)),
 				isMerge
-				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions")
-				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions"));
+				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.")
+				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions."));
 
 	if (!partRel->rd_rel->relispartition)
 		ereport(ERROR,
@@ -3545,8 +3545,8 @@ checkPartition(Relation rel, Oid partRelOid, bool isMerge)
 				errmsg("\"%s\" is not a partition of partitioned table \"%s\"",
 					   RelationGetRelationName(partRel), RelationGetRelationName(rel)),
 				isMerge
-				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions")
-				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions"));
+				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.")
+				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions."));
 
 	if (get_partition_parent(partRelOid, false) != RelationGetRelid(rel))
 		ereport(ERROR,
@@ -3554,8 +3554,8 @@ checkPartition(Relation rel, Oid partRelOid, bool isMerge)
 				errmsg("relation \"%s\" is not a partition of relation \"%s\"",
 					   RelationGetRelationName(partRel), RelationGetRelationName(rel)),
 				isMerge
-				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions")
-				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions"));
+				? errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.")
+				: errhint("ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions."));
 
 	table_close(partRel, NoLock);
 }
@@ -3647,7 +3647,7 @@ transformPartitionCmdForSplit(CreateStmtContext *cxt, PartitionCmd *partcmd)
 				errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 				errmsg("can not split DEFAULT partition \"%s\"",
 					   get_rel_name(splitPartOid)),
-				errhint("To split DEFAULT partition one of the new partition msut be DEFAULT"),
+				errhint("To split DEFAULT partition one of the new partition must be DEFAULT."),
 				parser_errposition(cxt->pstate, ((SinglePartitionSpec *) linitial(splitlist))->name->location));
 
 	/*
diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index f867d1b75a5..5afa781f086 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -5405,7 +5405,7 @@ check_partition_bounds_for_split_range(Relation parent,
 							errmsg("lower bound of partition \"%s\" is not equal to lower bound of split partition \"%s\"",
 								   relname,
 								   get_rel_name(splitPartOid)),
-							errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+							errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 									"ALTER TABLE ... SPLIT PARTITION"),
 							parser_errposition(pstate, exprLocation((Node *) datum)));
 			}
@@ -5415,7 +5415,7 @@ check_partition_bounds_for_split_range(Relation parent,
 						errmsg("lower bound of partition \"%s\" is less than lower bound of split partition \"%s\"",
 							   relname,
 							   get_rel_name(splitPartOid)),
-						errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+						errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 								"ALTER TABLE ... SPLIT PARTITION"),
 						parser_errposition(pstate, exprLocation((Node *) datum)));
 		}
@@ -5447,7 +5447,7 @@ check_partition_bounds_for_split_range(Relation parent,
 							errmsg("upper bound of partition \"%s\" is not equal to upper bound of split partition \"%s\"",
 								   relname,
 								   get_rel_name(splitPartOid)),
-							errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+							errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 									"ALTER TABLE ... SPLIT PARTITION"),
 							parser_errposition(pstate, exprLocation((Node *) datum)));
 			}
@@ -5457,7 +5457,7 @@ check_partition_bounds_for_split_range(Relation parent,
 						errmsg("upper bound of partition \"%s\" is greater than upper bound of split partition \"%s\"",
 							   relname,
 							   get_rel_name(splitPartOid)),
-						errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+						errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 								"ALTER TABLE ... SPLIT PARTITION"),
 						parser_errposition(pstate, exprLocation((Node *) datum)));
 		}
@@ -5653,7 +5653,7 @@ check_parent_values_in_new_partitions(Relation parent,
 				errmsg("new partitions combined partition bounds do not contain value (%s) but split partition \"%s\" does",
 					   "NULL",
 					   get_rel_name(partOid)),
-				errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+				errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 						"ALTER TABLE ... SPLIT PARTITION"));
 
 	/*
@@ -5696,7 +5696,7 @@ check_parent_values_in_new_partitions(Relation parent,
 				errmsg("new partitions combined partition bounds do not contain value (%s) but split partition \"%s\" does",
 					   deparse_expression((Node *) notFoundVal, NIL, false, false),
 					   get_rel_name(partOid)),
-				errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition",
+				errhint("%s require combined bounds of new partitions must exactly match the bound of the split partition.",
 						"ALTER TABLE ... SPLIT PARTITION"));
 	}
 }
diff --git a/src/test/regress/expected/partition_merge.out b/src/test/regress/expected/partition_merge.out
index 925fe4f570a..883110e25d9 100644
--- a/src/test/regress/expected/partition_merge.out
+++ b/src/test/regress/expected/partition_merge.out
@@ -29,7 +29,7 @@ LINE 1: ...e MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_feb2...
 -- ERROR:  "sales_apr2022" is not a table
 ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_apr2022) INTO sales_feb_mar_apr2022;
 ERROR:  "sales_apr2022" is not a table
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 -- ERROR:  can not merge partition "sales_mar2022" together with partition "sales_jan2022"
 -- DETAIL:  lower bound of partition "sales_mar2022" is not equal to the upper bound of partition "sales_jan2022"
 -- (space between sections sales_jan2022 and sales_mar2022)
@@ -483,15 +483,15 @@ CREATE TABLE sales_external2 (vch VARCHAR(5));
 -- ERROR:  "sales_external" is not a partition of partitioned table "sales_list"
 ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_external) INTO sales_all;
 ERROR:  "sales_external" is not a partition of partitioned table "sales_list"
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 -- ERROR:  "sales_external2" is not a partition of partitioned table "sales_list"
 ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_external2) INTO sales_all;
 ERROR:  "sales_external2" is not a partition of partitioned table "sales_list"
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 -- ERROR:  relation "sales_nord2" is not a partition of relation "sales_list"
 ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_nord2, sales_east) INTO sales_all;
 ERROR:  relation "sales_nord2" is not a partition of relation "sales_list"
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 DROP TABLE sales_external2;
 DROP TABLE sales_external;
 DROP TABLE sales_list2;
@@ -633,11 +633,11 @@ CREATE TABLE t3 (i int, t text);
 -- ERROR:  relation "t1p1" is not a partition of relation "t2"
 ALTER TABLE t2 MERGE PARTITIONS (t1p1, t2pa) INTO t2p;
 ERROR:  relation "t1p1" is not a partition of relation "t2"
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 -- ERROR:  "t3" is not a partition of partitioned table "t2"
 ALTER TABLE t2 MERGE PARTITIONS (t2pa, t3) INTO t2p;
 ERROR:  "t3" is not a partition of partitioned table "t2"
-HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
+HINT:  ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions.
 DROP TABLE t3;
 DROP TABLE t2;
 DROP TABLE t1;
diff --git a/src/test/regress/expected/partition_split.out b/src/test/regress/expected/partition_split.out
index 13ca733f9fa..dbcb9a4f6b7 100644
--- a/src/test/regress/expected/partition_split.out
+++ b/src/test/regress/expected/partition_split.out
@@ -57,7 +57,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
 ERROR:  lower bound of partition "sales_feb2022" is not equal to lower bound of split partition "sales_feb_mar_apr2022"
 LINE 2:   (PARTITION sales_feb2022 FOR VALUES FROM ('2022-01-01') TO...
                                                     ^
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 -- ERROR:  partition with name "sales_feb_mar_apr2022" is already used
 -- (We can create partition with the same name as split partition, but can't create two partitions with the same name)
 ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
@@ -100,7 +100,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
 ERROR:  upper bound of partition "sales_apr2022" is not equal to upper bound of split partition "sales_feb_mar_apr2022"
 LINE 4: ... sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-0...
                                                              ^
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 -- ERROR:  can not split to partition "sales_mar2022" together with 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'),
@@ -122,7 +122,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
 ERROR:  lower bound of partition "sales_feb2022" is not equal to lower bound of split partition "sales_feb_mar_apr2022"
 LINE 2:   (PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-02') TO...
                                                     ^
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 -- Check the source partition not in the search path
 SET search_path = partition_split_schema2, public;
 ALTER TABLE partition_split_schema.sales_range
@@ -159,7 +159,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
 ERROR:  upper bound of partition "sales_apr2022" is not equal to upper bound of split partition "sales_feb_mar_apr2022"
 LINE 4: ... sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-0...
                                                              ^
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 DROP TABLE sales_range;
 --
 -- Add rows into partitioned table then split partition
@@ -509,7 +509,7 @@ LINE 3:    PARTITION sales_error FOR VALUES FROM ('2021-12-01') TO (...
 DETAIL:  lower bound of partition "sales_error" is not equal to the upper bound of partition "sales_dec2021"
 HINT:  ALTER TABLE ... SPLIT PARTITION requires the partition bounds to be adjacent.
 -- ERROR:  can not split DEFAULT partition "sales_others"
--- HINT:  To split DEFAULT partition one of the new partition msut be DEFAULT
+-- HINT:  To split DEFAULT partition one of the new partition must be DEFAULT.
 ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
   (PARTITION sales_dec2021 FOR VALUES FROM ('2021-12-01') TO ('2022-01-01'),
    PARTITION sales_jan2022 FOR VALUES FROM ('2022-01-01') TO ('2022-02-01'),
@@ -517,7 +517,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
 ERROR:  can not split DEFAULT partition "sales_others"
 LINE 2:   (PARTITION sales_dec2021 FOR VALUES FROM ('2021-12-01') TO...
                      ^
-HINT:  To split DEFAULT partition one of the new partition msut be DEFAULT
+HINT:  To split DEFAULT partition one of the new partition must be DEFAULT.
 -- no error: bounds of sales_noerror are between sales_dec2021 and sales_feb2022
 ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
   (PARTITION sales_dec2021 FOR VALUES FROM ('2021-12-01') TO ('2022-01-01'),
@@ -925,7 +925,7 @@ ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
    PARTITION sales_east FOR VALUES IN ('Beijing', 'Delhi', 'Vladivostok'),
    PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
 ERROR:  new partitions combined partition bounds do not contain value (NULL) but split partition "sales_all" does
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 -- ERROR:  new partitions combined partition bounds do not contain value ('Kyiv'::character varying(20)) but split partition "sales_all" does
 -- HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
 ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
@@ -933,7 +933,7 @@ ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
    PARTITION sales_east FOR VALUES IN ('Beijing', 'Delhi', 'Vladivostok'),
    PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', NULL));
 ERROR:  new partitions combined partition bounds do not contain value ('Kyiv'::character varying(20)) but split partition "sales_all" does
-HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition
+HINT:  ALTER TABLE ... SPLIT PARTITION require combined bounds of new partitions must exactly match the bound of the split partition.
 -- ERROR  DEFAULT partition should be one
 ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
   (PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
@@ -1207,7 +1207,7 @@ ALTER TABLE t2 SPLIT PARTITION t1pa INTO
    (PARTITION t2a FOR VALUES FROM ('A') TO ('B'),
     PARTITION t2b FOR VALUES FROM ('B') TO ('C'));
 ERROR:  relation "t1pa" is not a partition of relation "t2"
-HINT:  ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions
+HINT:  ALTER TABLE ... SPLIT PARTITION can only split partitions don't have sub-partitions.
 DROP TABLE t2;
 DROP TABLE t1;
 --
diff --git a/src/test/regress/sql/partition_split.sql b/src/test/regress/sql/partition_split.sql
index 37c6d730840..3f97adc6767 100644
--- a/src/test/regress/sql/partition_split.sql
+++ b/src/test/regress/sql/partition_split.sql
@@ -331,7 +331,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
    PARTITION sales_others DEFAULT);
 
 -- ERROR:  can not split DEFAULT partition "sales_others"
--- HINT:  To split DEFAULT partition one of the new partition msut be DEFAULT
+-- HINT:  To split DEFAULT partition one of the new partition must be DEFAULT.
 ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
   (PARTITION sales_dec2021 FOR VALUES FROM ('2021-12-01') TO ('2022-01-01'),
    PARTITION sales_jan2022 FOR VALUES FROM ('2022-01-01') TO ('2022-02-01'),
-- 
2.47.3



view thread (15+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected]
  Subject: Re: Add missing period to HINT messages
  In-Reply-To: <CAHut+PvikGr4AtoFSs=jq=hmTybVF2NCMEZ57-sjwbGudfuqsQ@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox