diff --git a/django/contrib/postgres/operations.py b/django/contrib/postgres/operations.py index 1ee5fbc2e2..84360febf9 100644 --- a/django/contrib/postgres/operations.py +++ b/django/contrib/postgres/operations.py @@ -237,6 +237,11 @@ class CreateCollation(CollationOperation): def migration_name_fragment(self): return "create_collation_%s" % self.name.lower() + def reduce(self, operation, app_label): + if isinstance(operation, RemoveCollation) and self.name == operation.name: + return [] + return super().reduce(operation, app_label) + class RemoveCollation(CollationOperation): """Remove a collation.""" diff --git a/tests/postgres_tests/test_operations.py b/tests/postgres_tests/test_operations.py index f344d4ae74..322f38148b 100644 --- a/tests/postgres_tests/test_operations.py +++ b/tests/postgres_tests/test_operations.py @@ -318,7 +318,7 @@ class CreateExtensionTests(PostgreSQLTestCase): @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific tests.") -class CreateCollationTests(PostgreSQLTestCase): +class CreateCollationTests(OptimizerTestBase, PostgreSQLTestCase): app_label = "test_allow_create_collation" @override_settings(DATABASE_ROUTERS=[NoMigrationRouter()]) @@ -459,6 +459,24 @@ class CreateCollationTests(PostgreSQLTestCase): "),", ) + def test_reduce_create_remove(self): + self.assertOptimizesTo( + [ + CreateCollation( + "sample_collation", + "und-u-ks-level2", + provider="icu", + deterministic=False, + ), + RemoveCollation( + "sample_collation", + # Different locale + "de-u-ks-level1", + ), + ], + [], + ) + @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific tests.") class RemoveCollationTests(PostgreSQLTestCase):