#36407: Query compiler optimizes CASE..WHEN into a programming error on Postgres 16
-------------------------------------+-------------------------------------
Reporter: deceze | Owner: (none)
Type: Bug | Status: new
Component: Database layer | Version: dev
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Sarah Boyce):
* stage: Unreviewed => Accepted
* version: 3.2 => dev
Comment:
Thank you for the report! Replicated on main
Possible regression test
{{{#!diff
--- a/tests/ordering/tests.py
+++ b/tests/ordering/tests.py
@@ -3,15 +3,18 @@ from operator import attrgetter
from django.core.exceptions import FieldError
from django.db.models import (
+ Case,
CharField,
Count,
DateTimeField,
F,
+ IntegerField,
Max,
OrderBy,
OuterRef,
Subquery,
Value,
+ When,
)
from django.db.models.functions import Length, Upper
from django.test import TestCase
@@ -526,6 +529,16 @@ class OrderingTests(TestCase):
qs = Article.objects.order_by(Value("1",
output_field=CharField()), "-headline")
self.assertSequenceEqual(qs, [self.a4, self.a3, self.a2,
self.a1])
+ def test_case_when_ordering(self):
+ qs = Article.objects.order_by(
+ Case(
+ When(pk__in=[], then=Value(1)),
+ default=Value(0),
+ output_field=IntegerField(),
+ ).desc()
+ )
+ self.assertSequenceEqual(qs, [self.a1, self.a2, self.a3,
self.a4])
+
def test_related_ordering_duplicate_table_reference(self):
"""
}}}
This errors when testing against with postgres
{{{
django.db.utils.ProgrammingError: ORDER BY position 0 is not in select
list
LINE 1: ..._article"."pub_date" FROM "ordering_article" ORDER BY 0 DESC
^
}}}
--
Ticket URL: <
https://code.djangoproject.com/ticket/36407#comment:1>