From 19d6bc7acd68f5e93e1ffe9f45b8e8b9021c2151 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Wed, 23 Apr 2008 10:43:42 +0000 Subject: [PATCH] queryset-refactor: Fixed a crash when using extra(tables=...). Fixed #7045. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7447 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/sql/query.py | 13 +++++++++---- tests/regressiontests/queries/models.py | 6 ++++++ 2 files changed, 15 insertions(+), 4 deletions(-) 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. + """}