aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor/execUtils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/executor/execUtils.c')
-rw-r--r--src/backend/executor/execUtils.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index 358e5828831..122de068022 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -132,6 +132,8 @@ CreateExecutorState(void)
estate->es_insert_pending_result_relations = NIL;
estate->es_insert_pending_modifytables = NIL;
+ estate->es_resultrelinfo_extra = NIL;
+
estate->es_param_list_info = NULL;
estate->es_param_exec_vals = NULL;
@@ -1323,26 +1325,25 @@ ExecGetUpdatedCols(ResultRelInfo *relinfo, EState *estate)
Bitmapset *
ExecGetExtraUpdatedCols(ResultRelInfo *relinfo, EState *estate)
{
- /* see ExecGetInsertedCols() */
- if (relinfo->ri_RangeTableIndex != 0)
- {
- RangeTblEntry *rte = exec_rt_fetch(relinfo->ri_RangeTableIndex, estate);
+ Relation rel = relinfo->ri_RelationDesc;
+ TupleDesc tupdesc = RelationGetDescr(rel);
- return rte->extraUpdatedCols;
- }
- else if (relinfo->ri_RootResultRelInfo)
+ if (tupdesc->constr && tupdesc->constr->has_generated_stored)
{
- ResultRelInfo *rootRelInfo = relinfo->ri_RootResultRelInfo;
- RangeTblEntry *rte = exec_rt_fetch(rootRelInfo->ri_RangeTableIndex, estate);
+ ListCell *lc;
- if (relinfo->ri_RootToPartitionMap != NULL)
- return execute_attr_map_cols(relinfo->ri_RootToPartitionMap->attrMap,
- rte->extraUpdatedCols);
- else
- return rte->extraUpdatedCols;
+ /* Assert that ExecInitStoredGenerated has been called. */
+ Assert(relinfo->ri_GeneratedExprs != NULL);
+ foreach(lc, estate->es_resultrelinfo_extra)
+ {
+ ResultRelInfoExtra *rextra = (ResultRelInfoExtra *) lfirst(lc);
+
+ if (rextra->rinfo == relinfo)
+ return rextra->ri_extraUpdatedCols;
+ }
+ Assert(false); /* shouldn't get here */
}
- else
- return NULL;
+ return NULL;
}
/* Return columns being updated, including generated columns */