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 Initial Version

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

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()

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 (0)

Note: See TracTickets for help on using tickets.
Back to Top