Skip to content

Commit 502923b

Browse files
author
Nikita Glukhov
committed
Use nodes JsonFomat and JsonReturning in JsonValueExpr
1 parent 49ced4f commit 502923b

File tree

4 files changed

+36
-19
lines changed

4 files changed

+36
-19
lines changed

contrib/pg_stat_statements/pg_stat_statements.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3086,14 +3086,30 @@ JumbleExpr(pgssJumbleState *jstate, Node *node)
30863086
JumbleExpr(jstate, (Node *) conf->exclRelTlist);
30873087
}
30883088
break;
3089+
case T_JsonFormat:
3090+
{
3091+
JsonFormat *format = (JsonFormat *) node;
3092+
3093+
APP_JUMB(format->type);
3094+
APP_JUMB(format->encoding);
3095+
}
3096+
break;
3097+
case T_JsonReturning:
3098+
{
3099+
JsonReturning *returning = (JsonReturning *) node;
3100+
3101+
JumbleExpr(jstate, (Node *) returning->format);
3102+
APP_JUMB(returning->typid);
3103+
APP_JUMB(returning->typmod);
3104+
}
3105+
break;
30893106
case T_JsonValueExpr:
30903107
{
30913108
JsonValueExpr *expr = (JsonValueExpr *) node;
30923109

30933110
JumbleExpr(jstate, (Node *) expr->raw_expr);
30943111
JumbleExpr(jstate, (Node *) expr->formatted_expr);
3095-
APP_JUMB(expr->format.type);
3096-
APP_JUMB(expr->format.encoding);
3112+
JumbleExpr(jstate, (Node *) expr->format);
30973113
}
30983114
break;
30993115
case T_List:

src/backend/parser/parse_expr.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3584,7 +3584,7 @@ getJsonEncodingConst(JsonFormat *format)
35843584
Name encname = palloc(sizeof(NameData));
35853585

35863586
if (!format ||
3587-
format->type == JS_FORMAT_DEFAULT ||
3587+
format->format == JS_FORMAT_DEFAULT ||
35883588
format->encoding == JS_ENC_DEFAULT)
35893589
encoding = JS_ENC_UTF8;
35903590
else
@@ -3620,7 +3620,7 @@ makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location)
36203620
FuncExpr *fexpr = makeFuncExpr(F_PG_CONVERT_FROM, TEXTOID,
36213621
list_make2(expr, encoding),
36223622
InvalidOid, InvalidOid,
3623-
COERCE_INTERNAL_CAST);
3623+
COERCE_EXPLICIT_CALL);
36243624

36253625
fexpr->location = location;
36263626

@@ -3667,13 +3667,13 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve,
36673667

36683668
get_type_category_preferred(exprtype, &typcategory, &typispreferred);
36693669

3670-
if (ve->format.type != JS_FORMAT_DEFAULT)
3670+
if (ve->format->format != JS_FORMAT_DEFAULT)
36713671
{
3672-
if (ve->format.encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID)
3672+
if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID)
36733673
ereport(ERROR,
36743674
(errcode(ERRCODE_DATATYPE_MISMATCH),
36753675
errmsg("JSON ENCODING clause is only allowed for bytea input type"),
3676-
parser_errposition(pstate, ve->format.location)));
3676+
parser_errposition(pstate, ve->format->location)));
36773677

36783678
if (exprtype == JSONOID || exprtype == JSONBOID)
36793679
{
@@ -3683,7 +3683,7 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve,
36833683
parser_errposition(pstate, ve->format->location)));
36843684
}
36853685
else
3686-
format = ve->format.type;
3686+
format = ve->format->format;
36873687
}
36883688
else if (exprtype == JSONOID || exprtype == JSONBOID)
36893689
format = JS_FORMAT_DEFAULT; /* do not format json[b] types */
@@ -3701,16 +3701,16 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve,
37013701
if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING)
37023702
ereport(ERROR,
37033703
(errcode(ERRCODE_DATATYPE_MISMATCH),
3704-
errmsg(ve->format.type == JS_FORMAT_DEFAULT ?
3704+
errmsg(ve->format->format == JS_FORMAT_DEFAULT ?
37053705
"cannot use non-string types with implicit FORMAT JSON clause" :
37063706
"cannot use non-string types with explicit FORMAT JSON clause"),
3707-
parser_errposition(pstate, ve->format.location >= 0 ?
3708-
ve->format.location : location)));
3707+
parser_errposition(pstate, ve->format->location >= 0 ?
3708+
ve->format->location : location)));
37093709

37103710
/* Convert encoded JSON text from bytea. */
37113711
if (format == JS_FORMAT_JSON && exprtype == BYTEAOID)
37123712
{
3713-
expr = makeJsonByteaToTextConversion(expr, &ve->format, location);
3713+
expr = makeJsonByteaToTextConversion(expr, ve->format, location);
37143714
exprtype = TEXTOID;
37153715
}
37163716

src/backend/utils/adt/ruleutils.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7899,16 +7899,16 @@ get_rule_expr_paren(Node *node, deparse_context *context,
78997899
}
79007900

79017901
/*
7902-
* get_json_format - Parse back a JsonFormat structure
7902+
* get_json_format - Parse back a JsonFormat node
79037903
*/
79047904
static void
79057905
get_json_format(JsonFormat *format, deparse_context *context)
79067906
{
7907-
if (format->type == JS_FORMAT_DEFAULT)
7907+
if (format->format == JS_FORMAT_DEFAULT)
79087908
return;
79097909

79107910
appendStringInfoString(context->buf,
7911-
format->type == JS_FORMAT_JSONB ?
7911+
format->format == JS_FORMAT_JSONB ?
79127912
" FORMAT JSONB" : " FORMAT JSON");
79137913

79147914
if (format->encoding != JS_ENC_DEFAULT)
@@ -7936,9 +7936,9 @@ get_json_returning(JsonReturning *returning, deparse_context *context,
79367936
returning->typmod));
79377937

79387938
if (!json_format_by_default ||
7939-
returning->format.type !=
7939+
returning->format->format !=
79407940
(returning->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON))
7941-
get_json_format(&returning->format, context);
7941+
get_json_format(returning->format, context);
79427942
}
79437943

79447944
/* ----------
@@ -9118,7 +9118,7 @@ get_rule_expr(Node *node, deparse_context *context,
91189118
JsonValueExpr *jve = (JsonValueExpr *) node;
91199119

91209120
get_rule_expr((Node *) jve->raw_expr, context, false);
9121-
get_json_format(&jve->format, context);
9121+
get_json_format(jve->format, context);
91229122
}
91239123
break;
91249124

src/include/nodes/primnodes.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1243,7 +1243,8 @@ typedef struct JsonReturning
12431243
typedef struct JsonValueExpr
12441244
{
12451245
NodeTag type;
1246-
Expr *expr; /* raw expression */
1246+
Expr *raw_expr; /* raw expression */
1247+
Expr *formatted_expr; /* formatted expression or NULL */
12471248
JsonFormat *format; /* FORMAT clause, if specified */
12481249
} JsonValueExpr;
12491250

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy