diff options
-rw-r--r-- | src/backend/parser/parse_coerce.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 4723c960d0e..0b5b81c7f27 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -414,6 +414,12 @@ coerce_type(ParseState *pstate, Node *node, &funcId); if (pathtype != COERCION_PATH_NONE) { + Oid baseTypeId; + int32 baseTypeMod; + + baseTypeMod = targetTypeMod; + baseTypeId = getBaseTypeAndTypmod(targetTypeId, &baseTypeMod); + if (pathtype != COERCION_PATH_RELABELTYPE) { /* @@ -423,12 +429,6 @@ coerce_type(ParseState *pstate, Node *node, * and we need to extract the correct typmod to use from the * domain's typtypmod. */ - Oid baseTypeId; - int32 baseTypeMod; - - baseTypeMod = targetTypeMod; - baseTypeId = getBaseTypeAndTypmod(targetTypeId, &baseTypeMod); - result = build_coercion_expression(node, pathtype, funcId, baseTypeId, baseTypeMod, ccontext, cformat, location); @@ -454,7 +454,8 @@ coerce_type(ParseState *pstate, Node *node, * that must be accounted for. If the destination is a domain * then we won't need a RelabelType node. */ - result = coerce_to_domain(node, InvalidOid, -1, targetTypeId, + result = coerce_to_domain(node, baseTypeId, baseTypeMod, + targetTypeId, ccontext, cformat, location, false); if (result == node) @@ -660,10 +661,8 @@ can_coerce_type(int nargs, const Oid *input_typeids, const Oid *target_typeids, * Create an expression tree to represent coercion to a domain type. * * 'arg': input expression - * 'baseTypeId': base type of domain, if known (pass InvalidOid if caller - * has not bothered to look this up) - * 'baseTypeMod': base type typmod of domain, if known (pass -1 if caller - * has not bothered to look this up) + * 'baseTypeId': base type of domain + * 'baseTypeMod': base type typmod of domain * 'typeId': target type to coerce to * 'ccontext': context indicator to control coercions * 'cformat': coercion display format @@ -679,9 +678,8 @@ coerce_to_domain(Node *arg, Oid baseTypeId, int32 baseTypeMod, Oid typeId, { CoerceToDomain *result; - /* Get the base type if it hasn't been supplied */ - if (baseTypeId == InvalidOid) - baseTypeId = getBaseTypeAndTypmod(typeId, &baseTypeMod); + /* We now require the caller to supply correct baseTypeId/baseTypeMod */ + Assert(OidIsValid(baseTypeId)); /* If it isn't a domain, return the node as it was passed in */ if (baseTypeId == typeId) |