diff options
author | aaktsipetrov <aaktsipetrov@iponweb.net> | 2019-08-01 17:59:15 +0300 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-08-02 15:06:00 +0200 |
commit | 4edad1ddf6203326e0be4bdb105beecb0fe454c4 (patch) | |
tree | c43d58c2fb304876aff5f25c20e265fb8979ff4d /tests/expressions_window | |
parent | 194d1dfc186cc8d2b35dabf64f3ed38b757cbd98 (diff) | |
download | django-4edad1ddf6203326e0be4bdb105beecb0fe454c4.tar.gz |
Fixed #30668 -- Made QuerySet.filter() raise NotSupportedError if any of source expressions is not filterable.
Diffstat (limited to 'tests/expressions_window')
-rw-r--r-- | tests/expressions_window/tests.py | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/tests/expressions_window/tests.py b/tests/expressions_window/tests.py index f2ea95fa3c..8102ffe621 100644 --- a/tests/expressions_window/tests.py +++ b/tests/expressions_window/tests.py @@ -4,7 +4,8 @@ from unittest import mock, skipIf, skipUnless from django.core.exceptions import FieldError from django.db import NotSupportedError, connection from django.db.models import ( - F, OuterRef, RowRange, Subquery, Value, ValueRange, Window, WindowFrame, + F, Func, OuterRef, Q, RowRange, Subquery, Value, ValueRange, Window, + WindowFrame, ) from django.db.models.aggregates import Avg, Max, Min, Sum from django.db.models.functions import ( @@ -833,8 +834,17 @@ class NonQueryWindowTests(SimpleTestCase): def test_invalid_filter(self): msg = 'Window is disallowed in the filter clause' + qs = Employee.objects.annotate(dense_rank=Window(expression=DenseRank())) with self.assertRaisesMessage(NotSupportedError, msg): - Employee.objects.annotate(dense_rank=Window(expression=DenseRank())).filter(dense_rank__gte=1) + qs.filter(dense_rank__gte=1) + with self.assertRaisesMessage(NotSupportedError, msg): + qs.annotate(inc_rank=F('dense_rank') + Value(1)).filter(inc_rank__gte=1) + with self.assertRaisesMessage(NotSupportedError, msg): + qs.filter(id=F('dense_rank')) + with self.assertRaisesMessage(NotSupportedError, msg): + qs.filter(id=Func('dense_rank', 2, function='div')) + with self.assertRaisesMessage(NotSupportedError, msg): + qs.annotate(total=Sum('dense_rank', filter=Q(name='Jones'))).filter(total=1) def test_invalid_order_by(self): msg = 'order_by must be either an Expression or a sequence of expressions' |