From deeb4c2057fd3318f8164fc13c97314ba9182ab8 Mon Sep 17 00:00:00 2001 From: jian he 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