wfdw-rely-on-plannerinfo.patch
application/octet-stream
Filename: wfdw-rely-on-plannerinfo.patch
Type: application/octet-stream
Part: 0
Message:
Re: [v9.3] writable foreign tables
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: context
| File | + | − |
|---|---|---|
| src/backend/optimizer/plan/createplan.c | 15 | 0 |
| src/backend/optimizer/plan/planner.c | 6 | 0 |
| src/include/optimizer/planmain.h | 1 | 0 |
*** a/src/backend/optimizer/plan/createplan.c
--- b/src/backend/optimizer/plan/createplan.c
***************
*** 4715,4724 **** make_result(PlannerInfo *root,
*/
ModifyTable *
make_modifytable(PlannerInfo *root,
- CmdType operation, bool canSetTag,
List *resultRelations,
! List *subplans, List *returningLists,
! List *rowMarks, int epqParam)
{
ModifyTable *node = makeNode(ModifyTable);
Plan *plan = &node->plan;
--- 4715,4722 ----
*/
ModifyTable *
make_modifytable(PlannerInfo *root,
List *resultRelations,
! List *subplans, List *returningLists)
{
ModifyTable *node = makeNode(ModifyTable);
Plan *plan = &node->plan;
***************
*** 4726,4731 **** make_modifytable(PlannerInfo *root,
--- 4724,4743 ----
ListCell *subnode;
ListCell *resultRel;
List *fdw_priv_list = NIL;
+ CmdType operation = root->parse->commandType;
+ bool canSetTag = root->parse->canSetTag;
+ List *rowMarks;
+ int epqParam = SS_assign_special_param(root);
+
+ /*
+ * If there was a FOR [KEY] UPDATE/SHARE clause, the LockRows node will
+ * have dealt with fetching non-locked marked rows, else we need
+ * to have ModifyTable do that.
+ */
+ if (root->parse->rowMarks)
+ rowMarks = NIL;
+ else
+ rowMarks = root->rowMarks;
Assert(list_length(resultRelations) == list_length(subplans));
Assert(returningLists == NIL ||
*** a/src/backend/optimizer/plan/planner.c
--- b/src/backend/optimizer/plan/planner.c
***************
*** 551,557 **** subquery_planner(PlannerGlobal *glob, Query *parse,
if (parse->commandType != CMD_SELECT)
{
List *returningLists;
- List *rowMarks;
/*
* Set up the RETURNING list-of-lists, if needed.
--- 551,556 ----
***************
*** 561,584 **** subquery_planner(PlannerGlobal *glob, Query *parse,
else
returningLists = NIL;
! /*
! * If there was a FOR [KEY] UPDATE/SHARE clause, the LockRows node will
! * have dealt with fetching non-locked marked rows, else we need
! * to have ModifyTable do that.
! */
! if (parse->rowMarks)
! rowMarks = NIL;
! else
! rowMarks = root->rowMarks;
!
plan = (Plan *) make_modifytable(root,
- parse->commandType,
- parse->canSetTag,
list_make1_int(parse->resultRelation),
list_make1(plan),
! returningLists,
! rowMarks,
! SS_assign_special_param(root));
}
}
--- 560,571 ----
else
returningLists = NIL;
! Assert(parse->commandType == root->parse->commandType);
! Assert(parse->canSetTag == root->parse->canSetTag);
plan = (Plan *) make_modifytable(root,
list_make1_int(parse->resultRelation),
list_make1(plan),
! returningLists);
}
}
***************
*** 762,768 **** inheritance_planner(PlannerInfo *root)
List *subplans = NIL;
List *resultRelations = NIL;
List *returningLists = NIL;
- List *rowMarks;
ListCell *lc;
/*
--- 749,754 ----
***************
*** 954,978 **** inheritance_planner(PlannerInfo *root)
root->simple_rel_array_size = save_rel_array_size;
root->simple_rel_array = save_rel_array;
- /*
- * If there was a FOR [KEY] UPDATE/SHARE clause, the LockRows node will have
- * dealt with fetching non-locked marked rows, else we need to have
- * ModifyTable do that.
- */
- if (parse->rowMarks)
- rowMarks = NIL;
- else
- rowMarks = root->rowMarks;
-
/* And last, tack on a ModifyTable node to do the UPDATE/DELETE work */
return (Plan *) make_modifytable(root,
- parse->commandType,
- parse->canSetTag,
resultRelations,
subplans,
! returningLists,
! rowMarks,
! SS_assign_special_param(root));
}
/*--------------------
--- 940,952 ----
root->simple_rel_array_size = save_rel_array_size;
root->simple_rel_array = save_rel_array;
/* And last, tack on a ModifyTable node to do the UPDATE/DELETE work */
+ Assert(parse->commandType == root->parse->commandType);
+ Assert(parse->canSetTag == root->parse->canSetTag);
return (Plan *) make_modifytable(root,
resultRelations,
subplans,
! returningLists);
}
/*--------------------
*** a/src/include/optimizer/planmain.h
--- b/src/include/optimizer/planmain.h
***************
*** 80,88 **** extern SetOp *make_setop(SetOpCmd cmd, SetOpStrategy strategy, Plan *lefttree,
extern Result *make_result(PlannerInfo *root, List *tlist,
Node *resconstantqual, Plan *subplan);
extern ModifyTable *make_modifytable(PlannerInfo *root,
! CmdType operation, bool canSetTag,
! List *resultRelations, List *subplans, List *returningLists,
! List *rowMarks, int epqParam);
extern bool is_projection_capable_plan(Plan *plan);
/*
--- 80,86 ----
extern Result *make_result(PlannerInfo *root, List *tlist,
Node *resconstantqual, Plan *subplan);
extern ModifyTable *make_modifytable(PlannerInfo *root,
! List *resultRelations, List *subplans, List *returningLists);
extern bool is_projection_capable_plan(Plan *plan);
/*