diff options
| author | Anssi Kääriäinen <akaariai@gmail.com> | 2012-10-10 15:58:39 +0300 |
|---|---|---|
| committer | Anssi Kääriäinen <akaariai@gmail.com> | 2012-10-25 17:16:44 +0300 |
| commit | f64a5ef404cb6fd28e008a01039a3beea2fa8e1b (patch) | |
| tree | 85d84ecd06650d515f9b0b33e8e877858d28e092 /django | |
| parent | da56e1bac6449daef9aeab8d076d2594d9fd5b44 (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.py | 19 | ||||
| -rw-r--r-- | django/db/models/sql/subqueries.py | 8 |
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] |
