summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2017-07-28 15:05:25 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2017-07-28 17:36:08 -0400
commit7997d7fdc3634e7dba9fd0113b8b85ef311bfeaa (patch)
tree43deaf3902525a018b712d874494bfd45a245ec6
parent54670897701fa9b30ac3dd3cdb1511960e338e01 (diff)
downloadsqlalchemy-7997d7fdc3634e7dba9fd0113b8b85ef311bfeaa.tar.gz
Revert cx_Oracle WITH_UNICODE change under > 5.0
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. Change-Id: Iddd38d81a5adb27c953a5ee2eae5529a21da16e1 Fixes: #4035
-rw-r--r--doc/build/changelog/unreleased_10/4035.rst15
-rw-r--r--lib/sqlalchemy/dialects/oracle/cx_oracle.py17
2 files changed, 28 insertions, 4 deletions
diff --git a/doc/build/changelog/unreleased_10/4035.rst b/doc/build/changelog/unreleased_10/4035.rst
new file mode 100644
index 000000000..74acdfe71
--- /dev/null
+++ b/doc/build/changelog/unreleased_10/4035.rst
@@ -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.
diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py
index f6c3c97b7..4e9f6314b 100644
--- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py
+++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py
@@ -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: