Hello, akaariai has proposed a patch that solves the bug described below.
It is attached to ticket #16715. How do we proceed from here? Sebastian. On Thu, 29 Sep 2011 21:52:23 +0200 Sebastian Goll <[email protected]> wrote: > Hello, > > I'd like to draw your attention to ticket #16715: > > "Wrong JOIN with nested null-able foreign keys" > https://code.djangoproject.com/ticket/16715 > > > It seems that the Django query generator sometimes picks the wrong join type > in the following situation: > > Model A > | (Relation A/B: null=True) > v > Model B > | (Relation B/C: null=False) > v > Model C > > > A priori, the correct/default join for Relation A/B is LEFT OUTER JOIN, while > the correct join for Relation B/C is INNER JOIN. > > However, when combining all three models, the join between Model B and C must > be promoted to LEFT OUTER JOIN. If we wouldn't do that, instances of Model A > that do not reference an instance of Model B would be missing in the > resulting queryset: the INNER JOIN wouldn't be able find the matching Model C > with a primary key of NULL which results from the join between Models A and B > for As without referenced Bs. > > This promotion works in most cases and is done in > django/db/models/sql/query.py, methods 'promote_alias' and > 'promote_alias_chain' of class Query. > > > However, the promotion fails, and Django falls back to the wrong INNER JOIN > for Relation B/C in at least some cases involving 'select_related' and > 'values'. In those cases the relation between A and B can either be an > explicit foreign key (A -> B) or an implicit/reverse one such as introduced > by one-to-one relations (e.g. in multi-table inheritance). > > I outlined those cases in #16715. I also provided two semi-elaborate tests > for my observation ("wrong-join-test-r16910.patch" and > "nested-foreign-key-test-r16914.patch"). > > > What do you think? Is this something that can be fixed easily? My fears are > that this points to some deeper problem within the query generator, in which > the generator fails to correctly promote the join type for the nested > relation. > > Sebastian. -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.
