summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAxel Haustant <noirbizarre@gmail.com>2013-05-05 16:44:19 +0200
committerTim Graham <timograham@gmail.com>2013-06-11 14:13:40 -0400
commit64041f0e6e7a773574d7cde978d16305200004ea (patch)
treed33478aca7876acc62b6df0995b3115f7f5b6797
parent536703abf029ac1b9c2ebcf6f82fb16da524bebe (diff)
Fixed #20462 - Fixed sqlite regex lookups for null values and non-string fields.
-rw-r--r--AUTHORS1
-rw-r--r--django/db/backends/sqlite3/base.py2
-rw-r--r--tests/lookup/models.py9
-rw-r--r--tests/lookup/tests.py17
4 files changed, 27 insertions, 2 deletions
diff --git a/AUTHORS b/AUTHORS
index cedff32fe0..2355eeb655 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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/>
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py
index a2d925ac3f..3808170f9e 100644
--- a/django/db/backends/sqlite3/base.py
+++ b/django/db/backends/sqlite3/base.py
@@ -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
diff --git a/tests/lookup/models.py b/tests/lookup/models.py
index f388ddf403..af236cf56f 100644
--- a/tests/lookup/models.py
+++ b/tests/lookup/models.py
@@ -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
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py
index de7105f92d..5affac6b00 100644
--- a/tests/lookup/tests.py
+++ b/tests/lookup/tests.py
@@ -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