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

This commit is contained in:
Axel Haustant 2013-05-05 16:44:19 +02:00 committed by Tim Graham
parent 536703abf0
commit 64041f0e6e
4 changed files with 27 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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