Commit 64041f0e authored by Axel Haustant's avatar Axel Haustant Committed by Tim Graham
Browse files

Fixed #20462 - Fixed sqlite regex lookups for null values and non-string fields.

parent 536703ab
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -270,6 +270,7 @@ answer newbie questions, and generally made Django that much better:
    Brian Harring <ferringb@gmail.com>
    Brant Harris
    Ronny Haryanto <http://ronny.haryan.to/>
    Axel Haustant <noirbizarre@gmail.com>
    Hawkeye
    Kent Hauser <kent@khauser.net>
    Joe Heck <http://www.rhonabwy.com/wp/>
+1 −1
Original line number Diff line number Diff line
@@ -519,4 +519,4 @@ def _sqlite_format_dtdelta(dt, conn, days, secs, usecs):
    return str(dt)

def _sqlite_regexp(re_pattern, re_string):
    return bool(re.search(re_pattern, re_string))
    return bool(re.search(re_pattern, str(re_string))) if re_string is not None else False
+9 −0
Original line number Diff line number Diff line
@@ -57,3 +57,12 @@ class Player(models.Model):

    def __str__(self):
        return self.name


@python_2_unicode_compatible
class RegexTestModel(models.Model):
    name = models.CharField(max_length=100, null=True)
    integer = models.IntegerField(null=True)

    def __str__(self):
        return self.name
+16 −1
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@ from operator import attrgetter
from django.core.exceptions import FieldError
from django.test import TestCase, skipUnlessDBFeature

from .models import Author, Article, Tag, Game, Season, Player
from .models import Author, Article, Tag, Game, Season, Player, RegexTestModel


class LookupTests(TestCase):
@@ -610,6 +610,21 @@ class LookupTests(TestCase):
        self.assertQuerysetEqual(Article.objects.filter(headline__regex=r'b(.).*b\1'),
            ['<Article: barfoobaz>', '<Article: bazbaRFOO>', '<Article: foobarbaz>'])

    def test_regex_null(self):
        """
        Ensure that a regex lookup does not fail on null/None values
        """
        RegexTestModel.objects.create(name=None)
        self.assertQuerysetEqual(RegexTestModel.objects.filter(name__regex=r'^$'), [])

    def test_regex_non_string(self):
        """
        Ensure that a regex lookup does not fail on non-string fields
        """
        RegexTestModel.objects.create(name='test', integer=5)
        self.assertQuerysetEqual(RegexTestModel.objects.filter(integer__regex=r'^5$'),
            ['<RegexTestModel: test>'])

    def test_nonfield_lookups(self):
        """
        Ensure that a lookup query containing non-fields raises the proper