v45-0001-propagate-passing-clause-to-every-json_ta.based_on_v45
application/octet-stream
Filename: v45-0001-propagate-passing-clause-to-every-json_ta.based_on_v45
Type: application/octet-stream
Part: 0
Message:
Re: remaining sql/json patches
From deeb4c2057fd3318f8164fc13c97314ba9182ab8 Mon Sep 17 00:00:00 2001
From: jian he <jian.universality@gmail.com>
Date: Tue, 2 Apr 2024 21:15:07 +0800
Subject: [PATCH v45 1/1] propagate passing clause to every json_table_column
regardless of nesting level this should be applyed when you've already
applied v45-0001-JSON_TABLE.patch
get v45-0001-JSON_TABLE.patch in
https://www.postgresql.org/message-id/CA+HiwqE1gcPkQhBko+UbvVvAtRBaLfOpmHbFrK79pW_5F51Oww@mail.gmail.com
---
src/backend/parser/parse_jsontable.c | 46 ++++++++++++++++++++--------
1 file changed, 34 insertions(+), 12 deletions(-)
diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c
index b39cf5cd..a4b8fa83 100644
--- a/src/backend/parser/parse_jsontable.c
+++ b/src/backend/parser/parse_jsontable.c
@@ -44,7 +44,24 @@ typedef struct JsonTableParseContext
static JsonTablePlan *transformJsonTableColumns(JsonTableParseContext *cxt,
JsonTablePlanSpec *planspec,
List *columns,
+ List *passing_Args,
JsonTablePathSpec * pathspec);
+static Node *
+transformNestedJsonTableColumn(JsonTableParseContext *cxt, JsonTableColumn *jtc,
+ JsonTablePlanSpec *planspec,
+ List *passing_Args);
+static Node *
+transformJsonTableChildPlan(JsonTableParseContext *cxt,
+ JsonTablePlanSpec *plan,
+ List *columns,
+ List *passing_Args);
+
+static JsonTablePlan *
+makeParentJsonTablePlan(JsonTableParseContext *cxt, JsonTablePathSpec * pathspec,
+ List *columns, List *passing_Args);
+
+static void
+appendJsonTableColumns(JsonTableParseContext *cxt, List *columns, List *passing_Args);
/*
* Transform JSON_TABLE column
@@ -297,7 +314,8 @@ findNestedJsonTableColumn(List *columns, const char *pathname)
static Node *
transformNestedJsonTableColumn(JsonTableParseContext *cxt, JsonTableColumn *jtc,
- JsonTablePlanSpec *planspec)
+ JsonTablePlanSpec *planspec,
+ List *passing_Args)
{
if (jtc->pathspec->name == NULL)
{
@@ -314,6 +332,7 @@ transformNestedJsonTableColumn(JsonTableParseContext *cxt, JsonTableColumn *jtc,
}
return (Node *) transformJsonTableColumns(cxt, planspec, jtc->columns,
+ passing_Args,
jtc->pathspec);
}
@@ -340,7 +359,8 @@ makeJsonTableSiblingJoin(bool cross, Node *lnode, Node *rnode)
static Node *
transformJsonTableChildPlan(JsonTableParseContext *cxt,
JsonTablePlanSpec *plan,
- List *columns)
+ List *columns,
+ List *passing_Args)
{
JsonTableColumn *jtc = NULL;
@@ -360,7 +380,7 @@ transformJsonTableChildPlan(JsonTableParseContext *cxt,
if (col->coltype != JTC_NESTED)
continue;
- node = transformNestedJsonTableColumn(cxt, col, plan);
+ node = transformNestedJsonTableColumn(cxt, col, plan, passing_Args);
/* join transformed node with previous sibling nodes */
res = res ? makeJsonTableSiblingJoin(cross, res, node) : node;
@@ -383,9 +403,9 @@ transformJsonTableChildPlan(JsonTableParseContext *cxt,
else
{
Node *node1 = transformJsonTableChildPlan(cxt, plan->plan1,
- columns);
+ columns, passing_Args);
Node *node2 = transformJsonTableChildPlan(cxt, plan->plan2,
- columns);
+ columns, passing_Args);
return makeJsonTableSiblingJoin(plan->join_type == JSTP_JOIN_CROSS,
node1, node2);
@@ -402,7 +422,7 @@ transformJsonTableChildPlan(JsonTableParseContext *cxt,
plan->pathname),
parser_errposition(cxt->pstate, plan->location)));
- return transformNestedJsonTableColumn(cxt, jtc, plan);
+ return transformNestedJsonTableColumn(cxt, jtc, plan, passing_Args);
}
/* Check whether type is json/jsonb, array, or record. */
@@ -430,7 +450,7 @@ typeIsComposite(Oid typid)
/* Append transformed non-nested JSON_TABLE columns to the TableFunc node */
static void
-appendJsonTableColumns(JsonTableParseContext *cxt, List *columns)
+appendJsonTableColumns(JsonTableParseContext *cxt, List *columns, List *passing_Args)
{
ListCell *col;
ParseState *pstate = cxt->pstate;
@@ -495,7 +515,7 @@ appendJsonTableColumns(JsonTableParseContext *cxt, List *columns)
param->typeMod = -1;
je = transformJsonTableColumn(rawc, (Node *) param,
- NIL, errorOnError);
+ passing_Args, errorOnError);
colexpr = transformExpr(pstate, je, EXPR_KIND_FROM_FUNCTION);
assign_expr_collations(pstate, colexpr);
@@ -527,7 +547,7 @@ appendJsonTableColumns(JsonTableParseContext *cxt, List *columns)
*/
static JsonTablePlan *
makeParentJsonTablePlan(JsonTableParseContext *cxt, JsonTablePathSpec * pathspec,
- List *columns)
+ List *columns, List *passing_Args)
{
JsonTablePlan *plan = makeNode(JsonTablePlan);
JsonBehavior *on_error = cxt->table->on_error;
@@ -545,7 +565,7 @@ makeParentJsonTablePlan(JsonTableParseContext *cxt, JsonTablePathSpec * pathspec
/* save start of column range */
plan->colMin = list_length(cxt->tablefunc->colvalexprs);
- appendJsonTableColumns(cxt, columns);
+ appendJsonTableColumns(cxt, columns, passing_Args);
/* save end of column range */
plan->colMax = list_length(cxt->tablefunc->colvalexprs) - 1;
@@ -559,6 +579,7 @@ static JsonTablePlan *
transformJsonTableColumns(JsonTableParseContext *cxt,
JsonTablePlanSpec *planspec,
List *columns,
+ List *passing_Args,
JsonTablePathSpec * pathspec)
{
JsonTablePlan *plan;
@@ -607,12 +628,12 @@ transformJsonTableColumns(JsonTableParseContext *cxt,
}
/* transform only non-nested columns */
- plan = makeParentJsonTablePlan(cxt, pathspec, columns);
+ plan = makeParentJsonTablePlan(cxt, pathspec, columns, passing_Args);
if (childPlanSpec || defaultPlan)
{
/* transform recursively nested columns */
- plan->child = transformJsonTableChildPlan(cxt, childPlanSpec, columns);
+ plan->child = transformJsonTableChildPlan(cxt, childPlanSpec, columns, passing_Args);
if (plan->child)
plan->outerJoin = planspec == NULL ||
(planspec->join_type & JSTP_JOIN_OUTER);
@@ -695,6 +716,7 @@ transformJsonTable(ParseState *pstate, JsonTable *jt)
cxt.contextItemTypid = exprType(tf->docexpr);
tf->plan = (Node *) transformJsonTableColumns(&cxt, plan, jt->columns,
+ jfe->passing,
rootPathSpec);
/* Also save a copy of the PASSING arguments in the TableFunc node. */
base-commit: 6185c9737cf48c9540782d88f12bd2912d6ca1cc
prerequisite-patch-id: f30c460c82b539ea44eb0596ea36c7cfa257b98e
--
2.34.1