From 64041f0e6e7a773574d7cde978d16305200004ea Mon Sep 17 00:00:00 2001 From: Axel Haustant Date: Sun, 5 May 2013 16:44:19 +0200 Subject: [PATCH] Fixed #20462 - Fixed sqlite regex lookups for null values and non-string fields. --- AUTHORS | 1 + django/db/backends/sqlite3/base.py | 2 +- tests/lookup/models.py | 9 +++++++++ tests/lookup/tests.py | 17 ++++++++++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index cedff32fe09..2355eeb655f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -270,6 +270,7 @@ answer newbie questions, and generally made Django that much better: Brian Harring Brant Harris Ronny Haryanto + Axel Haustant Hawkeye Kent Hauser Joe Heck diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index a2d925ac3f8..3808170f9e8 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 f388ddf403d..af236cf56f4 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 de7105f92d7..5affac6b000 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'), ['', '', '']) + 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$'), + ['']) + def test_nonfield_lookups(self): """ Ensure that a lookup query containing non-fields raises the proper