From 62aac6593a12bbdd3d19ea184147fe650bdd6f5e Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Fri, 13 Aug 2021 08:33:13 -0700 Subject: [PATCH] Handle some error conditions --- datasette/utils/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/datasette/utils/__init__.py b/datasette/utils/__init__.py index 69c72566..a66bf0a1 100644 --- a/datasette/utils/__init__.py +++ b/datasette/utils/__init__.py @@ -1098,6 +1098,8 @@ def columns_for_query(conn, sql, params=None): per returned column. ``(None, None)`` if no table and column could be derived. """ + if sql.lower().strip().startswith("explain"): + return [] rows = conn.execute("explain " + sql, params).fetchall() table_rootpage_by_register = { r["p1"]: r["p2"] for r in rows if r["opcode"] == "OpenRead" @@ -1113,8 +1115,11 @@ def columns_for_query(conn, sql, params=None): for row in rows: if row["opcode"] in ("Rowid", "Column"): addr, opcode, table_id, cid, column_register, p4, p5, comment = row - table = names_by_rootpage[table_rootpage_by_register[table_id]] - columns_by_column_register[column_register] = (table, cid) + try: + table = names_by_rootpage[table_rootpage_by_register[table_id]] + columns_by_column_register[column_register] = (table, cid) + except KeyError: + pass result_row = [dict(r) for r in rows if r["opcode"] == "ResultRow"][0] registers = list(range(result_row["p1"], result_row["p1"] + result_row["p2"])) all_column_names = {}