Fixed #24148 -- Documented a bug with case expressions in SQLite < 3.7.0
This commit is contained in:
parent
51dc617b21
commit
39b58ad95a
|
@ -603,6 +603,23 @@ substring filtering.
|
||||||
|
|
||||||
.. _documented at sqlite.org: http://www.sqlite.org/faq.html#q18
|
.. _documented at sqlite.org: http://www.sqlite.org/faq.html#q18
|
||||||
|
|
||||||
|
Old SQLite and ``CASE`` expressions
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
SQLite 3.6.23.1 and older contains a bug when `handling query parameters`_ in
|
||||||
|
a ``CASE`` expression that contains an ``ELSE`` and arithmetic.
|
||||||
|
|
||||||
|
SQLite 3.6.23.1 was released in March 2010, and most current binary
|
||||||
|
distributions for different platforms include a newer version of SQLite, with
|
||||||
|
the notable exception of the Python 2.7 installers for Windows.
|
||||||
|
|
||||||
|
As of this writing, the latest release for Windows - Python 2.7.9 - includes
|
||||||
|
SQLite 3.6.21. You can install ``pysqlite2`` or replace ``sqlite3.dll`` (by
|
||||||
|
default installed in ``C:\Python27\DLLs``) with a newer version from
|
||||||
|
http://www.sqlite.org/ to remedy this issue.
|
||||||
|
|
||||||
|
.. _handling query parameters: https://code.djangoproject.com/ticket/24148
|
||||||
|
|
||||||
.. _using-newer-versions-of-pysqlite:
|
.. _using-newer-versions-of-pysqlite:
|
||||||
|
|
||||||
Using newer versions of the SQLite DB-API 2.0 driver
|
Using newer versions of the SQLite DB-API 2.0 driver
|
||||||
|
|
|
@ -7,7 +7,7 @@ import unittest
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from django.core.exceptions import FieldError
|
from django.core.exceptions import FieldError
|
||||||
from django.db import models
|
from django.db import connection, models
|
||||||
from django.db.models import F, Q, Value, Min, Max
|
from django.db.models import F, Q, Value, Min, Max
|
||||||
from django.db.models.expressions import Case, When
|
from django.db.models.expressions import Case, When
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
@ -254,6 +254,12 @@ class CaseExpressionTests(TestCase):
|
||||||
transform=attrgetter('integer', 'test')
|
transform=attrgetter('integer', 'test')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if connection.vendor == 'sqlite' and connection.Database.sqlite_version_info < (3, 7, 0):
|
||||||
|
# There is a bug in sqlite < 3.7.0, where placeholder order is lost.
|
||||||
|
# Thus, the above query returns <condition_value> + <result_value>
|
||||||
|
# for each matching case instead of <result_value> + 1 (#24148).
|
||||||
|
test_combined_expression = unittest.expectedFailure(test_combined_expression)
|
||||||
|
|
||||||
def test_in_subquery(self):
|
def test_in_subquery(self):
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
CaseTestModel.objects.filter(
|
CaseTestModel.objects.filter(
|
||||||
|
|
Loading…
Reference in New Issue