From 824a6febc54b31e02a6ea74726005e5c94699e2b Mon Sep 17 00:00:00 2001 From: Steve Hodgson Date: Mon, 23 Feb 2026 12:07:36 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Fix=20O(n=C2=B2)=20performance=20in=20Token?= =?UTF-8?q?List.group=5Ftokens()=20extend=20path?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove eager `grp.value = str(start)` recomputation that caused quadratic complexity when grouping large token lists (e.g. IN clauses with 20k elements). Co-Authored-By: Claude Opus 4.6 --- sqlparse/sql.py | 1 - tests/test_parse.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sqlparse/sql.py b/sqlparse/sql.py index 8425a076..0662019b 100644 --- a/sqlparse/sql.py +++ b/sqlparse/sql.py @@ -348,7 +348,6 @@ def group_tokens(self, grp_cls, start, end, include_end=True, extend=False): grp = start grp.tokens.extend(subtokens) del self.tokens[start_idx + 1 : end_idx] - grp.value = str(start) else: subtokens = self.tokens[start_idx:end_idx] grp = grp_cls(subtokens) diff --git a/tests/test_parse.py b/tests/test_parse.py index 005cc006..773ea883 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -545,7 +545,7 @@ def test_configurable_keywords(): tokens = sqlparse.parse(sql)[0] assert list( - (t.ttype, t.value) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace + (t.ttype, str(t)) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace ) == [ (sqlparse.tokens.Keyword.DML, "select"), (sqlparse.tokens.Wildcard, "*"), @@ -569,7 +569,7 @@ def test_configurable_keywords(): Lexer.get_default_instance().default_initialization() assert list( - (t.ttype, t.value) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace + (t.ttype, str(t.value)) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace ) == [ (sqlparse.tokens.Keyword.DML, "select"), (sqlparse.tokens.Wildcard, "*"), From dbd42b0d44913fda0b182cf32a746b188c2abff1 Mon Sep 17 00:00:00 2001 From: Steve Hodgson Date: Mon, 23 Feb 2026 14:28:17 +0000 Subject: [PATCH 2/2] merge conflict --- tests/test_parse.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_parse.py b/tests/test_parse.py index 773ea883..95f04b3f 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -569,7 +569,7 @@ def test_configurable_keywords(): Lexer.get_default_instance().default_initialization() assert list( - (t.ttype, str(t.value)) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace + (t.ttype, str(t)) for t in tokens if t.ttype not in sqlparse.tokens.Whitespace ) == [ (sqlparse.tokens.Keyword.DML, "select"), (sqlparse.tokens.Wildcard, "*"),