]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
original comparison regex generates false positives in situations where parameters... 662/head
authorPaul Becotte <pjbecotte@gmail.com>
Mon, 24 Feb 2020 04:54:00 +0000 (23:54 -0500)
committerPaul Becotte <pjbecotte@gmail.com>
Mon, 24 Feb 2020 04:54:00 +0000 (23:54 -0500)
alembic/ddl/impl.py
tests/test_autogen_diffs.py

index 72fc2947ce8ce74a8c125b0440234b652fbe627a..a62a3998104a91e11ca5fe75c4203d331143cf74 100644 (file)
@@ -330,11 +330,15 @@ class DefaultImpl(with_metaclass(ImplMeta)):
 
     def _tokenize_column_type(self, column):
         definition = self.dialect.type_compiler.process(column.type).lower()
-        # py27 - py36 - col_type, *param_terms = re.findall...
-        matches = re.findall("[^(),]+", definition)
-        col_type, param_terms = matches[0], matches[1:]
+        matches = re.search(
+            r"^(?P<col>[^()]*)(?:\((?P<params>.*?)\))?(?P<ext>[^()]*)?$",
+            definition,
+        ).groupdict(default="")
+        col_type = matches["col"]
+        if matches["ext"]:
+            col_type = col_type.strip() + " " + matches["ext"].strip()
         params = Params(col_type, [], {})
-        for term in param_terms:
+        for term in matches["params"].split(",") if matches["params"] else []:
             if "=" in term:
                 key, val = term.split("=")
                 params.kwargs[key.strip()] = val.strip()
index 7a7702f7c840406700ececf9b13071b7f2482b97..52f148cd05acd0882226e923ce6623be18a1e624 100644 (file)
@@ -31,6 +31,7 @@ from sqlalchemy import TypeDecorator
 from sqlalchemy import Unicode
 from sqlalchemy import UniqueConstraint
 from sqlalchemy import VARCHAR
+from sqlalchemy.dialects import mysql
 from sqlalchemy.dialects import sqlite
 from sqlalchemy.types import NULLTYPE
 from sqlalchemy.types import VARBINARY
@@ -842,6 +843,22 @@ class CompareMetadataToInspectorTest(TestBase):
             True,
             config.requirements.integer_subtype_comparisons,
         ),
+        (
+            mysql.INTEGER(unsigned=True, display_width=10),
+            mysql.INTEGER(unsigned=True, display_width=10),
+            False,
+        ),
+        (mysql.INTEGER(unsigned=True), mysql.INTEGER(unsigned=True), False),
+        (
+            mysql.INTEGER(unsigned=True, display_width=10),
+            mysql.INTEGER(unsigned=True),
+            False,
+        ),
+        (
+            mysql.INTEGER(unsigned=True),
+            mysql.INTEGER(unsigned=True, display_width=10),
+            False,
+        ),
     )
     def test_numeric_comparisons(self, cola, colb, expect_changes):
         is_(self._compare_columns(cola, colb), expect_changes)