Opened 5 years ago

Closed 5 years ago

#30822 closed Bug (duplicate)

Oracle Bulk Create TextField fails when there is a mix of short and long string.

Reported by: Ahmet Kucuk Owned by: nobody
Component: Database layer (models, ORM) Version: 2.2
Severity: Normal Keywords:
Cc: Georgi Yanchev Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Ahmet Kucuk)

Following test currently fails because oracle DB backend converts params larger than 4000 to be CLOB.

class OracleTextFieldBulkCreateTests(TestCase):
    @unittest.skipIf(connection.vendor != 'oracle', 'Only an oracle issue')
    def test_text_field_bulk_create(self):
        m1 = ModelD(name='a'*4001)
        m2 = ModelD(name='a')
        ModelD.objects.bulk_create([m1, m2])
DatabaseError: ORA-01790: expression must have same datatype as corresponding expression
  File "django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "django/db/backends/oracle/base.py", line 510, in execute
    return self.cursor.execute(query, self._param_generator(params))

DatabaseError: ORA-01790: expression must have same datatype as corresponding expression
(10 additional frame(s) were not displayed)
...
  File "job_queue/management/commands/worker.py", line 48, in __call__
    return execute(sql, params, many, context)
  File "django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "django/db/backends/oracle/base.py", line 510, in execute
    return self.cursor.execute(query, self._param_generator(params))

Adding TextField: TO_CLOB mapping to the following object seems to fix the issue: https://github.com/django/django/blob/c4e2fc5d9872c9a0c9c052a2e124f8a9b87de9b4/django/db/backends/oracle/utils.py#L34

I am planning to open a PR with the fix if this is an acceptable solution.

Change History (4)

comment:1 by Ahmet Kucuk, 5 years ago

Description: modified (diff)

comment:2 by Ahmet Kucuk, 5 years ago

Description: modified (diff)

comment:3 by Georgi Yanchev, 5 years ago

Cc: Georgi Yanchev added

comment:4 by Mariusz Felisiak, 5 years ago

Resolution: duplicate
Status: newclosed
Summary: Oracle Bulk Create TextField fails when there is a mix of short and long stringOracle Bulk Create TextField fails when there is a mix of short and long string.

Thanks for this report, proposed solution sounds reasonable. Please create a PR and reference to an original ticket #30510. I'll evaluate both patches and choose one of them. I like your proposition because it's minimal and looks sufficient for now. I hope that someday I will have time to refactor bulk_create() on Oracle (see comment) but this can take time.

Duplicate of #30510.

Note: See TracTickets for help on using tickets.
Back to Top