1
0
mirror of https://github.com/django/django.git synced 2025-01-03 06:55:47 +00:00

Fixed #30027 -- Errored out on Window function usage if unsupported.

This commit is contained in:
Simon Charette 2019-01-15 21:48:12 -06:00 committed by Tim Graham
parent ebd2fe1861
commit 64d5bafbc6
2 changed files with 10 additions and 1 deletions

View File

@ -7,6 +7,7 @@ from django.core.exceptions import EmptyResultSet, FieldError
from django.db import connection from django.db import connection
from django.db.models import fields from django.db.models import fields
from django.db.models.query_utils import Q from django.db.models.query_utils import Q
from django.db.utils import NotSupportedError
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.hashable import make_hashable from django.utils.hashable import make_hashable
@ -1237,6 +1238,8 @@ class Window(Expression):
def as_sql(self, compiler, connection, template=None): def as_sql(self, compiler, connection, template=None):
connection.ops.check_expression_support(self) connection.ops.check_expression_support(self)
if not connection.features.supports_over_clause:
raise NotSupportedError('This backend does not support window expressions.')
expr_sql, params = compiler.compile(self.source_expression) expr_sql, params = compiler.compile(self.source_expression)
window_sql, window_params = [], [] window_sql, window_params = [], []

View File

@ -1,5 +1,5 @@
import datetime import datetime
from unittest import skipIf, skipUnless from unittest import mock, skipIf, skipUnless
from django.core.exceptions import FieldError from django.core.exceptions import FieldError
from django.db import NotSupportedError, connection from django.db import NotSupportedError, connection
@ -821,6 +821,12 @@ class NonQueryWindowTests(SimpleTestCase):
with self.assertRaisesMessage(NotSupportedError, msg): with self.assertRaisesMessage(NotSupportedError, msg):
Employee.objects.annotate(dense_rank=Window(expression=DenseRank())).filter(dense_rank__gte=1) Employee.objects.annotate(dense_rank=Window(expression=DenseRank())).filter(dense_rank__gte=1)
def test_unsupported_backend(self):
msg = 'This backend does not support window expressions.'
with mock.patch.object(connection.features, 'supports_over_clause', False):
with self.assertRaisesMessage(NotSupportedError, msg):
Employee.objects.annotate(dense_rank=Window(expression=DenseRank())).get()
def test_invalid_order_by(self): def test_invalid_order_by(self):
msg = 'order_by must be either an Expression or a sequence of expressions' msg = 'order_by must be either an Expression or a sequence of expressions'
with self.assertRaisesMessage(ValueError, msg): with self.assertRaisesMessage(ValueError, msg):