v27-0005-Add-per-result-relation-extraUpdatedCols-to-Modi.patch
application/octet-stream
Filename: v27-0005-Add-per-result-relation-extraUpdatedCols-to-Modi.patch
Type: application/octet-stream
Part: 3
Patch
Format: format-patch
Series: patch v27-0005
Subject: Add per-result-relation extraUpdatedCols to ModifyTable
| File | + | − |
|---|---|---|
| src/backend/executor/execUtils.c | 3 | 6 |
| src/backend/executor/nodeModifyTable.c | 4 | 0 |
| src/backend/nodes/outfuncs.c | 0 | 1 |
| src/backend/nodes/readfuncs.c | 0 | 1 |
| src/backend/optimizer/plan/createplan.c | 4 | 2 |
| src/backend/optimizer/plan/planner.c | 38 | 0 |
| src/backend/optimizer/prep/preptlist.c | 47 | 0 |
| src/backend/optimizer/util/inherit.c | 11 | 11 |
| src/backend/optimizer/util/pathnode.c | 4 | 0 |
| src/backend/replication/logical/worker.c | 3 | 3 |
| src/backend/rewrite/rewriteHandler.c | 0 | 45 |
| src/include/nodes/execnodes.h | 3 | 0 |
| src/include/nodes/parsenodes.h | 0 | 1 |
| src/include/nodes/pathnodes.h | 3 | 0 |
| src/include/nodes/plannodes.h | 1 | 0 |
| src/include/optimizer/inherit.h | 3 | 0 |
| src/include/optimizer/pathnode.h | 1 | 0 |
| src/include/optimizer/prep.h | 4 | 0 |
| src/include/rewrite/rewriteHandler.h | 0 | 4 |
From 99780f5fa818c8e2b8446e4c0f2b7e5e66cda75b Mon Sep 17 00:00:00 2001
From: amitlan <amitlangote09@gmail.com>
Date: Tue, 4 Oct 2022 20:54:03 +0900
Subject: [PATCH v27 5/5] Add per-result-relation extraUpdatedCols to
ModifyTable
In spirit of removing things from RangeTblEntry that are better
carried by Query or PlannedStmt directly.
---
src/backend/executor/execUtils.c | 9 ++---
src/backend/executor/nodeModifyTable.c | 4 ++
src/backend/nodes/outfuncs.c | 1 -
src/backend/nodes/readfuncs.c | 1 -
src/backend/optimizer/plan/createplan.c | 6 ++-
src/backend/optimizer/plan/planner.c | 38 +++++++++++++++++++
src/backend/optimizer/prep/preptlist.c | 47 ++++++++++++++++++++++++
src/backend/optimizer/util/inherit.c | 22 +++++------
src/backend/optimizer/util/pathnode.c | 4 ++
src/backend/replication/logical/worker.c | 6 +--
src/backend/rewrite/rewriteHandler.c | 45 -----------------------
src/include/nodes/execnodes.h | 3 ++
src/include/nodes/parsenodes.h | 1 -
src/include/nodes/pathnodes.h | 3 ++
src/include/nodes/plannodes.h | 1 +
src/include/optimizer/inherit.h | 3 ++
src/include/optimizer/pathnode.h | 1 +
src/include/optimizer/prep.h | 4 ++
src/include/rewrite/rewriteHandler.h | 4 --
19 files changed, 129 insertions(+), 74 deletions(-)
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 51fa9a085e..8a14326854 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -1420,20 +1420,17 @@ ExecGetExtraUpdatedCols(ResultRelInfo *relinfo, EState *estate)
{
if (relinfo->ri_RangeTableIndex != 0)
{
- RangeTblEntry *rte = exec_rt_fetch(relinfo->ri_RangeTableIndex, estate);
-
- return rte->extraUpdatedCols;
+ return relinfo->ri_extraUpdatedCols;
}
else if (relinfo->ri_RootResultRelInfo)
{
ResultRelInfo *rootRelInfo = relinfo->ri_RootResultRelInfo;
- RangeTblEntry *rte = exec_rt_fetch(rootRelInfo->ri_RangeTableIndex, estate);
if (relinfo->ri_RootToPartitionMap != NULL)
return execute_attr_map_cols(relinfo->ri_RootToPartitionMap->attrMap,
- rte->extraUpdatedCols);
+ rootRelInfo->ri_extraUpdatedCols);
else
- return rte->extraUpdatedCols;
+ return rootRelInfo->ri_extraUpdatedCols;
}
else
return NULL;
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index b7ea953b55..abf681f401 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -3965,6 +3965,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
{
resultRelInfo = &mtstate->resultRelInfo[i];
+ if (node->extraUpdatedColsBitmaps)
+ resultRelInfo->ri_extraUpdatedCols =
+ list_nth(node->extraUpdatedColsBitmaps, i);
+
/* Let FDWs init themselves for foreign-table result rels */
if (!resultRelInfo->ri_usesFdwDirectModify &&
resultRelInfo->ri_FdwRoutine != NULL &&
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 59b0fdeb62..2d369e0340 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -561,7 +561,6 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
WRITE_BOOL_FIELD(lateral);
WRITE_BOOL_FIELD(inh);
WRITE_BOOL_FIELD(inFromCl);
- WRITE_BITMAPSET_FIELD(extraUpdatedCols);
WRITE_NODE_FIELD(securityQuals);
}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 966b75f5a6..d720aea857 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -537,7 +537,6 @@ _readRangeTblEntry(void)
READ_BOOL_FIELD(lateral);
READ_BOOL_FIELD(inh);
READ_BOOL_FIELD(inFromCl);
- READ_BITMAPSET_FIELD(extraUpdatedCols);
READ_NODE_FIELD(securityQuals);
READ_DONE();
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 5013ac3377..2360ae280b 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -308,7 +308,7 @@ static ModifyTable *make_modifytable(PlannerInfo *root, Plan *subplan,
Index nominalRelation, Index rootRelation,
bool partColsUpdated,
List *resultRelations,
- List *updateColnosLists,
+ List *updateColnosLists, List *extraUpdatedColsBitmaps,
List *withCheckOptionLists, List *returningLists,
List *rowMarks, OnConflictExpr *onconflict,
List *mergeActionLists, int epqParam);
@@ -2824,6 +2824,7 @@ create_modifytable_plan(PlannerInfo *root, ModifyTablePath *best_path)
best_path->partColsUpdated,
best_path->resultRelations,
best_path->updateColnosLists,
+ best_path->extraUpdatedColsBitmaps,
best_path->withCheckOptionLists,
best_path->returningLists,
best_path->rowMarks,
@@ -6980,7 +6981,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan,
Index nominalRelation, Index rootRelation,
bool partColsUpdated,
List *resultRelations,
- List *updateColnosLists,
+ List *updateColnosLists, List *extraUpdatedColsBitmaps,
List *withCheckOptionLists, List *returningLists,
List *rowMarks, OnConflictExpr *onconflict,
List *mergeActionLists, int epqParam)
@@ -7049,6 +7050,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan,
node->exclRelTlist = onconflict->exclRelTlist;
}
node->updateColnosLists = updateColnosLists;
+ node->extraUpdatedColsBitmaps = extraUpdatedColsBitmaps;
node->withCheckOptionLists = withCheckOptionLists;
node->returningLists = returningLists;
node->rowMarks = rowMarks;
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 5cddc9d6cf..4178eb416d 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -1746,6 +1746,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
Index rootRelation;
List *resultRelations = NIL;
List *updateColnosLists = NIL;
+ List *extraUpdatedColsBitmaps = NIL;
List *withCheckOptionLists = NIL;
List *returningLists = NIL;
List *mergeActionLists = NIL;
@@ -1779,15 +1780,35 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
if (parse->commandType == CMD_UPDATE)
{
List *update_colnos = root->update_colnos;
+ Bitmapset *extraUpdatedCols = root->extraUpdatedCols;
if (this_result_rel != top_result_rel)
+ {
update_colnos =
adjust_inherited_attnums_multilevel(root,
update_colnos,
this_result_rel->relid,
top_result_rel->relid);
+ extraUpdatedCols =
+ translate_col_privs_multilevel(root, this_result_rel,
+ top_result_rel,
+ extraUpdatedCols);
+ }
updateColnosLists = lappend(updateColnosLists,
update_colnos);
+ /*
+ * Make extraUpdatedCols bitmap look as a proper Node
+ * before adding into the List so that Node
+ * copy/write/read handle it correctly.
+ *
+ * XXX should be using makeNode(Bitmapset) somewhere?
+ */
+ if (extraUpdatedCols)
+ {
+ extraUpdatedCols->type = T_Bitmapset;
+ extraUpdatedColsBitmaps = lappend(extraUpdatedColsBitmaps,
+ extraUpdatedCols);
+ }
}
if (parse->withCheckOptions)
{
@@ -1869,7 +1890,15 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
*/
resultRelations = list_make1_int(parse->resultRelation);
if (parse->commandType == CMD_UPDATE)
+ {
updateColnosLists = list_make1(root->update_colnos);
+ /* See the comment in the inherited UPDATE block. */
+ if (root->extraUpdatedCols)
+ {
+ root->extraUpdatedCols->type = T_Bitmapset;
+ extraUpdatedColsBitmaps = list_make1(root->extraUpdatedCols);
+ }
+ }
if (parse->withCheckOptions)
withCheckOptionLists = list_make1(parse->withCheckOptions);
if (parse->returningList)
@@ -1883,7 +1912,15 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
/* Single-relation INSERT/UPDATE/DELETE/MERGE. */
resultRelations = list_make1_int(parse->resultRelation);
if (parse->commandType == CMD_UPDATE)
+ {
updateColnosLists = list_make1(root->update_colnos);
+ /* See the comment in the inherited UPDATE block. */
+ if (root->extraUpdatedCols)
+ {
+ root->extraUpdatedCols->type = T_Bitmapset;
+ extraUpdatedColsBitmaps = list_make1(root->extraUpdatedCols);
+ }
+ }
if (parse->withCheckOptions)
withCheckOptionLists = list_make1(parse->withCheckOptions);
if (parse->returningList)
@@ -1922,6 +1959,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction)
root->partColsUpdated,
resultRelations,
updateColnosLists,
+ extraUpdatedColsBitmaps,
withCheckOptionLists,
returningLists,
rowMarks,
diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c
index 137b28323d..6bbcb6ac1d 100644
--- a/src/backend/optimizer/prep/preptlist.c
+++ b/src/backend/optimizer/prep/preptlist.c
@@ -43,6 +43,7 @@
#include "optimizer/prep.h"
#include "optimizer/tlist.h"
#include "parser/parse_coerce.h"
+#include "parser/parse_relation.h"
#include "parser/parsetree.h"
#include "utils/rel.h"
@@ -106,6 +107,17 @@ preprocess_targetlist(PlannerInfo *root)
else if (command_type == CMD_UPDATE)
root->update_colnos = extract_update_targetlist_colnos(tlist);
+ /* Also populate extraUpdatedCols (for generated columns) */
+ if (command_type == CMD_UPDATE)
+ {
+ RTEPermissionInfo *target_perminfo =
+ GetRTEPermissionInfo(parse->rtepermlist, target_rte);
+
+ root->extraUpdatedCols =
+ get_extraUpdatedCols(target_perminfo->updatedCols,
+ target_relation);
+ }
+
/*
* For non-inherited UPDATE/DELETE/MERGE, register any junk column(s)
* needed to allow the executor to identify the rows to be updated or
@@ -337,6 +349,41 @@ extract_update_targetlist_colnos(List *tlist)
return update_colnos;
}
+/*
+ * Return the indexes of any generated columns that depend on any columns
+ * mentioned in updatedCols.
+ */
+Bitmapset *
+get_extraUpdatedCols(Bitmapset *updatedCols, Relation target_relation)
+{
+ TupleDesc tupdesc = RelationGetDescr(target_relation);
+ TupleConstr *constr = tupdesc->constr;
+ Bitmapset *extraUpdatedCols = NULL;
+
+ if (constr && constr->has_generated_stored)
+ {
+ for (int i = 0; i < constr->num_defval; i++)
+ {
+ AttrDefault *defval = &constr->defval[i];
+ Node *expr;
+ Bitmapset *attrs_used = NULL;
+
+ /* skip if not generated column */
+ if (!TupleDescAttr(tupdesc, defval->adnum - 1)->attgenerated)
+ continue;
+
+ /* identify columns this generated column depends on */
+ expr = stringToNode(defval->adbin);
+ pull_varattnos(expr, 1, &attrs_used);
+
+ if (bms_overlap(updatedCols, attrs_used))
+ extraUpdatedCols = bms_add_member(extraUpdatedCols,
+ defval->adnum - FirstLowInvalidHeapAttributeNumber);
+ }
+ }
+
+ return extraUpdatedCols;
+}
/*****************************************************************************
*
diff --git a/src/backend/optimizer/util/inherit.c b/src/backend/optimizer/util/inherit.c
index 09e2ffdfbc..ecfa179bfc 100644
--- a/src/backend/optimizer/util/inherit.c
+++ b/src/backend/optimizer/util/inherit.c
@@ -40,6 +40,7 @@ static void expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
RangeTblEntry *parentrte,
Index parentRTindex, Relation parentrel,
Bitmapset *parent_updatedCols,
+ Bitmapset *parent_extraUpdatedCols,
PlanRowMark *top_parentrc, LOCKMODE lockmode);
static void expand_single_inheritance_child(PlannerInfo *root,
RangeTblEntry *parentrte,
@@ -149,6 +150,7 @@ expand_inherited_rtentry(PlannerInfo *root, RelOptInfo *rel,
expand_partitioned_rtentry(root, rel, rte, rti,
oldrelation,
perminfo->updatedCols,
+ root->extraUpdatedCols,
oldrc, lockmode);
}
else
@@ -314,6 +316,7 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
RangeTblEntry *parentrte,
Index parentRTindex, Relation parentrel,
Bitmapset *parent_updatedCols,
+ Bitmapset *parent_extraUpdatedCols,
PlanRowMark *top_parentrc, LOCKMODE lockmode)
{
PartitionDesc partdesc;
@@ -344,7 +347,7 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
/*
* There shouldn't be any generated columns in the partition key.
*/
- Assert(!has_partition_attrs(parentrel, parentrte->extraUpdatedCols, NULL));
+ Assert(!has_partition_attrs(parentrel, parent_extraUpdatedCols, NULL));
/* Nothing further to do here if there are no partitions. */
if (partdesc->nparts == 0)
@@ -413,14 +416,18 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo,
{
AppendRelInfo *appinfo = root->append_rel_array[childRTindex];
Bitmapset *child_updatedCols;
+ Bitmapset *child_extraUpdatedCols;
child_updatedCols = translate_col_privs(parent_updatedCols,
appinfo->translated_vars);
+ child_extraUpdatedCols = translate_col_privs(parent_extraUpdatedCols,
+ appinfo->translated_vars);
expand_partitioned_rtentry(root, childrelinfo,
childrte, childRTindex,
childrel,
child_updatedCols,
+ child_extraUpdatedCols,
top_parentrc, lockmode);
}
@@ -562,13 +569,6 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte,
childrte->alias = childrte->eref = makeAlias(parentrte->eref->aliasname,
child_colnames);
- /* Translate the bitmapset of generated columns being updated. */
- if (childOID != parentOID)
- childrte->extraUpdatedCols = translate_col_privs(parentrte->extraUpdatedCols,
- appinfo->translated_vars);
- else
- childrte->extraUpdatedCols = bms_copy(parentrte->extraUpdatedCols);
-
/*
* Store the RTE and appinfo in the respective PlannerInfo arrays, which
* the caller must already have allocated space for.
@@ -875,7 +875,7 @@ apply_child_basequals(PlannerInfo *root, RelOptInfo *parentrel,
* 'top_parent_cols' to the columns numbers of a descendent relation
* given by 'relid'
*/
-static Bitmapset *
+Bitmapset *
translate_col_privs_multilevel(PlannerInfo *root, RelOptInfo *rel,
RelOptInfo *top_parent_rel,
Bitmapset *top_parent_cols)
@@ -949,12 +949,12 @@ GetRelAllUpdatedCols(PlannerInfo *root, RelOptInfo *rel)
updatedCols = translate_col_privs_multilevel(root, rel, top_parent_rel,
perminfo->updatedCols);
extraUpdatedCols = translate_col_privs_multilevel(root, rel, top_parent_rel,
- rte->extraUpdatedCols);
+ root->extraUpdatedCols);
}
else
{
updatedCols = perminfo->updatedCols;
- extraUpdatedCols = rte->extraUpdatedCols;
+ extraUpdatedCols = root->extraUpdatedCols;
}
return bms_union(updatedCols, extraUpdatedCols);
diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c
index 6dd11329fb..5b489da57d 100644
--- a/src/backend/optimizer/util/pathnode.c
+++ b/src/backend/optimizer/util/pathnode.c
@@ -3644,6 +3644,8 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel,
* 'resultRelations' is an integer list of actual RT indexes of target rel(s)
* 'updateColnosLists' is a list of UPDATE target column number lists
* (one sublist per rel); or NIL if not an UPDATE
+ * 'extraUpdatedColsBitmaps' is a list of generated column attribute number
+ * bitmapsets (one bitmapset per rel); or NIL if not an UPDATE
* 'withCheckOptionLists' is a list of WCO lists (one per rel)
* 'returningLists' is a list of RETURNING tlists (one per rel)
* 'rowMarks' is a list of PlanRowMarks (non-locking only)
@@ -3659,6 +3661,7 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel,
bool partColsUpdated,
List *resultRelations,
List *updateColnosLists,
+ List *extraUpdatedColsBitmaps,
List *withCheckOptionLists, List *returningLists,
List *rowMarks, OnConflictExpr *onconflict,
List *mergeActionLists, int epqParam)
@@ -3723,6 +3726,7 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel,
pathnode->partColsUpdated = partColsUpdated;
pathnode->resultRelations = resultRelations;
pathnode->updateColnosLists = updateColnosLists;
+ pathnode->extraUpdatedColsBitmaps = extraUpdatedColsBitmaps;
pathnode->withCheckOptionLists = withCheckOptionLists;
pathnode->returningLists = returningLists;
pathnode->rowMarks = rowMarks;
diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c
index 568344cc23..eb18a04908 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -156,6 +156,7 @@
#include "miscadmin.h"
#include "nodes/makefuncs.h"
#include "optimizer/optimizer.h"
+#include "optimizer/prep.h"
#include "parser/parse_relation.h"
#include "pgstat.h"
#include "postmaster/bgworker.h"
@@ -1815,7 +1816,6 @@ apply_handle_update(StringInfo s)
LogicalRepTupleData newtup;
bool has_oldtup;
TupleTableSlot *remoteslot;
- RangeTblEntry *target_rte;
RTEPermissionInfo *target_perminfo;
MemoryContext oldctx;
@@ -1864,7 +1864,6 @@ apply_handle_update(StringInfo s)
* information. But it would for example exclude columns that only exist
* on the subscriber, since we are not touching those.
*/
- target_rte = list_nth(estate->es_range_table, 0);
target_perminfo = list_nth(estate->es_rtepermlist, 0);
for (int i = 0; i < remoteslot->tts_tupleDescriptor->natts; i++)
{
@@ -1882,7 +1881,8 @@ apply_handle_update(StringInfo s)
}
/* Also populate extraUpdatedCols, in case we have generated columns */
- fill_extraUpdatedCols(target_rte, target_perminfo, rel->localrel);
+ edata->targetRelInfo->ri_extraUpdatedCols =
+ get_extraUpdatedCols(target_perminfo->updatedCols, rel->localrel);
/* Build the search tuple. */
oldctx = MemoryContextSwitchTo(GetPerTupleMemoryContext(estate));
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index 45d03bacbe..5261add7b2 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1626,46 +1626,6 @@ rewriteValuesRTEToNulls(Query *parsetree, RangeTblEntry *rte)
}
-/*
- * Record in target_rte->extraUpdatedCols the indexes of any generated columns
- * columns that depend on any columns mentioned in
- * target_perminfo->updatedCols.
- */
-void
-fill_extraUpdatedCols(RangeTblEntry *target_rte,
- RTEPermissionInfo *target_perminfo,
- Relation target_relation)
-{
- TupleDesc tupdesc = RelationGetDescr(target_relation);
- TupleConstr *constr = tupdesc->constr;
-
- target_rte->extraUpdatedCols = NULL;
-
- if (constr && constr->has_generated_stored)
- {
- for (int i = 0; i < constr->num_defval; i++)
- {
- AttrDefault *defval = &constr->defval[i];
- Node *expr;
- Bitmapset *attrs_used = NULL;
-
- /* skip if not generated column */
- if (!TupleDescAttr(tupdesc, defval->adnum - 1)->attgenerated)
- continue;
-
- /* identify columns this generated column depends on */
- expr = stringToNode(defval->adbin);
- pull_varattnos(expr, 1, &attrs_used);
-
- if (bms_overlap(target_perminfo->updatedCols, attrs_used))
- target_rte->extraUpdatedCols =
- bms_add_member(target_rte->extraUpdatedCols,
- defval->adnum - FirstLowInvalidHeapAttributeNumber);
- }
- }
-}
-
-
/*
* matchLocks -
* match the list of locks and returns the matching rules
@@ -3716,7 +3676,6 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
{
int result_relation;
RangeTblEntry *rt_entry;
- RTEPermissionInfo *rt_perminfo;
Relation rt_entry_relation;
List *locks;
List *product_queries;
@@ -3728,7 +3687,6 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
Assert(result_relation != 0);
rt_entry = rt_fetch(result_relation, parsetree->rtable);
Assert(rt_entry->rtekind == RTE_RELATION);
- rt_perminfo = GetRTEPermissionInfo(parsetree->rtepermlist, rt_entry);
/*
* We can use NoLock here since either the parser or
@@ -3813,9 +3771,6 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
parsetree->override,
rt_entry_relation,
NULL, 0, NULL);
-
- /* Also populate extraUpdatedCols (for generated columns) */
- fill_extraUpdatedCols(rt_entry, rt_perminfo, rt_entry_relation);
}
else if (event == CMD_MERGE)
{
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index a076cc11a9..063932e4d2 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -471,6 +471,9 @@ typedef struct ResultRelInfo
/* Have the projection and the slots above been initialized? */
bool ri_projectNewInfoValid;
+ /* generated column attribute numbers */
+ Bitmapset *ri_extraUpdatedCols;
+
/* triggers to be fired, if any */
TriggerDesc *ri_TrigDesc;
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index ae73fbe7da..f81b74a062 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -1153,7 +1153,6 @@ typedef struct RangeTblEntry
bool lateral; /* subquery, function, or values is LATERAL? */
bool inh; /* inheritance requested? */
bool inFromCl; /* present in FROM clause? */
- Bitmapset *extraUpdatedCols; /* generated columns being updated */
List *securityQuals; /* security barrier quals to apply, if any */
} RangeTblEntry;
diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h
index 1ef2f89782..23e1cfc2fb 100644
--- a/src/include/nodes/pathnodes.h
+++ b/src/include/nodes/pathnodes.h
@@ -422,6 +422,8 @@ struct PlannerInfo
*/
List *update_colnos;
+ Bitmapset *extraUpdatedCols;
+
/*
* Fields filled during create_plan() for use in setrefs.c
*/
@@ -2248,6 +2250,7 @@ typedef struct ModifyTablePath
bool partColsUpdated; /* some part key in hierarchy updated? */
List *resultRelations; /* integer list of RT indexes */
List *updateColnosLists; /* per-target-table update_colnos lists */
+ List *extraUpdatedColsBitmaps; /* per-target-table extraUpdatedCols bitmaps */
List *withCheckOptionLists; /* per-target-table WCO lists */
List *returningLists; /* per-target-table RETURNING tlists */
List *rowMarks; /* PlanRowMarks (non-locking only) */
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index e3a5233dd7..2e7b9a289d 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -237,6 +237,7 @@ typedef struct ModifyTable
bool partColsUpdated; /* some part key in hierarchy updated? */
List *resultRelations; /* integer list of RT indexes */
List *updateColnosLists; /* per-target-table update_colnos lists */
+ List *extraUpdatedColsBitmaps; /* per-target-table extraUpdatedCols bitmaps */
List *withCheckOptionLists; /* per-target-table WCO lists */
List *returningLists; /* per-target-table RETURNING tlists */
List *fdwPrivLists; /* per-target-table FDW private data lists */
diff --git a/src/include/optimizer/inherit.h b/src/include/optimizer/inherit.h
index 9a4f86920c..a729401031 100644
--- a/src/include/optimizer/inherit.h
+++ b/src/include/optimizer/inherit.h
@@ -24,5 +24,8 @@ extern bool apply_child_basequals(PlannerInfo *root, RelOptInfo *parentrel,
RelOptInfo *childrel, RangeTblEntry *childRTE,
AppendRelInfo *appinfo);
extern Bitmapset *GetRelAllUpdatedCols(PlannerInfo *root, RelOptInfo *rel);
+extern Bitmapset *translate_col_privs_multilevel(PlannerInfo *root, RelOptInfo *rel,
+ RelOptInfo *top_parent_rel,
+ Bitmapset *top_parent_cols);
#endif /* INHERIT_H */
diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h
index 050f00e79a..fd16d94916 100644
--- a/src/include/optimizer/pathnode.h
+++ b/src/include/optimizer/pathnode.h
@@ -278,6 +278,7 @@ extern ModifyTablePath *create_modifytable_path(PlannerInfo *root,
bool partColsUpdated,
List *resultRelations,
List *updateColnosLists,
+ List *extraUpdatedColsBitmaps,
List *withCheckOptionLists, List *returningLists,
List *rowMarks, OnConflictExpr *onconflict,
List *mergeActionLists, int epqParam);
diff --git a/src/include/optimizer/prep.h b/src/include/optimizer/prep.h
index 5b4f350b33..92753c9670 100644
--- a/src/include/optimizer/prep.h
+++ b/src/include/optimizer/prep.h
@@ -16,6 +16,7 @@
#include "nodes/pathnodes.h"
#include "nodes/plannodes.h"
+#include "utils/relcache.h"
/*
@@ -39,6 +40,9 @@ extern void preprocess_targetlist(PlannerInfo *root);
extern List *extract_update_targetlist_colnos(List *tlist);
+extern Bitmapset *get_extraUpdatedCols(Bitmapset *updatedCols,
+ Relation target_relation);
+
extern PlanRowMark *get_plan_rowmark(List *rowmarks, Index rtindex);
/*
diff --git a/src/include/rewrite/rewriteHandler.h b/src/include/rewrite/rewriteHandler.h
index 05c3680cd6..b4f96f298b 100644
--- a/src/include/rewrite/rewriteHandler.h
+++ b/src/include/rewrite/rewriteHandler.h
@@ -24,10 +24,6 @@ extern void AcquireRewriteLocks(Query *parsetree,
extern Node *build_column_default(Relation rel, int attrno);
-extern void fill_extraUpdatedCols(RangeTblEntry *target_rte,
- RTEPermissionInfo *target_perminfo,
- Relation target_relation);
-
extern Query *get_view_query(Relation view);
extern const char *view_query_is_auto_updatable(Query *viewquery,
bool check_cols);
--
2.35.3