summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2023-02-26 13:43:00 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-02-27 09:46:30 +0100
commitfc15d11f2eb26fe3d5c946e69223880bfe53e92b (patch)
tree03fdf5684c941cb27f1b2cdc6348a399d747325c
parent872dade29c8a4b9e82920a85c698fcef8ed332ee (diff)
[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
-rw-r--r--django/db/models/expressions.py5
-rw-r--r--django/db/models/sql/compiler.py2
-rw-r--r--tests/expressions_window/tests.py19
3 files changed, 25 insertions, 1 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index 175bee1bf9..3dfb21a8a4 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -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.
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 1faed5c416..1c16217ae7 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -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
diff --git a/tests/expressions_window/tests.py b/tests/expressions_window/tests.py
index 027fc9c25c..3a02a36707 100644
--- a/tests/expressions_window/tests.py
+++ b/tests/expressions_window/tests.py
@@ -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):