mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Ensure casting to typmod -1 generates a RelabelType.
Fix the code changed by commit 5c056b0c2
so that we always generate
RelabelType, not something else, for a cast to unspecified typmod.
Otherwise planner optimizations might not happen.
It appears we missed this point because the previous experiments were
done on type numeric: the parser undesirably generates a call on the
numeric() length-coercion function, but then numeric_support()
optimizes that down to a RelabelType, so that everything seems fine.
It misbehaves for types that have a non-optimized length coercion
function, such as bpchar.
Per report from John Naylor. Back-patch to all supported branches,
as the previous patch eventually was. Unfortunately, that no longer
includes 9.6 ... we really shouldn't put this type of change into a
nearly-EOL branch.
Discussion: https://postgr.es/m/CAFBsxsEfbFHEkouc+FSj+3K1sHipLPbEC67L0SAe-9-da8QtYg@mail.gmail.com
This commit is contained in:
@ -763,7 +763,15 @@ coerce_type_typmod(Node *node, Oid targetTypeId, int32 targetTypMod,
|
||||
if (hideInputCoercion)
|
||||
hide_coercion_node(node);
|
||||
|
||||
pathtype = find_typmod_coercion_function(targetTypeId, &funcId);
|
||||
/*
|
||||
* A negative typmod means that no actual coercion is needed, but we still
|
||||
* want a RelabelType to ensure that the expression exposes the intended
|
||||
* typmod.
|
||||
*/
|
||||
if (targetTypMod < 0)
|
||||
pathtype = COERCION_PATH_NONE;
|
||||
else
|
||||
pathtype = find_typmod_coercion_function(targetTypeId, &funcId);
|
||||
|
||||
if (pathtype != COERCION_PATH_NONE)
|
||||
{
|
||||
|
Reference in New Issue
Block a user