From: Mike Bayer Date: Fri, 28 Oct 2016 13:17:42 +0000 (-0400) Subject: Unwrap unaryexpression when testing for functional index X-Git-Tag: rel_0_8_9~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=539227fcbf4a7d2196c931696e6aa8ae1cad3dbe;p=thirdparty%2Fsqlalchemy%2Falembic.git Unwrap unaryexpression when testing for functional index 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 --- diff --git a/alembic/ddl/postgresql.py b/alembic/ddl/postgresql.py index e8d8e2fb..fa78e53f 100644 --- a/alembic/ddl/postgresql.py +++ b/alembic/ddl/postgresql.py @@ -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 diff --git a/docs/build/changelog.rst b/docs/build/changelog.rst index fef24e5e..6c1d7d24 100644 --- a/docs/build/changelog.rst +++ b/docs/build/changelog.rst @@ -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 diff --git a/tests/test_autogen_indexes.py b/tests/test_autogen_indexes.py index 9b6cd444..d5f2e7cc 100644 --- a/tests/test_autogen_indexes.py +++ b/tests/test_autogen_indexes.py @@ -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