Fixed #29692 -- Fixed removing ordering parts for multiline RawSQL expressions.
This commit is contained in:
parent
ef082ebb84
commit
567b9928a3
|
@ -32,7 +32,8 @@ class SQLCompiler:
|
||||||
self.select = None
|
self.select = None
|
||||||
self.annotation_col_map = None
|
self.annotation_col_map = None
|
||||||
self.klass_info = None
|
self.klass_info = None
|
||||||
self.ordering_parts = re.compile(r'(.*)\s(ASC|DESC)(.*)')
|
# Multiline ordering SQL clause may appear from RawSQL.
|
||||||
|
self.ordering_parts = re.compile(r'^(.*)\s(ASC|DESC)(.*)', re.MULTILINE | re.DOTALL)
|
||||||
self._meta_ordering = None
|
self._meta_ordering = None
|
||||||
|
|
||||||
def setup_query(self):
|
def setup_query(self):
|
||||||
|
|
|
@ -384,6 +384,29 @@ class BasicExpressionsTests(TestCase):
|
||||||
)
|
)
|
||||||
self.assertSequenceEqual(mustermanns_by_seniority, [self.max, mary])
|
self.assertSequenceEqual(mustermanns_by_seniority, [self.max, mary])
|
||||||
|
|
||||||
|
def test_order_by_multiline_sql(self):
|
||||||
|
raw_order_by = (
|
||||||
|
RawSQL('''
|
||||||
|
CASE WHEN num_employees > 1000
|
||||||
|
THEN num_chairs
|
||||||
|
ELSE 0 END
|
||||||
|
''', []).desc(),
|
||||||
|
RawSQL('''
|
||||||
|
CASE WHEN num_chairs > 1
|
||||||
|
THEN 1
|
||||||
|
ELSE 0 END
|
||||||
|
''', []).asc()
|
||||||
|
)
|
||||||
|
for qs in (
|
||||||
|
Company.objects.all(),
|
||||||
|
Company.objects.distinct(),
|
||||||
|
):
|
||||||
|
with self.subTest(qs=qs):
|
||||||
|
self.assertSequenceEqual(
|
||||||
|
qs.order_by(*raw_order_by),
|
||||||
|
[self.example_inc, self.gmbh, self.foobar_ltd],
|
||||||
|
)
|
||||||
|
|
||||||
def test_outerref(self):
|
def test_outerref(self):
|
||||||
inner = Company.objects.filter(point_of_contact=OuterRef('pk'))
|
inner = Company.objects.filter(point_of_contact=OuterRef('pk'))
|
||||||
msg = (
|
msg = (
|
||||||
|
|
Loading…
Reference in New Issue