mirror of
https://github.com/django/django.git
synced 2025-01-27 02:29:55 +00:00
[4.2.x] Fixed #34368 -- Made subquery raise NotSupportedError when referencing outer window expression.
Regression in f387d024fc75569d2a4a338bfda76cc2f328f627. Co-authored-by: Jannis Vajen <jvajen@gmail.com> Backport of c67ea79aa981ae82595d89f8018a41fcd842e7c9 from main
This commit is contained in:
parent
872dade29c
commit
fc15d11f2e
@ -859,6 +859,11 @@ class ResolvedOuterRef(F):
|
||||
|
||||
def resolve_expression(self, *args, **kwargs):
|
||||
col = super().resolve_expression(*args, **kwargs)
|
||||
if col.contains_over_clause:
|
||||
raise NotSupportedError(
|
||||
f"Referencing outer query window expression is not supported: "
|
||||
f"{self.name}."
|
||||
)
|
||||
# FIXME: Rename possibly_multivalued to multivalued and fix detection
|
||||
# for non-multivalued JOINs (e.g. foreign key fields). This should take
|
||||
# into account only many-to-many and one-to-many relationships.
|
||||
|
@ -676,7 +676,7 @@ class SQLCompiler:
|
||||
)
|
||||
)
|
||||
inner_query_compiler = inner_query.get_compiler(
|
||||
self.using, elide_empty=self.elide_empty
|
||||
self.using, connection=self.connection, elide_empty=self.elide_empty
|
||||
)
|
||||
inner_sql, inner_params = inner_query_compiler.as_sql(
|
||||
# The limits must be applied to the outer query to avoid pruning
|
||||
|
@ -1587,6 +1587,25 @@ class WindowUnsupportedTests(TestCase):
|
||||
dense_rank=Window(expression=DenseRank())
|
||||
).get()
|
||||
|
||||
def test_filter_subquery(self):
|
||||
qs = Employee.objects.annotate(
|
||||
department_salary_rank=Window(
|
||||
Rank(), partition_by="department", order_by="-salary"
|
||||
)
|
||||
)
|
||||
msg = (
|
||||
"Referencing outer query window expression is not supported: "
|
||||
"department_salary_rank."
|
||||
)
|
||||
with self.assertRaisesMessage(NotSupportedError, msg):
|
||||
qs.annotate(
|
||||
employee_name=Subquery(
|
||||
Employee.objects.filter(
|
||||
age=OuterRef("department_salary_rank")
|
||||
).values("name")[:1]
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class NonQueryWindowTests(SimpleTestCase):
|
||||
def test_window_repr(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user