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
.. 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
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()
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