Commit 38e24d68 authored by pegler's avatar pegler Committed by Simon Charette
Browse files

Fixed #21554 -- Incorrect SQL generated when using multiple inheritance.

parent b63acdfe
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -284,25 +284,32 @@ class SQLCompiler(object):
                continue
            alias = self.query.join_parent_model(opts, model, start_alias,
                                                 seen_models)
            column = field.column
            for seen_model, seen_alias in seen_models.items():
                if seen_model and seen_alias == alias:
                    ancestor_link = seen_model._meta.get_ancestor_link(model)
                    if ancestor_link:
                        column = ancestor_link.column
                    break
            table = self.query.alias_map[alias].table_name
            if table in only_load and field.column not in only_load[table]:
            if table in only_load and column not in only_load[table]:
                continue
            if as_pairs:
                result.append((alias, field.column))
                result.append((alias, column))
                aliases.add(alias)
                continue
            if with_aliases and field.column in col_aliases:
            if with_aliases and column in col_aliases:
                c_alias = 'Col%d' % len(col_aliases)
                result.append('%s.%s AS %s' % (qn(alias),
                    qn2(field.column), c_alias))
                    qn2(column), c_alias))
                col_aliases.add(c_alias)
                aliases.add(c_alias)
            else:
                r = '%s.%s' % (qn(alias), qn2(field.column))
                r = '%s.%s' % (qn(alias), qn2(column))
                result.append(r)
                aliases.add(r)
                if with_aliases:
                    col_aliases.add(field.column)
                    col_aliases.add(column)
        return result, aliases

    def get_distinct(self):
+14 −0
Original line number Diff line number Diff line
@@ -233,3 +233,17 @@ class User(models.Model):
class Profile(User):
    profile_id = models.AutoField(primary_key=True)
    extra = models.CharField(max_length=30, blank=True)


# Check concrete + concrete -> concrete -> concrete
class Politician(models.Model):
    politician_id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50)


class Congressman(Person, Politician):
    state = models.CharField(max_length=2)


class Senator(Congressman):
    pass
+8 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ from .models import (Place, Restaurant, ItalianRestaurant, ParkingLot,
    SelfRefChild, ArticleWithAuthor, M2MChild, QualityControl, DerivedM,
    Person, BirthdayParty, BachelorParty, MessyBachelorParty,
    InternalCertificationAudit, BusStation, TrainStation, User, Profile,
    ParkingLot4A, ParkingLot4B)
    ParkingLot4A, ParkingLot4B, Senator)


class ModelInheritanceTest(TestCase):
@@ -455,3 +455,10 @@ class ModelInheritanceTest(TestCase):
        # used in the qs and top contains direct pointer to the bottom model.
        qs = ItalianRestaurant.objects.values_list('serves_gnocchi').filter(name='foo')
        self.assertEqual(str(qs.query).count('JOIN'), 1)

    def test_issue_21554(self):
        senator = Senator.objects.create(
            name='John Doe', title='X', state='Y'
        )

        Senator.objects.get(pk=senator.pk)