v45-0002-error-message-refactoring.no-cfbot
application/octet-stream
Filename: v45-0002-error-message-refactoring.no-cfbot
Type: application/octet-stream
Part: 1
From b73cc0afd61b588a17528f59901334c1839fc33e Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Mon, 16 Jun 2025 11:54:41 +0800
Subject: [PATCH v45 2/2] error message refactoring
---
src/backend/parser/parse_utilcmd.c | 20 ++++++++-----------
src/backend/partitioning/partbounds.c | 3 ++-
src/test/regress/expected/partition_merge.out | 18 ++++++++++++-----
3 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index eb8a937e1e8..4fe9cd33328 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -3493,7 +3493,7 @@ transformRuleStmt(RuleStmt *stmt, const char *queryString,
/*
* checkPartition
- * Check that partRelOid is an oid of partition of the parent table rel
+ * Check whether partRelOid is a leaf partition of the parent table (rel).
*/
static void
checkPartition(Relation rel, Oid partRelOid)
@@ -3505,26 +3505,22 @@ checkPartition(Relation rel, Oid partRelOid)
if (partRel->rd_rel->relkind != RELKIND_RELATION)
ereport(ERROR,
errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("\"%s\" is not a table",
- RelationGetRelationName(partRel)));
+ errmsg("\"%s\" is not a table", RelationGetRelationName(partRel)),
+ errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions"));
if (!partRel->rd_rel->relispartition)
ereport(ERROR,
errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("\"%s\" is not a partition",
- RelationGetRelationName(partRel)));
+ errmsg("\"%s\" is not a partition of partitioned table \"%s\"",
+ RelationGetRelationName(partRel), RelationGetRelationName(rel)),
+ errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions"));
if (get_partition_parent(partRelOid, false) != RelationGetRelid(rel))
ereport(ERROR,
errcode(ERRCODE_UNDEFINED_TABLE),
errmsg("relation \"%s\" is not a partition of relation \"%s\"",
- RelationGetRelationName(partRel),
- RelationGetRelationName(rel)));
-
- /* Permissions checks */
- if (!object_ownercheck(RelationRelationId, RelationGetRelid(partRel), GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(partRel->rd_rel->relkind),
- RelationGetRelationName(partRel));
+ RelationGetRelationName(partRel), RelationGetRelationName(rel)),
+ errhint("ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions"));
table_close(partRel, NoLock);
}
diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index 2664c7b7091..9f7c01b7fa8 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -5028,8 +5028,9 @@ check_two_partitions_bounds_range(Relation parent,
ereport(ERROR,
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
- errmsg("lower bound of partition \"%s\" conflicts with upper bound of previous partition \"%s\"",
+ errmsg("lower bound of partition \"%s\" is not equal to the upper bound of partition \"%s\"",
second_name->relname, first_name->relname),
+ errhint("ALTER TABLE ... MERGE PARTITIONS requires the partition bounds to be adjacent."),
parser_errposition(pstate, datum->location));
}
}
diff --git a/src/test/regress/expected/partition_merge.out b/src/test/regress/expected/partition_merge.out
index 4bfc4f7b5ff..20fa6c13680 100644
--- a/src/test/regress/expected/partition_merge.out
+++ b/src/test/regress/expected/partition_merge.out
@@ -29,14 +29,17 @@ 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
-- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_jan2022"
-- (space between sections sales_jan2022 and sales_mar2022)
ALTER TABLE sales_range MERGE PARTITIONS (sales_jan2022, sales_mar2022) INTO sales_jan_mar2022;
-ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_jan2022"
+ERROR: lower bound of partition "sales_mar2022" is not equal to the upper bound of partition "sales_jan2022"
+HINT: ALTER TABLE ... MERGE PARTITIONS requires the partition bounds to be adjacent.
-- ERROR: lower bound of partition "sales_jan2022" conflicts with upper bound of previous partition "sales_dec2021"
-- (space between sections sales_dec2021 and sales_jan2022)
ALTER TABLE sales_range MERGE PARTITIONS (sales_dec2021, sales_jan2022, sales_feb2022) INTO sales_dec_jan_feb2022;
-ERROR: lower bound of partition "sales_jan2022" conflicts with upper bound of previous partition "sales_dec2021"
+ERROR: lower bound of partition "sales_jan2022" is not equal to the upper bound of partition "sales_dec2021"
+HINT: ALTER TABLE ... MERGE PARTITIONS requires the partition bounds to be adjacent.
-- ERROR: partition with name "sales_feb2022" is already used
ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, partitions_merge_schema.sales_feb2022) INTO sales_feb_mar_apr2022;
ERROR: partition with name "sales_feb2022" is already used
@@ -611,13 +614,16 @@ CREATE TABLE sales_external (LIKE sales_list);
CREATE TABLE sales_external2 (vch VARCHAR(5));
-- ERROR: "sales_external" is not a partition
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_external) INTO sales_all;
-ERROR: "sales_external" is not a partition
+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
-- ERROR: "sales_external2" is not a partition
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_external2) INTO sales_all;
-ERROR: "sales_external2" is not a partition
+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
-- 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
DROP TABLE sales_external2;
DROP TABLE sales_external;
DROP TABLE sales_list2;
@@ -759,9 +765,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
-- ERROR: "t3" is not a partition
ALTER TABLE t2 MERGE PARTITIONS (t2pa, t3) INTO t2p;
-ERROR: "t3" is not a partition
+ERROR: "t3" is not a partition of partitioned table "t2"
+HINT: ALTER TABLE ... MERGE PARTITIONS can only merge partitions don't have sub-partitions
DROP TABLE t3;
DROP TABLE t2;
DROP TABLE t1;
--
2.34.1