summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/dialects/sqlite/base.py13
-rw-r--r--lib/sqlalchemy/testing/requirements.py5
-rw-r--r--lib/sqlalchemy/testing/suite/test_reflection.py30
3 files changed, 45 insertions, 3 deletions
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py
index 1eea2b6c6..424f91fa6 100644
--- a/lib/sqlalchemy/dialects/sqlite/base.py
+++ b/lib/sqlalchemy/dialects/sqlite/base.py
@@ -1941,17 +1941,24 @@ class SQLiteDialect(default.DefaultDialect):
"sqlite_autoindex"
):
continue
-
indexes.append(dict(name=row[1], column_names=[], unique=row[2]))
# loop thru unique indexes to get the column names.
- for idx in indexes:
+ for idx in list(indexes):
pragma_index = self._get_table_pragma(
connection, "index_info", idx["name"]
)
for row in pragma_index:
- idx["column_names"].append(row[2])
+ if row[2] is None:
+ util.warn(
+ "Skipped unsupported reflection of "
+ "expression-based index %s" % idx["name"]
+ )
+ indexes.remove(idx)
+ break
+ else:
+ idx["column_names"].append(row[2])
return indexes
@reflection.cache
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
@@ -454,6 +454,11 @@ class SuiteRequirements(Requirements):
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"""
return exclusions.open()
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()