diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-07-28 15:05:25 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-07-28 17:36:08 -0400 |
commit | 7997d7fdc3634e7dba9fd0113b8b85ef311bfeaa (patch) | |
tree | 43deaf3902525a018b712d874494bfd45a245ec6 | |
parent | 54670897701fa9b30ac3dd3cdb1511960e338e01 (diff) | |
download | sqlalchemy-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.rst | 15 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/oracle/cx_oracle.py | 17 |
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: |