Opened 5 years ago
Closed 5 years ago
#32300 closed Bug (wontfix)
"BIGINT UNSIGNED value is out of range" occurs when substraction operation between PositiveBigIntegerField and BigIntegerField using F()
| Reported by: | jun | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 3.1 |
| Severity: | Normal | Keywords: | mysql unsigned |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
- Environment
MacOS 10.15.3 Django 3.1 MySQL 5.7.32 mysqlclient==2.0.1
- Model
class SomeModel(models.Model): positive_big_int_column = models.PositiveBigIntegerField(default=0) big_int_column = models.BigIntegerField(default=0)
- Test
SomeModel.objects.create(positive_big_int_column=100, big_int_column=300) qs = SomeModel.objects.filter(positive_big_int_column=100) qs.update(big_int_column=F('positive_big_int_column') - F('big_int_column'))
- Expected query
UPDATE SomeModel SET big_int_column=(100-300)
- Error
IntegrityError: (1690, "BIGINT UNSIGNED value is out of range in blabla")
Change History (2)
comment:1 by , 5 years ago
| Description: | modified (diff) |
|---|
comment:2 by , 5 years ago
| Keywords: | mysql unsigned added; F expression removed |
|---|---|
| Resolution: | → wontfix |
| Status: | new → closed |
Note:
See TracTickets
for help on using tickets.
It can be worked around by using an explicit
CastexpressionBut you risk data corruption if
positive_big_int_columnis larger than what MySQL allows storing an a signedbigint. PostgreSQL and Oracle backends don't suffer from that as they implementPositiveBigIntegerFieldusing a check constraint. SQLite simply have an integer type without constraints at all so it's also not affected.I'll close as wontfix as it's really just a MySQL quirk due to the usage of
UNSIGNEDdata types to implementPositiveIntegerFieldvariants. I guess there isn't much that can be done until we drop support for MySQL < 8 since the latter introducesCHECKconstraints support.