summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2020-01-02 11:33:01 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-01-03 10:35:44 +0100
commit02cda09b13e677db01863fa0a7112dba631b9c5c (patch)
tree6b2b6a464778b0a804570b17ce00b3ccceffa0cb /tests
parentd975415852749814e781425b595c9463c4391c19 (diff)
[3.0.x] Fixed #31133 -- Fixed crash when subtracting against a subquery annotation.
The subtract_temporals() database operation was not handling expressions returning SQL params in mixed database types. Regression in 35431298226165986ad07e91f9d3aca721ff38ec. Thanks Reupen Shah for the report. Backport of 9bcbcd599abac91ea853b2fe10b784ba32df043e from master
Diffstat (limited to 'tests')
-rw-r--r--tests/expressions/tests.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index 126cd586bb..005e9150e7 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -1425,6 +1425,16 @@ class FTimeDeltaTests(TestCase):
self.assertIsNone(queryset.first().shifted)
@skipUnlessDBFeature('supports_temporal_subtraction')
+ def test_date_subquery_subtraction(self):
+ subquery = Experiment.objects.filter(pk=OuterRef('pk')).values('completed')
+ queryset = Experiment.objects.annotate(
+ difference=ExpressionWrapper(
+ subquery - F('completed'), output_field=models.DurationField(),
+ ),
+ ).filter(difference=datetime.timedelta())
+ self.assertTrue(queryset.exists())
+
+ @skipUnlessDBFeature('supports_temporal_subtraction')
def test_time_subtraction(self):
Time.objects.create(time=datetime.time(12, 30, 15, 2345))
queryset = Time.objects.annotate(
@@ -1451,6 +1461,17 @@ class FTimeDeltaTests(TestCase):
self.assertIsNone(queryset.first().shifted)
@skipUnlessDBFeature('supports_temporal_subtraction')
+ def test_time_subquery_subtraction(self):
+ Time.objects.create(time=datetime.time(12, 30, 15, 2345))
+ subquery = Time.objects.filter(pk=OuterRef('pk')).values('time')
+ queryset = Time.objects.annotate(
+ difference=ExpressionWrapper(
+ subquery - F('time'), output_field=models.DurationField(),
+ ),
+ ).filter(difference=datetime.timedelta())
+ self.assertTrue(queryset.exists())
+
+ @skipUnlessDBFeature('supports_temporal_subtraction')
def test_datetime_subtraction(self):
under_estimate = [
e.name for e in Experiment.objects.filter(estimated_time__gt=F('end') - F('start'))
@@ -1475,6 +1496,16 @@ class FTimeDeltaTests(TestCase):
self.assertIsNone(queryset.first().shifted)
@skipUnlessDBFeature('supports_temporal_subtraction')
+ def test_datetime_subquery_subtraction(self):
+ subquery = Experiment.objects.filter(pk=OuterRef('pk')).values('start')
+ queryset = Experiment.objects.annotate(
+ difference=ExpressionWrapper(
+ subquery - F('start'), output_field=models.DurationField(),
+ ),
+ ).filter(difference=datetime.timedelta())
+ self.assertTrue(queryset.exists())
+
+ @skipUnlessDBFeature('supports_temporal_subtraction')
def test_datetime_subtraction_microseconds(self):
delta = datetime.timedelta(microseconds=8999999999999999)
Experiment.objects.update(end=F('start') + delta)