summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_14/8969.rst10
-rw-r--r--lib/sqlalchemy/dialects/sqlite/base.py2
-rw-r--r--test/dialect/test_sqlite.py1
-rw-r--r--test/requirements.py24
4 files changed, 36 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_14/8969.rst b/doc/build/changelog/unreleased_14/8969.rst
new file mode 100644
index 000000000..8458706c8
--- /dev/null
+++ b/doc/build/changelog/unreleased_14/8969.rst
@@ -0,0 +1,10 @@
+.. change::
+ :tags: bug, sqlite
+ :tickets: 8969
+ :versions: 2.0.0b5
+
+ Fixed regression caused by new support for reflection of partial indexes on
+ SQLite added in 1.4.45 for :ticket:`8804`, where the ``index_list`` pragma
+ command in very old versions of SQLite (possibly prior to 3.8.9) does not
+ return the current expected number of columns, leading to exceptions raised
+ when reflecting tables and indexes.
diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py
index fb9a19c89..5d8b3fbad 100644
--- a/lib/sqlalchemy/dialects/sqlite/base.py
+++ b/lib/sqlalchemy/dialects/sqlite/base.py
@@ -2670,7 +2670,7 @@ class SQLiteDialect(default.DefaultDialect):
)
# check partial indexes
- if row[4]:
+ if len(row) >= 5 and row[4]:
s = (
"SELECT sql FROM %(schema)ssqlite_master "
"WHERE name = ? "
diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py
index 07117b862..c52c9f195 100644
--- a/test/dialect/test_sqlite.py
+++ b/test/dialect/test_sqlite.py
@@ -2360,6 +2360,7 @@ class ConstraintReflectionTest(fixtures.TestBase):
],
)
+ @testing.requires.sqlite_partial_indexes
def test_reflect_partial_indexes(self, connection):
connection.exec_driver_sql(
"create table foo_with_partial_index (x integer, y integer)"
diff --git a/test/requirements.py b/test/requirements.py
index 83cd65cd8..2e0ad0afe 100644
--- a/test/requirements.py
+++ b/test/requirements.py
@@ -1133,6 +1133,30 @@ class DefaultRequirements(SuiteRequirements):
def sqlite_memory(self):
return only_on(self._sqlite_memory_db)
+ def _sqlite_partial_idx(self, config):
+ if not against(config, "sqlite"):
+ return False
+ else:
+ with config.db.connect() as conn:
+ connection = conn.connection
+ cursor = connection.cursor()
+ try:
+ cursor.execute("SELECT * FROM pragma_index_info('idx52')")
+ except:
+ return False
+ else:
+ return (
+ cursor.description is not None
+ and len(cursor.description) >= 3
+ )
+ finally:
+ cursor.close()
+
+ @property
+ def sqlite_partial_indexes(self):
+
+ return only_on(self._sqlite_partial_idx)
+
@property
def reflects_json_type(self):
return only_on(