#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.1b1.