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 in595a2abb58
. Thanks Lucas Lemke Saunitti for the report. Backport ofb98271a6e4
from main
This commit is contained in:
parent
71368b6f00
commit
345e3cf57f
@ -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"
|
||||||
|
@ -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`).
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user