Permalink
Browse files

[2.0.x] Fixed #27979 -- Made MySQL raise IntegrityError rather than O…

…perationalError when saving negative numbers in PositiveInteger fields.

Backport of dd82f33 from master
  • Loading branch information...
timgraham committed Sep 29, 2017
1 parent eff5f83 commit d6cec5f6ffd1b5dc906a85ecbb0ca8d11e6d494d
Showing with 14 additions and 2 deletions.
  1. +4 −1 django/db/backends/mysql/base.py
  2. +10 −1 tests/model_fields/test_integerfield.py
@@ -57,7 +57,10 @@ class CursorWrapper:
Implemented as a wrapper, rather than a subclass, so that it isn't stuck
to the particular underlying representation returned by Connection.cursor().
"""
- codes_for_integrityerror = (1048,)
+ codes_for_integrityerror = (
+ 1048, # Column cannot be null
+ 1690, # BIGINT UNSIGNED value is out of range
+ )
def __init__(self, cursor):
self.cursor = cursor
@@ -1,6 +1,8 @@
+import unittest
+
from django.core import validators
from django.core.exceptions import ValidationError
-from django.db import connection, models
+from django.db import IntegrityError, connection, models
from django.test import SimpleTestCase, TestCase
from .models import (
@@ -151,6 +153,13 @@ class PositiveIntegerFieldTests(IntegerFieldTests):
model = PositiveIntegerModel
documented_range = (0, 2147483647)
+ @unittest.skipIf(connection.vendor == 'sqlite', "SQLite doesn't have a constraint.")
+ def test_negative_values(self):
+ p = PositiveIntegerModel.objects.create(value=0)
+ p.value = models.F('value') - 1
+ with self.assertRaises(IntegrityError):
+ p.save()
+
class ValidationTests(SimpleTestCase):

0 comments on commit d6cec5f

Please sign in to comment.