From 2a2742ca3d99e6ce3471e43e9062144e12bd8ecc Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu, 18 Apr 2024 12:56:51 +0300
Subject: [PATCH v6 3/4] Fix error message in
 check_partition_bounds_for_split_range()

Currently, the error message is produced by a system of complex substitutions
making it quite untranslatable and hard to read.  This commit splits this into
4 plain error messages suitable for translation.

Reported-by: Kyotaro Horiguchi
Discussion: https://postgr.es/m/20240408.152402.1485994009160660141.horikyota.ntt%40gmail.com
---
 src/backend/partitioning/partbounds.c | 60 +++++++++++++++++----------
 1 file changed, 39 insertions(+), 21 deletions(-)

diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c
index 0dbacf39c05..bfb965fb2c6 100644
--- a/src/backend/partitioning/partbounds.c
+++ b/src/backend/partitioning/partbounds.c
@@ -5211,7 +5211,7 @@ check_partition_bounds_for_split_range(Relation parent,
 	if (first || last)
 	{
 		PartitionBoundSpec *split_spec = get_partition_bound_spec(splitPartOid, splitPartName);
-		bool		overlap = false;
+		PartitionRangeDatum *datum;
 
 		if (first)
 		{
@@ -5224,13 +5224,30 @@ check_partition_bounds_for_split_range(Relation parent,
 										  key->partcollation,
 										  lower->datums, lower->kind,
 										  true, split_lower);
+			datum = cmpval ? list_nth(spec->lowerdatums, abs(cmpval) - 1) : NULL;
 
 			/*
 			 * Lower bound of "spec" should be equal (or greater than or equal
 			 * in case defaultPart=true) to lower bound of split partition.
 			 */
-			if ((!defaultPart && cmpval) || (defaultPart && cmpval < 0))
-				overlap = true;
+			if (!defaultPart)
+			{
+				if (cmpval != 0)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+							 errmsg("lower bound of partition \"%s\" is not equal to lower bound of split partition",
+									relname),
+							 parser_errposition(pstate, datum->location)));
+			}
+			else
+			{
+				if (cmpval < 0)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+							 errmsg("lower bound of partition \"%s\" is less than lower bound of split partition",
+									relname),
+							 parser_errposition(pstate, datum->location)));
+			}
 		}
 		else
 		{
@@ -5243,29 +5260,30 @@ check_partition_bounds_for_split_range(Relation parent,
 										  key->partcollation,
 										  upper->datums, upper->kind,
 										  false, split_upper);
+			datum = cmpval ? list_nth(spec->lowerdatums, abs(cmpval) - 1) : NULL;
 
 			/*
 			 * Upper bound of of "spec" should be equal (or less than or equal
 			 * in case defaultPart=true) to upper bound of split partition.
 			 */
-			if ((!defaultPart && cmpval) || (defaultPart && cmpval > 0))
-				overlap = true;
-		}
-
-		if (overlap)
-		{
-			PartitionRangeDatum *datum;
-
-			datum = list_nth(first ? spec->lowerdatums : spec->upperdatums, abs(cmpval) - 1);
-
-			ereport(ERROR,
-					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-					 errmsg("%s bound of partition \"%s\" is %s %s bound of split partition",
-							first ? "lower" : "upper",
-							relname,
-							defaultPart ? (first ? "less than" : "greater than") : "not equal to",
-							first ? "lower" : "upper"),
-					 parser_errposition(pstate, datum->location)));
+			if (!defaultPart)
+			{
+				if (cmpval != 0)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+							 errmsg("upper bound of partition \"%s\" is not equal to upper bound of split partition",
+									relname),
+							 parser_errposition(pstate, datum->location)));
+			}
+			else
+			{
+				if (cmpval > 0)
+					ereport(ERROR,
+							(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+							 errmsg("upper bound of partition \"%s\" is greater than upper bound of split partition",
+									relname),
+							 parser_errposition(pstate, datum->location)));
+			}
 		}
 	}
 }
-- 
2.39.3 (Apple Git-145)

