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
Reviewed-by: Pavel Borisov
This commit is contained in:
Alexander Korotkov 2024-04-30 11:55:03 +03:00
parent fcf80c5d5f
commit 96c7381c4c
1 changed files with 49 additions and 21 deletions

View 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)));
}
}
}
}
}