]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
check index_list pragma for number of columns returned
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 12 Dec 2022 23:05:07 +0000 (18:05 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 13 Dec 2022 14:49:30 +0000 (09:49 -0500)
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

doc/build/changelog/unreleased_14/8969.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/sqlite/base.py
test/dialect/test_sqlite.py
test/requirements.py

diff --git a/doc/build/changelog/unreleased_14/8969.rst b/doc/build/changelog/unreleased_14/8969.rst
new file mode 100644 (file)
index 0000000..8458706
--- /dev/null
@@ -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.
index fb9a19c89ba1d146194a3cd5957d5994978d109b..5d8b3fbad8bc08bc4bd834a63abc06639a1f80fb 100644 (file)
@@ -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 = ? "
index 07117b862ef301f8efa30fd4e67dfbf788325d28..c52c9f195a8719bcd34588cc923b9cfb3653c615 100644 (file)
@@ -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)"
index 83cd65cd890aa56d3e1ea3878450f4687348e74c..2e0ad0afe763bb4775b9ee786888a6ab8845a109 100644 (file)
@@ -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(