diff options
author | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2023-12-11 11:55:34 +0100 |
---|---|---|
committer | Alvaro Herrera <alvherre@alvh.no-ip.org> | 2023-12-11 11:55:34 +0100 |
commit | d3fe6e90bab52b8cbf085cfad5e4da110a2cd373 (patch) | |
tree | 419610e166077571ec73e3a846e31d0b80d3b7db /src/backend/parser | |
parent | c7a3e6b46d38f880f42642df003796b9bf99c1a8 (diff) | |
download | postgresql-d3fe6e90bab52b8cbf085cfad5e4da110a2cd373.tar.gz postgresql-d3fe6e90bab52b8cbf085cfad5e4da110a2cd373.zip |
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
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index d631ac89a91..f16bbd3cdde 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 { |