From 5ab5ddc4549e210d5970a20505ef1813c7dcb335 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Fri, 7 Jul 2023 12:08:58 +0900 Subject: [PATCH v3 1/6] Pass constructName to transformJsonValueExpr() Which in turn can be passed to coerce_to_specific_type() so that it can report the name of the specific JSON_* expression being transformed. --- src/backend/parser/parse_expr.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 346fd272b6..9e8a2ac22b 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3223,6 +3223,7 @@ makeCaseTestExpr(Node *expr) */ static Node * transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, + char *constructName, JsonFormatType default_format) { Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); @@ -3233,12 +3234,8 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, char typcategory; bool typispreferred; - /* - * Using JSON_VALUE here is slightly bogus: perhaps we need to be passed a - * JsonConstructorType so that we can use one of JSON_OBJECTAGG, etc. - */ if (exprType(expr) == UNKNOWNOID) - expr = coerce_to_specific_type(pstate, expr, TEXTOID, "JSON_VALUE"); + expr = coerce_to_specific_type(pstate, expr, TEXTOID, constructName); rawexpr = expr; exprtype = exprType(expr); @@ -3589,6 +3586,7 @@ transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor) JsonKeyValue *kv = castNode(JsonKeyValue, lfirst(lc)); Node *key = transformExprRecurse(pstate, (Node *) kv->key); Node *val = transformJsonValueExpr(pstate, kv->value, + "JSON_OBJECT()", JS_FORMAT_DEFAULT); args = lappend(args, key); @@ -3768,7 +3766,8 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) Oid aggtype; key = transformExprRecurse(pstate, (Node *) agg->arg->key); - val = transformJsonValueExpr(pstate, agg->arg->value, JS_FORMAT_DEFAULT); + val = transformJsonValueExpr(pstate, agg->arg->value, "JSON_OBJECTAGG()", + JS_FORMAT_DEFAULT); args = list_make2(key, val); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, @@ -3824,7 +3823,8 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) Oid aggfnoid; Oid aggtype; - arg = transformJsonValueExpr(pstate, agg->arg, JS_FORMAT_DEFAULT); + arg = transformJsonValueExpr(pstate, agg->arg, "JSON_ARRAYAGG()", + JS_FORMAT_DEFAULT); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, list_make1(arg)); @@ -3871,6 +3871,7 @@ transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) { JsonValueExpr *jsval = castNode(JsonValueExpr, lfirst(lc)); Node *val = transformJsonValueExpr(pstate, jsval, + "JSON_ARRAY()", JS_FORMAT_DEFAULT); args = lappend(args, val); -- 2.35.3