Fixed #32690 -- Fixed __in lookup crash when combining with filtered aggregates.

Having lookups group by subquery right-hand-sides is likely unnecessary
in the first place but relatively large amount of work would be needed
to achieve that such as making Lookup instances proper resolvable
expressions.

Regression in 3543129822.

Thanks James A. Munsch for the report.
This commit is contained in:
Simon Charette 2021-05-04 23:42:52 -04:00 committed by Mariusz Felisiak
parent 06fd4df41a
commit 136ff592ad
2 changed files with 17 additions and 0 deletions

View File

@ -406,6 +406,15 @@ class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup):
self.rhs.add_fields(['pk']) self.rhs.add_fields(['pk'])
return super().process_rhs(compiler, connection) return super().process_rhs(compiler, connection)
def get_group_by_cols(self, alias=None):
cols = self.lhs.get_group_by_cols()
if hasattr(self.rhs, 'get_group_by_cols'):
if not getattr(self.rhs, 'has_select_fields', True):
self.rhs.clear_select_clause()
self.rhs.add_fields(['pk'])
cols.extend(self.rhs.get_group_by_cols())
return cols
def get_rhs_op(self, connection, rhs): def get_rhs_op(self, connection, rhs):
return 'IN %s' % rhs return 'IN %s' % rhs

View File

@ -1525,6 +1525,14 @@ class AggregationTests(TestCase):
allow_distinct = True allow_distinct = True
DistinctAggregate('foo', distinct=True) DistinctAggregate('foo', distinct=True)
@skipUnlessDBFeature('supports_subqueries_in_group_by')
def test_having_subquery_select(self):
authors = Author.objects.filter(pk=self.a1.pk)
books = Book.objects.annotate(Count('authors')).filter(
Q(authors__in=authors) | Q(authors__count__gt=2)
)
self.assertEqual(set(books), {self.b1, self.b4})
class JoinPromotionTests(TestCase): class JoinPromotionTests(TestCase):
def test_ticket_21150(self): def test_ticket_21150(self):