Skip to main content

tursotui_sql/
keywords.rs

1//! Single source of truth for SQL keyword, function, type, and operator constants.
2//!
3//! Both the syntax highlighter and autocomplete engine import from here
4//! instead of maintaining their own duplicate lists.
5
6/// SQL keywords (uppercase for matching; input is uppercased before comparison).
7///
8/// Union of all keyword lists from the highlighter and autocomplete engine.
9/// Sorted alphabetically for maintainability. Does NOT include word operators
10/// (AND/OR/NOT) — those are in [`SQL_WORD_OPERATORS`].
11///
12/// Note: REPLACE appears in both this list and [`SQL_FUNCTIONS`] intentionally.
13/// When followed by `(` it is the `REPLACE()` string function; bare `REPLACE`
14/// (as in `INSERT OR REPLACE`) is a keyword. Consumers must preserve this
15/// precedence logic (check functions before keywords when `(` follows).
16pub const SQL_KEYWORDS: &[&str] = &[
17    "ABORT",
18    "ADD",
19    "ALL",
20    "ALTER",
21    "ANALYZE",
22    "ANY",
23    "AS",
24    "ASC",
25    "ATTACH",
26    "AUTOINCREMENT",
27    "BEGIN",
28    "BETWEEN",
29    "BY",
30    "CASCADE",
31    "CASE",
32    "CAST",
33    "CHECK",
34    "COLLATE",
35    "COLUMN",
36    "COMMIT",
37    "CONFLICT",
38    "CONSTRAINT",
39    "CREATE",
40    "CROSS",
41    "DEFAULT",
42    "DEFERRED",
43    "DELETE",
44    "DESC",
45    "DETACH",
46    "DISTINCT",
47    "DROP",
48    "ELSE",
49    "END",
50    "ESCAPE",
51    "EXCEPT",
52    "EXCLUSIVE",
53    "EXISTS",
54    "EXPLAIN",
55    "FAIL",
56    "FOREIGN",
57    "FROM",
58    "GLOB",
59    "GROUP",
60    "HAVING",
61    "IF",
62    "IGNORE",
63    "IMMEDIATE",
64    "IN",
65    "INDEX",
66    "INNER",
67    "INSERT",
68    "INTERSECT",
69    "INTO",
70    "IS",
71    "ISNULL",
72    "JOIN",
73    "KEY",
74    "LEFT",
75    "LIKE",
76    "LIMIT",
77    "MATCH",
78    "NATURAL",
79    "NOCASE",
80    "NOTNULL",
81    "NULL",
82    "OFFSET",
83    "ON",
84    "ORDER",
85    "OUTER",
86    "PLAN",
87    "PRAGMA",
88    "PRIMARY",
89    "QUERY",
90    "RECURSIVE",
91    "REFERENCES",
92    "REGEXP",
93    "REINDEX",
94    "RENAME",
95    "REPLACE",
96    "RESTRICT",
97    "RIGHT",
98    "ROLLBACK",
99    "ROWID",
100    "SELECT",
101    "SET",
102    "TABLE",
103    "TEMP",
104    "TEMPORARY",
105    "THEN",
106    "TRANSACTION",
107    "TRIGGER",
108    "UNION",
109    "UNIQUE",
110    "UPDATE",
111    "USING",
112    "VACUUM",
113    "VALUES",
114    "VIEW",
115    "VIRTUAL",
116    "WHEN",
117    "WHERE",
118    "WITH",
119    "WITHOUT",
120];
121
122/// Word-form operators — styled differently from keywords in syntax highlighting.
123pub const SQL_WORD_OPERATORS: &[&str] = &["AND", "NOT", "OR"];
124
125/// SQL data type names — highlighted distinctly from keywords.
126pub const SQL_TYPES: &[&str] = &[
127    "BIGINT",
128    "BLOB",
129    "BOOLEAN",
130    "CHAR",
131    "DATE",
132    "DATETIME",
133    "DECIMAL",
134    "DOUBLE",
135    "FLOAT",
136    "INT",
137    "INTEGER",
138    "NUMERIC",
139    "REAL",
140    "SMALLINT",
141    "TEXT",
142    "TIMESTAMP",
143    "TINYINT",
144    "VARCHAR",
145];
146
147/// SQL function names — union of highlighter and autocomplete lists, deduplicated.
148///
149/// Note: REPLACE appears in both [`SQL_KEYWORDS`] and this list intentionally.
150/// When followed by `(` the tokenizer should classify it as a Function.
151pub const SQL_FUNCTIONS: &[&str] = &[
152    "ABS",
153    "AVG",
154    "BIN_RECORD_JSON_OBJECT",
155    "CAST",
156    "CHANGES",
157    "COALESCE",
158    "COUNT",
159    "DATE",
160    "DATETIME",
161    "FORMAT",
162    "FTS_HIGHLIGHT",
163    "FTS_MATCH",
164    "FTS_SCORE",
165    "GENERATE_SERIES",
166    "GROUP_CONCAT",
167    "HEX",
168    "IFNULL",
169    "IIF",
170    "INSTR",
171    "JSON",
172    "JSON_ARRAY",
173    "JSON_EACH",
174    "JSON_EXTRACT",
175    "JSON_GROUP_ARRAY",
176    "JSON_GROUP_OBJECT",
177    "JSON_INSERT",
178    "JSON_OBJECT",
179    "JSON_PATCH",
180    "JSON_REMOVE",
181    "JSON_REPLACE",
182    "JSON_SET",
183    "JSON_TREE",
184    "JSON_TYPE",
185    "JSON_VALID",
186    "JULIANDAY",
187    "LAST_INSERT_ROWID",
188    "LENGTH",
189    "LIBSQL_VECTOR_IDX",
190    "LIKELIHOOD",
191    "LIKELY",
192    "LOWER",
193    "LTRIM",
194    "MAX",
195    "MEDIAN",
196    "MIN",
197    "NULLIF",
198    "PERCENTILE",
199    "PERCENTILE_CONT",
200    "PERCENTILE_DISC",
201    "PRINTF",
202    "QUOTE",
203    "RANDOM",
204    "RANDOMBLOB",
205    "REGEXP_CAPTURE",
206    "REGEXP_REPLACE",
207    "REGEXP_SUBSTR",
208    "REPLACE",
209    "ROUND",
210    "RTRIM",
211    "STDDEV",
212    "STRFTIME",
213    "SUBSTR",
214    "SUBSTRING",
215    "SUM",
216    "TABLE_COLUMNS_JSON_ARRAY",
217    "TIME",
218    "TIMEDIFF",
219    "TIME_ADD",
220    "TIME_DATE",
221    "TIME_FMT_DATETIME",
222    "TIME_FMT_ISO",
223    "TIME_FMT_UNIXEPOCH",
224    "TIME_NOW",
225    "TIME_SUB",
226    "TIME_UNIX",
227    "TOTAL",
228    "TOTAL_CHANGES",
229    "TRIM",
230    "TYPEOF",
231    "UNICODE",
232    "UNIXEPOCH",
233    "UNLIKELY",
234    "UPPER",
235    "UUID4",
236    "UUID7",
237    "UUID7_TIMESTAMP_MS",
238    "UUID_BLOB",
239    "UUID_STR",
240    "VECTOR32",
241    "VECTOR64",
242    "VECTOR_CONCAT",
243    "VECTOR_DIMENSION",
244    "VECTOR_DISTANCE_COS",
245    "VECTOR_DISTANCE_L2",
246    "VECTOR_EXTRACT",
247    "VECTOR_SLICE",
248    "VECTOR_TOP_K",
249    "ZEROBLOB",
250];
251
252/// `SQLite` base types (affinity types). Pure SQL knowledge.
253pub const BASE_TYPES: &[&str] = &["ANY", "BLOB", "INTEGER", "REAL", "TEXT"];
254
255// ─── Autocomplete-specific keyword subsets ───────────────────────────────────
256
257/// Keywords that directly introduce a table name (the next token is a table).
258pub const TABLE_CONTEXT_KEYWORDS: &[&str] = &["FROM", "INTO", "JOIN", "TABLE", "UPDATE"];
259
260/// JOIN qualifier keywords — after these the next expected token is `JOIN`.
261pub const JOIN_QUALIFIER_KEYWORDS: &[&str] =
262    &["CROSS", "INNER", "LEFT", "NATURAL", "OUTER", "RIGHT"];
263
264/// Keywords that introduce a column/expression context.
265pub const COLUMN_CONTEXT_KEYWORDS: &[&str] = &[
266    "AND", "BY", "GROUP", "HAVING", "ON", "OR", "ORDER", "SELECT", "SET", "WHERE",
267];
268
269/// Statement-starting keywords (for autocomplete top-level suggestions).
270pub const STATEMENT_KEYWORDS: &[&str] = &[
271    "ALTER", "ANALYZE", "ATTACH", "BEGIN", "COMMIT", "CREATE", "DELETE", "DETACH", "DROP",
272    "EXPLAIN", "INSERT", "PRAGMA", "REINDEX", "ROLLBACK", "SELECT", "UPDATE", "VACUUM", "WITH",
273];
274
275/// Combined clause-level keywords offered in expression context.
276pub const CLAUSE_KEYWORDS: &[&str] = &[
277    "ALL",
278    "AND",
279    "AS",
280    "ASC",
281    "BETWEEN",
282    "BY",
283    "CASE",
284    "CROSS",
285    "DEFAULT",
286    "DESC",
287    "DISTINCT",
288    "ELSE",
289    "END",
290    "EXCEPT",
291    "EXISTS",
292    "FROM",
293    "GROUP",
294    "HAVING",
295    "IN",
296    "INNER",
297    "INTERSECT",
298    "INTO",
299    "IS",
300    "JOIN",
301    "LEFT",
302    "LIKE",
303    "LIMIT",
304    "NOT",
305    "NULL",
306    "OFFSET",
307    "ON",
308    "OR",
309    "ORDER",
310    "OUTER",
311    "RIGHT",
312    "SELECT",
313    "SET",
314    "THEN",
315    "UNION",
316    "VALUES",
317    "WHEN",
318    "WHERE",
319];
320
321/// Filter/expression keywords used by the autocomplete `is_sql_keyword()` check.
322///
323/// These were previously hardcoded in a `matches!()` block. Now a proper constant
324/// so that all keyword knowledge lives in one place.
325pub const FILTER_KEYWORDS: &[&str] = &[
326    "AND",
327    "AS",
328    "BETWEEN",
329    "CASE",
330    "DEFAULT",
331    "ELSE",
332    "END",
333    "EXCEPT",
334    "EXISTS",
335    "GROUP",
336    "HAVING",
337    "IN",
338    "INTERSECT",
339    "IS",
340    "LIKE",
341    "LIMIT",
342    "NOT",
343    "NULL",
344    "OFFSET",
345    "ON",
346    "OR",
347    "ORDER",
348    "SET",
349    "THEN",
350    "UNION",
351    "VALUES",
352    "WHEN",
353    "WHERE",
354];