diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 0f4ec6cdcf..b8ab1b6fe5 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -425,7 +425,12 @@ class Query(object): 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)' @@ -436,10 +441,10 @@ class Query(object): 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, [] diff --git a/tests/regressiontests/queries/models.py b/tests/regressiontests/queries/models.py index ee167ce604..d99e828c3b 100644 --- a/tests/regressiontests/queries/models.py +++ b/tests/regressiontests/queries/models.py @@ -634,5 +634,11 @@ True 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. + """}