Commit 39b58ad9 authored by Michał Modzelewski's avatar Michał Modzelewski Committed by Tim Graham
Browse files

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

parent 51dc617b
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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
+7 −1
Original line number Diff line number Diff line
@@ -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(