summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAhmet Kucuk <ahmetkucuk92@gmail.com>2019-10-01 01:42:48 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-10-01 13:11:19 +0200
commit9dc13f41b5c80941d4873ce0791b83afd8f7c1ca (patch)
tree668a81d69b7456d8677258c1492fba1d3ef4917e
parenta135e1e16ebbac86ec09022a34b01316ca17a42f (diff)
[3.0.x] 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. Backport of dc890bef5ad8e9fccce55f3e64af72103ea6e8c1 from master
-rw-r--r--django/db/backends/oracle/utils.py2
-rw-r--r--tests/bulk_create/tests.py10
2 files changed, 12 insertions, 0 deletions
diff --git a/django/db/backends/oracle/utils.py b/django/db/backends/oracle/utils.py
index fdd6dee617..513ea5e82e 100644
--- a/django/db/backends/oracle/utils.py
+++ b/django/db/backends/oracle/utils.py
@@ -51,6 +51,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)'
@@ -70,5 +71,6 @@ class BulkInsertMapper:
'PositiveIntegerField': NUMBER,
'PositiveSmallIntegerField': NUMBER,
'SmallIntegerField': NUMBER,
+ 'TextField': CBLOB,
'TimeField': TIMESTAMP,
}
diff --git a/tests/bulk_create/tests.py b/tests/bulk_create/tests.py
index 08c753a826..47aa7afcdc 100644
--- a/tests/bulk_create/tests.py
+++ b/tests/bulk_create/tests.py
@@ -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):