From f9a8bc9f27e6c7569f30fc86b82129647068f6a0 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 16 Dec 2021 15:36:02 -0500 Subject: 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 --- src/backend/parser/parse_coerce.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src/backend/parser/parse_coerce.c') diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 78194afedfb..5e86f4b1e2e 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -766,7 +766,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) { -- cgit v1.2.3