Do not return invalid indexes in PostgreSQL #45151
Merged
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.
When creating indexes with
CONCURRENTLY
, it is possible to end up with an invalid index if PostgreSQL was unable to do so. Fo example, if we have duplicate records and try to create a unique index, the error will be raised, but also an invalid index in the db will be left.This can be a problem. For example, someone may try to create a migration like this:
And to make it bulletproof, add a guard:
But if that migration failed and needs to be rerun,
index_exists?
will silently succeed and an invalid index will be left in the db. With this PR, this check will return false and when adding an index - an expected error will be raised.Another example: a gem
active_record_doctor
can make incorrect assumptions about healthiness of the db and models based on invalid indexes: