Fixed #24148 -- Documented a bug with case expressions in SQLite < 3.7.0

This commit is contained in:
Michał Modzelewski 2015-01-15 22:16:25 +01:00 committed by Tim Graham
parent 51dc617b21
commit 39b58ad95a
2 changed files with 24 additions and 1 deletions

View File

@ -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

View File

@ -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(