Skip to content

Commit

Permalink
Fixed #9406 -- Ensure that each database column is only represented o…
Browse files Browse the repository at this point in the history
…nce in the

"ORDER BY" clause of an SQL statement.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@9251 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Oct 24, 2008
1 parent e3aa9a2 commit 9319dc4
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
24 changes: 17 additions & 7 deletions django/db/models/sql/query.py
Expand Up @@ -621,6 +621,12 @@ def get_ordering(self):
asc, desc = ORDER_DIR['ASC']
else:
asc, desc = ORDER_DIR['DESC']

# It's possible, due to model inheritance, that normal usage might try
# to include the same field more than once in the ordering. We track
# the table/column pairs we use and discard any after the first use.
processed_pairs = set()

for field in ordering:
if field == '?':
result.append(self.connection.ops.random_function_sql())
Expand All @@ -638,18 +644,22 @@ def get_ordering(self):
# on verbatim.
col, order = get_order_dir(field, asc)
table, col = col.split('.', 1)
elt = '%s.%s' % (qn(table), col)
if not distinct or elt in select_aliases:
result.append('%s %s' % (elt, order))
if (table, col) not in processed_pairs:
elt = '%s.%s' % (qn(table), col)
processed_pairs.add((table, col))
if not distinct or elt in select_aliases:
result.append('%s %s' % (elt, order))
elif get_order_dir(field)[0] not in self.extra_select:
# 'col' is of the form 'field' or 'field1__field2' or
# '-field1__field2__field', etc.
for table, col, order in self.find_ordering_name(field,
self.model._meta, default_order=asc):
elt = '%s.%s' % (qn(table), qn2(col))
if distinct and elt not in select_aliases:
ordering_aliases.append(elt)
result.append('%s %s' % (elt, order))
if (table, col) not in processed_pairs:
elt = '%s.%s' % (qn(table), qn2(col))
processed_pairs.add((table, col))
if distinct and elt not in select_aliases:
ordering_aliases.append(elt)
result.append('%s %s' % (elt, order))
else:
col, order = get_order_dir(field, asc)
elt = qn2(col)
Expand Down
10 changes: 10 additions & 0 deletions tests/regressiontests/model_inheritance_regress/models.py
Expand Up @@ -257,4 +257,14 @@ class QualityControl(Evaluation):
# without error.
>>> _ = QualityControl.objects.create(headline="Problems in Django", pub_date=datetime.datetime.now(), quality=10, assignee="adrian")
# Ordering should not include any database column more than once (this is most
# likely to ocurr naturally with model inheritance, so we check it here).
# Regression test for #9390. This necessarily pokes at the SQL string for the
# query, since the duplicate problems are only apparent at that late stage.
>>> sql = ArticleWithAuthor.objects.order_by('pub_date', 'pk').query.as_sql()[0]
>>> fragment = sql[sql.find('ORDER BY'):]
>>> pos = fragment.find('pub_date')
>>> fragment.find('pub_date', pos + 1) == -1
True
"""}

0 comments on commit 9319dc4

Please sign in to comment.