#33808: Specific subquery produces wrong SQL (error 500)
-------------------------------------+-------------------------------------
     Reporter:  Fabio Zoratti        |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  3.2
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  database, count,     |             Triage Stage:
  query, orm                         |  Unreviewed
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Fabio Zoratti):

 * has_patch:  0 => 1


Old description:

> You can find in attachment a minimal working example. I created the zip
> with
>
> {{{
> django-admin startproject mwe
> ./manage.py startapp testapp
> }}}
>

> Then I only edited the file `testapp/models.py` `testapp/tests.py` and
> `mwe/settings.py` (to add the app to the installed apps) and ran
> `./manage.py makemigrations testapp`.
>
> Running the tests with the usual `./manage.py test` triggers the problem.
> I printed the query produced by django, simply adding a `print` in
> `django/db/backends/sqlite/base.py`. The query is the following:
>
> {{{
> SELECT DISTINCT "testapp_firstmodel"."id",
> COUNT("testapp_secondmodel_related_field2"."secondmodel_id" IN
> "testapp_secondmodel_related_field1"."secondmodel_id") AS "howmany"
> FROM "testapp_firstmodel"
> LEFT OUTER JOIN "testapp_secondmodel_related_field1" ON
> ("testapp_firstmodel"."id" =
> "testapp_secondmodel_related_field1"."firstmodel_id")
> LEFT OUTER JOIN "testapp_secondmodel_related_field2" ON
> ("testapp_firstmodel"."id" =
> "testapp_secondmodel_related_field2"."firstmodel_id")
> GROUP BY "testapp_firstmodel"."id" LIMIT 21
> }}}
>
> Adding a layer of parenthesis in the query inside the `Count` fixes the
> issue.
>

> {{{
> SELECT DISTINCT "testapp_firstmodel"."id",
> COUNT("testapp_secondmodel_related_field2"."secondmodel_id" IN
> ("testapp_secondmodel_related_field1"."secondmodel_id")) AS "howmany"
> FROM "testapp_firstmodel"
> LEFT OUTER JOIN "testapp_secondmodel_related_field1" ON
> ("testapp_firstmodel"."id" =
> "testapp_secondmodel_related_field1"."firstmodel_id")
> LEFT OUTER JOIN "testapp_secondmodel_related_field2" ON
> ("testapp_firstmodel"."id" =
> "testapp_secondmodel_related_field2"."firstmodel_id")
> GROUP BY "testapp_firstmodel"."id" LIMIT 21
> }}}

New description:

 You can find in attachment a minimal working example. I created the zip
 with

 {{{
 django-admin startproject mwe
 ./manage.py startapp testapp
 }}}


 Then I only edited the file `testapp/models.py` `testapp/tests.py` and
 `mwe/settings.py` (to add the app to the installed apps) and ran
 `./manage.py makemigrations testapp`.

 Running the tests with the usual `./manage.py test` triggers the problem.
 I printed the query produced by django, simply adding a `print` in
 `django/db/backends/sqlite/base.py`. The query is the following:

 {{{
 SELECT DISTINCT "testapp_firstmodel"."id",
 COUNT("testapp_secondmodel_related_field2"."secondmodel_id" IN
 "testapp_secondmodel_related_field1"."secondmodel_id") AS "howmany"
 FROM "testapp_firstmodel"
 LEFT OUTER JOIN "testapp_secondmodel_related_field1" ON
 ("testapp_firstmodel"."id" =
 "testapp_secondmodel_related_field1"."firstmodel_id")
 LEFT OUTER JOIN "testapp_secondmodel_related_field2" ON
 ("testapp_firstmodel"."id" =
 "testapp_secondmodel_related_field2"."firstmodel_id")
 GROUP BY "testapp_firstmodel"."id" LIMIT 21
 }}}

 Adding a layer of parenthesis in the query inside the `Count` fixes the
 issue.


 {{{
 SELECT DISTINCT "testapp_firstmodel"."id",
 COUNT("testapp_secondmodel_related_field2"."secondmodel_id" IN
 ("testapp_secondmodel_related_field1"."secondmodel_id")) AS "howmany"
 FROM "testapp_firstmodel"
 LEFT OUTER JOIN "testapp_secondmodel_related_field1" ON
 ("testapp_firstmodel"."id" =
 "testapp_secondmodel_related_field1"."firstmodel_id")
 LEFT OUTER JOIN "testapp_secondmodel_related_field2" ON
 ("testapp_firstmodel"."id" =
 "testapp_secondmodel_related_field2"."firstmodel_id")
 GROUP BY "testapp_firstmodel"."id" LIMIT 21
 }}}


 This should fix the issue: https://github.com/django/django/pull/15798

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33808#comment:4>
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/0107018197b145c0-a0bce247-d4a8-43f0-8d6b-9abb16027c22-000000%40eu-central-1.amazonses.com.

Reply via email to