[Django] #19625: mysql 5.1 large decimalfield lookups return too few results

5 views
Skip to first unread message

Django

unread,
Jan 17, 2013, 6:08:03 AM1/17/13
to django-...@googlegroups.com
#19625: mysql 5.1 large decimalfield lookups return too few results
----------------------------------------------+--------------------
Reporter: wdoekes | Owner: nobody
Type: Uncategorized | Status: new
Component: Database layer (models, ORM) | Version: master
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------------------------+--------------------
It seems that there is a bug in the mysql 5.1 (and probably lower)
conversion of strings to decimals. Since Decimal value lookups are always
passed to the mysql backend as strings, Django is affected.

See this example:
{{{
mysql> select version() as server_version\G
*************************** 1. row ***************************
server_version: 5.1.66-0+squeeze1-log
...
mysql> create table abc (value decimal(31,0));
...
mysql> insert into abc values (1234567890123456789012345678901);
Query OK, 1 row affected (0.00 sec)

mysql> select value from abc where value =
1234567890123456789012345678901\G
*************************** 1. row ***************************
value: 1234567890123456789012345678901
...

mysql> select value from abc where value =
'1234567890123456789012345678901'\G
Empty set (0.01 sec)
}}}

Obviously, a fix could be to upgrade to a newer MySQL server version --
the MySQL 5.5.28 I tested didn't have this issue -- but that isn't always
possible.

I suppose a workaround/fix might not be included in Django because the bug
lies in MySQL, but I'll file it here for the record.

Test cases are included:
{{{
FAIL: test_decimal_field_broken1 (test_long_decimal.tests.DecimalTests)
...
AssertionError: book with isbn 1234567890123456789012345678901 was not
found
}}}

I tried to work around the bug by surrounding a decimal value in lookup
with CAST(..), but that (sometimes!) triggers an SQL Warning (in other
tests!) instead:
{{{
ERROR: test_decimal_field_works1 (test_long_decimal.tests.DecimalTests)
...
Warning: Truncated incorrect DECIMAL value: ''
}}}

So, my easy fix did not work out as expected.

The proper fix, if any, would probably to force the backend to take the
decimal as an *unquoted* value. But I didn't find an easy path to achieve
that.

Regards,
Walter Doekes
OSSO B.V.

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

Django

unread,
Jan 23, 2013, 2:22:21 AM1/23/13
to django-...@googlegroups.com
#19625: mysql 5.1 large decimalfield lookups return too few results
-------------------------------------+-------------------------------------

Reporter: wdoekes | Owner: nobody
Type: Uncategorized | Status: new
Component: Database layer | Version: master
(models, ORM) | Resolution:
Severity: Normal | Triage Stage: Accepted
Keywords: | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by akaariai):

* needs_better_patch: => 0
* needs_docs: => 0
* needs_tests: => 0
* stage: Unreviewed => Accepted


--
Ticket URL: <https://code.djangoproject.com/ticket/19625#comment:1>

Django

unread,
Feb 13, 2013, 6:31:29 AM2/13/13
to django-...@googlegroups.com
#19625: mysql 5.1 large decimalfield lookups return too few results
-------------------------------------+-------------------------------------

Reporter: wdoekes | Owner: nobody
Type: Uncategorized | Status: new
Component: Database layer | Version: master
(models, ORM) | Resolution:
Severity: Normal | Triage Stage: Accepted
Keywords: | Needs documentation: 0
Has patch: 0 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------

Comment (by wdoekes):

I added `django19625-master.fix_using_django_conversions.patch​` which
seems to do the trick.

It was written by my colleague Harm Geerts (hgeerts).

--
Ticket URL: <https://code.djangoproject.com/ticket/19625#comment:2>

Django

unread,
Feb 13, 2013, 6:32:14 AM2/13/13
to django-...@googlegroups.com
#19625: mysql 5.1 large decimalfield lookups return too few results
-------------------------------------+-------------------------------------
Reporter: wdoekes | Owner: nobody
Type: Bug | Status: new

Component: Database layer | Version: master
(models, ORM) | Resolution:
Severity: Normal | Triage Stage: Accepted
Keywords: | Needs documentation: 0
Has patch: 1 | Patch needs improvement: 0

Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by wdoekes):

* has_patch: 0 => 1
* type: Uncategorized => Bug


--
Ticket URL: <https://code.djangoproject.com/ticket/19625#comment:3>

Django

unread,
Jun 13, 2014, 8:18:54 PM6/13/14
to django-...@googlegroups.com
#19625: mysql 5.1 large decimalfield lookups return too few results
-------------------------------------+-------------------------------------
Reporter: wdoekes | Owner: nobody
Type: Bug | Status: closed

Component: Database layer | Version: master
(models, ORM) | Resolution: wontfix

Severity: Normal | Triage Stage: Accepted
Keywords: | Needs documentation: 0
Has patch: 1 | Patch needs improvement: 0
Needs tests: 0 | UI/UX: 0
Easy pickings: 0 |
-------------------------------------+-------------------------------------
Changes (by timo):

* status: new => closed
* resolution: => wontfix


Comment:

As MySQL 5.1 is End of life as of December 31, 2013, I think we should
close this.

--
Ticket URL: <https://code.djangoproject.com/ticket/19625#comment:4>

Reply all
Reply to author
Forward
0 new messages