[1.2.X] Committing missing files from [13859].

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@13861 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Ian Kelly 2010-09-16 19:58:25 +00:00
parent a63bea3e3b
commit 1fb572a6d6
3 changed files with 29 additions and 2 deletions

View File

@ -233,6 +233,13 @@ class BaseDatabaseOperations(object):
""" """
return "%s" return "%s"
def max_in_list_size(self):
"""
Returns the maximum number of items that can be passed in a single 'IN'
list condition, or None if the backend does not impose a limit.
"""
return None
def max_name_length(self): def max_name_length(self):
""" """
Returns the maximum length of table and column names, or None if there Returns the maximum length of table and column names, or None if there

View File

@ -178,6 +178,9 @@ WHEN (new.%(col_name)s IS NULL)
return "UPPER(%s)" return "UPPER(%s)"
return "%s" return "%s"
def max_in_list_size(self):
return 1000
def max_name_length(self): def max_name_length(self):
return 30 return 30

View File

@ -2,6 +2,7 @@
Code to manage the creation and SQL rendering of 'where' constraints. Code to manage the creation and SQL rendering of 'where' constraints.
""" """
import datetime import datetime
from itertools import repeat
from django.utils import tree from django.utils import tree
from django.db.models.fields import Field from django.db.models.fields import Field
@ -178,8 +179,24 @@ class WhereNode(tree.Node):
raise EmptyResultSet raise EmptyResultSet
if extra: if extra:
return ('%s IN %s' % (field_sql, extra), params) return ('%s IN %s' % (field_sql, extra), params)
return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * len(params))), max_in_list_size = connection.ops.max_in_list_size()
params) if max_in_list_size and len(params) > max_in_list_size:
# Break up the params list into an OR of manageable chunks.
in_clause_elements = ['(']
for offset in xrange(0, len(params), max_in_list_size):
if offset > 0:
in_clause_elements.append(' OR ')
in_clause_elements.append('%s IN (' % field_sql)
group_size = min(len(params) - offset, max_in_list_size)
param_group = ', '.join(repeat('%s', group_size))
in_clause_elements.append(param_group)
in_clause_elements.append(')')
in_clause_elements.append(')')
return ''.join(in_clause_elements), params
else:
return ('%s IN (%s)' % (field_sql,
', '.join(repeat('%s', len(params)))),
params)
elif lookup_type in ('range', 'year'): elif lookup_type in ('range', 'year'):
return ('%s BETWEEN %%s and %%s' % field_sql, params) return ('%s BETWEEN %%s and %%s' % field_sql, params)
elif lookup_type in ('month', 'day', 'week_day'): elif lookup_type in ('month', 'day', 'week_day'):