Browse files

Fixed #19351 -- SQLite bulk_insert of more than 500 single-field objs

  • Loading branch information...
1 parent a275824 commit 0a0a0d66b316598f7c296e8bf75749a14ce3ac49 @akaariai akaariai committed Nov 24, 2012
Showing with 13 additions and 1 deletion.
  1. +5 −1 django/db/backends/sqlite3/base.py
  2. +8 −0 tests/regressiontests/bulk_create/tests.py
View
6 django/db/backends/sqlite3/base.py
@@ -120,8 +120,12 @@ def bulk_batch_size(self, fields, objs):
"""
SQLite has a compile-time default (SQLITE_LIMIT_VARIABLE_NUMBER) of
999 variables per query.
+
+ If there is just single field to insert, then we can hit another
+ limit, SQLITE_MAX_COMPOUND_SELECT which defaults to 500.
"""
- return (999 // len(fields)) if len(fields) > 0 else len(objs)
+ limit = 999 if len(fields) > 1 else 500
+ return (limit // len(fields)) if len(fields) > 0 else len(objs)
def date_extract_sql(self, lookup_type, field_name):
# sqlite doesn't support extract, so we fake it with the user-defined
View
8 tests/regressiontests/bulk_create/tests.py
@@ -103,6 +103,14 @@ def test_large_batch(self):
self.assertEqual(TwoFields.objects.filter(f2__gte=901).count(), 101)
@skipUnlessDBFeature('has_bulk_insert')
+ def test_large_single_field_batch(self):
+ # SQLite had a problem with more than 500 UNIONed selects in single
+ # query.
+ Restaurant.objects.bulk_create([
+ Restaurant() for i in range(0, 501)
+ ])
+
+ @skipUnlessDBFeature('has_bulk_insert')
def test_large_batch_efficiency(self):
with override_settings(DEBUG=True):
connection.queries = []

0 comments on commit 0a0a0d6

Please sign in to comment.