Fixed SQLite's collapsing of same-valued instances in bulk_create

SQLite used INSERT INTO tbl SELECT %s UNION SELECT %s, the problem
was that there should have been UNION ALL instead of UNION.

Refs #19351
This commit is contained in:
Anssi Kääriäinen 2012-11-24 00:28:20 +02:00
parent 5c81e9de0f
commit a27582484c
2 changed files with 9 additions and 1 deletions

View File

@ -227,7 +227,7 @@ class DatabaseOperations(BaseDatabaseOperations):
res.append("SELECT %s" % ", ".join( res.append("SELECT %s" % ", ".join(
"%%s AS %s" % self.quote_name(f.column) for f in fields "%%s AS %s" % self.quote_name(f.column) for f in fields
)) ))
res.extend(["UNION SELECT %s" % ", ".join(["%s"] * len(fields))] * (num_values - 1)) res.extend(["UNION ALL SELECT %s" % ", ".join(["%s"] * len(fields))] * (num_values - 1))
return " ".join(res) return " ".join(res)
class DatabaseWrapper(BaseDatabaseWrapper): class DatabaseWrapper(BaseDatabaseWrapper):

View File

@ -82,6 +82,14 @@ class BulkCreateTests(TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
Country.objects.bulk_create([valid_country, invalid_country]) Country.objects.bulk_create([valid_country, invalid_country])
def test_batch_same_vals(self):
# Sqlite had a problem where all the same-valued models were
# collapsed to one insert.
Restaurant.objects.bulk_create([
Restaurant(name='foo') for i in range(0, 2)
])
self.assertEqual(Restaurant.objects.count(), 2)
def test_large_batch(self): def test_large_batch(self):
with override_settings(DEBUG=True): with override_settings(DEBUG=True):
connection.queries = [] connection.queries = []