From 9d0bacebd2d0fc2b3581dac9acdc631338387921 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Sun, 16 Nov 2008 08:48:24 +0000 Subject: [PATCH] Fixed #3501 -- Fixed date filtering in querysets for nullable date fields. Only affects SQLite. git-svn-id: http://code.djangoproject.com/svn/django/trunk@9466 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/backends/sqlite3/base.py | 6 ++++-- tests/regressiontests/model_regress/models.py | 12 +++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index f175bc4cb7..745f9982a0 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -101,7 +101,7 @@ class DatabaseOperations(BaseDatabaseOperations): return [first % value, second % value] class DatabaseWrapper(BaseDatabaseWrapper): - + # SQLite requires LIKE statements to include an ESCAPE clause if the value # being escaped has a percent or underscore in it. # See http://www.sqlite.org/lang_expr.html for an explanation. @@ -124,7 +124,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): def __init__(self, *args, **kwargs): super(DatabaseWrapper, self).__init__(*args, **kwargs) - + self.features = DatabaseFeatures() self.ops = DatabaseOperations() self.client = DatabaseClient() @@ -179,6 +179,8 @@ class SQLiteCursorWrapper(Database.Cursor): return query % tuple("?" * num_params) def _sqlite_extract(lookup_type, dt): + if dt is None: + return None try: dt = util.typecast_timestamp(dt) except (ValueError, TypeError): diff --git a/tests/regressiontests/model_regress/models.py b/tests/regressiontests/model_regress/models.py index 2f2c2facd5..19d38b216c 100644 --- a/tests/regressiontests/model_regress/models.py +++ b/tests/regressiontests/model_regress/models.py @@ -27,7 +27,7 @@ class Movie(models.Model): name = models.CharField(max_length=60) class Party(models.Model): - when = models.DateField() + when = models.DateField(null=True) class Event(models.Model): when = models.DateTimeField() @@ -93,6 +93,16 @@ u'' >>> [p.when for p in Party.objects.filter(when__year='1998')] [datetime.date(1998, 12, 31)] +# Date filtering was failing with NULL date values in SQLite (regression test +# for #3501, amongst other things). +>>> _ = Party.objects.create() +>>> p = Party.objects.filter(when__month=1)[0] +>>> p.when +datetime.date(1999, 1, 1) +>>> l = Party.objects.filter(pk=p.pk).dates("when", "month") +>>> l[0].month == 1 +True + # Check that get_next_by_FIELD and get_previous_by_FIELD don't crash when we # have usecs values stored on the database #