diff --git a/src/backend/optimizer/util/appendinfo.c b/src/backend/optimizer/util/appendinfo.c index af46f581ac..6e88fe6175 100644 --- a/src/backend/optimizer/util/appendinfo.c +++ b/src/backend/optimizer/util/appendinfo.c @@ -752,7 +752,8 @@ find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos) * * The Var must be equal(), aside from varno, to any other row-identity * column with the same rowid_name. Thus, for example, "wholerow" - * row identities had better use vartype == RECORDOID. + * row identities had better use vartype == RECORDOID, except in the cases + * where it is clear that there will be only one target relation. * * rtindex is currently redundant with rowid_var->varno, but we specify * it as a separate parameter in case this is ever generalized to support @@ -846,6 +847,36 @@ add_row_identity_var(PlannerInfo *root, Var *orig_var, root->processed_tlist = lappend(root->processed_tlist, tle); } +/* + * add_row_identity_var_wholerow + * Wrapper over add_row_identity_var() to register a "wholerow" + * row-identity column + * + * This has been made into a function unlike for other row-identity Vars, + * because the vartype that must be assigned to the Var differs based on + * whether it's being added for the root or for a child target relation. + * FDWs should call this for example instead of making the Var by themselves. + */ +void +add_row_identity_var_wholerow(PlannerInfo *root, Index rtindex, + Relation target_relation) +{ + Var *var; + Oid wholerow_type; + + if (rtindex == root->parse->resultRelation) + wholerow_type = RelationGetForm(target_relation)->reltype; + else + wholerow_type = RECORDOID; + var = makeVar(rtindex, + InvalidAttrNumber, + wholerow_type, + -1, + InvalidOid, + 0); + add_row_identity_var(root, var, rtindex, "wholerow"); +} + /* * add_row_identity_columns * @@ -909,15 +940,7 @@ add_row_identity_columns(PlannerInfo *root, Index rtindex, (target_relation->trigdesc && (target_relation->trigdesc->trig_delete_after_row || target_relation->trigdesc->trig_delete_before_row))) - { - var = makeVar(rtindex, - InvalidAttrNumber, - RECORDOID, - -1, - InvalidOid, - 0); - add_row_identity_var(root, var, rtindex, "wholerow"); - } + add_row_identity_var_wholerow(root, rtindex, target_relation); } } diff --git a/src/include/optimizer/appendinfo.h b/src/include/optimizer/appendinfo.h index 39d04d9cc0..97442a4ee1 100644 --- a/src/include/optimizer/appendinfo.h +++ b/src/include/optimizer/appendinfo.h @@ -42,6 +42,8 @@ extern AppendRelInfo **find_appinfos_by_relids(PlannerInfo *root, Relids relids, int *nappinfos); extern void add_row_identity_var(PlannerInfo *root, Var *rowid_var, Index rtindex, const char *rowid_name); +extern void add_row_identity_var_wholerow(PlannerInfo *root, Index rtindex, + Relation target_relation); extern void add_row_identity_columns(PlannerInfo *root, Index rtindex, RangeTblEntry *target_rte, Relation target_relation);