v10-0005-remove-more-non-terminal-grammar-symbols.patch
text/x-patch
Filename: v10-0005-remove-more-non-terminal-grammar-symbols.patch
Type: text/x-patch
Part: 4
Message:
Re: SQL/JSON revisited
Patch
Format: format-patch
Series: patch v10-0005
Subject: remove more non-terminal grammar symbols
| File | + | − |
|---|---|---|
| src/backend/parser/gram.y | 29 | 95 |
From 4ea38b713b6d9b012e99401c6a3e06683d38bba2 Mon Sep 17 00:00:00 2001
From: Andrew Dunstan <andrew@dunslane.net>
Date: Thu, 16 Mar 2023 20:23:44 -0400
Subject: [PATCH 5/9] remove more non-terminal grammar symbols
---
src/backend/parser/gram.y | 124 +++++++++-----------------------------
1 file changed, 29 insertions(+), 95 deletions(-)
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 601db83769..5b32eed2cd 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -655,7 +655,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_representation
json_value_expr
json_api_common_syntax
- json_context_item
json_argument
json_returning_clause_opt
json_output_clause_opt
@@ -663,7 +662,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_object_args
json_name_and_value
json_aggregate_func
- json_path_specification
%type <list> json_name_and_value_list
json_value_expr_list
@@ -671,8 +669,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_arguments
json_passing_clause_opt
-%type <str> json_table_path_name
- json_as_path_name_clause_opt
+%type <str> json_as_path_name_clause_opt
%type <ival> json_encoding_clause_opt
json_predicate_type_constraint_opt
@@ -680,15 +677,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_wrapper_behavior
json_conditional_or_unconditional_opt
-%type <jsbehavior> json_behavior_error
- json_behavior_null
- json_behavior_true
- json_behavior_false
- json_behavior_unknown
- json_behavior_empty_array
- json_behavior_empty_object
- json_behavior_default
- json_value_behavior
+%type <jsbehavior> json_value_behavior
json_query_behavior
json_exists_error_behavior
json_exists_error_clause_opt
@@ -696,8 +685,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
%type <on_behavior> json_value_on_behavior_clause_opt
json_query_on_behavior_clause_opt
-%type <js_quotes> json_quotes_behavior
- json_quotes_clause_opt
+%type <js_quotes> json_quotes_clause_opt
%type <boolean> json_key_uniqueness_constraint_opt
json_object_constructor_null_clause_opt
@@ -16510,7 +16498,7 @@ opt_asymmetric: ASYMMETRIC
/* SQL/JSON support */
json_api_common_syntax:
- json_context_item ',' json_path_specification
+ json_value_expr ',' a_expr /* i.e. a json_path */
json_as_path_name_clause_opt
json_passing_clause_opt
{
@@ -16525,23 +16513,11 @@ json_api_common_syntax:
}
;
-json_context_item:
- json_value_expr { $$ = $1; }
- ;
-
-json_path_specification:
- a_expr { $$ = $1; }
- ;
-
json_as_path_name_clause_opt:
- AS json_table_path_name { $$ = $2; }
+ AS name { $$ = $2; }
| /* EMPTY */ { $$ = NULL; }
;
-json_table_path_name:
- name { $$ = $1; }
- ;
-
json_passing_clause_opt:
PASSING json_arguments { $$ = $2; }
| /* EMPTY */ { $$ = NIL; }
@@ -16569,10 +16545,10 @@ json_exists_error_clause_opt:
;
json_exists_error_behavior:
- json_behavior_error
- | json_behavior_true
- | json_behavior_false
- | json_behavior_unknown
+ ERROR_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); }
+ | TRUE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_TRUE, NULL); }
+ | FALSE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_FALSE, NULL); }
+ | UNKNOWN { $$ = makeJsonBehavior(JSON_BEHAVIOR_UNKNOWN, NULL); }
;
json_value_expr:
@@ -16607,45 +16583,10 @@ json_encoding_clause_opt:
| /* EMPTY */ { $$ = JS_ENC_DEFAULT; }
;
-json_behavior_error:
- ERROR_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); }
- ;
-
-json_behavior_null:
- NULL_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_NULL, NULL); }
- ;
-
-json_behavior_true:
- TRUE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_TRUE, NULL); }
- ;
-
-json_behavior_false:
- FALSE_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_FALSE, NULL); }
- ;
-
-json_behavior_unknown:
- UNKNOWN { $$ = makeJsonBehavior(JSON_BEHAVIOR_UNKNOWN, NULL); }
- ;
-
-json_behavior_empty_array:
- EMPTY_P ARRAY { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); }
- /* non-standard, for Oracle compatibility only */
- | EMPTY_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); }
- ;
-
-json_behavior_empty_object:
- EMPTY_P OBJECT_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_OBJECT, NULL); }
- ;
-
-json_behavior_default:
- DEFAULT a_expr { $$ = makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2); }
- ;
-
-
json_value_behavior:
- json_behavior_null
- | json_behavior_error
- | json_behavior_default
+ NULL_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_NULL, NULL); }
+ | ERROR_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); }
+ | DEFAULT a_expr { $$ = makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2); }
;
json_value_on_behavior_clause_opt:
@@ -16666,14 +16607,12 @@ json_wrapper_clause_opt:
| /* EMPTY */ { $$ = 0; }
;
+/* ARRAY is a noise word */
json_wrapper_behavior:
- WITHOUT array_opt { $$ = JSW_NONE; }
- | WITH json_conditional_or_unconditional_opt array_opt { $$ = $2; }
- ;
-
-array_opt:
- ARRAY { }
- | /* EMPTY */ { }
+ WITHOUT ARRAY { $$ = JSW_NONE; }
+ | WITHOUT { $$ = JSW_NONE; }
+ | WITH json_conditional_or_unconditional_opt ARRAY { $$ = $2; }
+ | WITH json_conditional_or_unconditional_opt { $$ = $2; }
;
json_conditional_or_unconditional_opt:
@@ -16683,26 +16622,21 @@ json_conditional_or_unconditional_opt:
;
json_quotes_clause_opt:
- json_quotes_behavior QUOTES json_on_scalar_string_opt { $$ = $1; }
- | /* EMPTY */ { $$ = JS_QUOTES_UNSPEC; }
- ;
-
-json_quotes_behavior:
- KEEP { $$ = JS_QUOTES_KEEP; }
- | OMIT { $$ = JS_QUOTES_OMIT; }
- ;
-
-json_on_scalar_string_opt:
- ON SCALAR STRING_P { }
- | /* EMPTY */ { }
+ KEEP QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_KEEP; }
+ | KEEP QUOTES { $$ = JS_QUOTES_KEEP; }
+ | OMIT QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_OMIT; }
+ | OMIT QUOTES { $$ = JS_QUOTES_OMIT; }
+ | /* EMPTY */ { $$ = JS_QUOTES_UNSPEC; }
;
json_query_behavior:
- json_behavior_error
- | json_behavior_null
- | json_behavior_empty_array
- | json_behavior_empty_object
- | json_behavior_default
+ ERROR_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_ERROR, NULL); }
+ | NULL_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_NULL, NULL); }
+ | EMPTY_P ARRAY { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); }
+ /* non-standard, for Oracle compatibility only */
+ | EMPTY_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_ARRAY, NULL); }
+ | EMPTY_P OBJECT_P { $$ = makeJsonBehavior(JSON_BEHAVIOR_EMPTY_OBJECT, NULL); }
+ | DEFAULT a_expr { $$ = makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2); }
;
json_query_on_behavior_clause_opt:
--
2.34.1