diff options
Diffstat (limited to 'src/backend/optimizer/util/appendinfo.c')
-rw-r--r-- | src/backend/optimizer/util/appendinfo.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/backend/optimizer/util/appendinfo.c b/src/backend/optimizer/util/appendinfo.c index 16d315176eb..1890f256de8 100644 --- a/src/backend/optimizer/util/appendinfo.c +++ b/src/backend/optimizer/util/appendinfo.c @@ -34,7 +34,7 @@ typedef struct static void make_inh_translation_list(Relation oldrelation, Relation newrelation, Index newvarno, - List **translated_vars); + AppendRelInfo *appinfo); static Node *adjust_appendrel_attrs_mutator(Node *node, adjust_appendrel_attrs_context *context); static List *adjust_inherited_tlist(List *tlist, @@ -55,8 +55,7 @@ make_append_rel_info(Relation parentrel, Relation childrel, appinfo->child_relid = childRTindex; appinfo->parent_reltype = parentrel->rd_rel->reltype; appinfo->child_reltype = childrel->rd_rel->reltype; - make_inh_translation_list(parentrel, childrel, childRTindex, - &appinfo->translated_vars); + make_inh_translation_list(parentrel, childrel, childRTindex, appinfo); appinfo->parent_reloid = RelationGetRelid(parentrel); return appinfo; @@ -65,16 +64,23 @@ make_append_rel_info(Relation parentrel, Relation childrel, /* * make_inh_translation_list * Build the list of translations from parent Vars to child Vars for - * an inheritance child. + * an inheritance child, as well as a reverse-translation array. + * + * The reverse-translation array has an entry for each child relation + * column, which is either the 1-based index of the corresponding parent + * column, or 0 if there's no match (that happens for dropped child columns, + * as well as child columns beyond those of the parent, which are allowed in + * traditional inheritance though not partitioning). * * For paranoia's sake, we match type/collation as well as attribute name. */ static void make_inh_translation_list(Relation oldrelation, Relation newrelation, Index newvarno, - List **translated_vars) + AppendRelInfo *appinfo) { List *vars = NIL; + AttrNumber *pcolnos; TupleDesc old_tupdesc = RelationGetDescr(oldrelation); TupleDesc new_tupdesc = RelationGetDescr(newrelation); Oid new_relid = RelationGetRelid(newrelation); @@ -83,6 +89,11 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation, int old_attno; int new_attno = 0; + /* Initialize reverse-translation array with all entries zero */ + appinfo->num_child_cols = newnatts; + appinfo->parent_colnos = pcolnos = + (AttrNumber *) palloc0(newnatts * sizeof(AttrNumber)); + for (old_attno = 0; old_attno < oldnatts; old_attno++) { Form_pg_attribute att; @@ -115,6 +126,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation, atttypmod, attcollation, 0)); + pcolnos[old_attno] = old_attno + 1; continue; } @@ -138,6 +150,7 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation, elog(ERROR, "could not find inherited attribute \"%s\" of relation \"%s\"", attname, RelationGetRelationName(newrelation)); new_attno = ((Form_pg_attribute) GETSTRUCT(newtup))->attnum - 1; + Assert(new_attno >= 0 && new_attno < newnatts); ReleaseSysCache(newtup); att = TupleDescAttr(new_tupdesc, new_attno); @@ -157,10 +170,11 @@ make_inh_translation_list(Relation oldrelation, Relation newrelation, atttypmod, attcollation, 0)); + pcolnos[new_attno] = old_attno + 1; new_attno++; } - *translated_vars = vars; + appinfo->translated_vars = vars; } /* |