summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/modeltests/expressions/tests.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/modeltests/expressions/tests.py b/tests/modeltests/expressions/tests.py
index 99eb07e370..ca47521ccd 100644
--- a/tests/modeltests/expressions/tests.py
+++ b/tests/modeltests/expressions/tests.py
@@ -219,3 +219,42 @@ class ExpressionsTests(TestCase):
)
acme.num_employees = F("num_employees") + 16
self.assertRaises(TypeError, acme.save)
+
+ def test_ticket_18375_join_reuse(self):
+ # Test that reverse multijoin F() references and the lookup target
+ # the same join. Pre #18375 the F() join was generated first, and the
+ # lookup couldn't reuse that join.
+ qs = Employee.objects.filter(
+ company_ceo_set__num_chairs=F('company_ceo_set__num_employees'))
+ self.assertEqual(str(qs.query).count('JOIN'), 1)
+
+ def test_ticket_18375_kwarg_ordering(self):
+ # The next query was dict-randomization dependent - if the "gte=1"
+ # was seen first, then the F() will reuse the join generated by the
+ # gte lookup, if F() was seen first, then it generated a join the
+ # other lookups could not reuse.
+ qs = Employee.objects.filter(
+ company_ceo_set__num_chairs=F('company_ceo_set__num_employees'),
+ company_ceo_set__num_chairs__gte=1)
+ self.assertEqual(str(qs.query).count('JOIN'), 1)
+
+ def test_ticket_18375_kwarg_ordering_2(self):
+ # Another similar case for F() than above. Now we have the same join
+ # in two filter kwargs, one in the lhs lookup, one in F. Here pre
+ # #18375 the amount of joins generated was random if dict
+ # randomization was enabled, that is the generated query dependend
+ # on which clause was seen first.
+ qs = Employee.objects.filter(
+ company_ceo_set__num_employees=F('pk'),
+ pk=F('company_ceo_set__num_employees')
+ )
+ self.assertEqual(str(qs.query).count('JOIN'), 1)
+
+ def test_ticket_18375_chained_filters(self):
+ # Test that F() expressions do not reuse joins from previous filter.
+ qs = Employee.objects.filter(
+ company_ceo_set__num_employees=F('pk')
+ ).filter(
+ company_ceo_set__num_employees=F('company_ceo_set__num_employees')
+ )
+ self.assertEqual(str(qs.query).count('JOIN'), 2)