From c2c9bd4c4976902525ebfcb0e32eb8249df549c9 Mon Sep 17 00:00:00 2001 From: amit Date: Thu, 24 Jan 2019 20:42:11 +0900 Subject: [PATCH 2/2] Don't recurse in ATExecDropConstraint for non-CHECK constraints --- src/backend/commands/tablecmds.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index fea4d99735..82e2cf1473 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -9134,6 +9134,7 @@ ATExecDropConstraint(Relation rel, const char *constrName, HeapTuple tuple; bool found = false; bool is_no_inherit_constraint = false; + char contype; /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) @@ -9203,6 +9204,7 @@ ATExecDropConstraint(Relation rel, const char *constrName, performDeletion(&conobj, behavior, 0); found = true; + contype = con->contype; } systable_endscan(scan); @@ -9227,6 +9229,16 @@ ATExecDropConstraint(Relation rel, const char *constrName, } /* + * Non-CHECK inherited constraints are dropped via dependency mechanism, + * so we're done here for such constraints. + */ + if (contype != CONSTRAINT_CHECK) + { + table_close(conrel, RowExclusiveLock); + return; + } + + /* * Propagate to children as appropriate. Unlike most other ALTER * routines, we have to do this one level of recursion at a time; we can't * use find_all_inheritors to do it in one pass. -- 2.11.0