From 9bcbcd599abac91ea853b2fe10b784ba32df043e Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Thu, 2 Jan 2020 11:33:01 -0500 Subject: 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. --- tests/expressions/tests.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'tests') diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 1e6d4c967c..180153f555 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -1426,6 +1426,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)) @@ -1452,6 +1462,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 = [ @@ -1476,6 +1497,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) -- cgit v1.3