From 70456610694d24d07d76c64fd3bc40f664be51ea Mon Sep 17 00:00:00 2001 From: David Wobrock Date: Fri, 22 Dec 2023 09:49:56 +0100 Subject: [PATCH] Fixed #35022 -- Fixed RenameIndex() crash on unnamed indexes if exists unique constraint on the same fields. --- django/db/migrations/operations/models.py | 5 ++++- tests/migrations/test_operations.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py index d616cafb4597..df153da7e5a2 100644 --- a/django/db/migrations/operations/models.py +++ b/django/db/migrations/operations/models.py @@ -1017,7 +1017,10 @@ def database_forwards(self, app_label, schema_editor, from_state, to_state): from_model._meta.get_field(field).column for field in self.old_fields ] matching_index_name = schema_editor._constraint_names( - from_model, column_names=columns, index=True + from_model, + column_names=columns, + index=True, + unique=False, ) if len(matching_index_name) != 1: raise ValueError( diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 7643111c348b..2d9d3a38f05c 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -3626,6 +3626,26 @@ def test_rename_index_unknown_unnamed_index(self): with self.assertRaisesMessage(ValueError, msg): operation.database_forwards(app_label, editor, project_state, new_state) + @skipUnlessDBFeature("allows_multiple_constraints_on_same_fields") + def test_rename_index_unnamed_index_with_unique_index(self): + app_label = "test_rninuniwui" + project_state = self.set_up_test_model( + app_label, + multicol_index=True, + unique_together=True, + ) + table_name = app_label + "_pony" + self.assertIndexNotExists(table_name, "new_pony_test_idx") + operation = migrations.RenameIndex( + "Pony", new_name="new_pony_test_idx", old_fields=["pink", "weight"] + ) + new_state = project_state.clone() + operation.state_forwards(app_label, new_state) + # Rename index. + with connection.schema_editor() as editor: + operation.database_forwards(app_label, editor, project_state, new_state) + self.assertIndexNameExists(table_name, "new_pony_test_idx") + def test_add_index_state_forwards(self): project_state = self.set_up_test_model("test_adinsf") index = models.Index(fields=["pink"], name="test_adinsf_pony_pink_idx")