Skip to main content

alopex_sql/tokenizer/
keyword.rs

1/// Supported SQL keywords for the Alopex dialect.
2#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3pub enum Keyword {
4    // DML
5    SELECT,
6    FROM,
7    WHERE,
8    DISTINCT,
9    AS,
10    INSERT,
11    INTO,
12    VALUES,
13    UPDATE,
14    SET,
15    DELETE,
16
17    // DDL
18    CREATE,
19    DROP,
20    TABLE,
21    INDEX,
22    IF,
23    NOT,
24    EXISTS,
25    USING,
26    WITH,
27    CONSTRAINT,
28    ON,
29    PRIMARY,
30    KEY,
31    DEFAULT,
32    UNIQUE,
33
34    // Clauses
35    GROUP,
36    ORDER,
37    BY,
38    HAVING,
39    ASC,
40    DESC,
41    NULLS,
42    FIRST,
43    LAST,
44    LIMIT,
45    OFFSET,
46    ESCAPE,
47
48    // Expressions / operators
49    TRUE,
50    FALSE,
51    NULL,
52    AND,
53    OR,
54    LIKE,
55    BETWEEN,
56    IN,
57    IS,
58
59    // Types / extensions
60    INTEGER,
61    INT,
62    BIGINT,
63    FLOAT,
64    DOUBLE,
65    TEXT,
66    BLOB,
67    BOOLEAN,
68    BOOL,
69    TIMESTAMP,
70    VECTOR,
71    COSINE,
72    L2,
73    INNER,
74    BTREE,
75    HNSW,
76
77    // Reserved / functions
78    CAST,
79    CASE,
80    WHEN,
81    THEN,
82    ELSE,
83    END,
84    NOW,
85
86    /// Not a recognized keyword.
87    NoKeyword,
88}
89
90impl Keyword {
91    /// Case-insensitive lookup.
92    #[allow(clippy::should_implement_trait)]
93    pub fn from_str(input: &str) -> Self {
94        match input.to_ascii_uppercase().as_str() {
95            "SELECT" => Self::SELECT,
96            "FROM" => Self::FROM,
97            "WHERE" => Self::WHERE,
98            "DISTINCT" => Self::DISTINCT,
99            "AS" => Self::AS,
100            "INSERT" => Self::INSERT,
101            "INTO" => Self::INTO,
102            "VALUES" => Self::VALUES,
103            "UPDATE" => Self::UPDATE,
104            "SET" => Self::SET,
105            "DELETE" => Self::DELETE,
106
107            "CREATE" => Self::CREATE,
108            "DROP" => Self::DROP,
109            "TABLE" => Self::TABLE,
110            "INDEX" => Self::INDEX,
111            "IF" => Self::IF,
112            "NOT" => Self::NOT,
113            "EXISTS" => Self::EXISTS,
114            "USING" => Self::USING,
115            "WITH" => Self::WITH,
116            "CONSTRAINT" => Self::CONSTRAINT,
117            "ON" => Self::ON,
118            "PRIMARY" => Self::PRIMARY,
119            "KEY" => Self::KEY,
120            "DEFAULT" => Self::DEFAULT,
121            "UNIQUE" => Self::UNIQUE,
122
123            "GROUP" => Self::GROUP,
124            "ORDER" => Self::ORDER,
125            "BY" => Self::BY,
126            "HAVING" => Self::HAVING,
127            "ASC" => Self::ASC,
128            "DESC" => Self::DESC,
129            "NULLS" => Self::NULLS,
130            "FIRST" => Self::FIRST,
131            "LAST" => Self::LAST,
132            "LIMIT" => Self::LIMIT,
133            "OFFSET" => Self::OFFSET,
134            "ESCAPE" => Self::ESCAPE,
135
136            "TRUE" => Self::TRUE,
137            "FALSE" => Self::FALSE,
138            "NULL" => Self::NULL,
139            "AND" => Self::AND,
140            "OR" => Self::OR,
141            "LIKE" => Self::LIKE,
142            "BETWEEN" => Self::BETWEEN,
143            "IN" => Self::IN,
144            "IS" => Self::IS,
145
146            "INTEGER" => Self::INTEGER,
147            "INT" => Self::INT,
148            "BIGINT" => Self::BIGINT,
149            "FLOAT" => Self::FLOAT,
150            "DOUBLE" => Self::DOUBLE,
151            "TEXT" => Self::TEXT,
152            "BLOB" => Self::BLOB,
153            "BOOLEAN" => Self::BOOLEAN,
154            "BOOL" => Self::BOOL,
155            "TIMESTAMP" => Self::TIMESTAMP,
156            "VECTOR" => Self::VECTOR,
157            "COSINE" => Self::COSINE,
158            "L2" => Self::L2,
159            "INNER" => Self::INNER,
160            "BTREE" => Self::BTREE,
161            "HNSW" => Self::HNSW,
162
163            "CAST" => Self::CAST,
164            "CASE" => Self::CASE,
165            "WHEN" => Self::WHEN,
166            "THEN" => Self::THEN,
167            "ELSE" => Self::ELSE,
168            "END" => Self::END,
169            "NOW" => Self::NOW,
170            _ => Self::NoKeyword,
171        }
172    }
173}