Simplify productions for FORMAT JSON [ ENCODING name ]

This removes the production json_encoding_clause_opt, instead merging
it into json_format_clause.  Also remove the auxiliary
makeJsonEncoding() function.

Reviewed-by: Amit Langote <amitlangote09@gmail.com>
Discussion: https://postgr.es/m/202312071841.u2gueb5dsrbk%40alvherre.pgsql
This commit is contained in:
Alvaro Herrera 2023-12-11 11:55:34 +01:00
parent c7a3e6b46d
commit d3fe6e90ba
No known key found for this signature in database
GPG Key ID: 1C20ACB9D5C564AE
3 changed files with 34 additions and 39 deletions

View File

@ -857,27 +857,6 @@ makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr,
return jve; 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 - * makeJsonKeyValue -
* creates a JsonKeyValue node * creates a JsonKeyValue node

View File

@ -645,7 +645,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <list> hash_partbound %type <list> hash_partbound
%type <defelt> hash_partbound_elem %type <defelt> hash_partbound_elem
%type <node> json_format_clause_opt %type <node> json_format_clause
json_format_clause_opt
json_value_expr json_value_expr
json_returning_clause_opt json_returning_clause_opt
json_name_and_value json_name_and_value
@ -653,8 +654,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <list> json_name_and_value_list %type <list> json_name_and_value_list
json_value_expr_list json_value_expr_list
json_array_aggregate_order_by_clause_opt json_array_aggregate_order_by_clause_opt
%type <ival> json_encoding_clause_opt %type <ival> json_predicate_type_constraint
json_predicate_type_constraint
%type <boolean> json_key_uniqueness_constraint_opt %type <boolean> json_key_uniqueness_constraint_opt
json_object_constructor_null_clause_opt json_object_constructor_null_clause_opt
json_array_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 * Required by SQL/JSON, but there are conflicts
| a_expr | a_expr
FORMAT_LA JSON json_encoding_clause_opt json_format_clause
IS json_predicate_type_constraint IS json_predicate_type_constraint
json_key_uniqueness_constraint_opt %prec IS json_key_uniqueness_constraint_opt %prec IS
{ {
$3.location = @2; $$ = makeJsonIsPredicate($1, $2, $4, $5, @1);
$$ = makeJsonIsPredicate($1, $3, $5, $6, @1);
} }
*/ */
| a_expr IS NOT | a_expr IS NOT
@ -14981,13 +14980,12 @@ a_expr: c_expr { $$ = $1; }
/* /*
* Required by SQL/JSON, but there are conflicts * Required by SQL/JSON, but there are conflicts
| a_expr | a_expr
FORMAT_LA JSON json_encoding_clause_opt json_format_clause
IS NOT IS NOT
json_predicate_type_constraint json_predicate_type_constraint
json_key_uniqueness_constraint_opt %prec IS json_key_uniqueness_constraint_opt %prec IS
{ {
$3.location = @2; $$ = makeNotExpr(makeJsonIsPredicate($1, $2, $5, $6, @1), @1);
$$ = makeNotExpr(makeJsonIsPredicate($1, $3, $6, $7, @1), @1);
} }
*/ */
| DEFAULT | DEFAULT
@ -16503,10 +16501,34 @@ json_value_expr:
} }
; ;
json_format_clause_opt: json_format_clause:
FORMAT_LA JSON json_encoding_clause_opt FORMAT_LA JSON ENCODING name
{ {
$$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $3, @1); 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:
json_format_clause
{
$$ = $1;
} }
| /* EMPTY */ | /* 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: json_returning_clause_opt:
RETURNING Typename json_format_clause_opt RETURNING Typename json_format_clause_opt
{ {

View File

@ -116,6 +116,5 @@ extern Node *makeJsonKeyValue(Node *key, Node *value);
extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format,
JsonValueType item_type, bool unique_keys, JsonValueType item_type, bool unique_keys,
int location); int location);
extern JsonEncoding makeJsonEncoding(char *name);
#endif /* MAKEFUNC_H */ #endif /* MAKEFUNC_H */