From 7f2485b4d180956aa556a88ed1d9754eeeeea054 Mon Sep 17 00:00:00 2001 From: Alexey Voronov Date: Sun, 22 Dec 2013 00:03:17 +0200 Subject: [PATCH] Fixed #21643 -- repeated execution of qs with F() + timedelta Thanks Tim Graham for review. --- django/db/models/sql/expressions.py | 1 + tests/expressions_regress/tests.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/django/db/models/sql/expressions.py b/django/db/models/sql/expressions.py index bd661b5adf..9f29e2ace5 100644 --- a/django/db/models/sql/expressions.py +++ b/django/db/models/sql/expressions.py @@ -111,6 +111,7 @@ class SQLEvaluator(object): def evaluate_date_modifier_node(self, node, qn, connection): timedelta = node.children.pop() sql, params = self.evaluate_node(node, qn, connection) + node.children.append(timedelta) if (timedelta.days == timedelta.seconds == timedelta.microseconds == 0): return sql, params diff --git a/tests/expressions_regress/tests.py b/tests/expressions_regress/tests.py index e603c410ac..7533e4ee39 100644 --- a/tests/expressions_regress/tests.py +++ b/tests/expressions_regress/tests.py @@ -274,6 +274,13 @@ class FTimeDeltaTests(TestCase): self.days_long.append(e4.completed - e4.assigned) self.expnames = [e.name for e in Experiment.objects.all()] + def test_multiple_query_compilation(self): + # Ticket #21643 + queryset = Experiment.objects.filter(end__lt=F('start') + datetime.timedelta(hours=1)) + q1 = str(queryset.query) + q2 = str(queryset.query) + self.assertEqual(q1, q2) + def test_delta_add(self): for i in range(len(self.deltas)): delta = self.deltas[i]