From eb4724a0632928bda2a512a9117a91260096e457 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Fri, 28 Apr 2017 09:30:35 -0400 Subject: [PATCH] Reverted "Refs #20939 -- Moved subquery ordering clearing optimization to the __in lookup." This reverts commit e62ea0bb9cbb54c1eef848871fe3eab2bad268dc since it broke multi-column __in lookups and _meta.order_wrt on Oracle. --- django/db/models/lookups.py | 15 +++------------ django/db/models/sql/query.py | 6 ++++++ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py index 78ed3e477f..48e68d0b8b 100644 --- a/django/db/models/lookups.py +++ b/django/db/models/lookups.py @@ -367,18 +367,9 @@ class In(FieldGetDbPrepValueIterableMixin, BuiltinLookup): placeholder = '(' + ', '.join(sqls) + ')' return (placeholder, sqls_params) else: - from django.db.models.sql.query import Query # avoid circular import - if isinstance(self.rhs, Query): - query = self.rhs - # It's safe to drop ordering if the queryset isn't using - # slicing, distinct(*fields), or select_for_update(). - if (query.low_mark == 0 and query.high_mark is None and - not query.distinct_fields and - not query.select_for_update): - query.clear_ordering(True) - if not query.has_select_fields: - query.clear_select_clause() - query.add_fields(['pk']) + if not getattr(self.rhs, 'has_select_fields', True): + self.rhs.clear_select_clause() + self.rhs.add_fields(['pk']) return super().process_rhs(compiler, connection) def get_rhs_op(self, connection, rhs): diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index c8cb095d09..a1c1c4be38 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -981,6 +981,12 @@ class Query: # Subqueries need to use a different set of aliases than the outer query. clone.bump_prefix(query) clone.subquery = True + # It's safe to drop ordering if the queryset isn't using slicing, + # distinct(*fields) or select_for_update(). + if (self.low_mark == 0 and self.high_mark is None and + not self.distinct_fields and + not self.select_for_update): + clone.clear_ordering(True) return clone def prepare_lookup_value(self, value, lookups, can_reuse, allow_joins=True):