From 691486a5cf7588c95250a873c5b57748e82fc4c2 Mon Sep 17 00:00:00 2001
From: David Wobrock <david.wobrock@gmail.com>
Date: Tue, 31 Aug 2021 22:37:07 +0200
Subject: [PATCH] Fixed #33073 -- Fixed queryset crash with aggregation and
 empty/extra queryset annotation.

---
 django/db/models/sql/query.py |  2 +-
 tests/aggregation/tests.py    | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 1258eb61a9..39a735b50e 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -1692,7 +1692,7 @@ class Query(BaseExpression):
                 yield expr
             elif include_external and callable(getattr(expr, 'get_external_cols', None)):
                 yield from expr.get_external_cols()
-            else:
+            elif hasattr(expr, 'get_source_expressions'):
                 yield from cls._gen_cols(
                     expr.get_source_expressions(),
                     include_external=include_external,
diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py
index c5fd590543..85742dcb9c 100644
--- a/tests/aggregation/tests.py
+++ b/tests/aggregation/tests.py
@@ -1603,3 +1603,17 @@ class AggregateTestCase(TestCase):
             value=Sum('price', filter=Q(rating__lt=3.0), default=Avg('pages') / 10.0),
         )
         self.assertAlmostEqual(result['value'], Decimal('61.72'), places=2)
+
+    def test_exists_none_with_aggregate(self):
+        qs = Book.objects.all().annotate(
+            count=Count('id'),
+            exists=Exists(Author.objects.none()),
+        )
+        self.assertEqual(len(qs), 6)
+
+    def test_exists_extra_where_with_aggregate(self):
+        qs = Book.objects.all().annotate(
+            count=Count('id'),
+            exists=Exists(Author.objects.extra(where=['1=0'])),
+        )
+        self.assertEqual(len(qs), 6)