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