v3-0001-Pass-constructName-to-transformJsonValueExpr.patch
application/octet-stream
Filename: v3-0001-Pass-constructName-to-transformJsonValueExpr.patch
Type: application/octet-stream
Part: 5
Message:
Re: remaining sql/json patches
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v3-0001
Subject: Pass constructName to transformJsonValueExpr()
| File | + | − |
|---|---|---|
| src/backend/parser/parse_expr.c | 8 | 7 |
From 5ab5ddc4549e210d5970a20505ef1813c7dcb335 Mon Sep 17 00:00:00 2001
From: Amit Langote <amitlan@postgresql.org>
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