#34590: Regression in 4.2 when querying db for too large decimals
-------------------------------------+-------------------------------------
               Reporter:  Marc       |          Owner:  nobody
  Odermatt                           |
                   Type:  Bug        |         Status:  new
              Component:  Database   |        Version:  4.2
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Introduced in: Refs #33308 -- Improved adapting DecimalField values to
 decimal.

 Description: I have DecimalField with `max_digits=4`. Previously, querying
 for something larger (e.g. 12345) would execute the sql and return
 ObjectNotFound. Now, in 4.2, it throws a decimal.InvalidOperation error,
 as it tries to quantize the value to have 4 digits.

 I understand that it doesn't make sense to query for a larger number, but
 the error that occurs was pretty confusing to me. Also, it is not as easy
 to check in my application, because I don't have easy access to the
 `max_digits` parameter of the field.

 In my opinion, the backend should either accept larger values and always
 return "not found", or the error should be more descriptive, so that it
 can be caught specifically.

 Testcase: placed in `tests/backends` folder and used for git bisect
 {{{
 import decimal

 from django.db import models
 from django.test import TestCase


 class DecimalModel(models.Model):
     dec_field = models.DecimalField(decimal_places=0, max_digits=4)

 class InvalidDecimalQuery(TestCase):
     def test_invalid_decimal_query(self):
         try:
             DecimalModel.objects.get(dec_field='12345')
         except decimal.InvalidOperation:
             self.fail("Too large decimal query caused exception.")
         except DecimalModel.DoesNotExist:
             pass

 }}}

 Stacktrace:
 {{{
 Traceback (most recent call last):
   File "lib/python3.10/site-packages/django/db/models/manager.py", line
 87, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "lib/python3.10/site-packages/django/db/models/query.py", line 633,
 in get
     num = len(clone)
   File "lib/python3.10/site-packages/django/db/models/query.py", line 380,
 in __len__
     self._fetch_all()
   File "lib/python3.10/site-packages/django/db/models/query.py", line
 1881, in _fetch_all
     self._result_cache = list(self._iterable_class(self))
   File "lib/python3.10/site-packages/django/db/models/query.py", line 91,
 in __iter__
     results = compiler.execute_sql(
   File "lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 line 1547, in execute_sql
     sql, params = self.as_sql()
   File "lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 line 762, in as_sql
     self.compile(self.where) if self.where is not None else ("", [])
   File "lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 line 544, in compile
     sql, params = node.as_sql(self, self.connection)
   File "lib/python3.10/site-packages/django/db/models/sql/where.py", line
 145, in as_sql
     sql, params = compiler.compile(child)
   File "lib/python3.10/site-packages/django/db/models/sql/compiler.py",
 line 544, in compile
     sql, params = node.as_sql(self, self.connection)
   File "lib/python3.10/site-packages/django/db/models/lookups.py", line
 357, in as_sql
     return super().as_sql(compiler, connection)
   File "lib/python3.10/site-packages/django/db/models/lookups.py", line
 225, in as_sql
     rhs_sql, rhs_params = self.process_rhs(compiler, connection)
   File "lib/python3.10/site-packages/django/db/models/lookups.py", line
 126, in process_rhs
     return self.get_db_prep_lookup(value, connection)
   File "lib/python3.10/site-packages/django/db/models/lookups.py", line
 254, in get_db_prep_lookup
     else [get_db_prep_value(value, connection, prepared=True)],
   File "lib/python3.10/site-packages/django/db/models/fields/__init__.py",
 line 1761, in get_db_prep_value
     return connection.ops.adapt_decimalfield_value(
   File "lib/python3.10/site-
 packages/django/db/backends/base/operations.py", line 574, in
 adapt_decimalfield_value
     return utils.format_number(value, max_digits, decimal_places)
   File "lib/python3.10/site-packages/django/db/backends/utils.py", line
 304, in format_number
     value = value.quantize(
 decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34590>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070188439a218b-df67d4d8-2850-4453-8678-4b070b40c0ef-000000%40eu-central-1.amazonses.com.

Reply via email to