summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2012-10-10 15:58:39 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2012-10-25 17:16:44 +0300
commitf64a5ef404cb6fd28e008a01039a3beea2fa8e1b (patch)
tree85d84ecd06650d515f9b0b33e8e877858d28e092 /django
parentda56e1bac6449daef9aeab8d076d2594d9fd5b44 (diff)
Fixed #19102 -- Fixed fast-path delete for modified SELECT clause cases
There was a bug introduced in #18676 which caused fast-path deletes implemented as "DELETE WHERE pk IN <subquery>" to fail if the SELECT clause contained additional stuff (for example extra() and annotate()). Thanks to Trac alias pressureman for spotting this regression.
Diffstat (limited to 'django')
-rw-r--r--django/db/models/sql/query.py19
-rw-r--r--django/db/models/sql/subqueries.py8
2 files changed, 16 insertions, 11 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index ad82b167a6..264e29eaf3 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -431,13 +431,9 @@ class Query(object):
def has_results(self, using):
q = self.clone()
+ q.clear_select_clause()
q.add_extra({'a': 1}, None, None, None, None, None)
- q.select = []
- q.select_fields = []
- q.default_cols = False
- q.select_related = False
- q.set_extra_mask(('a',))
- q.set_aggregate_mask(())
+ q.set_extra_mask(['a'])
q.clear_ordering(True)
q.set_limits(high=1)
compiler = q.get_compiler(using=using)
@@ -1626,6 +1622,17 @@ class Query(object):
"""
return not self.low_mark and self.high_mark is None
+ def clear_select_clause(self):
+ """
+ Removes all fields from SELECT clause.
+ """
+ self.select = []
+ self.select_fields = []
+ self.default_cols = False
+ self.select_related = False
+ self.set_extra_mask(())
+ self.set_aggregate_mask(())
+
def clear_select_fields(self):
"""
Clears the list of fields to select (but not extra_select columns).
diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py
index 9f3fb8ac22..1371ef58e9 100644
--- a/django/db/models/sql/subqueries.py
+++ b/django/db/models/sql/subqueries.py
@@ -70,8 +70,9 @@ class DeleteQuery(Query):
self.delete_batch(values, using)
return
else:
- values = innerq
+ innerq.clear_select_clause()
innerq.select = [(self.get_initial_alias(), pk.column)]
+ values = innerq
where = self.where_class()
where.add((Constraint(None, pk.column, pk), 'in', values), AND)
self.where = where
@@ -237,11 +238,8 @@ class DateQuery(Query):
% field.name
alias = result[3][-1]
select = Date((alias, field.column), lookup_type)
+ self.clear_select_clause()
self.select = [select]
- self.select_fields = [None]
- self.select_related = False # See #7097.
- self.aggregates = SortedDict() # See 18056.
- self.set_extra_mask([])
self.distinct = True
self.order_by = order == 'ASC' and [1] or [-1]