1
0
mirror of https://github.com/django/django.git synced 2024-12-30 21:16:26 +00:00

[5.0.x] Fixed #35329 -- Fixed migrations crash when adding partial unique constraints with nulls_distinct.

Bug in 595a2abb58.

Thanks Lucas Lemke Saunitti for the report.
Backport of b98271a6e4 from main
This commit is contained in:
Mariusz Felisiak 2024-03-26 22:58:47 +01:00
parent 71368b6f00
commit 345e3cf57f
3 changed files with 37 additions and 1 deletions

View File

@ -129,7 +129,7 @@ class BaseDatabaseSchemaEditor:
) )
sql_create_unique_index = ( sql_create_unique_index = (
"CREATE UNIQUE INDEX %(name)s ON %(table)s " "CREATE UNIQUE INDEX %(name)s ON %(table)s "
"(%(columns)s)%(include)s%(condition)s%(nulls_distinct)s" "(%(columns)s)%(include)s%(nulls_distinct)s%(condition)s"
) )
sql_rename_index = "ALTER INDEX %(old_name)s RENAME TO %(new_name)s" sql_rename_index = "ALTER INDEX %(old_name)s RENAME TO %(new_name)s"
sql_delete_index = "DROP INDEX %(name)s" sql_delete_index = "DROP INDEX %(name)s"

View File

@ -17,3 +17,7 @@ Bugfixes
* Fixed a regression in Django 5.0 where the ``AdminFileWidget`` could be * Fixed a regression in Django 5.0 where the ``AdminFileWidget`` could be
rendered with two ``id`` attributes on the "Clear" checkbox rendered with two ``id`` attributes on the "Clear" checkbox
(:ticket:`35273`). (:ticket:`35273`).
* Fixed a bug in Django 5.0 that caused a migration crash on PostgreSQL 15+
when adding a partial ``UniqueConstraint`` with ``nulls_distinct``
(:ticket:`35329`).

View File

@ -3596,6 +3596,38 @@ class SchemaTests(TransactionTestCase):
constraints = self.get_constraints(Author._meta.db_table) constraints = self.get_constraints(Author._meta.db_table)
self.assertNotIn(constraint.name, constraints) self.assertNotIn(constraint.name, constraints)
@skipUnlessDBFeature(
"supports_nulls_distinct_unique_constraints",
"supports_partial_indexes",
)
def test_unique_constraint_nulls_distinct_condition(self):
with connection.schema_editor() as editor:
editor.create_model(Author)
constraint = UniqueConstraint(
fields=["height", "weight"],
name="un_height_weight_start_A",
condition=Q(name__startswith="A"),
nulls_distinct=False,
)
with connection.schema_editor() as editor:
editor.add_constraint(Author, constraint)
Author.objects.create(name="Adam", height=None, weight=None)
Author.objects.create(name="Avocado", height=1, weight=None)
Author.objects.create(name="Adrian", height=None, weight=1)
with self.assertRaises(IntegrityError):
Author.objects.create(name="Alex", height=None, weight=None)
Author.objects.create(name="Bob", height=None, weight=None)
with self.assertRaises(IntegrityError):
Author.objects.create(name="Alex", height=1, weight=None)
Author.objects.create(name="Bill", height=None, weight=None)
with self.assertRaises(IntegrityError):
Author.objects.create(name="Alex", height=None, weight=1)
Author.objects.create(name="Celine", height=None, weight=1)
with connection.schema_editor() as editor:
editor.remove_constraint(Author, constraint)
constraints = self.get_constraints(Author._meta.db_table)
self.assertNotIn(constraint.name, constraints)
@skipIfDBFeature("supports_nulls_distinct_unique_constraints") @skipIfDBFeature("supports_nulls_distinct_unique_constraints")
def test_unique_constraint_nulls_distinct_unsupported(self): def test_unique_constraint_nulls_distinct_unsupported(self):
# UniqueConstraint is ignored on databases that don't support # UniqueConstraint is ignored on databases that don't support