0006-Get-rid-of-JsonCommon.patch.nocfbot
text/plain
Filename: 0006-Get-rid-of-JsonCommon.patch.nocfbot
Type: text/plain
Part: 5
Message:
Re: remaining sql/json patches
From 87f6b4ad2d85a243b106c933c3f8830e5f64451f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 21 Nov 2023 07:25:41 +0100
Subject: [PATCH 6/6] Get rid of JsonCommon
---
src/backend/nodes/nodeFuncs.c | 18 ++----
src/backend/parser/gram.y | 95 ++++++++++----------------------
src/backend/parser/parse_expr.c | 8 +--
src/include/nodes/parsenodes.h | 18 +-----
src/tools/pgindent/typedefs.list | 1 -
5 files changed, 40 insertions(+), 100 deletions(-)
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index 7cad662e28..b6cd8c38d2 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -4081,18 +4081,6 @@ raw_expression_tree_walker_impl(Node *node,
return WALK(((JsonIsPredicate *) node)->expr);
case T_JsonArgument:
return WALK(((JsonArgument *) node)->val);
- case T_JsonCommon:
- {
- JsonCommon *jc = (JsonCommon *) node;
-
- if (WALK(jc->expr))
- return true;
- if (WALK(jc->pathspec))
- return true;
- if (WALK(jc->passing))
- return true;
- }
- break;
case T_JsonBehavior:
{
JsonBehavior *jb = (JsonBehavior *) node;
@@ -4106,7 +4094,11 @@ raw_expression_tree_walker_impl(Node *node,
{
JsonFuncExpr *jfe = (JsonFuncExpr *) node;
- if (WALK(jfe->common))
+ if (WALK(jfe->context_item))
+ return true;
+ if (WALK(jfe->pathspec))
+ return true;
+ if (WALK(jfe->passing))
return true;
if (jfe->output && WALK(jfe->output))
return true;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 99585308c8..4cdf086a42 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -650,7 +650,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_returning_clause_opt
json_name_and_value
json_aggregate_func
- json_api_common_syntax
json_argument
json_behavior
%type <list> json_name_and_value_list
@@ -658,6 +657,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
json_array_aggregate_order_by_clause_opt
json_arguments
json_behavior_clause_opt
+ json_passing_clause_opt
%type <ival> json_encoding_clause_opt
json_predicate_type_constraint
json_wrapper_behavior
@@ -15763,7 +15763,7 @@ func_expr_common_subexpr:
$$ = (Node *) n;
}
| JSON_QUERY '('
- json_api_common_syntax
+ json_value_expr ',' a_expr json_passing_clause_opt
json_returning_clause_opt
json_wrapper_behavior
json_quotes_clause_opt
@@ -15773,31 +15773,35 @@ func_expr_common_subexpr:
JsonFuncExpr *n = makeNode(JsonFuncExpr);
n->op = JSON_QUERY_OP;
- n->common = (JsonCommon *) $3;
- n->output = (JsonOutput *) $4;
- n->wrapper = $5;
- n->quotes = $6;
- n->behavior = $7;
+ n->context_item = (JsonValueExpr *) $3;
+ n->pathspec = $5;
+ n->passing = $6;
+ n->output = (JsonOutput *) $7;
+ n->wrapper = $8;
+ n->quotes = $9;
+ n->behavior = $10;
n->location = @1;
$$ = (Node *) n;
}
| JSON_EXISTS '('
- json_api_common_syntax
+ json_value_expr ',' a_expr json_passing_clause_opt
json_returning_clause_opt
json_behavior_clause_opt
')'
{
- JsonFuncExpr *p = makeNode(JsonFuncExpr);
+ JsonFuncExpr *n = makeNode(JsonFuncExpr);
- p->op = JSON_EXISTS_OP;
- p->common = (JsonCommon *) $3;
- p->output = (JsonOutput *) $4;
- p->behavior = $5;
- p->location = @1;
- $$ = (Node *) p;
+ n->op = JSON_EXISTS_OP;
+ n->context_item = (JsonValueExpr *) $3;
+ n->pathspec = $5;
+ n->passing = $6;
+ n->output = (JsonOutput *) $7;
+ n->behavior = $8;
+ n->location = @1;
+ $$ = (Node *) n;
}
| JSON_VALUE '('
- json_api_common_syntax
+ json_value_expr ',' a_expr json_passing_clause_opt
json_returning_clause_opt
json_behavior_clause_opt
')'
@@ -15805,9 +15809,11 @@ func_expr_common_subexpr:
JsonFuncExpr *n = makeNode(JsonFuncExpr);
n->op = JSON_VALUE_OP;
- n->common = (JsonCommon *) $3;
- n->output = (JsonOutput *) $4;
- n->behavior = $5;
+ n->context_item = (JsonValueExpr *) $3;
+ n->pathspec = $5;
+ n->passing = $6;
+ n->output = (JsonOutput *) $7;
+ n->behavior = $8;
n->location = @1;
$$ = (Node *) n;
}
@@ -16537,54 +16543,9 @@ opt_asymmetric: ASYMMETRIC
;
/* SQL/JSON support */
-json_api_common_syntax:
- json_value_expr ',' a_expr /* i.e. a json_path */
- {
- JsonCommon *n = makeNode(JsonCommon);
-
- n->expr = (JsonValueExpr *) $1;
- n->pathspec = $3;
- n->pathname = NULL;
- n->passing = NULL;
- n->location = @1;
- $$ = (Node *) n;
- }
- | json_value_expr ',' a_expr AS name
- {
- JsonCommon *n = makeNode(JsonCommon);
-
- n->expr = (JsonValueExpr *) $1;
- n->pathspec = $3;
- n->pathname = $5;
- n->passing = NULL;
- n->location = @1;
- $$ = (Node *) n;
- }
-
- | json_value_expr ',' a_expr /* i.e. a json_path */
- PASSING json_arguments
- {
- JsonCommon *n = makeNode(JsonCommon);
-
- n->expr = (JsonValueExpr *) $1;
- n->pathspec = $3;
- n->pathname = NULL;
- n->passing = $5;
- n->location = @1;
- $$ = (Node *) n;
- }
- | json_value_expr ',' a_expr AS name
- PASSING json_arguments
- {
- JsonCommon *n = makeNode(JsonCommon);
-
- n->expr = (JsonValueExpr *) $1;
- n->pathspec = $3;
- n->pathname = $5;
- n->passing = $7;
- n->location = @1;
- $$ = (Node *) n;
- }
+json_passing_clause_opt:
+ PASSING json_arguments { $$ = $2; }
+ | /*EMPTY*/ { $$ = NIL; }
;
json_arguments:
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c
index 2f4d3cb118..af0843aa3c 100644
--- a/src/backend/parser/parse_expr.c
+++ b/src/backend/parser/parse_expr.c
@@ -4384,17 +4384,17 @@ transformJsonExprCommon(ParseState *pstate, JsonFuncExpr *func,
jsexpr->location = func->location;
jsexpr->op = func->op;
jsexpr->formatted_expr = transformJsonValueExpr(pstate, constructName,
- func->common->expr,
+ func->context_item,
JS_FORMAT_JSON,
InvalidOid, false);
- jsexpr->format = func->common->expr->format;
+ jsexpr->format = func->context_item->format;
/* Both set in the caller. */
jsexpr->result_coercion = NULL;
jsexpr->omit_quotes = false;
- pathspec = transformExprRecurse(pstate, func->common->pathspec);
+ pathspec = transformExprRecurse(pstate, func->pathspec);
jsexpr->path_spec =
coerce_to_target_type(pstate, pathspec, exprType(pathspec),
@@ -4415,7 +4415,7 @@ transformJsonExprCommon(ParseState *pstate, JsonFuncExpr *func,
transformJsonPassingArgs(pstate, constructName,
exprType(jsexpr->formatted_expr) == JSONBOID ?
JS_FORMAT_JSONB : JS_FORMAT_JSON,
- func->common->passing,
+ func->passing,
&jsexpr->passing_values,
&jsexpr->passing_names);
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 0f977f935e..83acd17ad4 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1731,20 +1731,6 @@ typedef struct JsonArgument
char *name; /* argument name */
} JsonArgument;
-/*
- * JsonCommon -
- * representation of common syntax of functions using JSON path
- */
-typedef struct JsonCommon
-{
- NodeTag type;
- JsonValueExpr *expr; /* context item expression */
- Node *pathspec; /* JSON path specification expression */
- char *pathname; /* path name, if any */
- List *passing; /* list of PASSING clause arguments, if any */
- int location; /* token location, or -1 if unknown */
-} JsonCommon;
-
/*
* JsonFuncExpr -
* untransformed representation of JSON function expressions
@@ -1753,7 +1739,9 @@ typedef struct JsonFuncExpr
{
NodeTag type;
JsonExprOp op; /* expression type */
- JsonCommon *common; /* common syntax */
+ JsonValueExpr *context_item; /* context item expression */
+ Node *pathspec; /* JSON path specification expression */
+ List *passing; /* list of PASSING clause arguments, if any */
JsonOutput *output; /* output clause, if specified */
List *behavior; /* ON EMPTY / ERROR behavior, list of two JsonBehavior nodes */
JsonWrapper wrapper; /* array wrapper behavior (JSON_QUERY only) */
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 9258576b4c..8186a42659 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1263,7 +1263,6 @@ JsonBehavior
JsonBehaviorType
JsonCoercion
JsonCoercionState
-JsonCommon
JsonConstructorExpr
JsonConstructorExprState
JsonConstructorType
--
2.42.1