setnotnull-child-v1.patch
text/x-patch
Filename: setnotnull-child-v1.patch
Type: text/x-patch
Part: 0
[1mdiff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c[m
[1mindex 1bd8a58b7f..74903a8f24 100644[m
[1m--- a/src/backend/catalog/pg_inherits.c[m
[1m+++ b/src/backend/catalog/pg_inherits.c[m
[36m@@ -242,6 +242,40 @@[m [mfind_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)[m
}[m
[m
[m
[32m+[m[32m/*[m
[32m+[m[32m * get_superclasses -[m
[32m+[m[32m * Returns a list of relation OIDs of direct parents[m
[32m+[m[32m */[m
[32m+[m[32mList *[m
[32m+[m[32mget_superclasses(Oid relationId)[m
[32m+[m[32m{[m
[32m+[m [32mList *list = NIL;[m
[32m+[m [32mRelation catalog;[m
[32m+[m [32mSysScanDesc scan;[m
[32m+[m [32mScanKeyData skey;[m
[32m+[m [32mHeapTuple inheritsTuple;[m
[32m+[m [32mOid inhparent;[m
[32m+[m
[32m+[m [32mcatalog = heap_open(InheritsRelationId, AccessShareLock);[m
[32m+[m [32mScanKeyInit(&skey, Anum_pg_inherits_inhrelid, BTEqualStrategyNumber,[m
[32m+[m [32mF_OIDEQ, ObjectIdGetDatum(relationId));[m
[32m+[m [32mscan = systable_beginscan(catalog, InheritsRelidSeqnoIndexId, true,[m
[32m+[m [32m NULL, 1, &skey);[m
[32m+[m
[32m+[m [32mwhile ((inheritsTuple = systable_getnext(scan)) != NULL)[m
[32m+[m [32m{[m
[32m+[m [32minhparent = ((Form_pg_inherits) GETSTRUCT(inheritsTuple))->inhparent;[m
[32m+[m [32mlist = lappend_oid(list, inhparent);[m
[32m+[m [32m}[m
[32m+[m
[32m+[m [32msystable_endscan(scan);[m
[32m+[m
[32m+[m [32mheap_close(catalog, AccessShareLock);[m
[32m+[m
[32m+[m [32mreturn list;[m
[32m+[m[32m}[m
[32m+[m
[32m+[m
/*[m
* has_subclass - does this relation have any children?[m
*[m
[1mdiff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c[m
[1mindex d979ce266d..c76fc3715d 100644[m
[1m--- a/src/backend/commands/tablecmds.c[m
[1m+++ b/src/backend/commands/tablecmds.c[m
[36m@@ -5683,6 +5683,8 @@[m [mATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)[m
Relation attr_rel;[m
List *indexoidlist;[m
ListCell *indexoidscan;[m
[32m+[m [32mList *parentlist;[m
[32m+[m [32mListCell *parentscan;[m
ObjectAddress address;[m
[m
/*[m
[36m@@ -5773,6 +5775,24 @@[m [mATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode)[m
heap_close(parent, AccessShareLock);[m
}[m
[m
[32m+[m [32m/* If rel has parents, shoudn't drop NOT NULL if parent has the same */[m
[32m+[m [32mparentlist = get_superclasses(RelationGetRelid(rel));[m
[32m+[m [32mforeach(parentscan, parentlist) {[m
[32m+[m [32mOid parentId = lfirst_oid(parentscan);[m
[32m+[m [32mRelation parent = heap_open(parentId, AccessShareLock);[m
[32m+[m [32mTupleDesc tupDesc = RelationGetDescr(parent);[m
[32m+[m [32mAttrNumber parent_attnum;[m
[32m+[m
[32m+[m [32mparent_attnum = get_attnum(parentId, colName);[m
[32m+[m [32mif (parent_attnum != InvalidAttrNumber &&[m
[32m+[m [32mTupleDescAttr(tupDesc, parent_attnum - 1)->attnotnull)[m
[32m+[m [32mereport(ERROR,[m
[32m+[m [32m(errcode(ERRCODE_INVALID_TABLE_DEFINITION),[m
[32m+[m [32m errmsg("column \"%s\" is marked NOT NULL in parent table",[m
[32m+[m [32mcolName)));[m
[32m+[m [32mheap_close(parent, AccessShareLock);[m
[32m+[m [32m}[m
[32m+[m
/*[m
* Okay, actually perform the catalog change ... if needed[m
*/[m
[1mdiff --git a/src/include/catalog/pg_inherits_fn.h b/src/include/catalog/pg_inherits_fn.h[m
[1mindex 7743388899..291861b846 100644[m
[1m--- a/src/include/catalog/pg_inherits_fn.h[m
[1m+++ b/src/include/catalog/pg_inherits_fn.h[m
[36m@@ -20,6 +20,7 @@[m
extern List *find_inheritance_children(Oid parentrelId, LOCKMODE lockmode);[m
extern List *find_all_inheritors(Oid parentrelId, LOCKMODE lockmode,[m
List **parents);[m
[32m+[m[32mextern List *get_superclasses(Oid relationId);[m
extern bool has_subclass(Oid relationId);[m
extern bool has_superclass(Oid relationId);[m
extern bool typeInheritsFrom(Oid subclassTypeId, Oid superclassTypeId);[m