]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Use regexp to parse cx_oracle version string
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 9 May 2017 16:17:04 +0000 (12:17 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 9 May 2017 16:18:27 +0000 (12:18 -0400)
Fixed bug in cx_Oracle dialect where version string parsing would
fail for cx_Oracle version 6.0b1 due to the "b" character.  Version
string parsing is now via a regexp rather than a simple split.

Change-Id: I2af7172b0d7184e3ea3bd051e9fa8d6ca2a571cd
Fixes: #3975
doc/build/changelog/changelog_11.rst
lib/sqlalchemy/dialects/oracle/cx_oracle.py
test/dialect/test_oracle.py

index 2a44a2f1007ee87392a2a710767f4c261ff5f67a..c0abe37a222fa73e6de3de2150db1dd683ed8118 100644 (file)
 .. changelog::
     :version: 1.1.10
 
+    .. change:: 3975
+        :tags: bug, oracle
+        :versions: 1.2.0b1
+        :tickets: 3975
+
+        Fixed bug in cx_Oracle dialect where version string parsing would
+        fail for cx_Oracle version 6.0b1 due to the "b" character.  Version
+        string parsing is now via a regexp rather than a simple split.
+
     .. change:: 3980
         :tags: bug, ext
         :versions: 1.2.0b1
index 93b6987ace4dcf3ab3c2b8fb77343e973b178b72..c2841424587896686b72995a327db3b042aabff0 100644 (file)
@@ -709,8 +709,8 @@ class OracleDialect_cx_oracle(OracleDialect):
         self._retry_on_12516 = _retry_on_12516
 
         if hasattr(self.dbapi, 'version'):
-            self.cx_oracle_ver = tuple([int(x) for x in
-                                        self.dbapi.version.split('.')])
+            self.cx_oracle_ver = self._parse_cx_oracle_ver(self.dbapi.version)
+
         else:
             self.cx_oracle_ver = (0, 0, 0)
 
@@ -778,6 +778,16 @@ class OracleDialect_cx_oracle(OracleDialect):
                 self.dbapi.BINARY: oracle.RAW(),
             }
 
+    def _parse_cx_oracle_ver(self, version):
+        m = re.match(r'(\d+)\.(\d+)(?:\.(\d+))?', version)
+        if m:
+            return tuple(
+                int(x)
+                for x in m.group(1, 2, 3)
+                if x is not None)
+        else:
+            return (0, 0, 0)
+
     @classmethod
     def dbapi(cls):
         import cx_Oracle
index f6e1e14c78690e3c3a805bd78b3a829804ca0191..3219a1b6dd9cbd577a38ae8077411b9398cce706 100644 (file)
@@ -24,6 +24,26 @@ from sqlalchemy import sql
 from sqlalchemy.testing.mock import Mock
 
 
+class DialectTest(fixtures.TestBase):
+    def test_cx_oracle_version_parse(self):
+        dialect = cx_oracle.OracleDialect_cx_oracle()
+
+        eq_(
+            dialect._parse_cx_oracle_ver("5.2"),
+            (5, 2)
+        )
+
+        eq_(
+            dialect._parse_cx_oracle_ver("5.0.1"),
+            (5, 0, 1)
+        )
+
+        eq_(
+            dialect._parse_cx_oracle_ver("6.0b1"),
+            (6, 0)
+        )
+
+
 class OutParamTest(fixtures.TestBase, AssertsExecutionResults):
     __only_on__ = 'oracle+cx_oracle'
     __backend__ = True
@@ -2260,3 +2280,4 @@ class ServiceNameTest(fixtures.TestBase):
             create_engine, url_string,
             _initialize=False
         )
+