Author: ikelly
Date: 2010-09-16 14:58:25 -0500 (Thu, 16 Sep 2010)
New Revision: 13861

Modified:
   django/branches/releases/1.2.X/
   django/branches/releases/1.2.X/django/db/backends/__init__.py
   django/branches/releases/1.2.X/django/db/backends/oracle/base.py
   django/branches/releases/1.2.X/django/db/models/sql/where.py
Log:
[1.2.X] Committing missing files from [13859].


Property changes on: django/branches/releases/1.2.X
___________________________________________________________________
Name: svnmerge-integrated
   - 
/django/trunk:1-13360,13400,13434,13480,13574,13600,13638,13652,13664,13666,13668,13680,13683,13685,13687-13688,13690,13694,13696,13701-13702,13705,13709,13712,13715,13717,13732,13735
   + 
/django/trunk:1-13360,13400,13434,13480,13574,13600,13638,13652,13664,13666,13668,13680,13683,13685,13687-13688,13690,13694,13696,13701-13702,13705,13709,13712,13715,13717,13732,13735,13859

Modified: django/branches/releases/1.2.X/django/db/backends/__init__.py
===================================================================
--- django/branches/releases/1.2.X/django/db/backends/__init__.py       
2010-09-16 19:56:39 UTC (rev 13860)
+++ django/branches/releases/1.2.X/django/db/backends/__init__.py       
2010-09-16 19:58:25 UTC (rev 13861)
@@ -233,6 +233,13 @@
         """
         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):
         """
         Returns the maximum length of table and column names, or None if there

Modified: django/branches/releases/1.2.X/django/db/backends/oracle/base.py
===================================================================
--- django/branches/releases/1.2.X/django/db/backends/oracle/base.py    
2010-09-16 19:56:39 UTC (rev 13860)
+++ django/branches/releases/1.2.X/django/db/backends/oracle/base.py    
2010-09-16 19:58:25 UTC (rev 13861)
@@ -178,6 +178,9 @@
             return "UPPER(%s)"
         return "%s"
 
+    def max_in_list_size(self):
+        return 1000
+
     def max_name_length(self):
         return 30
 

Modified: django/branches/releases/1.2.X/django/db/models/sql/where.py
===================================================================
--- django/branches/releases/1.2.X/django/db/models/sql/where.py        
2010-09-16 19:56:39 UTC (rev 13860)
+++ django/branches/releases/1.2.X/django/db/models/sql/where.py        
2010-09-16 19:58:25 UTC (rev 13861)
@@ -2,6 +2,7 @@
 Code to manage the creation and SQL rendering of 'where' constraints.
 """
 import datetime
+from itertools import repeat
 
 from django.utils import tree
 from django.db.models.fields import Field
@@ -178,8 +179,24 @@
                 raise EmptyResultSet
             if extra:
                 return ('%s IN %s' % (field_sql, extra), params)
-            return ('%s IN (%s)' % (field_sql, ', '.join(['%s'] * 
len(params))),
-                    params)
+            max_in_list_size = connection.ops.max_in_list_size()
+            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'):
             return ('%s BETWEEN %%s and %%s' % field_sql, params)
         elif lookup_type in ('month', 'day', 'week_day'):

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to