v31-0004-Simplify-productions-for-FORMAT-JSON-ENCODING-na.patch
application/octet-stream
Filename: v31-0004-Simplify-productions-for-FORMAT-JSON-ENCODING-na.patch
Type: application/octet-stream
Part: 0
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 v31-0004
Subject: Simplify productions for FORMAT JSON [ ENCODING name ]
| File | + | − |
|---|---|---|
| src/backend/nodes/makefuncs.c | 0 | 21 |
| src/backend/parser/gram.y | 33 | 16 |
| src/include/nodes/makefuncs.h | 0 | 1 |
From d4fdfada70c6aee00e34f31ad822bda08d4c801c Mon Sep 17 00:00:00 2001
From: Amit Langote <amitlan@postgresql.org>
Date: Fri, 8 Dec 2023 16:14:39 +0900
Subject: [PATCH v31 4/7] Simplify productions for FORMAT JSON [ ENCODING name
]
This removes the production json_encoding_clause_opt, instead merging
it into json_format_clause.
Author: Alvaro Herrera <alvherre@alvh.no-ip.org>
Discussion: https://postgr.es/m/202312071841.u2gueb5dsrbk%40alvherre.pgsql
---
src/backend/nodes/makefuncs.c | 21 ---------------
src/backend/parser/gram.y | 49 +++++++++++++++++++++++------------
src/include/nodes/makefuncs.h | 1 -
3 files changed, 33 insertions(+), 38 deletions(-)
diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index c6fb571982..89e77adbc7 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -857,27 +857,6 @@ makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr,
return jve;
}
-/*
- * makeJsonEncoding -
- * converts JSON encoding name to enum JsonEncoding
- */
-JsonEncoding
-makeJsonEncoding(char *name)
-{
- if (!pg_strcasecmp(name, "utf8"))
- return JS_ENC_UTF8;
- if (!pg_strcasecmp(name, "utf16"))
- return JS_ENC_UTF16;
- if (!pg_strcasecmp(name, "utf32"))
- return JS_ENC_UTF32;
-
- ereport(ERROR,
- errcode(ERRCODE_INVALID_PARAMETER_VALUE),
- errmsg("unrecognized JSON encoding: %s", name));
-
- return JS_ENC_DEFAULT;
-}
-
/*
* makeJsonKeyValue -
* creates a JsonKeyValue node
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index d631ac89a9..f16bbd3cdd 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -645,7 +645,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <list> hash_partbound
%type <defelt> hash_partbound_elem
-%type <node> json_format_clause_opt
+%type <node> json_format_clause
+ json_format_clause_opt
json_value_expr
json_returning_clause_opt
json_name_and_value
@@ -653,8 +654,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <list> json_name_and_value_list
json_value_expr_list
json_array_aggregate_order_by_clause_opt
-%type <ival> json_encoding_clause_opt
- json_predicate_type_constraint
+%type <ival> json_predicate_type_constraint
%type <boolean> json_key_uniqueness_constraint_opt
json_object_constructor_null_clause_opt
json_array_constructor_null_clause_opt
@@ -14962,12 +14962,11 @@ a_expr: c_expr { $$ = $1; }
/*
* Required by SQL/JSON, but there are conflicts
| a_expr
- FORMAT_LA JSON json_encoding_clause_opt
+ json_format_clause
IS json_predicate_type_constraint
json_key_uniqueness_constraint_opt %prec IS
{
- $3.location = @2;
- $$ = makeJsonIsPredicate($1, $3, $5, $6, @1);
+ $$ = makeJsonIsPredicate($1, $2, $4, $5, @1);
}
*/
| a_expr IS NOT
@@ -14981,13 +14980,12 @@ a_expr: c_expr { $$ = $1; }
/*
* Required by SQL/JSON, but there are conflicts
| a_expr
- FORMAT_LA JSON json_encoding_clause_opt
+ json_format_clause
IS NOT
json_predicate_type_constraint
json_key_uniqueness_constraint_opt %prec IS
{
- $3.location = @2;
- $$ = makeNotExpr(makeJsonIsPredicate($1, $3, $6, $7, @1), @1);
+ $$ = makeNotExpr(makeJsonIsPredicate($1, $2, $5, $6, @1), @1);
}
*/
| DEFAULT
@@ -16503,10 +16501,34 @@ json_value_expr:
}
;
+json_format_clause:
+ FORMAT_LA JSON ENCODING name
+ {
+ int encoding;
+
+ if (!pg_strcasecmp($4, "utf8"))
+ encoding = JS_ENC_UTF8;
+ else if (!pg_strcasecmp($4, "utf16"))
+ encoding = JS_ENC_UTF16;
+ else if (!pg_strcasecmp($4, "utf32"))
+ encoding = JS_ENC_UTF32;
+ else
+ ereport(ERROR,
+ errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+ errmsg("unrecognized JSON encoding: %s", $4));
+
+ $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, encoding, @1);
+ }
+ | FORMAT_LA JSON
+ {
+ $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, @1);
+ }
+ ;
+
json_format_clause_opt:
- FORMAT_LA JSON json_encoding_clause_opt
+ json_format_clause
{
- $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $3, @1);
+ $$ = $1;
}
| /* EMPTY */
{
@@ -16514,11 +16536,6 @@ json_format_clause_opt:
}
;
-json_encoding_clause_opt:
- ENCODING name { $$ = makeJsonEncoding($2); }
- | /* EMPTY */ { $$ = JS_ENC_DEFAULT; }
- ;
-
json_returning_clause_opt:
RETURNING Typename json_format_clause_opt
{
diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h
index 3180703005..aca0ee54df 100644
--- a/src/include/nodes/makefuncs.h
+++ b/src/include/nodes/makefuncs.h
@@ -116,6 +116,5 @@ extern Node *makeJsonKeyValue(Node *key, Node *value);
extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format,
JsonValueType item_type, bool unique_keys,
int location);
-extern JsonEncoding makeJsonEncoding(char *name);
#endif /* MAKEFUNC_H */
--
2.35.3