diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2015-05-11 10:02:41 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-05-11 11:17:37 -0400 |
| commit | 056a91dbfae9e741cd4bf033d3062d3d35ff4d90 (patch) | |
| tree | caacd938b7f22b75e57c90e67ae007c0b4ceedc2 /tests | |
| parent | d3a8f36fdb3094e58db24065bc77ec790b95c789 (diff) | |
[1.8.x] Fixed #24766 -- Added join promotion for Case expressions
Backport of be9d645346a20a6c394bf70d47b1b1d5c81ff530 from master
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/expressions_case/tests.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/tests/expressions_case/tests.py b/tests/expressions_case/tests.py index 5eacd1cf9f..d6ff0debb0 100644 --- a/tests/expressions_case/tests.py +++ b/tests/expressions_case/tests.py @@ -1031,6 +1031,38 @@ class CaseExpressionTests(TestCase): transform=attrgetter('integer', 'test') ) + def test_join_promotion(self): + o = CaseTestModel.objects.create(integer=1, integer2=1, string='1') + # Testing that: + # 1. There isn't any object on the remote side of the fk_rel + # relation. If the query used inner joins, then the join to fk_rel + # would remove o from the results. So, in effect we are testing that + # we are promoting the fk_rel join to a left outer join here. + # 2. The default value of 3 is generated for the case expression. + self.assertQuerysetEqual( + CaseTestModel.objects.filter(pk=o.pk).annotate( + foo=Case( + When(fk_rel__pk=1, then=2), + default=3, + output_field=models.IntegerField() + ), + ), + [(o, 3)], + lambda x: (x, x.foo) + ) + # Now 2 should be generated, as the fk_rel is null. + self.assertQuerysetEqual( + CaseTestModel.objects.filter(pk=o.pk).annotate( + foo=Case( + When(fk_rel__isnull=True, then=2), + default=3, + output_field=models.IntegerField() + ), + ), + [(o, 2)], + lambda x: (x, x.foo) + ) + class CaseDocumentationExamples(TestCase): @classmethod |
