It's clear that we need to pass down the information that this action is coming from re-creation of a check constraint, but I think the above proposal for how to do it is pretty wrong-headed.
Yeah, I only meant that we need to teach ATExecAddConstraint that its being called from the specific pass of ALTER TABLE and wanted to get agreement on that. I hadn't thought about any particular implementation. So your proposal below looks absolutely fine and clean.
I'm inclined to think the cleanest solution is to add another value of enum AlterTableType, perhaps "AT_ReAddConstraint", to signal that we're executing a re-add; and then add another bool parameter to ATExecAddConstraint to tell the latter not to complain if child tables exist. This is more in line with pre-existing coding choices such as the use of AT_AddConstraintRecurse.
Please see attached patch which does what you suggested above. May be it needs a little more commentary to record why we made this specific change. Please let me know if you think so and want me to do that.