diff options
| author | Karen Tracey <kmtracey@gmail.com> | 2010-03-21 20:47:52 +0000 |
|---|---|---|
| committer | Karen Tracey <kmtracey@gmail.com> | 2010-03-21 20:47:52 +0000 |
| commit | 9df71371c2d70f61ae0f8916422487bb031a7164 (patch) | |
| tree | 29e53cf461b17356f19f2a7ce3828ee6088e6439 /django/db/models/sql/query.py | |
| parent | 72ea8fc4eb79d4dfbbbf65161486c06f411ab8c6 (diff) | |
Fixed #12822: Don't copy the _aggregate_select_cache when cloning a query set,
as that can lead to incorrect SQL being generated for the query. Thanks to mat
for the report and test, tobias for the fix, and Alex for review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12830 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/db/models/sql/query.py')
| -rw-r--r-- | django/db/models/sql/query.py | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index ffc9d3b13f..9819be09a1 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -240,10 +240,12 @@ class Query(object): obj.aggregate_select_mask = None else: obj.aggregate_select_mask = self.aggregate_select_mask.copy() - if self._aggregate_select_cache is None: - obj._aggregate_select_cache = None - else: - obj._aggregate_select_cache = self._aggregate_select_cache.copy() + # _aggregate_select_cache cannot be copied, as doing so breaks the + # (necessary) state in which both aggregates and + # _aggregate_select_cache point to the same underlying objects. + # It will get re-populated in the cloned queryset the next time it's + # used. + obj._aggregate_select_cache = None obj.max_depth = self.max_depth obj.extra = self.extra.copy() if self.extra_select_mask is None: |
