#define ATT_COMPOSITE_TYPE 0x0010
#define ATT_FOREIGN_TABLE 0x0020
+/*
+ * Partition tables are expected to be dropped when the parent partitioned
+ * table gets dropped. Hence for partitioning we use AUTO dependency.
+ * Otherwise, for regular inheritance use NORMAL dependency.
+ */
+#define child_dependency_type(child_is_partition) \
+ ((child_is_partition) ? DEPENDENCY_AUTO : DEPENDENCY_NORMAL)
+
static void truncate_check_rel(Relation rel);
static List *MergeAttributes(List *schema, List *supers, char relpersistence,
bool is_partition, List **supOids, List **supconstr,
static void ATPrepAddInherit(Relation child_rel);
static ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode);
static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode);
-static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid);
+static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid,
+ DependencyType deptype);
static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode);
static void ATExecDropOf(Relation rel, LOCKMODE lockmode);
static void ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode);
childobject.objectId = relationId;
childobject.objectSubId = 0;
- /*
- * Partition tables are expected to be dropped when the parent partitioned
- * table gets dropped.
- */
- if (child_is_partition)
- recordDependencyOn(&childobject, &parentobject, DEPENDENCY_AUTO);
- else
- recordDependencyOn(&childobject, &parentobject, DEPENDENCY_NORMAL);
+ recordDependencyOn(&childobject, &parentobject,
+ child_dependency_type(child_is_partition));
/*
* Post creation hook of this inheritance. Since object_access_hook
drop_parent_dependency(RelationGetRelid(child_rel),
RelationRelationId,
- RelationGetRelid(parent_rel));
+ RelationGetRelid(parent_rel),
+ child_dependency_type(child_is_partition));
/*
* Post alter hook of this inherits. Since object_access_hook doesn't take
* through pg_depend.
*/
static void
-drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid)
+drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid,
+ DependencyType deptype)
{
Relation catalogRelation;
SysScanDesc scan;
if (dep->refclassid == refclassid &&
dep->refobjid == refobjid &&
dep->refobjsubid == 0 &&
- dep->deptype == DEPENDENCY_NORMAL)
+ dep->deptype == deptype)
CatalogTupleDelete(catalogRelation, &depTuple->t_self);
}
/* If the table was already typed, drop the existing dependency. */
if (rel->rd_rel->reloftype)
- drop_parent_dependency(relid, TypeRelationId, rel->rd_rel->reloftype);
+ drop_parent_dependency(relid, TypeRelationId, rel->rd_rel->reloftype,
+ DEPENDENCY_NORMAL);
/* Record a dependency on the new type. */
tableobj.classId = RelationRelationId;
* table is presumed enough rights. No lock required on the type, either.
*/
- drop_parent_dependency(relid, TypeRelationId, rel->rd_rel->reloftype);
+ drop_parent_dependency(relid, TypeRelationId, rel->rd_rel->reloftype,
+ DEPENDENCY_NORMAL);
/* Clear pg_class.reloftype */
relationRelation = heap_open(RelationRelationId, RowExclusiveLock);