Fix reverting the addition of invalid foreign keys and check constraints #45896
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Adding foreign keys and check constraints to an existing (large) table is dangerous in PostgreSQL, because they need to be checked (validated) and while they are validated, the table stays exclusively locked. So, usually, they are added as invalid and then validated in a separate transaction.
Something like:
This migration is reversible, because of the bug in
rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
Line 143 in a2fc96a
Note the missing
self
inoptions.fetch...
.Similar migration was also always reversible before #45808 (because before that PR, only name was checked for check constraints to match the searched one).
So, this PR fixes
defined_for?
for both foreign keys and check constraints to work correctly with validity and makes adding them them as invalid a reversible operation.