summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/compiler.py9
-rw-r--r--django/db/models/sql/query.py17
2 files changed, 16 insertions, 10 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index e4605918d9..e9f99fa838 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -535,8 +535,8 @@ class SQLCompiler:
if not query.is_empty()
]
if not features.supports_slicing_ordering_in_compound:
- for query, compiler in zip(self.query.combined_queries, compilers):
- if query.low_mark or query.high_mark:
+ for compiler in compilers:
+ if compiler.query.is_sliced:
raise DatabaseError(
"LIMIT/OFFSET not allowed in subqueries of compound statements."
)
@@ -544,6 +544,11 @@ class SQLCompiler:
raise DatabaseError(
"ORDER BY not allowed in subqueries of compound statements."
)
+ elif self.query.is_sliced and combinator == "union":
+ limit = (self.query.low_mark, self.query.high_mark)
+ for compiler in compilers:
+ if not compiler.query.is_sliced:
+ compiler.query.set_limits(*limit)
parts = ()
for compiler in compilers:
try:
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index e454a6e868..9d4ca0ffb6 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -556,7 +556,7 @@ class Query(BaseExpression):
def has_filters(self):
return self.where
- def exists(self, using, limit=True):
+ def exists(self, limit=True):
q = self.clone()
if not (q.distinct and q.is_sliced):
if q.group_by is True:
@@ -568,11 +568,8 @@ class Query(BaseExpression):
q.set_group_by(allow_aliases=False)
q.clear_select_clause()
if q.combined_queries and q.combinator == "union":
- limit_combined = connections[
- using
- ].features.supports_slicing_ordering_in_compound
q.combined_queries = tuple(
- combined_query.exists(using, limit=limit_combined)
+ combined_query.exists(limit=False)
for combined_query in q.combined_queries
)
q.clear_ordering(force=True)
@@ -1150,12 +1147,16 @@ class Query(BaseExpression):
if col.alias in self.external_aliases
]
- def get_group_by_cols(self, alias=None):
+ def get_group_by_cols(self, alias=None, wrapper=None):
+ # If wrapper is referenced by an alias for an explicit GROUP BY through
+ # values() a reference to this expression and not the self must be
+ # returned to ensure external column references are not grouped against
+ # as well.
if alias:
- return [Ref(alias, self)]
+ return [Ref(alias, wrapper or self)]
external_cols = self.get_external_cols()
if any(col.possibly_multivalued for col in external_cols):
- return [self]
+ return [wrapper or self]
return external_cols
def as_sql(self, compiler, connection):