]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
Unwrap unaryexpression when testing for functional index
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 28 Oct 2016 13:17:42 +0000 (09:17 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 28 Oct 2016 13:39:32 +0000 (09:39 -0400)
Fixed bug in Postgresql "functional index skip" behavior where a
functional index that ended in ASC/DESC wouldn't be detected as something
we can't compare in autogenerate, leading to duplicate definitions
in autogenerated files.

Change-Id: I0fdfee69a89da575078a687bb4551088fb1b67d7
Fixes: #392
alembic/ddl/postgresql.py
docs/build/changelog.rst
tests/test_autogen_indexes.py

index e8d8e2fbdbeb18d9041758305f3d3351ea7c752f..fa78e53fbba19143e745a58922ba5f1d5c23686b 100644 (file)
@@ -162,7 +162,9 @@ class PostgresqlImpl(DefaultImpl):
             else:
                 exprs = idx.columns
             for expr in exprs:
-                if not isinstance(expr, (Column, UnaryExpression)):
+                while isinstance(expr, UnaryExpression):
+                    expr = expr.element
+                if not isinstance(expr, Column):
                     util.warn(
                         "autogenerate skipping functional index %s; "
                         "not supported by SQLAlchemy reflection" % idx.name
index fef24e5e4121831a4e22788729062ca357727ce6..6c1d7d24539011215b36c3a52cc2022260c5c051 100644 (file)
@@ -6,6 +6,15 @@ Changelog
 .. changelog::
     :version: 0.8.9
 
+    .. change::
+      :tags: bug, autogenerate, postgresql
+      :tickets: 392
+
+      Fixed bug in Postgresql "functional index skip" behavior where a
+      functional index that ended in ASC/DESC wouldn't be detected as something
+      we can't compare in autogenerate, leading to duplicate definitions
+      in autogenerated files.
+
     .. change::
       :tags: bug, versioning
 
index 9b6cd444a1cc3b1ad411abbeba1184b340615458..d5f2e7ccb226a60142d93cb033cc55a8faf42547 100644 (file)
@@ -640,7 +640,7 @@ class PGUniqueIndexTest(AutogenerateUniqueIndexTest):
         eq_(diffs[0][1].name, "uq_name")
         eq_(len(diffs), 1)
 
-    def test_functional_ix(self):
+    def test_functional_ix_one(self):
         m1 = MetaData()
         m2 = MetaData()
 
@@ -665,6 +665,37 @@ class PGUniqueIndexTest(AutogenerateUniqueIndexTest):
             diffs = self._fixture(m1, m2)
         eq_(diffs, [])
 
+    def test_functional_ix_two(self):
+        m1 = MetaData()
+        m2 = MetaData()
+
+        t1 = Table(
+            'foo', m1,
+            Column('id', Integer, primary_key=True),
+            Column('email', String(50)),
+            Column('name', String(50))
+        )
+        Index(
+            "email_idx",
+            func.coalesce(t1.c.email, t1.c.name).desc(), unique=True)
+
+        t2 = Table(
+            'foo', m2,
+            Column('id', Integer, primary_key=True),
+            Column('email', String(50)),
+            Column('name', String(50))
+        )
+        Index(
+            "email_idx",
+            func.coalesce(t2.c.email, t2.c.name).desc(), unique=True)
+
+        with assertions.expect_warnings(
+                "Skipped unsupported reflection",
+                "autogenerate skipping functional index"
+        ):
+            diffs = self._fixture(m1, m2)
+        eq_(diffs, [])
+
 
 class MySQLUniqueIndexTest(AutogenerateUniqueIndexTest):
     reports_unnamed_constraints = True