From: Mike Bayer Date: Mon, 12 Dec 2022 23:05:07 +0000 (-0500) Subject: check index_list pragma for number of columns returned X-Git-Tag: rel_2_0_0rc1~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a8d76cff39dbaf6354d42d35cd68332df469d124;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git check index_list pragma for number of columns returned 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. Fixes: #8969 Change-Id: If317cdcfc6782f7e180df329b6ea0ddb48ce2269 --- diff --git a/doc/build/changelog/unreleased_14/8969.rst b/doc/build/changelog/unreleased_14/8969.rst new file mode 100644 index 0000000000..8458706c80 --- /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 fb9a19c89b..5d8b3fbad8 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 07117b862e..c52c9f195a 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 83cd65cd89..2e0ad0afe7 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(