1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

Fixed #34701 -- Added support for NULLS [NOT] DISTINCT on PostgreSQL 15+.

This commit is contained in:
Simon Charette
2023-07-07 19:43:51 -04:00
committed by Mariusz Felisiak
parent 98cfb90182
commit 595a2abb58
13 changed files with 295 additions and 9 deletions

View File

@@ -3318,6 +3318,43 @@ class SchemaTests(TransactionTestCase):
with self.assertRaises(DatabaseError):
editor.add_constraint(Author, constraint)
@skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")
def test_unique_constraint_nulls_distinct(self):
with connection.schema_editor() as editor:
editor.create_model(Author)
nulls_distinct = UniqueConstraint(
F("height"), name="distinct_height", nulls_distinct=True
)
nulls_not_distinct = UniqueConstraint(
F("weight"), name="not_distinct_weight", nulls_distinct=False
)
with connection.schema_editor() as editor:
editor.add_constraint(Author, nulls_distinct)
editor.add_constraint(Author, nulls_not_distinct)
Author.objects.create(name="", height=None, weight=None)
Author.objects.create(name="", height=None, weight=1)
with self.assertRaises(IntegrityError):
Author.objects.create(name="", height=1, weight=None)
with connection.schema_editor() as editor:
editor.remove_constraint(Author, nulls_distinct)
editor.remove_constraint(Author, nulls_not_distinct)
constraints = self.get_constraints(Author._meta.db_table)
self.assertNotIn(nulls_distinct.name, constraints)
self.assertNotIn(nulls_not_distinct.name, constraints)
@skipIfDBFeature("supports_nulls_distinct_unique_constraints")
def test_unique_constraint_nulls_distinct_unsupported(self):
# UniqueConstraint is ignored on databases that don't support
# NULLS [NOT] DISTINCT.
with connection.schema_editor() as editor:
editor.create_model(Author)
constraint = UniqueConstraint(
F("name"), name="func_name_uq", nulls_distinct=True
)
with connection.schema_editor() as editor, self.assertNumQueries(0):
self.assertIsNone(editor.add_constraint(Author, constraint))
self.assertIsNone(editor.remove_constraint(Author, constraint))
@ignore_warnings(category=RemovedInDjango51Warning)
def test_index_together(self):
"""