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:
parent
e1c1eaf0c6
commit
dc890bef5a
|
@ -54,6 +54,7 @@ class Oracle_datetime(datetime.datetime):
|
|||
|
||||
class BulkInsertMapper:
|
||||
BLOB = 'TO_BLOB(%s)'
|
||||
CBLOB = 'TO_CLOB(%s)'
|
||||
DATE = 'TO_DATE(%s)'
|
||||
INTERVAL = 'CAST(%s as INTERVAL DAY(9) TO SECOND(6))'
|
||||
NUMBER = 'TO_NUMBER(%s)'
|
||||
|
@ -73,5 +74,6 @@ class BulkInsertMapper:
|
|||
'PositiveIntegerField': NUMBER,
|
||||
'PositiveSmallIntegerField': NUMBER,
|
||||
'SmallIntegerField': NUMBER,
|
||||
'TextField': CBLOB,
|
||||
'TimeField': TIMESTAMP,
|
||||
}
|
||||
|
|
|
@ -49,6 +49,16 @@ class BulkCreateTests(TestCase):
|
|||
Country.objects.bulk_create([Country(description='Ж' * 3000)])
|
||||
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):
|
||||
expected_message = "Can't bulk create a multi-table inherited model"
|
||||
with self.assertRaisesMessage(ValueError, expected_message):
|
||||
|
|
Loading…
Reference in New Issue