From 08994cb97c501a3cf984fd827eba9aa9614b9dd3 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 9 Jan 2019 11:42:02 -0500 Subject: Skip expression-based index reflection for SQLite Reflection of an index based on SQL expressions are now skipped with a warning, in the same way as that of the Postgresql dialect, where we currently do not support reflecting indexes that have SQL expressions within them. Previously, an index with columns of None were produced which would break tools like Alembic. Fixes: #4431 Change-Id: I1363ade912d206b42669331e2be2bb6f444b65a2 --- lib/sqlalchemy/testing/requirements.py | 5 +++++ lib/sqlalchemy/testing/suite/test_reflection.py | 30 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) (limited to 'lib/sqlalchemy/testing') diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 941a9458b..ce9954cfd 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -453,6 +453,11 @@ class SuiteRequirements(Requirements): def index_reflection(self): return exclusions.open() + @property + def indexes_with_expressions(self): + """target database supports CREATE INDEX against SQL expressions.""" + return exclusions.closed() + @property def unique_constraint_reflection(self): """target dialect supports reflection of unique constraints""" diff --git a/lib/sqlalchemy/testing/suite/test_reflection.py b/lib/sqlalchemy/testing/suite/test_reflection.py index 96bd188ee..d589c046f 100644 --- a/lib/sqlalchemy/testing/suite/test_reflection.py +++ b/lib/sqlalchemy/testing/suite/test_reflection.py @@ -6,6 +6,7 @@ from .. import assert_raises_message from .. import config from .. import engines from .. import eq_ +from .. import expect_warnings from .. import fixtures from .. import is_ from ..schema import Column @@ -792,6 +793,35 @@ class ComponentReflectionTest(fixtures.TablesTest): def test_get_noncol_index_pk(self): self._test_get_noncol_index("noncol_idx_test_pk", "noncol_idx_pk") + @testing.requires.indexes_with_expressions + @testing.provide_metadata + def test_reflect_expression_based_indexes(self): + Table( + "t", + self.metadata, + Column("x", String(30)), + Column("y", String(30)), + ) + event.listen( + self.metadata, + "after_create", + DDL("CREATE INDEX t_idx ON t(lower(x), lower(y))"), + ) + event.listen( + self.metadata, "after_create", DDL("CREATE INDEX t_idx_2 ON t(x)") + ) + self.metadata.create_all() + + insp = inspect(self.metadata.bind) + + with expect_warnings( + "Skipped unsupported reflection of expression-based index t_idx" + ): + eq_( + insp.get_indexes("t"), + [{"name": "t_idx_2", "column_names": ["x"], "unique": 0}], + ) + @testing.requires.unique_constraint_reflection def test_get_unique_constraints(self): self._test_get_unique_constraints() -- cgit v1.2.1