0005-Get-rid-of-JsonBehaviorClause.patch.nocfbot

text/plain

Filename: 0005-Get-rid-of-JsonBehaviorClause.patch.nocfbot
Type: text/plain
Part: 4
Message: Re: remaining sql/json patches
From 34795db318b16892926dae9ebc848827771136fa Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 21 Nov 2023 07:21:03 +0100
Subject: [PATCH 5/6] Get rid of JsonBehaviorClause

---
 src/backend/nodes/makefuncs.c    | 17 -----------------
 src/backend/nodes/nodeFuncs.c    | 10 ----------
 src/backend/parser/gram.y        | 16 ++++++++--------
 src/backend/parser/parse_expr.c  |  4 ++--
 src/include/nodes/makefuncs.h    |  3 ---
 src/include/nodes/parsenodes.h   | 14 +-------------
 src/tools/pgindent/typedefs.list |  1 -
 7 files changed, 11 insertions(+), 54 deletions(-)

diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c
index 746ed3d1da..a3757af6cf 100644
--- a/src/backend/nodes/makefuncs.c
+++ b/src/backend/nodes/makefuncs.c
@@ -857,23 +857,6 @@ makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr,
 	return jve;
 }
 
-/*
- * makeJsonBehaviorClause -
- *	  creates a JsonBehaviorClause node
- */
-JsonBehaviorClause *
-makeJsonBehaviorClause(JsonBehavior *on_empty, JsonBehavior *on_error,
-					   int location)
-{
-	JsonBehaviorClause *behavior = makeNode(JsonBehaviorClause);
-
-	behavior->on_empty = on_empty;
-	behavior->on_error = on_error;
-	behavior->location = location;
-
-	return behavior;
-}
-
 /*
  * makeJsonBehavior -
  *	  creates a JsonBehavior node
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index 8e49ef6b95..7cad662e28 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -4093,16 +4093,6 @@ raw_expression_tree_walker_impl(Node *node,
 					return true;
 			}
 			break;
-		case T_JsonBehaviorClause:
-			{
-				JsonBehaviorClause *jbc = (JsonBehaviorClause *) node;
-
-				if (WALK(jbc->on_empty))
-					return true;
-				if (WALK(jbc->on_error))
-					return true;
-			}
-			break;
 		case T_JsonBehavior:
 			{
 				JsonBehavior *jb = (JsonBehavior *) node;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 2866d1345c..99585308c8 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -653,11 +653,11 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				json_api_common_syntax
 				json_argument
 				json_behavior
-				json_behavior_clause_opt
 %type <list>	json_name_and_value_list
 				json_value_expr_list
 				json_array_aggregate_order_by_clause_opt
 				json_arguments
+				json_behavior_clause_opt
 %type <ival>	json_encoding_clause_opt
 				json_predicate_type_constraint
 				json_wrapper_behavior
@@ -15777,7 +15777,7 @@ func_expr_common_subexpr:
 					n->output = (JsonOutput *) $4;
 					n->wrapper = $5;
 					n->quotes = $6;
-					n->behavior = (JsonBehaviorClause *) $7;
+					n->behavior = $7;
 					n->location = @1;
 					$$ = (Node *) n;
 				}
@@ -15792,7 +15792,7 @@ func_expr_common_subexpr:
 					p->op = JSON_EXISTS_OP;
 					p->common = (JsonCommon *) $3;
 					p->output = (JsonOutput *) $4;
-					p->behavior = (JsonBehaviorClause *) $5;
+					p->behavior = $5;
 					p->location = @1;
 					$$ = (Node *) p;
 				}
@@ -15807,7 +15807,7 @@ func_expr_common_subexpr:
 					n->op = JSON_VALUE_OP;
 					n->common = (JsonCommon *) $3;
 					n->output = (JsonOutput *) $4;
-					n->behavior = (JsonBehaviorClause *) $5;
+					n->behavior = $5;
 					n->location = @1;
 					$$ = (Node *) n;
 				}
@@ -16677,13 +16677,13 @@ json_behavior:
 
 json_behavior_clause_opt:
 			json_behavior ON EMPTY_P
-				{ $$ = (Node *) makeJsonBehaviorClause((JsonBehavior *) $1, NULL, @1); }
+				{ $$ = list_make2($1, NULL); }
 			| json_behavior ON ERROR_P
-				{ $$ = (Node *) makeJsonBehaviorClause(NULL, (JsonBehavior *) $1, @1); }
+				{ $$ = list_make2(NULL, $1); }
 			| json_behavior ON EMPTY_P json_behavior ON ERROR_P
-				{ $$ = (Node *) makeJsonBehaviorClause((JsonBehavior *) $1, (JsonBehavior *) $4, @1); }
+				{ $$ = list_make2($1, $4); }
 			| /* EMPTY */
