|
4 | 4 | import json |
5 | 5 |
|
6 | 6 | from django import VERSION |
7 | | -from django.db.models import BooleanField |
| 7 | +from django.db.models import BooleanField, Value |
8 | 8 | from django.db.models.functions import Cast |
9 | 9 | from django.db.models.functions.math import ATan2, Log, Ln, Mod, Round |
10 | | -from django.db.models.expressions import Case, Exists, OrderBy, When |
| 10 | +from django.db.models.expressions import Case, Exists, OrderBy, When, Window |
11 | 11 | from django.db.models.lookups import Lookup, In |
12 | 12 | from django.db.models import lookups |
13 | 13 |
|
@@ -55,6 +55,13 @@ def sqlserver_round(self, compiler, connection, **extra_context): |
55 | 55 | return self.as_sql(compiler, connection, template='%(function)s(%(expressions)s, 0)', **extra_context) |
56 | 56 |
|
57 | 57 |
|
| 58 | +def sqlserver_window(self, compiler, connection, template=None): |
| 59 | + # MSSQL window functions require an OVER clause with ORDER BY |
| 60 | + if self.order_by is None: |
| 61 | + self.order_by = Value('SELECT NULL') |
| 62 | + return self.as_sql(compiler, connection, template) |
| 63 | + |
| 64 | + |
58 | 65 | def sqlserver_exists(self, compiler, connection, template=None, **extra_context): |
59 | 66 | # MS SQL doesn't allow EXISTS() in the SELECT list, so wrap it with a |
60 | 67 | # CASE WHEN expression. Change the template since the When expression |
@@ -180,10 +187,12 @@ def json_HasKeyLookup(self, compiler, connection): |
180 | 187 | Log.as_microsoft = sqlserver_log |
181 | 188 | Mod.as_microsoft = sqlserver_mod |
182 | 189 | Round.as_microsoft = sqlserver_round |
| 190 | +Window.as_microsoft = sqlserver_window |
183 | 191 |
|
184 | 192 | if DJANGO3: |
185 | 193 | Lookup.as_microsoft = sqlserver_lookup |
186 | 194 | else: |
187 | 195 | Exists.as_microsoft = sqlserver_exists |
188 | 196 |
|
189 | 197 | OrderBy.as_microsoft = sqlserver_orderby |
| 198 | + |
0 commit comments