summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Thomassen <peter@desec.io>2023-12-01 14:12:06 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-12-03 14:12:39 +0100
commitcb013fc7d9be5faf59f79b6e59ab04e751d05a16 (patch)
tree67278b9ed4ad3b655e6407ba10f042e93637f859
parent6c502734a0395c3c937a827716e3c02697f53f9b (diff)
[5.0.x] Fixed #35002 -- Made UniqueConstraints with fields respect nulls_distinct.
Regression in 595a2abb58e04caa4d55fb2589bb80fb2a8fdfa1. Backport of 54cb1a7e160089cea438f50fdb70aaaf6823786e from main
-rw-r--r--django/db/backends/base/schema.py2
-rw-r--r--tests/schema/tests.py25
2 files changed, 25 insertions, 2 deletions
diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py
index a311dc432e..1062e9feca 100644
--- a/django/db/backends/base/schema.py
+++ b/django/db/backends/base/schema.py
@@ -111,7 +111,7 @@ class BaseDatabaseSchemaEditor:
sql_create_unique = (
"ALTER TABLE %(table)s ADD CONSTRAINT %(name)s "
- "UNIQUE (%(columns)s)%(deferrable)s"
+ "UNIQUE%(nulls_distinct)s (%(columns)s)%(deferrable)s"
)
sql_delete_unique = sql_delete_constraint
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index a37b49b31d..046097366c 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -3474,7 +3474,7 @@ class SchemaTests(TransactionTestCase):
editor.add_constraint(Author, constraint)
@skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")
- def test_unique_constraint_nulls_distinct(self):
+ def test_unique_constraint_index_nulls_distinct(self):
with connection.schema_editor() as editor:
editor.create_model(Author)
nulls_distinct = UniqueConstraint(
@@ -3497,6 +3497,29 @@ class SchemaTests(TransactionTestCase):
self.assertNotIn(nulls_distinct.name, constraints)
self.assertNotIn(nulls_not_distinct.name, constraints)
+ @skipUnlessDBFeature("supports_nulls_distinct_unique_constraints")
+ def test_unique_constraint_nulls_distinct(self):
+ with connection.schema_editor() as editor:
+ editor.create_model(Author)
+ constraint = UniqueConstraint(
+ fields=["height", "weight"], name="constraint", nulls_distinct=False
+ )
+ with connection.schema_editor() as editor:
+ editor.add_constraint(Author, constraint)
+ Author.objects.create(name="", height=None, weight=None)
+ Author.objects.create(name="", height=1, weight=None)
+ Author.objects.create(name="", height=None, weight=1)
+ with self.assertRaises(IntegrityError):
+ Author.objects.create(name="", height=None, weight=None)
+ with self.assertRaises(IntegrityError):
+ Author.objects.create(name="", height=1, weight=None)
+ with self.assertRaises(IntegrityError):
+ Author.objects.create(name="", 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")
def test_unique_constraint_nulls_distinct_unsupported(self):
# UniqueConstraint is ignored on databases that don't support