It seems hard to believe that ATExecDropConstraint() doesn't need any
adjustment.
Yeah, I think we could return early on for "only" type of constraints.
Also, shouldn't the systable scan break out of the while loop after a matching constraint name has been found? As of now, it's doing a full scan of all the constraints for the given relation.
> @@ -6755,6 +6765,7 @@ ATExecDropConstraint(Relation rel, const char *constrName,
> HeapTuple tuple;
> bool found = false;
> bool is_check_constraint = false;
> + bool is_only_constraint = false;
>
> /* At top level, permission check was done in ATPrepCmd, else do it */
> if (recursing)
> @@ -6791,6 +6802,12 @@ ATExecDropConstraint(Relation rel, const char *constrName,
> /* Right now only CHECK constraints can be inherited */
> if (con->contype == CONSTRAINT_CHECK)
> is_check_constraint = true;
> +
> + if (con->conisonly)
> + {
> + Assert(is_check_constraint);
> + is_only_constraint = true;
> + }
>
> /*
> * Perform the actual constraint deletion
> @@ -6802,6 +6819,9 @@ ATExecDropConstraint(Relation rel, const char *constrName,
> performDeletion(&conobj, behavior);
>
> found = true;
> +
> + /* constraint found - break from the while loop now */
> + break;
> }
>
> systable_endscan(scan);
> @@ -6830,7 +6850,7 @@ ATExecDropConstraint(Relation rel, const char *constrName,
> * 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.
> */
> - if (is_check_constraint)
> + if (is_check_constraint && !is_only_constraint)
> children = find_inheritance_children(RelationGetRelid(rel), lockmode);
> else
> children = NIL;
PFA, revised version containing the above changes based on Alvaro's v4 patch.
Regards,
Nikhils