Opened 3 years ago

Last modified 3 years ago

#33225 assigned Bug

Missing FROM-clause when ordering by a relationship defined on the parent model in a Subquery inside a negated Q — at Version 1

Reported by: InvalidInterrupt Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords:
Cc: InvalidInterrupt Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by InvalidInterrupt)

I encountered the following error in 3.2, and produced this test case against main (551c997f) today; using the postgres backend for all tests.

Using the models from tests.model_inheritance_regress.models, when running:

list(
    ItalianRestaurant.objects.filter(
        ~Q(
            supplier__pk__in=Subquery(
                ItalianRestaurant.objects.filter(pk=OuterRef('pk'))
                .order_by('serves_gnocchi')
                .values('pk')
            )
        )
    )
)

ProgrammingError is raised, due to a missing JOIN of model_inheritance_regress_restaurant.

This is as much as I was able to reduce the test case. In particular, the following seem necessary to encounter the error:

  • The negation of the Q object
  • The __in lookup passing through a relationship defined on the parent model
  • The filter() on an OuterRef
  • The use of order_by() (distinct(*fields) may be substituted)

The error also occurs if values('supplier__pk') is used as would be semantically correct.

When debugging, it appeared that the inner Query object had a refcount of zero for the alias in question, but I may have misunderstood what was happening there.

Change History (1)

comment:1 by InvalidInterrupt, 3 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top