-				{ $$ = NULL; }
+				{ $$ = list_make2(NULL, NULL); }
 		;
 
 json_predicate_type_constraint:
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 1c1f38a808..2f4d3cb118 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -4240,8 +4240,8 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
 
 	if (func->behavior)
 	{
-		on_error = func->behavior->on_error;
-		on_empty = func->behavior->on_empty;
+		on_empty = linitial(func->behavior);
+		on_error = lsecond(func->behavior);
 	}
 
 	switch (func->op)
diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h
index 783e82ac92..a850a1928b 100644
--- a/src/include/nodes/makefuncs.h
+++ b/src/include/nodes/makefuncs.h
@@ -113,9 +113,6 @@ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding,
 extern JsonValueExpr *makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr,
 										JsonFormat *format);
 extern JsonBehavior *makeJsonBehavior(JsonBehaviorType type, Node *expr, int location);
-extern JsonBehaviorClause *makeJsonBehaviorClause(JsonBehavior *on_empty,
-												  JsonBehavior *on_error,
-												  int location);
 extern Node *makeJsonKeyValue(Node *key, Node *value);
 extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format,
 								 JsonValueType item_type, bool unique_keys,
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index ce6893fb91..0f977f935e 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1703,18 +1703,6 @@ typedef enum JsonQuotes
 	JS_QUOTES_OMIT				/* OMIT QUOTES */
 } JsonQuotes;
 
-/*
- * JsonBehaviorClause -
- *		representation of JSON ON ERROR / ON EMPTY clause
- */
-typedef struct JsonBehaviorClause
-{
-	NodeTag		type;
-	JsonBehavior *on_empty;		/* behavior ON EMPTY */
-	JsonBehavior *on_error;		/* behavior ON ERROR */
-	int			location;		/* token location, or -1 if unknown */
-} JsonBehaviorClause;
-
 /*
  * JsonPathSpec -
  *		representation of JSON path constant
@@ -1767,7 +1755,7 @@ typedef struct JsonFuncExpr
 	JsonExprOp	op;				/* expression type */
 	JsonCommon *common;			/* common syntax */
 	JsonOutput *output;			/* output clause, if specified */
-	JsonBehaviorClause *behavior;	/* ON ERROR / EMPTY behavior, if specified */
+	List	   *behavior;		/* ON EMPTY / ERROR behavior, list of two JsonBehavior nodes */
 	JsonWrapper wrapper;		/* array wrapper behavior (JSON_QUERY only) */
 	JsonQuotes	quotes;			/* omit or keep quotes? (JSON_QUERY only) */
 	int			location;		/* token location, or -1 if unknown */
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 3cfa9d756e..9258576b4c 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1260,7 +1260,6 @@ JsonArrayConstructor
 JsonArrayQueryConstructor
 JsonBaseObjectInfo
 JsonBehavior
-JsonBehaviorClause
 JsonBehaviorType
 JsonCoercion
 JsonCoercionState
-- 
2.42.1