summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichaƂ Modzelewski <michal.modzelewski@gmail.com>2015-01-15 22:16:25 +0100
committerTim Graham <timograham@gmail.com>2015-01-15 19:42:05 -0500
commit39b58ad95ade8109de0f0ae3930e333b7f689c0f (patch)
treebf5f765b64e5a0e7dd6a4f9db3d99c2fb4d4e550
parent51dc617b21e67636d96cf645905797a4d6ff4bf0 (diff)
Fixed #24148 -- Documented a bug with case expressions in SQLite < 3.7.0
-rw-r--r--docs/ref/databases.txt17
-rw-r--r--tests/expressions_case/tests.py8
2 files changed, 24 insertions, 1 deletions
diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt
index c764095d9b..a3ad36f291 100644
--- a/docs/ref/databases.txt
+++ b/docs/ref/databases.txt
@@ -603,6 +603,23 @@ substring filtering.
.. _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 the SQLite DB-API 2.0 driver
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py
index a344e79923..9636930e05 100644
--- a/tests/expressions_case/tests.py
+++ b/tests/expressions_case/tests.py
@@ -7,7 +7,7 @@ import unittest
from uuid import UUID
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.expressions import Case, When
from django.test import TestCase
@@ -254,6 +254,12 @@ class CaseExpressionTests(TestCase):
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):
self.assertQuerysetEqual(
CaseTestModel.objects.filter(