diff options
| author | Simon Charette <charette.s@gmail.com> | 2020-01-02 11:33:01 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-01-03 10:35:44 +0100 |
| commit | 02cda09b13e677db01863fa0a7112dba631b9c5c (patch) | |
| tree | 6b2b6a464778b0a804570b17ce00b3ccceffa0cb /tests | |
| parent | d975415852749814e781425b595c9463c4391c19 (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.py | 31 |
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) |
