*** ./src/backend/catalog/dependency.c.orig Mon Apr 10 13:47:39 2006 --- ./src/backend/catalog/dependency.c Mon Apr 10 14:39:33 2006 *************** *** 1931,1933 **** --- 1931,2009 ---- ReleaseSysCache(relTup); } + + /* Recursively travel and search for the default sequence. Finally detach it */ + + void performSequenceDefaultDeletion(const ObjectAddress *object, + DropBehavior behavior, int deleteFlag) + { + + ScanKeyData key[3]; + int nkeys; + SysScanDesc scan; + HeapTuple tup; + ObjectAddress otherObject; + Relation depRel; + + depRel = heap_open(DependRelationId, RowExclusiveLock); + + ScanKeyInit(&key[0], + Anum_pg_depend_classid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(object->classId)); + ScanKeyInit(&key[1], + Anum_pg_depend_objid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(object->objectId)); + if (object->objectSubId != 0) + { + ScanKeyInit(&key[2], + Anum_pg_depend_objsubid, + BTEqualStrategyNumber, F_INT4EQ, + Int32GetDatum(object->objectSubId)); + nkeys = 3; + } + else + nkeys = 2; + + scan = systable_beginscan(depRel, DependDependerIndexId, true, + SnapshotNow, nkeys, key); + + while (HeapTupleIsValid(tup = systable_getnext(scan))) + { + + Form_pg_depend foundDep = (Form_pg_depend) GETSTRUCT(tup); + + otherObject.classId = foundDep->refclassid; + otherObject.objectId = foundDep->refobjid; + otherObject.objectSubId = foundDep->refobjsubid; + + /* Detach the default sequence from the relation */ + if(deleteFlag == 1) + { + simple_heap_delete(depRel, &tup->t_self); + break; + } + + switch (foundDep->deptype) + { + case DEPENDENCY_NORMAL: + { + + if(getObjectClass(&otherObject) == OCLASS_CLASS) + { + performSequenceDefaultDeletion(&otherObject, behavior, 1); + systable_endscan(scan); + heap_close(depRel, RowExclusiveLock); + return; + } + } + + } + } + + systable_endscan(scan); + heap_close(depRel, RowExclusiveLock); + + } + *** ./src/backend/catalog/heap.c.orig Mon Apr 10 13:47:51 2006 --- ./src/backend/catalog/heap.c Mon Apr 10 14:39:59 2006 *************** *** 2130,2132 **** --- 2130,2175 ---- return result; } + + /* Detach the default sequence and the relation */ + + void + RemoveSequenceDefault(Oid relid, AttrNumber attnum, + DropBehavior behavior) + { + Relation attrdef_rel; + ScanKeyData scankeys[2]; + SysScanDesc scan; + HeapTuple tuple; + + attrdef_rel = heap_open(AttrDefaultRelationId, RowExclusiveLock); + + ScanKeyInit(&scankeys[0], + Anum_pg_attrdef_adrelid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(relid)); + ScanKeyInit(&scankeys[1], + Anum_pg_attrdef_adnum, + BTEqualStrategyNumber, F_INT2EQ, + Int16GetDatum(attnum)); + + scan = systable_beginscan(attrdef_rel, AttrDefaultIndexId, true, + SnapshotNow, 2, scankeys); + + /* There should be at most one matching tuple, but we loop anyway */ + while (HeapTupleIsValid(tuple = systable_getnext(scan))) + { + ObjectAddress object; + + object.classId = AttrDefaultRelationId; + object.objectId = HeapTupleGetOid(tuple); + object.objectSubId = 0; + + performSequenceDefaultDeletion(&object, behavior, 0); + + } + + systable_endscan(scan); + heap_close(attrdef_rel, RowExclusiveLock); + + } *** ./src/backend/commands/tablecmds.c.orig Mon Apr 10 13:48:00 2006 --- ./src/backend/commands/tablecmds.c Mon Apr 10 13:50:54 2006 *************** *** 3362,3367 **** --- 3362,3368 ---- * safety, but at present we do not expect anything to depend on the * default. */ + RemoveSequenceDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT); RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, false); if (newDefault) *** ./src/include/catalog/dependency.h.orig Mon Apr 10 13:59:00 2006 --- ./src/include/catalog/dependency.h Mon Apr 10 14:01:16 2006 *************** *** 207,210 **** --- 207,214 ---- extern void shdepReassignOwned(List *relids, Oid newrole); + extern void performSequenceDefaultDeletion(const ObjectAddress *object, + DropBehavior behavior, int deleteFlag); + + #endif /* DEPENDENCY_H */ *** ./src/include/catalog/heap.h.orig Mon Apr 10 13:59:47 2006 --- ./src/include/catalog/heap.h Mon Apr 10 14:01:23 2006 *************** *** 97,100 **** --- 97,103 ---- extern void CheckAttributeType(const char *attname, Oid atttypid); + extern void RemoveSequenceDefault(Oid relid, AttrNumber attnum, + DropBehavior behavior); + #endif /* HEAP_H */