1
0
mirror of https://github.com/django/django.git synced 2025-10-25 22:56:12 +00:00

Fixed #10132 -- Corrected the interaction of extra() queries with the values() clause. Thanks to Glen Maynard for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@9838 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee
2009-02-16 12:29:31 +00:00
parent 58ea6d4561
commit fb64ea7896
3 changed files with 28 additions and 14 deletions

View File

@@ -68,7 +68,7 @@ class BaseQuery(object):
self.tables = [] # Aliases in the order they are created.
self.where = where()
self.where_class = where
self.group_by = []
self.group_by = None
self.having = where()
self.order_by = []
self.low_mark, self.high_mark = 0, None # Used for offset/limit
@@ -177,7 +177,10 @@ class BaseQuery(object):
obj.tables = self.tables[:]
obj.where = deepcopy(self.where)
obj.where_class = self.where_class
obj.group_by = self.group_by[:]
if self.group_by is None:
obj.group_by = None
else:
obj.group_by = self.group_by[:]
obj.having = deepcopy(self.having)
obj.order_by = self.order_by[:]
obj.low_mark, obj.high_mark = self.low_mark, self.high_mark
@@ -272,7 +275,7 @@ class BaseQuery(object):
# If there is a group by clause, aggregating does not add useful
# information but retrieves only the first row. Aggregate
# over the subquery instead.
if self.group_by:
if self.group_by is not None:
from subqueries import AggregateQuery
query = AggregateQuery(self.model, self.connection)
@@ -379,8 +382,8 @@ class BaseQuery(object):
result.append('AND')
result.append(' AND '.join(self.extra_where))
if self.group_by:
grouping = self.get_grouping()
grouping = self.get_grouping()
if grouping:
if ordering:
# If the backend can't group by PK (i.e., any database
# other than MySQL), then any fields mentioned in the
@@ -698,13 +701,15 @@ class BaseQuery(object):
"""
qn = self.quote_name_unless_alias
result = []
for col in self.group_by + self.related_select_cols:
if isinstance(col, (list, tuple)):
result.append('%s.%s' % (qn(col[0]), qn(col[1])))
elif hasattr(col, 'as_sql'):
result.append(col.as_sql(qn))
else:
result.append(str(col))
if self.group_by is not None:
group_by = self.group_by or []
for col in group_by + self.related_select_cols + self.extra_select.keys():
if isinstance(col, (list, tuple)):
result.append('%s.%s' % (qn(col[0]), qn(col[1])))
elif hasattr(col, 'as_sql'):
result.append(col.as_sql(qn))
else:
result.append(str(col))
return result
def get_ordering(self):
@@ -1224,7 +1229,7 @@ class BaseQuery(object):
# Aggregate references a normal field
field_name = field_list[0]
source = opts.get_field(field_name)
if not (self.group_by and is_summary):
if not (self.group_by is not None and is_summary):
# Only use a column alias if this is a
# standalone aggregate, or an annotation
col = (opts.db_table, source.column)
@@ -1816,6 +1821,7 @@ class BaseQuery(object):
primary key, and the query would be equivalent, the optimization
will be made automatically.
"""
self.group_by = []
if self.connection.features.allows_group_by_pk:
if len(self.select) == len(self.model._meta.fields):
self.group_by.append('.'.join([self.model._meta.db_table,