mirror of
https://github.com/django/django.git
synced 2025-04-22 00:04:43 +00:00
[1.11.x] Fixed #27862 -- Fixed incorrectly quoted table aliases in Subquery SQL.
Add aliases from resolved querysets to the parent query's external aliases to prevent those aliases from being quoted. Thanks to Vasily Stepanov for the report and Tim Graham for the review. Backport of f48bc7c3dbd204eefb3c19016b1e4906ac26bee3 from master
This commit is contained in:
parent
3a3145bfcd
commit
2864bb3ba6
@ -933,10 +933,15 @@ class Subquery(Expression):
|
||||
|
||||
def resolve(child):
|
||||
if hasattr(child, 'resolve_expression'):
|
||||
return child.resolve_expression(
|
||||
resolved = child.resolve_expression(
|
||||
query=query, allow_joins=allow_joins, reuse=reuse,
|
||||
summarize=summarize, for_save=for_save,
|
||||
)
|
||||
# Add table alias to the parent query's aliases to prevent
|
||||
# quoting.
|
||||
if hasattr(resolved, 'alias'):
|
||||
clone.queryset.query.external_aliases.add(resolved.alias)
|
||||
return resolved
|
||||
return child
|
||||
|
||||
resolve_all(clone.queryset.query.where)
|
||||
|
@ -517,6 +517,15 @@ class BasicExpressionsTests(TestCase):
|
||||
[{'salary': 10, 'total_employees': 2300}, {'salary': 20, 'total_employees': 35}],
|
||||
)
|
||||
|
||||
def test_subquery_references_joined_table_twice(self):
|
||||
inner = Company.objects.filter(
|
||||
num_chairs__gte=OuterRef('ceo__salary'),
|
||||
num_employees__gte=OuterRef('point_of_contact__salary'),
|
||||
)
|
||||
# Another contrived example (there is no need to have a subquery here)
|
||||
outer = Company.objects.filter(pk__in=Subquery(inner.values('pk')))
|
||||
self.assertFalse(outer.exists())
|
||||
|
||||
|
||||
class IterableLookupInnerExpressionsTests(TestCase):
|
||||
@classmethod
|
||||
|
Loading…
x
Reference in New Issue
Block a user