﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
15020	Redundant joins generated when using reverse foreign key	Andy Durdin	nobody	"A query using a reverse foreign key generates a left outer join to a related table and a second, redundant left outer join to the original table. 

Tested in Django 1.1 and trunk r15147, and found to be an issue in both.

'''Using these models:'''
{{{
from django.db import models

class Original(models.Model):
    pass # Don't need anything more for this test

class Reference(models.Model):
    original = models.ForeignKey(Original, primary_key=True)
}}}

Background: the `Reference` model is used for storing and testing set membership; an `Original` instance is a member of the set iff its PK is in the `Reference` table.


'''Incorrect query was generated for this queryset:'''
{{{
Original.objects.filter(reference__pk__isnull=True)
}}}

Generated SQL:
{{{
SELECT `fkpk_original`.`id` FROM `fkpk_original`
LEFT OUTER JOIN `fkpk_reference` ON (`fkpk_original`.`id` = `fkpk_reference`.`original_id`)
LEFT OUTER JOIN `fkpk_original` T3 ON (`fkpk_reference`.`original_id` = T3.`id`)
WHERE T3.`id` IS NULL
}}}

Expected SQL:
{{{
SELECT `fkpk_original`.`id` FROM `fkpk_original`
LEFT OUTER JOIN `fkpk_reference` ON (`fkpk_original`.`id` = `fkpk_reference`.`original_id`)
WHERE `fkpk_reference`.`original_id` IS NULL
}}}


'''Notes'''

An incorrect query is also generated for the following queryset; however this seems to be covered by #14056:
{{{
Original.objects.filter(reference__pk__isnull=False)
}}}
"	Bug	closed	Database layer (models, ORM)	dev	Normal	fixed		me@…	Accepted	0	0	0	0	0	0
