Opened 10 years ago

Closed 10 years ago

#22221 closed Bug (invalid)

Wrong join promotion on ManyToManyField to self with an intermediate model.

Reported by: loic84 Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Generated SQL:

SELECT "m2m_through_personselfrefm2m"."id", "m2m_through_personselfrefm2m"."name"
FROM "m2m_through_personselfrefm2m"
INNER JOIN "m2m_through_friendship" ON ( "m2m_through_personselfrefm2m"."id" = "m2m_through_friendship"."second_id" )
INNER JOIN "m2m_through_friendship" T4 ON ( "m2m_through_personselfrefm2m"."id" = T4."first_id" )
WHERE ("m2m_through_friendship"."first_id" = 1 AND T4."reason" = 'because')

Change History (3)

comment:2 by Anssi Kääriäinen, 10 years ago

I don't see how this is a join promotion issue - why should joins be left joins in the generated SQL for the test case? Both joined fields are checked for equality in the WHERE clause. Left joins can't give more results as the WHERE clause can't match if either T4 or m2m_through_friendship are NULL.

comment:3 by Anssi Kääriäinen, 10 years ago

Resolution: invalid
Status: newclosed

The problem seems to be using the wrong direction in the query. The rel_from_set in tony.friends.filter(rel_from_set...) refers to the *friend's* rel_from_set. That is, it refers to Chris' rel_from_set, and chris isn't the first friend in the relation. I believe the correct query is tony.friend.filter(rel_to_set...). Closing as invalid, do reopen if my analysis seems wrong.

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