Fixed #29172 -- Fixed crash with Window expression in a subquery.
This commit is contained in:
parent
ba4a986240
commit
fa352626c2
@ -315,8 +315,10 @@ class BaseExpression:
|
|||||||
|
|
||||||
def relabeled_clone(self, change_map):
|
def relabeled_clone(self, change_map):
|
||||||
clone = self.copy()
|
clone = self.copy()
|
||||||
clone.set_source_expressions(
|
clone.set_source_expressions([
|
||||||
[e.relabeled_clone(change_map) for e in self.get_source_expressions()])
|
e.relabeled_clone(change_map) if e is not None else None
|
||||||
|
for e in self.get_source_expressions()
|
||||||
|
])
|
||||||
return clone
|
return clone
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
|
@ -25,3 +25,6 @@ Bugfixes
|
|||||||
|
|
||||||
* Fixed a regression where a ``When()`` expression with a list argument crashes
|
* Fixed a regression where a ``When()`` expression with a list argument crashes
|
||||||
(:ticket:`29166`).
|
(:ticket:`29166`).
|
||||||
|
|
||||||
|
* Fixed crash when using a ``Window()`` expression in a subquery
|
||||||
|
(:ticket:`29172`).
|
||||||
|
@ -650,6 +650,19 @@ class WindowFunctionTests(TestCase):
|
|||||||
salary=Window(expression=Sum(Value(10000), order_by=F('pk').asc())),
|
salary=Window(expression=Sum(Value(10000), order_by=F('pk').asc())),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_window_expression_within_subquery(self):
|
||||||
|
subquery_qs = Employee.objects.annotate(
|
||||||
|
highest=Window(FirstValue('id'), partition_by=F('department'), order_by=F('salary').desc())
|
||||||
|
).values('highest')
|
||||||
|
highest_salary = Employee.objects.filter(pk__in=subquery_qs)
|
||||||
|
self.assertSequenceEqual(highest_salary.values('department', 'salary'), [
|
||||||
|
{'department': 'Accounting', 'salary': 50000},
|
||||||
|
{'department': 'Sales', 'salary': 55000},
|
||||||
|
{'department': 'Marketing', 'salary': 40000},
|
||||||
|
{'department': 'IT', 'salary': 60000},
|
||||||
|
{'department': 'Management', 'salary': 100000}
|
||||||
|
])
|
||||||
|
|
||||||
def test_invalid_start_value_range(self):
|
def test_invalid_start_value_range(self):
|
||||||
msg = "start argument must be a negative integer, zero, or None, but got '3'."
|
msg = "start argument must be a negative integer, zero, or None, but got '3'."
|
||||||
with self.assertRaisesMessage(ValueError, msg):
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user