1
0
mirror of https://github.com/django/django.git synced 2025-10-24 06:06:09 +00:00

If an SQL query doesn't specify any ordering, avoid the implicit sort

that happens with MySQL when a "GROUP BY" clause is included. This is a
backend-specific operation, so any other databases requiring similar
encouragement can have a function added to their own backend code.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@9637 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick
2008-12-10 05:19:27 +00:00
parent 7030ab9a72
commit a1cbeb9afb
4 changed files with 36 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ import datetime
import pickle
import sys
from django.conf import settings
from django.db import models
from django.db.models.query import Q, ITER_CHUNK_SIZE
@@ -1053,3 +1054,20 @@ FieldError: Infinite loop caused by ordering.
[]
"""
if settings.DATABASE_ENGINE == "mysql":
__test__["API_TESTS"] += """
When grouping without specifying ordering, we add an explicit "ORDER BY NULL"
portion in MySQL to prevent unnecessary sorting.
>>> query = Tag.objects.values_list('parent_id', flat=True).order_by().query
>>> query.group_by = ['parent_id']
>>> sql = query.as_sql()[0]
>>> fragment = "ORDER BY "
>>> pos = sql.find(fragment)
>>> sql.find(fragment, pos + 1) == -1
True
>>> sql.find("NULL", pos + len(fragment)) == pos + len(fragment)
True
"""