Opened 4 years ago
Last modified 4 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
__inlookup passing through a relationship defined on the parent model - The
filter()on anOuterRef - 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.