aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/parse_expr.c')
-rw-r--r--src/backend/parser/parse_expr.c34
1 files changed, 10 insertions, 24 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 45c019627cc..8577f278065 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -3582,7 +3582,6 @@ coerceJsonFuncExpr(ParseState *pstate, Node *expr,
Node *res;
int location;
Oid exprtype = exprType(expr);
- int32 baseTypmod = returning->typmod;
/* if output type is not specified or equals to function type, return */
if (!OidIsValid(returning->typid) || returning->typid == exprtype)
@@ -3612,19 +3611,18 @@ coerceJsonFuncExpr(ParseState *pstate, Node *expr,
}
/*
- * For domains, consider the base type's typmod to decide whether to setup
- * an implicit or explicit cast.
+ * For other cases, try to coerce expression to the output type using
+ * assignment-level casts, erroring out if none available. This basically
+ * allows coercing the jsonb value to any string type (typcategory = 'S').
+ *
+ * Requesting assignment-level here means that typmod / length coercion
+ * assumes implicit coercion which is the behavior we want; see
+ * build_coercion_expression().
*/
- if (get_typtype(returning->typid) == TYPTYPE_DOMAIN)
- (void) getBaseTypeAndTypmod(returning->typid, &baseTypmod);
-
- /* try to coerce expression to the output type */
res = coerce_to_target_type(pstate, expr, exprtype,
- returning->typid, baseTypmod,
- baseTypmod > 0 ? COERCION_IMPLICIT :
- COERCION_EXPLICIT,
- baseTypmod > 0 ? COERCE_IMPLICIT_CAST :
- COERCE_EXPLICIT_CAST,
+ returning->typid, returning->typmod,
+ COERCION_ASSIGNMENT,
+ COERCE_IMPLICIT_CAST,
location);
if (!res && report_error)
@@ -3649,7 +3647,6 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type,
JsonConstructorExpr *jsctor = makeNode(JsonConstructorExpr);
Node *placeholder;
Node *coercion;
- int32 baseTypmod = returning->typmod;
jsctor->args = args;
jsctor->func = fexpr;
@@ -3687,17 +3684,6 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type,
placeholder = (Node *) cte;
}
- /*
- * Convert the source expression to text, because coerceJsonFuncExpr()
- * will create an implicit cast to the RETURNING types with typmod and
- * there are no implicit casts from json(b) to such types. For domains,
- * the base type's typmod will be considered, so do so here too.
- */
- if (get_typtype(returning->typid) == TYPTYPE_DOMAIN)
- (void) getBaseTypeAndTypmod(returning->typid, &baseTypmod);
- if (baseTypmod > 0)
- placeholder = coerce_to_specific_type(pstate, placeholder, TEXTOID,
- "JSON_CONSTRUCTOR()");
coercion = coerceJsonFuncExpr(pstate, placeholder, returning, true);
if (coercion != placeholder)