Fix error message in check_partition_bounds_for_split_range()
authorAlexander Korotkov <akorotkov@postgresql.org>
Tue, 30 Apr 2024 08:55:03 +0000 (11:55 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Tue, 30 Apr 2024 09:00:39 +0000 (12:00 +0300)
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
Reviewed-by: Pavel Borisov
src/backend/partitioning/partbounds.c

index b08edf87a69157a818371086fae78bd669fbc7d1..4eda59767ce7b770406dd4d944a8a57063b5aa57 100644 (file)
@@ -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)
                {
@@ -5229,8 +5229,30 @@ check_partition_bounds_for_split_range(Relation parent,
                         * 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)
+                               {
+                                       datum = list_nth(spec->lowerdatums, abs(cmpval) - 1);
+                                       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)
+                               {
+                                       datum = list_nth(spec->lowerdatums, abs(cmpval) - 1);
+                                       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
                {
@@ -5248,24 +5270,30 @@ check_partition_bounds_for_split_range(Relation parent,
                         * Upper bound 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)
+                               {
+                                       datum = list_nth(spec->upperdatums, abs(cmpval) - 1);
+                                       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)
+                               {
+                                       datum = list_nth(spec->upperdatums, abs(cmpval) - 1);
+                                       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)));
+                               }
+                       }
                }
        }
 }