Skip to content

Commit ef9ebdf

Browse files
committed
Fix unique constraints for values > 32 bits on various IntegerFields
1 parent 4733ea6 commit ef9ebdf

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

django_mongodb_backend/base.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,16 @@ class DatabaseWrapper(BaseDatabaseWrapper):
4646
"FileField": "string",
4747
"FilePathField": "string",
4848
"FloatField": "double",
49-
"IntegerField": "int",
49+
"IntegerField": "long",
5050
"BigIntegerField": "long",
5151
"GenericIPAddressField": "string",
5252
"JSONField": "object",
53-
"PositiveBigIntegerField": "int",
53+
"PositiveBigIntegerField": "long",
5454
"PositiveIntegerField": "long",
55-
"PositiveSmallIntegerField": "int",
55+
"PositiveSmallIntegerField": "long",
5656
"SlugField": "string",
5757
"SmallAutoField": "", # Not supported
58-
"SmallIntegerField": "int",
58+
"SmallIntegerField": "long",
5959
"TextField": "string",
6060
"TimeField": "date",
6161
"UUIDField": "string",

docs/source/releases/5.2.x.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ Bug fixes
3333
- :meth:`QuerySet.explain() <django.db.models.query.QuerySet.explain>` now
3434
:ref:`returns a string that can be parsed as JSON <queryset-explain>`.
3535
- Improved ``QuerySet`` performance by removing low limit on server-side chunking.
36+
- Fixed unique constraint generation for ``SmallIntegerField``, ``IntegerField``,
37+
``PositiveSmallIntegerField``, and ``PositiveBigIntegerField``, which incorrectly
38+
allowed duplicate values larger than 32 bits.
3639

3740
5.2.0 beta 1
3841
============

tests/model_fields_/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313
from django_mongodb_backend.models import EmbeddedModel
1414

1515

16+
class Integers(models.Model):
17+
small = models.SmallIntegerField(unique=True, null=True)
18+
normal = models.IntegerField(unique=True, null=True)
19+
big = models.BigIntegerField(unique=True, null=True)
20+
positive_small = models.PositiveSmallIntegerField(unique=True, null=True)
21+
positive = models.PositiveIntegerField(unique=True, null=True)
22+
positive_big = models.PositiveBigIntegerField(unique=True, null=True)
23+
24+
1625
# ObjectIdField
1726
class ObjectIdModel(models.Model):
1827
field = ObjectIdField()
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from django.db import IntegrityError
2+
from django.test import TestCase
3+
4+
from .models import Integers
5+
6+
7+
class LargeUniqueTests(TestCase):
8+
"""
9+
Duplicate values > 32 bits are prohibited. It confirms each field uses the correct
10+
db_type().
11+
"""
12+
13+
def test_smallintegerfield(self):
14+
Integers.objects.create(small=2**31)
15+
with self.assertRaises(IntegrityError):
16+
Integers.objects.create(small=2**31)
17+
18+
def test_integerfield(self):
19+
Integers.objects.create(normal=2**31)
20+
with self.assertRaises(IntegrityError):
21+
Integers.objects.create(normal=2**31)
22+
23+
def test_bigintegerfield(self):
24+
Integers.objects.create(big=2**31)
25+
with self.assertRaises(IntegrityError):
26+
Integers.objects.create(big=2**31)
27+
28+
def test_positivesmallintegerfield(self):
29+
Integers.objects.create(positive_small=2**31)
30+
with self.assertRaises(IntegrityError):
31+
Integers.objects.create(positive_small=2**31)
32+
33+
def test_positiveintegerfield(self):
34+
Integers.objects.create(positive=2**31)
35+
with self.assertRaises(IntegrityError):
36+
Integers.objects.create(positive=2**31)
37+
38+
def test_positivebigintegerfield(self):
39+
Integers.objects.create(positive_big=2**31)
40+
with self.assertRaises(IntegrityError):
41+
Integers.objects.create(positive_big=2**31)

0 commit comments

Comments
 (0)