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

