Fixed #20462 -- null/non-string regex lookups are now consistent
Thanks to noirbizarre for the report and initial patch.
This commit is contained in:
parent
c6862d57c1
commit
273dc550a4
2
AUTHORS
2
AUTHORS
|
@ -152,6 +152,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Antonis Christofides <anthony@itia.ntua.gr>
|
Antonis Christofides <anthony@itia.ntua.gr>
|
||||||
Michal Chruszcz <troll@pld-linux.org>
|
Michal Chruszcz <troll@pld-linux.org>
|
||||||
Can Burak Çilingir <canburak@cs.bilgi.edu.tr>
|
Can Burak Çilingir <canburak@cs.bilgi.edu.tr>
|
||||||
|
Andrew Clark <amclark7@gmail.com>
|
||||||
Ian Clelland <clelland@gmail.com>
|
Ian Clelland <clelland@gmail.com>
|
||||||
Travis Cline <travis.cline@gmail.com>
|
Travis Cline <travis.cline@gmail.com>
|
||||||
Russell Cloran <russell@rucus.net>
|
Russell Cloran <russell@rucus.net>
|
||||||
|
@ -273,6 +274,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Brian Harring <ferringb@gmail.com>
|
Brian Harring <ferringb@gmail.com>
|
||||||
Brant Harris
|
Brant Harris
|
||||||
Ronny Haryanto <http://ronny.haryan.to/>
|
Ronny Haryanto <http://ronny.haryan.to/>
|
||||||
|
Axel Haustant <noirbizarre@gmail.com>
|
||||||
Hawkeye
|
Hawkeye
|
||||||
Kent Hauser <kent@khauser.net>
|
Kent Hauser <kent@khauser.net>
|
||||||
Joe Heck <http://www.rhonabwy.com/wp/>
|
Joe Heck <http://www.rhonabwy.com/wp/>
|
||||||
|
|
|
@ -69,7 +69,7 @@ class DatabaseOperations(BaseDatabaseOperations):
|
||||||
|
|
||||||
# Cast text lookups to text to allow things like filter(x__contains=4)
|
# Cast text lookups to text to allow things like filter(x__contains=4)
|
||||||
if lookup_type in ('iexact', 'contains', 'icontains', 'startswith',
|
if lookup_type in ('iexact', 'contains', 'icontains', 'startswith',
|
||||||
'istartswith', 'endswith', 'iendswith'):
|
'istartswith', 'endswith', 'iendswith', 'regex', 'iregex'):
|
||||||
lookup = "%s::text"
|
lookup = "%s::text"
|
||||||
|
|
||||||
# Use UPPER(x) for case-insensitive lookups; it's faster.
|
# Use UPPER(x) for case-insensitive lookups; it's faster.
|
||||||
|
|
|
@ -522,4 +522,4 @@ def _sqlite_format_dtdelta(dt, conn, days, secs, usecs):
|
||||||
return str(dt)
|
return str(dt)
|
||||||
|
|
||||||
def _sqlite_regexp(re_pattern, re_string):
|
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
|
||||||
|
|
|
@ -610,6 +610,21 @@ class LookupTests(TestCase):
|
||||||
self.assertQuerysetEqual(Article.objects.filter(headline__regex=r'b(.).*b\1'),
|
self.assertQuerysetEqual(Article.objects.filter(headline__regex=r'b(.).*b\1'),
|
||||||
['<Article: barfoobaz>', '<Article: bazbaRFOO>', '<Article: foobarbaz>'])
|
['<Article: barfoobaz>', '<Article: bazbaRFOO>', '<Article: foobarbaz>'])
|
||||||
|
|
||||||
|
def test_regex_null(self):
|
||||||
|
"""
|
||||||
|
Ensure that a regex lookup does not fail on null/None values
|
||||||
|
"""
|
||||||
|
Season.objects.create(year=2012, gt=None)
|
||||||
|
self.assertQuerysetEqual(Season.objects.filter(gt__regex=r'^$'), [])
|
||||||
|
|
||||||
|
def test_regex_non_string(self):
|
||||||
|
"""
|
||||||
|
Ensure that a regex lookup does not fail on non-string fields
|
||||||
|
"""
|
||||||
|
Season.objects.create(year=2013, gt=444)
|
||||||
|
self.assertQuerysetEqual(Season.objects.filter(gt__regex=r'^444$'),
|
||||||
|
['<Season: 2013>'])
|
||||||
|
|
||||||
def test_nonfield_lookups(self):
|
def test_nonfield_lookups(self):
|
||||||
"""
|
"""
|
||||||
Ensure that a lookup query containing non-fields raises the proper
|
Ensure that a lookup query containing non-fields raises the proper
|
||||||
|
|
Loading…
Reference in New Issue