diff options
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r-- | src/backend/commands/tablecmds.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f518c1371e6..c91bcb411a7 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1605,8 +1605,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * execute if the user attempts to create a table with hundreds of * thousands of columns. * - * Note that we also need to check that we do not exceed this figure - * after including columns from inherited relations. + * Note that we also need to check that we do not exceed this figure after + * including columns from inherited relations. */ if (list_length(schema) > MaxHeapAttributeNumber) ereport(ERROR, @@ -10902,6 +10902,46 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) } } + /* + * If the parent has an OID column, so must the child, and we'd better + * update the child's attinhcount and attislocal the same as for normal + * columns. We needn't check data type or not-nullness though. + */ + if (tupleDesc->tdhasoid) + { + /* + * Here we match by column number not name; the match *must* be the + * system column, not some random column named "oid". + */ + tuple = SearchSysCacheCopy2(ATTNUM, + ObjectIdGetDatum(RelationGetRelid(child_rel)), + Int16GetDatum(ObjectIdAttributeNumber)); + if (HeapTupleIsValid(tuple)) + { + Form_pg_attribute childatt = (Form_pg_attribute) GETSTRUCT(tuple); + + /* See comments above; these changes should be the same */ + childatt->attinhcount++; + + if (child_is_partition) + { + Assert(childatt->attinhcount == 1); + childatt->attislocal = false; + } + + simple_heap_update(attrrel, &tuple->t_self, tuple); + CatalogUpdateIndexes(attrrel, tuple); + heap_freetuple(tuple); + } + else + { + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("child table is missing column \"%s\"", + "oid"))); + } + } + heap_close(attrrel, RowExclusiveLock); } |