#35613 closed Bug (duplicate)
SQL params mismatch when using ArrayAgg with timezone override
| Reported by: | Claudia Onorato | Owned by: | |
|---|---|---|---|
| Component: | contrib.postgres | Version: | 5.0 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Hi! When updating from Django 4.0 to Django 5.0., I encountered an issue related to the use of django.contrib.postgres.aggregates's ArrayAgg. I also checked and this issue also happens on Django 4.1 and 4.2.
Given the following models:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=300)
class Book(models.Model):
name = models.CharField(max_length=300)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
published_on = models.DateTimeField(null=True)
If I run the following in a shell
import zoneinfo
from django.utils import timezone
from django.contrib.postgres.aggregates import ArrayAgg
from django.db.models import Q
from library.models import Publisher
with timezone.override(zoneinfo.ZoneInfo('America/Toronto')):
Publisher.objects.annotate(books_date=ArrayAgg(
'book__published_on__date',
filter=Q(id=100),
ordering=('book__published_on__date',),
)).all()
I get an error saying there's an invalid input syntax. Looking at the generated SQL, I see there's indeed an error, where the argument for the filter was instead use to localize the field in the order by, and vice-versa.
SELECT
"library_publisher"."id",
"library_publisher"."name",
ARRAY_AGG(
(
"library_book"."published_on" AT TIME ZONE 'America/Toronto'
) :: date
ORDER BY
("library_book"."published_on" AT TIME ZONE 100) :: date
) FILTER (
WHERE
"library_publisher"."id" = 'America/Toronto'
) AS "books_date"
FROM
"library_publisher"
LEFT OUTER JOIN "library_book" ON (
"library_publisher"."id" = "library_book"."publisher_id"
)
GROUP BY
"library_publisher"."id";
Let me know if you need any more information. I created a small django project for this that I can share.
Hey Claudia, thank you for your report I'm pretty sure this is a duplicate of #35339 which was fixed by c8df2f994130d74ec35d32a36e30aad7d6ea8e3a which will be part of the upcoming 5.1 release (expected August 2024). It wasn't backported as when it was discovered, 4 months ago, the issue had existed since the introduction of
ArrayAggas you've noticed.I've confirmed with the following test
tests/postgres_tests/test_aggregates.py
Please re-open if you can reproduce against
Django==5.1.b1.