Skip to content

Commit 153e7c5

Browse files
andygroveclaude
andauthored
perf: optimize make_word() to avoid unnecessary allocations (apache#2176)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent a175cdb commit 153e7c5

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

src/tokenizer.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -413,16 +413,22 @@ impl Token {
413413
/// When `quote_style` is `None`, the parser attempts a case-insensitive keyword
414414
/// lookup and sets the `Word::keyword` accordingly.
415415
pub fn make_word(word: &str, quote_style: Option<char>) -> Self {
416-
let word_uppercase = word.to_uppercase();
416+
// Only perform keyword lookup for unquoted identifiers.
417+
// Use to_ascii_uppercase() since SQL keywords are ASCII,
418+
// avoiding Unicode case conversion overhead.
419+
let keyword = if quote_style.is_none() {
420+
let word_uppercase = word.to_ascii_uppercase();
421+
ALL_KEYWORDS
422+
.binary_search(&word_uppercase.as_str())
423+
.map_or(Keyword::NoKeyword, |x| ALL_KEYWORDS_INDEX[x])
424+
} else {
425+
Keyword::NoKeyword
426+
};
427+
417428
Token::Word(Word {
418429
value: word.to_string(),
419430
quote_style,
420-
keyword: if quote_style.is_none() {
421-
let keyword = ALL_KEYWORDS.binary_search(&word_uppercase.as_str());
422-
keyword.map_or(Keyword::NoKeyword, |x| ALL_KEYWORDS_INDEX[x])
423-
} else {
424-
Keyword::NoKeyword
425-
},
431+
keyword,
426432
})
427433
}
428434
}

0 commit comments

Comments
 (0)