aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/parser/parse_coerce.c26
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)