Skip to content

Commit

Permalink
Fixed #35295 -- Used INSERT with multiple rows on Oracle 23c.
Browse files Browse the repository at this point in the history
  • Loading branch information
felixxm committed Mar 14, 2024
1 parent 912f72a commit 175b049
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
4 changes: 4 additions & 0 deletions django/db/backends/oracle/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,10 @@ def supports_boolean_expr_in_select_clause(self):
def supports_aggregation_over_interval_types(self):
return self.connection.oracle_version >= (23,)

@cached_property
def supports_bulk_insert_with_multiple_rows(self):
return self.connection.oracle_version >= (23,)

@cached_property
def bare_select_suffix(self):
return "" if self.connection.oracle_version >= (23,) else " FROM DUAL"
18 changes: 18 additions & 0 deletions django/db/backends/oracle/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,24 @@ def bulk_insert_sql(self, fields, placeholder_rows):
for field in fields
if field
]
if (
self.connection.features.supports_bulk_insert_with_multiple_rows
# A workaround with UNION of SELECTs is required for models without
# any fields.
and field_placeholders
):
placeholder_rows_sql = []
for row in placeholder_rows:
placeholders_row = (
field_placeholder % placeholder
for field_placeholder, placeholder in zip(
field_placeholders, row, strict=True
)
)
placeholder_rows_sql.append(placeholders_row)
return super().bulk_insert_sql(fields, placeholder_rows_sql)
# Oracle < 23c doesn't support inserting multiple rows in a single
# statement, use UNION of SELECTs as a workaround.
query = []
for row in placeholder_rows:
select = []
Expand Down

0 comments on commit 175b049

Please sign in to comment.