Skip to main content

rigsql_lexer/
keywords.rs

1/// SQL reserved keywords (ANSI + common TSQL/PostgreSQL).
2/// Must be sorted alphabetically for binary_search.
3pub static RESERVED_KEYWORDS: &[&str] = &[
4    "ADD",
5    "ALL",
6    "ALTER",
7    "AND",
8    "ANY",
9    "AS",
10    "ASC",
11    "BEGIN",
12    "BETWEEN",
13    "BREAK",
14    "BY",
15    "CASE",
16    "CAST",
17    "CATCH",
18    "CHECK",
19    "CLOSE",
20    "CLUSTERED",
21    "COALESCE",
22    "COLUMN",
23    "COMMIT",
24    "CONSTRAINT",
25    "CONTINUE",
26    "CONVERT",
27    "CREATE",
28    "CROSS",
29    "CURRENT",
30    "CURRENT_DATE",
31    "CURRENT_TIME",
32    "CURRENT_TIMESTAMP",
33    "CURSOR",
34    "DEALLOCATE",
35    "DECLARE",
36    "DEFAULT",
37    "DELETE",
38    "DESC",
39    "DISTINCT",
40    "DROP",
41    "ELSE",
42    "END",
43    "EXCEPT",
44    "EXEC",
45    "EXECUTE",
46    "EXISTS",
47    "FALSE",
48    "FETCH",
49    "FOLLOWING",
50    "FOR",
51    "FOREIGN",
52    "FROM",
53    "FULL",
54    "FUNCTION",
55    "GO",
56    "GOTO",
57    "GROUP",
58    "GROUPS",
59    "HAVING",
60    "HOLDLOCK",
61    "IDENTITY",
62    "IF",
63    "IN",
64    "INDEX",
65    "INNER",
66    "INSERT",
67    "INTERSECT",
68    "INTO",
69    "IS",
70    "JOIN",
71    "KEY",
72    "LEFT",
73    "LIKE",
74    "LIMIT",
75    "MERGE",
76    "NEXT",
77    "NOCOUNT",
78    "NONCLUSTERED",
79    "NOLOCK",
80    "NOT",
81    "NULL",
82    "NULLIF",
83    "OFFSET",
84    "ON",
85    "OPEN",
86    "OR",
87    "ORDER",
88    "OUTER",
89    "OUTPUT",
90    "OVER",
91    "PARTITION",
92    "PRECEDING",
93    "PRIMARY",
94    "PRINT",
95    "PROCEDURE",
96    "RAISERROR",
97    "RANGE",
98    "REFERENCES",
99    "RETURN",
100    "RETURNING",
101    "RIGHT",
102    "ROLLBACK",
103    "ROW",
104    "ROWLOCK",
105    "ROWS",
106    "SCOPE_IDENTITY",
107    "SELECT",
108    "SET",
109    "TABLE",
110    "THEN",
111    "THROW",
112    "TOP",
113    "TRAN",
114    "TRANSACTION",
115    "TRIGGER",
116    "TRUE",
117    "TRUNCATE",
118    "TRY",
119    "UNBOUNDED",
120    "UNION",
121    "UNIQUE",
122    "UPDATE",
123    "UPDLOCK",
124    "USE",
125    "USING",
126    "VALUES",
127    "WHEN",
128    "WHERE",
129    "WHILE",
130    "WITH",
131];
132
133/// Check if a word (case-insensitive) is a reserved keyword.
134/// Uses zero-allocation binary search with byte-level comparison.
135pub fn is_keyword(word: &str) -> bool {
136    RESERVED_KEYWORDS
137        .binary_search_by(|kw| {
138            kw.as_bytes()
139                .iter()
140                .copied()
141                .cmp(word.as_bytes().iter().map(|b| b.to_ascii_uppercase()))
142        })
143        .is_ok()
144}