Coverage Report

Created: 2026-07-25 07:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/serenity/Userland/Libraries/LibSQL/AST/Token.h
Line
Count
Source
1
/*
2
 * Copyright (c) 2021, Tim Flynn <trflynn89@serenityos.org>
3
 * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
4
 * Copyright (c) 2021, Mahmoud Mandour <ma.mandourr@gmail.com>
5
 *
6
 * SPDX-License-Identifier: BSD-2-Clause
7
 */
8
9
#pragma once
10
11
#include <AK/ByteString.h>
12
#include <AK/HashMap.h>
13
#include <AK/StringView.h>
14
15
namespace SQL::AST {
16
17
// https://sqlite.org/lang_keywords.html
18
#define ENUMERATE_SQL_TOKENS                                              \
19
211
    __ENUMERATE_SQL_TOKEN("ABORT", Abort, Keyword)                        \
20
681
    __ENUMERATE_SQL_TOKEN("ACTION", Action, Keyword)                      \
21
1.29k
    __ENUMERATE_SQL_TOKEN("ADD", Add, Keyword)                            \
22
1.81k
    __ENUMERATE_SQL_TOKEN("AFTER", After, Keyword)                        \
23
1.80k
    __ENUMERATE_SQL_TOKEN("ALL", All, Keyword)                            \
24
50
    __ENUMERATE_SQL_TOKEN("ALTER", Alter, Keyword)                        \
25
641
    __ENUMERATE_SQL_TOKEN("ALWAYS", Always, Keyword)                      \
26
638
    __ENUMERATE_SQL_TOKEN("ANALYZE", Analyze, Keyword)                    \
27
5.64k
    __ENUMERATE_SQL_TOKEN("AND", And, Keyword)                            \
28
340k
    __ENUMERATE_SQL_TOKEN("AS", As, Keyword)                              \
29
340k
    __ENUMERATE_SQL_TOKEN("ASC", Asc, Keyword)                            \
30
1.15k
    __ENUMERATE_SQL_TOKEN("ATTACH", Attach, Keyword)                      \
31
1.14k
    __ENUMERATE_SQL_TOKEN("AUTOINCREMENT", Autoincrement, Keyword)        \
32
81
    __ENUMERATE_SQL_TOKEN("BEFORE", Before, Keyword)                      \
33
101
    __ENUMERATE_SQL_TOKEN("BEGIN", Begin, Keyword)                        \
34
11.5k
    __ENUMERATE_SQL_TOKEN("BETWEEN", Between, Keyword)                    \
35
11.5k
    __ENUMERATE_SQL_TOKEN("BY", By, Keyword)                              \
36
1.31k
    __ENUMERATE_SQL_TOKEN("CASCADE", Cascade, Keyword)                    \
37
70.1k
    __ENUMERATE_SQL_TOKEN("CASE", Case, Keyword)                          \
38
70.1k
    __ENUMERATE_SQL_TOKEN("CAST", Cast, Keyword)                          \
39
28.7k
    __ENUMERATE_SQL_TOKEN("CHECK", Check, Keyword)                        \
40
302
    __ENUMERATE_SQL_TOKEN("COLLATE", Collate, Keyword)                    \
41
299
    __ENUMERATE_SQL_TOKEN("COLUMN", Column, Keyword)                      \
42
254
    __ENUMERATE_SQL_TOKEN("COMMIT", Commit, Keyword)                      \
43
251
    __ENUMERATE_SQL_TOKEN("CONFLICT", Conflict, Keyword)                  \
44
637
    __ENUMERATE_SQL_TOKEN("CONSTRAINT", Constraint, Keyword)              \
45
634
    __ENUMERATE_SQL_TOKEN("CREATE", Create, Keyword)                      \
46
157
    __ENUMERATE_SQL_TOKEN("CROSS", Cross, Keyword)                        \
47
264
    __ENUMERATE_SQL_TOKEN("CURRENT", Current, Keyword)                    \
48
1.43k
    __ENUMERATE_SQL_TOKEN("CURRENT_DATE", CurrentDate, Keyword)           \
49
1.43k
    __ENUMERATE_SQL_TOKEN("CURRENT_TIME", CurrentTime, Keyword)           \
50
623
    __ENUMERATE_SQL_TOKEN("CURRENT_TIMESTAMP", CurrentTimestamp, Keyword) \
51
3
    __ENUMERATE_SQL_TOKEN("DATABASE", Database, Keyword)                  \
52
345
    __ENUMERATE_SQL_TOKEN("DEFAULT", Default, Keyword)                    \
53
342
    __ENUMERATE_SQL_TOKEN("DEFERRABLE", Deferrable, Keyword)              \
54
947
    __ENUMERATE_SQL_TOKEN("DEFERRED", Deferred, Keyword)                  \
55
1.53k
    __ENUMERATE_SQL_TOKEN("DELETE", Delete, Keyword)                      \
56
1.53k
    __ENUMERATE_SQL_TOKEN("DESC", Desc, Keyword)                          \
57
22
    __ENUMERATE_SQL_TOKEN("DESCRIBE", Describe, Keyword)                  \
58
389
    __ENUMERATE_SQL_TOKEN("DETACH", Detach, Keyword)                      \
59
415
    __ENUMERATE_SQL_TOKEN("DISTINCT", Distinct, Keyword)                  \
60
412
    __ENUMERATE_SQL_TOKEN("DO", Do, Keyword)                              \
61
112
    __ENUMERATE_SQL_TOKEN("DROP", Drop, Keyword)                          \
62
112
    __ENUMERATE_SQL_TOKEN("EACH", Each, Keyword)                          \
63
3.42k
    __ENUMERATE_SQL_TOKEN("ELSE", Else, Keyword)                          \
64
347k
    __ENUMERATE_SQL_TOKEN("END", End, Keyword)                            \
65
347k
    __ENUMERATE_SQL_TOKEN("ESCAPE", Escape, Keyword)                      \
66
1.96k
    __ENUMERATE_SQL_TOKEN("EXCEPT", Except, Keyword)                      \
67
79
    __ENUMERATE_SQL_TOKEN("EXCLUDE", Exclude, Keyword)                    \
68
705
    __ENUMERATE_SQL_TOKEN("EXCLUSIVE", Exclusive, Keyword)                \
69
5.04k
    __ENUMERATE_SQL_TOKEN("EXISTS", Exists, Keyword)                      \
70
5.04k
    __ENUMERATE_SQL_TOKEN("EXPLAIN", Explain, Keyword)                    \
71
487
    __ENUMERATE_SQL_TOKEN("FAIL", Fail, Keyword)                          \
72
484
    __ENUMERATE_SQL_TOKEN("FALSE", False, Keyword)                        \
73
127
    __ENUMERATE_SQL_TOKEN("FILTER", Filter, Keyword)                      \
74
371
    __ENUMERATE_SQL_TOKEN("FIRST", First, Keyword)                        \
75
368
    __ENUMERATE_SQL_TOKEN("FOLLOWING", Following, Keyword)                \
76
285
    __ENUMERATE_SQL_TOKEN("FOR", For, Keyword)                            \
77
282
    __ENUMERATE_SQL_TOKEN("FOREIGN", Foreign, Keyword)                    \
78
1.01k
    __ENUMERATE_SQL_TOKEN("FROM", From, Keyword)                          \
79
1.00k
    __ENUMERATE_SQL_TOKEN("FULL", Full, Keyword)                          \
80
392
    __ENUMERATE_SQL_TOKEN("GENERATED", Generated, Keyword)                \
81
602
    __ENUMERATE_SQL_TOKEN("GLOB", Glob, Keyword)                          \
82
599
    __ENUMERATE_SQL_TOKEN("GROUP", Group, Keyword)                        \
83
587
    __ENUMERATE_SQL_TOKEN("GROUPS", Groups, Keyword)                      \
84
584
    __ENUMERATE_SQL_TOKEN("HAVING", Having, Keyword)                      \
85
345
    __ENUMERATE_SQL_TOKEN("IF", If, Keyword)                              \
86
1.00k
    __ENUMERATE_SQL_TOKEN("IGNORE", Ignore, Keyword)                      \
87
997
    __ENUMERATE_SQL_TOKEN("IMMEDIATE", Immediate, Keyword)                \
88
23.7k
    __ENUMERATE_SQL_TOKEN("IN", In, Keyword)                              \
89
23.7k
    __ENUMERATE_SQL_TOKEN("INDEX", Index, Keyword)                        \
90
1.93k
    __ENUMERATE_SQL_TOKEN("INDEXED", Indexed, Keyword)                    \
91
1.93k
    __ENUMERATE_SQL_TOKEN("INITIALLY", Initially, Keyword)                \
92
52
    __ENUMERATE_SQL_TOKEN("INNER", Inner, Keyword)                        \
93
1.87k
    __ENUMERATE_SQL_TOKEN("INSERT", Insert, Keyword)                      \
94
1.87k
    __ENUMERATE_SQL_TOKEN("INSTEAD", Instead, Keyword)                    \
95
524
    __ENUMERATE_SQL_TOKEN("INTERSECT", Intersect, Keyword)                \
96
2.69k
    __ENUMERATE_SQL_TOKEN("INTO", Into, Keyword)                          \
97
3.60k
    __ENUMERATE_SQL_TOKEN("IS", Is, Keyword)                              \
98
3.60k
    __ENUMERATE_SQL_TOKEN("ISNULL", Isnull, Keyword)                      \
99
8
    __ENUMERATE_SQL_TOKEN("JOIN", Join, Keyword)                          \
100
115
    __ENUMERATE_SQL_TOKEN("KEY", Key, Keyword)                            \
101
112
    __ENUMERATE_SQL_TOKEN("LAST", Last, Keyword)                          \
102
17
    __ENUMERATE_SQL_TOKEN("LEFT", Left, Keyword)                          \
103
652
    __ENUMERATE_SQL_TOKEN("LIKE", Like, Keyword)                          \
104
1.14k
    __ENUMERATE_SQL_TOKEN("LIMIT", Limit, Keyword)                        \
105
1.13k
    __ENUMERATE_SQL_TOKEN("MATCH", Match, Keyword)                        \
106
911
    __ENUMERATE_SQL_TOKEN("MATERIALIZED", Materialized, Keyword)          \
107
89
    __ENUMERATE_SQL_TOKEN("NATURAL", Natural, Keyword)                    \
108
2.85k
    __ENUMERATE_SQL_TOKEN("NO", No, Keyword)                              \
109
2.94k
    __ENUMERATE_SQL_TOKEN("NOT", Not, Keyword)                            \
110
2.93k
    __ENUMERATE_SQL_TOKEN("NOTHING", Nothing, Keyword)                    \
111
2.03k
    __ENUMERATE_SQL_TOKEN("NOTNULL", Notnull, Keyword)                    \
112
2.02k
    __ENUMERATE_SQL_TOKEN("NULL", Null, Keyword)                          \
113
1.59k
    __ENUMERATE_SQL_TOKEN("NULLS", Nulls, Keyword)                        \
114
959
    __ENUMERATE_SQL_TOKEN("OF", Of, Keyword)                              \
115
269
    __ENUMERATE_SQL_TOKEN("OFFSET", Offset, Keyword)                      \
116
1.39k
    __ENUMERATE_SQL_TOKEN("ON", On, Keyword)                              \
117
1.54k
    __ENUMERATE_SQL_TOKEN("OR", Or, Keyword)                              \
118
3.39k
    __ENUMERATE_SQL_TOKEN("ORDER", Order, Keyword)                        \
119
3.39k
    __ENUMERATE_SQL_TOKEN("OTHERS", Others, Keyword)                      \
120
1.80k
    __ENUMERATE_SQL_TOKEN("OUTER", Outer, Keyword)                        \
121
1.80k
    __ENUMERATE_SQL_TOKEN("OVER", Over, Keyword)                          \
122
161
    __ENUMERATE_SQL_TOKEN("PARTITION", Partition, Keyword)                \
123
158
    __ENUMERATE_SQL_TOKEN("PLAN", Plan, Keyword)                          \
124
64
    __ENUMERATE_SQL_TOKEN("PRAGMA", Pragma, Keyword)                      \
125
5
    __ENUMERATE_SQL_TOKEN("PRECEDING", Preceding, Keyword)                \
126
278
    __ENUMERATE_SQL_TOKEN("PRIMARY", Primary, Keyword)                    \
127
275
    __ENUMERATE_SQL_TOKEN("QUERY", Query, Keyword)                        \
128
672
    __ENUMERATE_SQL_TOKEN("RAISE", Raise, Keyword)                        \
129
787
    __ENUMERATE_SQL_TOKEN("RANGE", Range, Keyword)                        \
130
784
    __ENUMERATE_SQL_TOKEN("RECURSIVE", Recursive, Keyword)                \
131
15
    __ENUMERATE_SQL_TOKEN("REFERENCES", References, Keyword)              \
132
32
    __ENUMERATE_SQL_TOKEN("REGEXP", Regexp, Keyword)                      \
133
29
    __ENUMERATE_SQL_TOKEN("REINDEX", Reindex, Keyword)                    \
134
9
    __ENUMERATE_SQL_TOKEN("RELEASE", Release, Keyword)                    \
135
109
    __ENUMERATE_SQL_TOKEN("RENAME", Rename, Keyword)                      \
136
172
    __ENUMERATE_SQL_TOKEN("REPLACE", Replace, Keyword)                    \
137
354
    __ENUMERATE_SQL_TOKEN("RESTRICT", Restrict, Keyword)                  \
138
351
    __ENUMERATE_SQL_TOKEN("RETURNING", Returning, Keyword)                \
139
138
    __ENUMERATE_SQL_TOKEN("RIGHT", Right, Keyword)                        \
140
12
    __ENUMERATE_SQL_TOKEN("ROLLBACK", Rollback, Keyword)                  \
141
37
    __ENUMERATE_SQL_TOKEN("ROW", Row, Keyword)                            \
142
106
    __ENUMERATE_SQL_TOKEN("ROWS", Rows, Keyword)                          \
143
103
    __ENUMERATE_SQL_TOKEN("SAVEPOINT", Savepoint, Keyword)                \
144
39
    __ENUMERATE_SQL_TOKEN("SCHEMA", Schema, Keyword)                      \
145
52.6k
    __ENUMERATE_SQL_TOKEN("SELECT", Select, Keyword)                      \
146
52.6k
    __ENUMERATE_SQL_TOKEN("SET", Set, Keyword)                            \
147
3.31k
    __ENUMERATE_SQL_TOKEN("TABLE", Table, Keyword)                        \
148
351
    __ENUMERATE_SQL_TOKEN("TEMP", Temp, Keyword)                          \
149
6
    __ENUMERATE_SQL_TOKEN("TEMPORARY", Temporary, Keyword)                \
150
656k
    __ENUMERATE_SQL_TOKEN("THEN", Then, Keyword)                          \
151
656k
    __ENUMERATE_SQL_TOKEN("TIES", Ties, Keyword)                          \
152
909
    __ENUMERATE_SQL_TOKEN("TO", To, Keyword)                              \
153
906
    __ENUMERATE_SQL_TOKEN("TRANSACTION", Transaction, Keyword)            \
154
231
    __ENUMERATE_SQL_TOKEN("TRIGGER", Trigger, Keyword)                    \
155
18
    __ENUMERATE_SQL_TOKEN("TRUE", True, Keyword)                          \
156
799
    __ENUMERATE_SQL_TOKEN("UNBOUNDED", Unbounded, Keyword)                \
157
796
    __ENUMERATE_SQL_TOKEN("UNION", Union, Keyword)                        \
158
86
    __ENUMERATE_SQL_TOKEN("UNIQUE", Unique, Keyword)                      \
159
1.37k
    __ENUMERATE_SQL_TOKEN("UPDATE", Update, Keyword)                      \
160
1.37k
    __ENUMERATE_SQL_TOKEN("USING", Using, Keyword)                        \
161
454
    __ENUMERATE_SQL_TOKEN("VACUUM", Vacuum, Keyword)                      \
162
1.87k
    __ENUMERATE_SQL_TOKEN("VALUES", Values, Keyword)                      \
163
1.87k
    __ENUMERATE_SQL_TOKEN("VIEW", View, Keyword)                          \
164
1.23k
    __ENUMERATE_SQL_TOKEN("VIRTUAL", Virtual, Keyword)                    \
165
347k
    __ENUMERATE_SQL_TOKEN("WHEN", When, Keyword)                          \
166
347k
    __ENUMERATE_SQL_TOKEN("WHERE", Where, Keyword)                        \
167
818
    __ENUMERATE_SQL_TOKEN("WINDOW", Window, Keyword)                      \
168
318
    __ENUMERATE_SQL_TOKEN("WITH", With, Keyword)                          \
169
315
    __ENUMERATE_SQL_TOKEN("WITHOUT", Without, Keyword)                    \
170
787k
    __ENUMERATE_SQL_TOKEN("_identifier_", Identifier, Identifier)         \
171
787k
    __ENUMERATE_SQL_TOKEN("_numeric_", NumericLiteral, Number)            \
172
91.1k
    __ENUMERATE_SQL_TOKEN("_string_", StringLiteral, String)              \
173
91.1k
    __ENUMERATE_SQL_TOKEN("_blob_", BlobLiteral, Blob)                    \
174
218k
    __ENUMERATE_SQL_TOKEN("_eof_", Eof, Invalid)                          \
175
1.58M
    __ENUMERATE_SQL_TOKEN("_invalid_", Invalid, Invalid)                  \
176
1.58M
    __ENUMERATE_SQL_TOKEN("?", Placeholder, Operator)                     \
177
46.2k
    __ENUMERATE_SQL_TOKEN("&", Ampersand, Operator)                       \
178
103k
    __ENUMERATE_SQL_TOKEN("*", Asterisk, Operator)                        \
179
223k
    __ENUMERATE_SQL_TOKEN(",", Comma, Punctuation)                        \
180
223k
    __ENUMERATE_SQL_TOKEN("/", Divide, Operator)                          \
181
73.2k
    __ENUMERATE_SQL_TOKEN("||", DoublePipe, Operator)                     \
182
88.3k
    __ENUMERATE_SQL_TOKEN("=", Equals, Operator)                          \
183
88.2k
    __ENUMERATE_SQL_TOKEN("==", EqualsEquals, Operator)                   \
184
44.9k
    __ENUMERATE_SQL_TOKEN(">", GreaterThan, Operator)                     \
185
3.29k
    __ENUMERATE_SQL_TOKEN(">=", GreaterThanEquals, Operator)              \
186
29.1k
    __ENUMERATE_SQL_TOKEN("<", LessThan, Operator)                        \
187
29.1k
    __ENUMERATE_SQL_TOKEN("<=", LessThanEquals, Operator)                 \
188
103k
    __ENUMERATE_SQL_TOKEN("-", Minus, Operator)                           \
189
103k
    __ENUMERATE_SQL_TOKEN("%", Modulus, Operator)                         \
190
52.1k
    __ENUMERATE_SQL_TOKEN("!=", NotEquals1, Operator)                     \
191
2.81k
    __ENUMERATE_SQL_TOKEN("<>", NotEquals2, Operator)                     \
192
970k
    __ENUMERATE_SQL_TOKEN(")", ParenClose, Punctuation)                   \
193
1.11M
    __ENUMERATE_SQL_TOKEN("(", ParenOpen, Punctuation)                    \
194
1.11M
    __ENUMERATE_SQL_TOKEN(".", Period, Operator)                          \
195
29.9k
    __ENUMERATE_SQL_TOKEN("|", Pipe, Operator)                            \
196
332k
    __ENUMERATE_SQL_TOKEN("+", Plus, Operator)                            \
197
332k
    __ENUMERATE_SQL_TOKEN(";", SemiColon, Punctuation)                    \
198
95.3k
    __ENUMERATE_SQL_TOKEN("<<", ShiftLeft, Operator)                      \
199
15.5k
    __ENUMERATE_SQL_TOKEN(">>", ShiftRight, Operator)                     \
200
2.47k
    __ENUMERATE_SQL_TOKEN("~", Tilde, Operator)
201
202
enum class TokenType {
203
#define __ENUMERATE_SQL_TOKEN(value, type, category) type,
204
    ENUMERATE_SQL_TOKENS
205
#undef __ENUMERATE_SQL_TOKEN
206
        _COUNT_OF_TOKENS,
207
};
208
209
enum class TokenCategory {
210
    Invalid,
211
    Keyword,
212
    Identifier,
213
    Number,
214
    String,
215
    Blob,
216
    Operator,
217
    Punctuation,
218
};
219
220
struct SourcePosition {
221
    size_t line { 0 };
222
    size_t column { 0 };
223
};
224
225
class Token {
226
public:
227
    Token(TokenType type, ByteString value, SourcePosition start_position, SourcePosition end_position)
228
155M
        : m_type(type)
229
155M
        , m_value(move(value))
230
155M
        , m_start_position(start_position)
231
155M
        , m_end_position(end_position)
232
155M
    {
233
155M
    }
234
235
    static StringView name(TokenType);
236
    static TokenCategory category(TokenType);
237
238
4.87M
    StringView name() const { return name(m_type); }
239
1.73G
    TokenType type() const { return m_type; }
240
0
    TokenCategory category() const { return category(m_type); }
241
242
72.0M
    ByteString const& value() const { return m_value; }
243
    double double_value() const;
244
245
4.92M
    SourcePosition const& start_position() const { return m_start_position; }
246
0
    SourcePosition const& end_position() const { return m_end_position; }
247
248
private:
249
    TokenType m_type;
250
    ByteString m_value;
251
    SourcePosition m_start_position;
252
    SourcePosition m_end_position;
253
};
254
255
}