Fix error message in check_partition_bounds_for_split_range()
authorAlexander Korotkov
Tue, 30 Apr 2024 08:55:03 +0000 (11:55 +0300)
committerAlexander Korotkov
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)));
+               }
+           }
        }
    }
 }