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:
@@ -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
|
||||
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user