Fixed #30510 -- Fixed crash of QuerySet.bulk_create() with mixed-length texts on Oracle.

Text with more than 4000 characters must be set to as a CLOB on Oracle
what caused a mixed datatype error (ORA-01790) when shorter text
appeared in the same operation.
This commit is contained in:
Ahmet Kucuk 2019-10-01 01:42:48 -04:00 committed by Mariusz Felisiak
parent e1c1eaf0c6
commit dc890bef5a
2 changed files with 12 additions and 0 deletions

View File

@ -54,6 +54,7 @@ class Oracle_datetime(datetime.datetime):
class BulkInsertMapper: class BulkInsertMapper:
BLOB = 'TO_BLOB(%s)' BLOB = 'TO_BLOB(%s)'
CBLOB = 'TO_CLOB(%s)'
DATE = 'TO_DATE(%s)' DATE = 'TO_DATE(%s)'
INTERVAL = 'CAST(%s as INTERVAL DAY(9) TO SECOND(6))' INTERVAL = 'CAST(%s as INTERVAL DAY(9) TO SECOND(6))'
NUMBER = 'TO_NUMBER(%s)' NUMBER = 'TO_NUMBER(%s)'
@ -73,5 +74,6 @@ class BulkInsertMapper:
'PositiveIntegerField': NUMBER, 'PositiveIntegerField': NUMBER,
'PositiveSmallIntegerField': NUMBER, 'PositiveSmallIntegerField': NUMBER,
'SmallIntegerField': NUMBER, 'SmallIntegerField': NUMBER,
'TextField': CBLOB,
'TimeField': TIMESTAMP, 'TimeField': TIMESTAMP,
} }

View File

@ -49,6 +49,16 @@ class BulkCreateTests(TestCase):
Country.objects.bulk_create([Country(description='Ж' * 3000)]) Country.objects.bulk_create([Country(description='Ж' * 3000)])
self.assertEqual(Country.objects.count(), 1) self.assertEqual(Country.objects.count(), 1)
@skipUnlessDBFeature('has_bulk_insert')
def test_long_and_short_text(self):
Country.objects.bulk_create([
Country(description='a' * 4001),
Country(description='a'),
Country(description='Ж' * 2001),
Country(description='Ж'),
])
self.assertEqual(Country.objects.count(), 4)
def test_multi_table_inheritance_unsupported(self): def test_multi_table_inheritance_unsupported(self):
expected_message = "Can't bulk create a multi-table inherited model" expected_message = "Can't bulk create a multi-table inherited model"
with self.assertRaisesMessage(ValueError, expected_message): with self.assertRaisesMessage(ValueError, expected_message):