#34285: Index transforms on filtered array aggregates produces incorrect SQL 
query
--------------------------------------------+------------------------
               Reporter:  nils-van-zuijlen  |          Owner:  nobody
                   Type:  Bug               |         Status:  new
              Component:  Uncategorized     |        Version:  3.2
               Severity:  Normal            |       Keywords:
           Triage Stage:  Unreviewed        |      Has patch:  0
    Needs documentation:  0                 |    Needs tests:  0
Patch needs improvement:  0                 |  Easy pickings:  0
                  UI/UX:  0                 |
--------------------------------------------+------------------------
 For example, with the following models:
 {{{
 class MembershipKind(models.TextChoices):
     MEMBER = "member", _("Member")
     DIRECTOR = "director", _("Director")
     MANAGER = "manager", _("Manager")


 class Project(models.Model):
     name = models.CharField(max_length=255)
     members = models.ManyToManyField(User, related_name="projects",
 blank=True, through="ProjectMember")


 class ProjectMember(models.Model):
     project = models.ForeignKey(
         Project, related_name="memberships", on_delete=models.CASCADE,
 verbose_name=_("project")
     )
     user = models.ForeignKey(User, related_name="project_memberships",
 on_delete=models.CASCADE, verbose_name=_("user"))
     kind = models.CharField(choices=MembershipKind.choices, max_length=10)

     class Meta:
         constraints = [models.UniqueConstraint(fields=("project", "user"),
 name="project_user_unique_link")]
 }}}

 The following query has missing parenthesis around the annotated field
 first_director_id.


 {{{
 >>> Project.objects.all().annotate(
 ...     director_ids=ArrayAgg('memberships__user_id',
 filter=Q(memberships__kind=MembershipKind.DIRECTOR))
 ... ).annotate(
 ...     first_director_id=F('director_ids__0')
 ... ).query.sql_with_params()
 (
 '''SELECT "imputations_project"."id", "imputations_project"."name",
     ARRAY_AGG("imputations_projectmember"."user_id" ) FILTER (WHERE
 "imputations_projectmember"."kind" = %s) AS "director_ids",
     ARRAY_AGG("imputations_projectmember"."user_id" ) FILTER (WHERE
 "imputations_projectmember"."kind" = %s)[%s] AS "first_director_id"
 FROM "imputations_project"
 LEFT OUTER JOIN "imputations_projectmember" ON ("imputations_project"."id"
 = "imputations_projectmember"."project_id")
 GROUP BY "imputations_project"."id"''',
 (<MembershipKind.DIRECTOR: 'director'>, <MembershipKind.DIRECTOR:
 'director'>, 1)
 )
 }}}

 It should be
 {{{
     (ARRAY_AGG("imputations_projectmember"."user_id" ) FILTER (WHERE
 "imputations_projectmember"."kind" = %s))[%s] AS "first_director_id"
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34285>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070185df94f57b-76b4d2f1-076e-412f-8533-bd9f6828c94a-000000%40eu-central-1.amazonses.com.

Reply via email to