summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane2021-12-16 20:36:02 +0000
committerTom Lane2021-12-16 20:36:02 +0000
commitda0d8a4545e639ca9c22dc2a0a10dcddcdf58761 (patch)
treee19c7be805638f90c9701da6f49c49d2577805d2 /src/backend/parser
parentaadbf825b7c41e241d27dc4d8ed7d77fc4718634 (diff)
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
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/parse_coerce.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 33b96a73529..70466153d9d 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -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)
{