mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-28 11:35:19 -04:00
Revert cx_Oracle WITH_UNICODE change under > 5.0
Fixed performance regression caused by the fix for 🎫`3937` where cx_Oracle as of version 5.3 dropped the ``.UNICODE`` symbol from its namespace, which was interpreted as cx_Oracle's "WITH_UNICODE" mode being turned on unconditionally, which invokes functions on the SQLAlchemy side which convert all strings to unicode unconditionally and causing a performance impact. In fact, per cx_Oracle's author the "WITH_UNICODE" mode has been removed entirely as of 5.1, so the expensive unicode conversion functions are no longer necessary and are disabled if cx_Oracle 5.1 or greater is detected under Python 2. The warning against "WITH_UNICODE" mode that was removed under 🎫`3937` is also restored. Change-Id: Iddd38d81a5adb27c953a5ee2eae5529a21da16e1 Fixes: #4035
This commit is contained in:
+15
@@ -0,0 +1,15 @@
|
||||
.. change::
|
||||
:tags: bug, oracle, performance, py2k
|
||||
:tickets: 4035
|
||||
:versions: 1.0.19, 1.1.13, 1.2.0b3
|
||||
|
||||
Fixed performance regression caused by the fix for :ticket:`3937` where
|
||||
cx_Oracle as of version 5.3 dropped the ``.UNICODE`` symbol from its
|
||||
namespace, which was interpreted as cx_Oracle's "WITH_UNICODE" mode being
|
||||
turned on unconditionally, which invokes functions on the SQLAlchemy
|
||||
side which convert all strings to unicode unconditionally and causing
|
||||
a performance impact. In fact, per cx_Oracle's author the
|
||||
"WITH_UNICODE" mode has been removed entirely as of 5.1, so the expensive unicode
|
||||
conversion functions are no longer necessary and are disabled if
|
||||
cx_Oracle 5.1 or greater is detected under Python 2. The warning against
|
||||
"WITH_UNICODE" mode that was removed under :ticket:`3937` is also restored.
|
||||
@@ -723,19 +723,28 @@ class OracleDialect_cx_oracle(OracleDialect):
|
||||
self._cx_oracle_string_types = set()
|
||||
self._cx_oracle_with_unicode = False
|
||||
elif util.py3k or (
|
||||
self.cx_oracle_ver >= (5,) and not \
|
||||
self.cx_oracle_ver >= (5,) and
|
||||
self.cx_oracle_ver < (5, 1) and not
|
||||
hasattr(self.dbapi, 'UNICODE')
|
||||
):
|
||||
# cx_Oracle WITH_UNICODE mode. *only* python
|
||||
# unicode objects accepted for anything
|
||||
# unicode objects accepted for anything. This
|
||||
# mode of operation is implicit for Python 3,
|
||||
# however under Python 2 it existed as a never-used build-time
|
||||
# option for cx_Oracle 5.0 only and was removed in 5.1.
|
||||
self.supports_unicode_statements = True
|
||||
self.supports_unicode_binds = True
|
||||
self._cx_oracle_with_unicode = True
|
||||
|
||||
if util.py2k:
|
||||
# There's really no reason to run with WITH_UNICODE under
|
||||
# Python 2.x. However as of cx_oracle 5.3 it seems to be
|
||||
# set to ON for default builds
|
||||
# Python 2.x. Give the user a hint.
|
||||
util.warn(
|
||||
"cx_Oracle is compiled under Python 2.xx using the "
|
||||
"WITH_UNICODE flag. Consider recompiling cx_Oracle "
|
||||
"without this flag, which is in no way necessary for "
|
||||
"full support of Unicode and causes significant "
|
||||
"performance issues.")
|
||||
self.execution_ctx_cls = \
|
||||
OracleExecutionContext_cx_oracle_with_unicode
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user