mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
Remove complaints about COLLATE clauses in partition bound values.
transformPartitionBoundValue went out of its way to do the wrong thing: there is no reason to complain about a non-matching COLLATE clause in a partition boundary expression. We're coercing the bound expression to the target column type as though by an implicit assignment, and the rules for implicit assignment say that collations can be implicitly converted. What we *do* need to do, and the code is not doing, is apply assign_expr_collations() to the bound expression. While this is merely a definition disagreement, that is a bug that needs to be back-patched, so I'll commit it separately. Discussion: https://postgr.es/m/CAJV4CdrZ5mKuaEsRSbLf2URQ3h6iMtKD=hik8MaF5WwdmC9uZw@mail.gmail.com
This commit is contained in:
@ -4183,50 +4183,6 @@ transformPartitionBoundValue(ParseState *pstate, Node *val,
|
||||
*/
|
||||
Assert(!contain_var_clause(value));
|
||||
|
||||
/*
|
||||
* Check that the input expression's collation is compatible with one
|
||||
* specified for the parent's partition key (partcollation). Don't throw
|
||||
* an error if it's the default collation which we'll replace with the
|
||||
* parent's collation anyway.
|
||||
*/
|
||||
if (IsA(value, CollateExpr))
|
||||
{
|
||||
Oid exprCollOid = exprCollation(value);
|
||||
|
||||
/*
|
||||
* Check we have a collation iff it is a collatable type. The only
|
||||
* expected failures here are (1) COLLATE applied to a noncollatable
|
||||
* type, or (2) partition bound expression had an unresolved
|
||||
* collation. But we might as well code this to be a complete
|
||||
* consistency check.
|
||||
*/
|
||||
if (type_is_collatable(colType))
|
||||
{
|
||||
if (!OidIsValid(exprCollOid))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INDETERMINATE_COLLATION),
|
||||
errmsg("could not determine which collation to use for partition bound expression"),
|
||||
errhint("Use the COLLATE clause to set the collation explicitly.")));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (OidIsValid(exprCollOid))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("collations are not supported by type %s",
|
||||
format_type_be(colType))));
|
||||
}
|
||||
|
||||
if (OidIsValid(exprCollOid) &&
|
||||
exprCollOid != DEFAULT_COLLATION_OID &&
|
||||
exprCollOid != partCollation)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DATATYPE_MISMATCH),
|
||||
errmsg("collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"",
|
||||
colName, get_collation_name(partCollation)),
|
||||
parser_errposition(pstate, exprLocation(value))));
|
||||
}
|
||||
|
||||
/*
|
||||
* Coerce to the correct type. This might cause an explicit coercion step
|
||||
* to be added on top of the expression, which must be evaluated before
|
||||
|
Reference in New Issue
Block a user