Commit e9bbdb39 authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #13293 -- Corrected a problem with the MySQL handling of boolean return...

Fixed #13293 -- Corrected a problem with the MySQL handling of boolean return values when a query has an extra() clause. Thanks to mk for the report and draft patch.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12939 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 056c940f
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -3,13 +3,13 @@ from django.db.models.sql import compiler
class SQLCompiler(compiler.SQLCompiler):
    def resolve_columns(self, row, fields=()):
        values = []
        for value, field in map(None, row, fields):
        index_extra_select = len(self.query.extra_select.keys())
        for value, field in map(None, row[index_extra_select:], fields):
            if (field and field.get_internal_type() in ("BooleanField", "NullBooleanField") and
                value in (0, 1)):
                value = bool(value)
            values.append(value)
        return tuple(values)

        return row[:index_extra_select] + tuple(values)

class SQLInsertCompiler(compiler.SQLInsertCompiler, SQLCompiler):
    pass
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ class NullBooleanModel(models.Model):

class BooleanModel(models.Model):
    bfield = models.BooleanField()
    string = models.CharField(max_length=10, default='abc')

###############################################################################
# ImageField
+7 −0
Original line number Diff line number Diff line
@@ -191,6 +191,13 @@ class BooleanFieldTests(unittest.TestCase):
        self.assertTrue(isinstance(b4.nbfield, bool))
        self.assertEqual(b4.nbfield, False)

        # http://code.djangoproject.com/ticket/13293
        # Verify that when an extra clause exists, the boolean
        # conversions are applied with an offset
        b5 = BooleanModel.objects.all().extra(
            select={'string_length': 'LENGTH(string)'})[0]
        self.assertFalse(isinstance(b5.pk, bool))

class ChoicesTests(django.test.TestCase):
    def test_choices_and_field_display(self):
        """