Opened 2 years ago

Last modified 2 years ago

#33808 closed Bug

Count manytomany__in produces wrong SQL — at Initial Version

Reported by: Fabio Zoratti Owned by: nobody
Component: Database layer (models, ORM) Version: 3.2
Severity: Normal Keywords: database, count, query, orm
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

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

Change History (1)

by Fabio Zoratti, 2 years ago

Attachment: mwe.zip added

Minimal django project reproducing the issue

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