summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-10-05 18:52:37 +0200
committerGitHub <noreply@github.com>2017-10-05 18:52:37 +0200
commit1b823b8f182e8f31b8c9db281311ef718299eda7 (patch)
treec03b0d904ecfb312c35e66e5346684042234a391
parent86367a11d347c489e450232b19d9ca23e5a9cef4 (diff)
Fixed #28596 -- Fixed QuerySet.bulk_create() and cascade deletion crash on Oracle when using more than 65535 parameters.
Thanks Tim Graham for the review.
-rw-r--r--django/db/backends/oracle/features.py1
-rw-r--r--django/db/backends/oracle/operations.py6
-rw-r--r--tests/backends/oracle/test_operations.py14
3 files changed, 21 insertions, 0 deletions
diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py
index a378372947..71421f0df8 100644
--- a/django/db/backends/oracle/features.py
+++ b/django/db/backends/oracle/features.py
@@ -55,3 +55,4 @@ class DatabaseFeatures(BaseDatabaseFeatures):
"""
supports_callproc_kwargs = True
supports_over_clause = True
+ max_query_params = 2**16 - 1
diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py
index 51df23aedb..5c0f6accae 100644
--- a/django/db/backends/oracle/operations.py
+++ b/django/db/backends/oracle/operations.py
@@ -556,3 +556,9 @@ END;
rhs_sql, rhs_params = rhs
return "NUMTODSINTERVAL(%s - %s, 'DAY')" % (lhs_sql, rhs_sql), lhs_params + rhs_params
return super().subtract_temporals(internal_type, lhs, rhs)
+
+ def bulk_batch_size(self, fields, objs):
+ """Oracle restricts the number of parameters in a query."""
+ if fields:
+ return self.connection.features.max_query_params // len(fields)
+ return len(objs)
diff --git a/tests/backends/oracle/test_operations.py b/tests/backends/oracle/test_operations.py
index d73df9a05c..bcae17cec6 100644
--- a/tests/backends/oracle/test_operations.py
+++ b/tests/backends/oracle/test_operations.py
@@ -9,3 +9,17 @@ class OperationsTests(unittest.TestCase):
def test_sequence_name_truncation(self):
seq_name = connection.ops._get_no_autofield_sequence_name('schema_authorwithevenlongee869')
self.assertEqual(seq_name, 'SCHEMA_AUTHORWITHEVENLOB0B8_SQ')
+
+ def test_bulk_batch_size(self):
+ # Oracle restricts the number of parameters in a query.
+ objects = range(2**16)
+ self.assertEqual(connection.ops.bulk_batch_size([], objects), len(objects))
+ # Each field is a parameter for each object.
+ self.assertEqual(
+ connection.ops.bulk_batch_size(['id'], objects),
+ connection.features.max_query_params,
+ )
+ self.assertEqual(
+ connection.ops.bulk_batch_size(['id', 'other'], objects),
+ connection.features.max_query_params // 2,
+ )