#33225: Missing FROM-clause when ordering by a relationship defined on the 
parent
model in a Subquery inside a negated Q
-------------------------------------+-------------------------------------
     Reporter:  InvalidInterrupt     |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  dev
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by InvalidInterrupt:

Old 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.

New 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()` (`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.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33225#comment:1>
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/074.50ea8b0a75e053f577b67a68b53b75e4%40djangoproject.com.

Reply via email to