Commits

Anonymous committed ecbd4c5

queryset-refactor: Fixed a crash when using extra(tables=...). Fixed #7045.

Comments (0)

Files changed (2)

django/db/models/sql/query.py

         for alias in self.tables:
             if not self.alias_refcount[alias]:
                 continue
-            name, alias, join_type, lhs, lhs_col, col, nullable = self.alias_map[alias]
+            try:
+                name, alias, join_type, lhs, lhs_col, col, nullable = self.alias_map[alias]
+            except KeyError:
+                # Extra tables can end up in self.tables, but not in the
+                # alias_map if they aren't in a join. That's OK. We skip them.
+                continue
             alias_str = (alias != name and ' %s' % alias or '')
             if join_type and not first:
                 result.append('%s %s%s ON (%s.%s = %s.%s)'
                 result.append('%s%s%s' % (connector, qn(name), alias_str))
             first = False
         for t in self.extra_tables:
-            alias, created = self.table_alias(t)
-            if created:
+            alias, unused = self.table_alias(t)
+            if alias not in self.alias_map:
                 connector = not first and ', ' or ''
-                result.append('%s%s' % (connector, alias))
+                result.append('%s%s' % (connector, qn(alias)))
                 first = False
         return result, []
 

tests/regressiontests/queries/models.py

 Traceback (most recent call last):
 ...
 IndexError: ...
+
+Bug #7045 -- extra tables used to crash SQL construction on the second use.
+>>> qs = Ranking.objects.extra(tables=['django_site'])
+>>> s = qs.query.as_sql()
+>>> s = qs.query.as_sql()   # test passes if this doesn't raise an exception.
+
 """}