Kaydet (Commit) 567b9928 authored tarafından can's avatar can Kaydeden (comit) Mariusz Felisiak

Fixed #29692 -- Fixed removing ordering parts for multiline RawSQL expressions.

üst ef082ebb
...@@ -32,7 +32,8 @@ class SQLCompiler: ...@@ -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): ...@@ -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 = (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment