From 0a6e03d3a484ba3225e6d34090ed6f9f068df677 Mon Sep 17 00:00:00 2001 From: Scott Nemes Date: Tue, 3 Mar 2026 21:20:37 -0800 Subject: [PATCH 1/2] [bug] Fix crash for completion edge case (#1668) --- changelog.md | 5 +++++ mycli/packages/parseutils.py | 2 ++ 2 files changed, 7 insertions(+) diff --git a/changelog.md b/changelog.md index 30ac12cb..1f0bf567 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,11 @@ Features * Improve value-position keywords. +Bug Fixes +--------- +* Fix crash for completion edge case (#1668) + + 1.59.0 (2026/03/03) ============== diff --git a/mycli/packages/parseutils.py b/mycli/packages/parseutils.py index 96c498a1..9e1fa874 100644 --- a/mycli/packages/parseutils.py +++ b/mycli/packages/parseutils.py @@ -259,6 +259,8 @@ def extract_columns_from_select(sql: str) -> list[str]: if isinstance(token, IdentifierList): # multiple columns for identifier in token.get_identifiers(): + if not isinstance(identifier, Identifier): + continue column = identifier.get_real_name() columns.append(column) elif isinstance(token, Identifier): From c9a9726e5c88189584adfbe8921fb1612ac5e3c3 Mon Sep 17 00:00:00 2001 From: Scott Nemes Date: Tue, 3 Mar 2026 21:58:35 -0800 Subject: [PATCH 2/2] Add test. Add additional logic to capture name in edge case of Token vs Identifier --- mycli/packages/parseutils.py | 7 +++++-- test/test_parseutils.py | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/mycli/packages/parseutils.py b/mycli/packages/parseutils.py index 9e1fa874..7a2b341f 100644 --- a/mycli/packages/parseutils.py +++ b/mycli/packages/parseutils.py @@ -259,9 +259,12 @@ def extract_columns_from_select(sql: str) -> list[str]: if isinstance(token, IdentifierList): # multiple columns for identifier in token.get_identifiers(): - if not isinstance(identifier, Identifier): + if isinstance(identifier, Identifier): + column = identifier.get_real_name() + elif isinstance(identifier, Token): + column = identifier.value + else: continue - column = identifier.get_real_name() columns.append(column) elif isinstance(token, Identifier): # single column diff --git a/test/test_parseutils.py b/test/test_parseutils.py index cbdb790a..13d79b0b 100644 --- a/test/test_parseutils.py +++ b/test/test_parseutils.py @@ -3,6 +3,7 @@ import pytest from mycli.packages.parseutils import ( + extract_columns_from_select, extract_tables, extract_tables_from_complete_statements, is_destructive, @@ -13,6 +14,14 @@ ) +def test_extract_columns_from_select(): + try: + columns = extract_columns_from_select("SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS") + except Exception: + columns = [] + assert columns == ["COLUMN_NAME", "DATA_TYPE", "IS_NULLABLE", "COLUMN_DEFAULT"] + + def test_empty_string(): tables = extract_tables("") assert tables == []