1use logos::Lexer;
16use logos::Logos;
17use memchr::memchr_iter;
18use strum::IntoEnumIterator;
19use strum_macros::EnumIter;
20
21pub use self::TokenKind::*;
22use crate::ParseError;
23use crate::Range;
24use crate::Result;
25
26#[derive(Clone, PartialEq, Eq)]
27pub struct Token<'a> {
28 pub source: &'a str,
29 pub kind: TokenKind,
30 pub span: Range,
31}
32
33impl<'a> Token<'a> {
34 pub fn new_eoi(source: &'a str) -> Self {
35 Token {
36 source,
37 kind: TokenKind::EOI,
38 span: (source.len()..source.len()).into(),
39 }
40 }
41
42 pub fn text(&self) -> &'a str {
43 &self.source[std::ops::Range::from(self.span)]
44 }
45}
46
47impl std::fmt::Debug for Token<'_> {
48 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
49 write!(f, "{:?}({:?})", self.kind, self.span)
50 }
51}
52
53pub struct Tokenizer<'a> {
54 source: &'a str,
55 lexer: Lexer<'a, TokenKind>,
56 prev_token: Option<TokenKind>,
57 eoi: bool,
58}
59
60impl<'a> Tokenizer<'a> {
61 pub fn new(source: &'a str) -> Self {
62 Tokenizer {
63 source,
64 lexer: TokenKind::lexer(source),
65 eoi: false,
66 prev_token: None,
67 }
68 }
69
70 pub fn contains_token(query: &str, target_kind: TokenKind) -> bool {
71 let mut tokenizer = Tokenizer::new(query);
72 while let Some(Ok(token)) = tokenizer.next() {
73 if token.kind == target_kind {
74 return true;
75 }
76 }
77 false
78 }
79}
80
81impl<'a> Iterator for Tokenizer<'a> {
82 type Item = Result<Token<'a>>;
83
84 fn next(&mut self) -> Option<Self::Item> {
85 match self.lexer.next() {
86 Some(TokenKind::Error) => {
87 let span = Some((self.lexer.span().start..self.source.len()).into());
88 Some(Err(ParseError(
89 span,
90 "unable to recognize the rest tokens".to_string(),
91 )))
92 }
93 Some(kind) => {
94 if !matches!(
96 self.prev_token,
97 Some(
98 TokenKind::INSERT
99 | TokenKind::SELECT
100 | TokenKind::REPLACE
101 | TokenKind::UPDATE
102 | TokenKind::DELETE
103 | TokenKind::COPY
104 )
105 ) && kind == TokenKind::HintPrefix
106 {
107 loop {
108 match self.next() {
109 Some(Ok(token)) if token.kind == TokenKind::HintSuffix => {
111 return self.next();
112 }
113 Some(Ok(token)) if token.kind == TokenKind::EOI => {
115 return Some(Ok(token));
116 }
117 Some(Ok(_)) => continue,
119 Some(Err(err)) => return Some(Err(err)),
120 None => return None,
121 }
122 }
123 }
124 self.prev_token = Some(kind);
125 Some(Ok(Token {
126 source: self.source,
127 kind,
128 span: self.lexer.span().into(),
129 }))
130 }
131 None if !self.eoi => {
132 self.eoi = true;
133 Some(Ok(Token::new_eoi(self.source)))
134 }
135 None => None,
136 }
137 }
138}
139
140pub fn is_ident_start(c: char) -> bool {
146 c == '_' || c.is_alphabetic()
147}
148
149pub fn is_ident_continue(c: char) -> bool {
154 c == '_' || c == '$' || c.is_alphanumeric()
155}
156
157fn bump_ident_continue(lex: &mut Lexer<TokenKind>) {
158 loop {
159 match lex.remainder().chars().next() {
160 Some(c) if is_ident_continue(c) => lex.bump(c.len_utf8()),
161 _ => break,
162 }
163 }
164}
165
166fn lex_ascii_ident(lex: &mut Lexer<TokenKind>) -> logos::FilterResult<()> {
167 bump_ident_continue(lex);
168 logos::FilterResult::Emit(())
169}
170
171fn lex_unicode_ident(lex: &mut Lexer<TokenKind>) -> logos::FilterResult<()> {
172 if !is_ident_start(lex.slice().chars().next().unwrap()) {
173 return logos::FilterResult::Error;
174 }
175 bump_ident_continue(lex);
176 logos::FilterResult::Emit(())
177}
178
179fn lex_comment_block(lex: &mut Lexer<TokenKind>) -> logos::FilterResult<()> {
180 let remainder = lex.remainder().as_bytes();
181
182 for idx in memchr_iter(b'*', remainder) {
183 if remainder.get(idx + 1) == Some(&b'/') {
184 lex.bump(idx + 2);
185 return logos::FilterResult::Skip;
186 }
187 }
188
189 logos::FilterResult::Error
190}
191
192#[allow(non_camel_case_types)]
193#[derive(Logos, EnumIter, Clone, Copy, Debug, PartialEq, Eq, Hash)]
194pub enum TokenKind {
195 #[error]
196 Error,
197
198 EOI,
199
200 #[regex(r"[ \t\r\n\f]+", logos::skip)]
201 Whitespace,
202
203 #[regex(r"--[^\n\f]*", logos::skip)]
204 Comment,
205
206 #[token("/*", lex_comment_block)]
207 CommentBlock,
208
209 #[regex(r#"[_a-zA-Z][_$a-zA-Z0-9]*"#, lex_ascii_ident)]
210 #[regex(r"[^\x00-\x7f]", lex_unicode_ident)]
211 Ident,
212
213 #[regex(r#"\$[_a-zA-Z][_$a-zA-Z0-9]*"#)]
214 IdentVariable,
215
216 #[regex(r#"\$[0-9]+"#)]
217 ColumnPosition,
218
219 #[regex(r#"`[^`]*`"#)]
220 #[regex(r#""([^"\\]|\\.|"")*""#)]
221 #[regex(r#"'([^'\\]|\\.|'')*'"#)]
222 LiteralString,
223
224 #[regex(r#"\$\$([^\$]|(\$[^\$]))*\$\$"#)]
225 LiteralCodeString,
226
227 #[regex(r#"@([^\s,`;'"()]|\\\s|\\'|\\"|\\\\)+"#)]
228 LiteralAtString,
229
230 #[regex(r"[xX]'[a-fA-F0-9]*'")]
231 PGLiteralHex,
232 #[regex(r"0[xX][a-fA-F0-9]+")]
233 MySQLLiteralHex,
234
235 #[regex(r"[0-9]+(_|[0-9])*")]
236 LiteralInteger,
237
238 #[regex(r"[0-9]+[eE][+-]?[0-9]+")]
239 #[regex(r"([0-9]*\.[0-9]+([eE][+-]?[0-9]+)?)|([0-9]+\.[0-9]*([eE][+-]?[0-9]+)?)")]
240 LiteralFloat,
241
242 #[token("/*+")]
244 HintPrefix,
245 #[token("*/")]
246 HintSuffix,
247 #[token("==")]
248 DoubleEq,
249 #[token("=")]
250 Eq,
251 #[token("<>")]
252 #[token("!=")]
253 NotEq,
254 #[token("<")]
255 Lt,
256 #[token(">")]
257 Gt,
258 #[token("<=")]
259 Lte,
260 #[token(">=")]
261 Gte,
262 #[token("<=>")]
263 Spaceship,
264 #[token("+")]
265 Plus,
266 #[token("-")]
267 Minus,
268 #[token("*")]
269 Multiply,
270 #[token("/")]
271 Divide,
272 #[token("//")]
273 IntDiv,
274 #[token("%")]
275 Modulo,
276 #[token("||")]
277 StringConcat,
278 #[token("(")]
279 LParen,
280 #[token(")")]
281 RParen,
282 #[token(",")]
283 Comma,
284 #[token(".")]
285 Dot,
286 #[token(":")]
287 Colon,
288 #[token("::")]
289 DoubleColon,
290 #[token(":=")]
291 ColonEqual,
292 #[token(";")]
293 SemiColon,
294 #[token("\\")]
295 Backslash,
296 #[token("[")]
297 LBracket,
298 #[token("]")]
299 RBracket,
300 #[token("^")]
301 Caret,
302 #[token("{")]
303 LBrace,
304 #[token("}")]
305 RBrace,
306 #[token("$")]
307 Dollar,
308 #[token("->")]
309 RArrow,
310 #[token("->>")]
311 LongRArrow,
312 #[token("=>")]
313 FatRArrow,
314 #[token("#>")]
315 HashRArrow,
316 #[token("#>>")]
317 HashLongRArrow,
318 #[token("~*")]
320 TildeAsterisk,
321 #[token("!*")]
323 ExclamationMarkTilde,
324 #[token("!~*")]
326 ExclamationMarkTildeAsterisk,
327 #[token("&")]
329 BitWiseAnd,
330 #[token("|")]
332 BitWiseOr,
333 #[token("#")]
335 BitWiseXor,
336 #[token("~")]
338 BitWiseNot,
339 #[token("<<")]
341 ShiftLeft,
342 #[token(">>")]
344 ShiftRight,
345 #[token("!")]
347 Factorial,
348 #[token("!!")]
350 DoubleExclamationMark,
351 #[token("@")]
353 Abs,
354 #[token("|/")]
356 SquareRoot,
357 #[token("||/")]
359 CubeRoot,
360 #[token("?")]
363 Placeholder,
364 #[token("?|")]
366 QuestionOr,
367 #[token("?&")]
369 QuestionAnd,
370 #[token("<@")]
372 ArrowAt,
373 #[token("@>")]
375 AtArrow,
376 #[token("@?")]
378 AtQuestion,
379 #[token("@@")]
381 AtAt,
382 #[token("#-")]
384 HashMinus,
385
386 #[token("ACCOUNT", ignore(ascii_case))]
393 ACCOUNT,
394 #[token("ALL", ignore(ascii_case))]
395 ALL,
396 #[token("ALLOWED_IP_LIST", ignore(ascii_case))]
397 ALLOWED_IP_LIST,
398 #[token("ALLOWED_VALUES", ignore(ascii_case))]
399 ALLOWED_VALUES,
400 #[token("ALLOW_QUOTED_NULLS", ignore(ascii_case))]
401 ALLOW_QUOTED_NULLS,
402 #[token("ADD", ignore(ascii_case))]
403 ADD,
404 #[token("AFTER", ignore(ascii_case))]
405 AFTER,
406 #[token("AGGREGATING", ignore(ascii_case))]
407 AGGREGATING,
408 #[token("ANY", ignore(ascii_case))]
409 ANY,
410 #[token("APPEND_ONLY", ignore(ascii_case))]
411 APPEND_ONLY,
412 #[token("APPLY", ignore(ascii_case))]
413 APPLY,
414 #[token("ARGS", ignore(ascii_case))]
415 ARGS,
416 #[token("AUTO", ignore(ascii_case))]
417 AUTO,
418 #[token("AUTOINCREMENT", ignore(ascii_case))]
419 AUTOINCREMENT,
420 #[token("SOME", ignore(ascii_case))]
421 SOME,
422 #[token("ALTER", ignore(ascii_case))]
423 ALTER,
424 #[token("ALWAYS", ignore(ascii_case))]
425 ALWAYS,
426 #[token("ANALYZE", ignore(ascii_case))]
427 ANALYZE,
428 #[token("AND", ignore(ascii_case))]
429 AND,
430 #[token("ARRAY", ignore(ascii_case))]
431 ARRAY,
432 #[token("AS", ignore(ascii_case))]
433 AS,
434 #[token("ASOF", ignore(ascii_case))]
435 ASOF,
436 #[token("AST", ignore(ascii_case))]
437 AST,
438 #[token("AT", ignore(ascii_case))]
439 AT,
440 #[token("ASC", ignore(ascii_case))]
441 ASC,
442 #[token("ANTI", ignore(ascii_case))]
443 ANTI,
444 #[token("ASYNC", ignore(ascii_case))]
445 ASYNC,
446 #[token("ATTACH", ignore(ascii_case))]
447 ATTACH,
448 #[token("AVRO", ignore(ascii_case))]
449 AVRO,
450 #[token("BEFORE", ignore(ascii_case))]
451 BEFORE,
452 #[token("BETWEEN", ignore(ascii_case))]
453 BETWEEN,
454 #[token("BIGINT", ignore(ascii_case))]
455 BIGINT,
456 #[token("BINARY", ignore(ascii_case))]
457 BINARY,
458 #[token("BREAK", ignore(ascii_case))]
459 BREAK,
460 #[token("LONGBLOB", ignore(ascii_case))]
461 LONGBLOB,
462 #[token("MEDIUMBLOB", ignore(ascii_case))]
463 MEDIUMBLOB,
464 #[token("TINYBLOB", ignore(ascii_case))]
465 TINYBLOB,
466 #[token("BLOB", ignore(ascii_case))]
467 BLOB,
468 #[token("BINARY_FORMAT", ignore(ascii_case))]
469 BINARY_FORMAT,
470 #[token("BITMAP", ignore(ascii_case))]
471 BITMAP,
472 #[token("BLOCKED_IP_LIST", ignore(ascii_case))]
473 BLOCKED_IP_LIST,
474 #[token("BOOL", ignore(ascii_case))]
475 BOOL,
476 #[token("BOOLEAN", ignore(ascii_case))]
477 BOOLEAN,
478 #[token("BOTH", ignore(ascii_case))]
479 BOTH,
480 #[token("BRANCH", ignore(ascii_case))]
481 BRANCH,
482 #[token("BY", ignore(ascii_case))]
483 BY,
484 #[token("BROTLI", ignore(ascii_case))]
485 BROTLI,
486 #[token("BZ2", ignore(ascii_case))]
487 BZ2,
488 #[token("BLOCK", ignore(ascii_case))]
489 BLOCK,
490 #[token("CALL", ignore(ascii_case))]
491 CALL,
492 #[token("CASE", ignore(ascii_case))]
493 CASE,
494 #[token("CASE_SENSITIVE", ignore(ascii_case))]
495 CASE_SENSITIVE,
496 #[token("CAST", ignore(ascii_case))]
497 CAST,
498 #[token("CATALOG", ignore(ascii_case))]
499 CATALOG,
500 #[token("CATALOGS", ignore(ascii_case))]
501 CATALOGS,
502 #[token("CENTURY", ignore(ascii_case))]
503 CENTURY,
504 #[token("CHANGES", ignore(ascii_case))]
505 CHANGES,
506 #[token("CLUSTER", ignore(ascii_case))]
507 CLUSTER,
508 #[token("COMMENT", ignore(ascii_case))]
509 COMMENT,
510 #[token("COMMENTS", ignore(ascii_case))]
511 COMMENTS,
512 #[token("COMPACT", ignore(ascii_case))]
513 COMPACT,
514 #[token("CONNECTION", ignore(ascii_case))]
515 CONNECTION,
516 #[token("CONNECTIONS", ignore(ascii_case))]
517 CONNECTIONS,
518 #[token("CONSUME", ignore(ascii_case))]
519 CONSUME,
520 #[token("CONTENT_TYPE", ignore(ascii_case))]
521 CONTENT_TYPE,
522 #[token("CONTINUE", ignore(ascii_case))]
523 CONTINUE,
524 #[token("CURSOR", ignore(ascii_case))]
525 CURSOR,
526 #[token("CHAR", ignore(ascii_case))]
527 CHAR,
528 #[token("CHECK", ignore(ascii_case))]
529 CHECK,
530 #[token("CLOSE", ignore(ascii_case))]
531 CLOSE,
532 #[token("COLUMN", ignore(ascii_case))]
533 COLUMN,
534 #[token("CACHE", ignore(ascii_case))]
535 CACHE,
536 #[token("COLUMN_MATCH_MODE", ignore(ascii_case))]
537 COLUMN_MATCH_MODE,
538 #[token("COLUMNS", ignore(ascii_case))]
539 COLUMNS,
540 #[token("CHARACTER", ignore(ascii_case))]
541 CHARACTER,
542 #[token("CONFLICT", ignore(ascii_case))]
543 CONFLICT,
544 #[token("CONSTRAINT", ignore(ascii_case))]
545 CONSTRAINT,
546 #[token("COMPRESSION", ignore(ascii_case))]
547 COMPRESSION,
548 #[token("COPY_OPTIONS", ignore(ascii_case))]
549 COPY_OPTIONS,
550 #[token("COPY", ignore(ascii_case))]
551 COPY,
552 #[token("COUNT", ignore(ascii_case))]
553 COUNT,
554 #[token("CREDENTIAL", ignore(ascii_case))]
555 CREDENTIAL,
556 #[token("CREATE", ignore(ascii_case))]
557 CREATE,
558 #[token("CROSS", ignore(ascii_case))]
559 CROSS,
560 #[token("CSV", ignore(ascii_case))]
561 CSV,
562 #[token("CURRENT_DATE", ignore(ascii_case))]
563 CURRENT_DATE,
564 #[token("CURRENT_TIME", ignore(ascii_case))]
565 CURRENT_TIME,
566 #[token("CURRENT_TIMESTAMP", ignore(ascii_case))]
567 CURRENT_TIMESTAMP,
568 #[token("CURRENT", ignore(ascii_case))]
569 CURRENT,
570 #[token("DATABASE", ignore(ascii_case))]
571 DATABASE,
572 #[token("DATABASES", ignore(ascii_case))]
573 DATABASES,
574 #[token("DATA", ignore(ascii_case))]
575 DATA,
576 #[token("DATE", ignore(ascii_case))]
577 DATE,
578 #[token("DATE_ADD", ignore(ascii_case))]
579 DATE_ADD,
580 #[token("DATEADD", ignore(ascii_case))]
581 DATEADD,
582 #[token("DATE_DIFF", ignore(ascii_case))]
583 DATE_DIFF,
584 #[token("DATEDIFF", ignore(ascii_case))]
585 DATEDIFF,
586 #[token("DATE_PART", ignore(ascii_case))]
587 DATE_PART,
588 #[token("DATEPART", ignore(ascii_case))]
589 DATEPART,
590 #[token("DATE_SUB", ignore(ascii_case))]
591 DATE_SUB,
592 #[token("DATE_BETWEEN", ignore(ascii_case))]
593 DATE_BETWEEN,
594 #[token("DATEBETWEEN", ignore(ascii_case))]
595 DATEBETWEEN,
596 #[token("DATESUB", ignore(ascii_case))]
597 DATESUB,
598 #[token("DATE_TRUNC", ignore(ascii_case))]
599 DATE_TRUNC,
600 #[token("TIME_SLICE", ignore(ascii_case))]
601 TIME_SLICE,
602 #[token("TRUNC", ignore(ascii_case))]
603 TRUNC,
604 #[token("DATETIME", ignore(ascii_case))]
605 DATETIME,
606 #[token("DAY", ignore(ascii_case))]
607 DAY,
608 #[token("DECADE", ignore(ascii_case))]
609 DECADE,
610 #[token("DECIMAL", ignore(ascii_case))]
611 DECIMAL,
612 #[token("DECLARE", ignore(ascii_case))]
613 DECLARE,
614 #[token("DEFAULT", ignore(ascii_case))]
615 DEFAULT,
616 #[token("DEFLATE", ignore(ascii_case))]
617 DEFLATE,
618 #[token("DELETE", ignore(ascii_case))]
619 DELETE,
620 #[token("DESC", ignore(ascii_case))]
621 DESC,
622 #[token("DETAILED_OUTPUT", ignore(ascii_case))]
623 DETAILED_OUTPUT,
624 #[token("DESCRIBE", ignore(ascii_case))]
625 DESCRIBE,
626 #[token("DISABLE", ignore(ascii_case))]
627 DISABLE,
628 #[token("DISABLE_VARIANT_CHECK", ignore(ascii_case))]
629 DISABLE_VARIANT_CHECK,
630 #[token("DISTINCT", ignore(ascii_case))]
631 DISTINCT,
632 #[token("RESPECT", ignore(ascii_case))]
633 RESPECT,
634 #[token("IGNORE", ignore(ascii_case))]
635 IGNORE,
636 #[token("DIV", ignore(ascii_case))]
637 DIV,
638 #[token("DOUBLE_SHA1_PASSWORD", ignore(ascii_case))]
639 DOUBLE_SHA1_PASSWORD,
640 #[token("DO", ignore(ascii_case))]
641 DO,
642 #[token("DOUBLE", ignore(ascii_case))]
643 DOUBLE,
644 #[token("DOW", ignore(ascii_case))]
645 DOW,
646 #[token("WEEK", ignore(ascii_case))]
647 WEEK,
648 #[token("DELTA", ignore(ascii_case))]
649 DELTA,
650 #[token("DOY", ignore(ascii_case))]
651 DOY,
652 #[token("DOWNLOAD", ignore(ascii_case))]
653 DOWNLOAD,
654 #[token("DOWNSTREAM", ignore(ascii_case))]
655 DOWNSTREAM,
656 #[token("DROP", ignore(ascii_case))]
657 DROP,
658 #[token("DRY", ignore(ascii_case))]
659 DRY,
660 #[token("DYNAMIC", ignore(ascii_case))]
661 DYNAMIC,
662 #[token("EXCEPT", ignore(ascii_case))]
663 EXCEPT,
664 #[token("EXCLUDE", ignore(ascii_case))]
665 EXCLUDE,
666 #[token("ELSE", ignore(ascii_case))]
667 ELSE,
668 #[token("EMPTY_FIELD_AS", ignore(ascii_case))]
669 EMPTY_FIELD_AS,
670 #[token("ENABLE", ignore(ascii_case))]
671 ENABLE,
672 #[token("ENABLE_VIRTUAL_HOST_STYLE", ignore(ascii_case))]
673 ENABLE_VIRTUAL_HOST_STYLE,
674 #[token("END", ignore(ascii_case))]
675 END,
676 #[token("ENDPOINT", ignore(ascii_case))]
677 ENDPOINT,
678 #[token("ENGINE", ignore(ascii_case))]
679 ENGINE,
680 #[token("ENGINES", ignore(ascii_case))]
681 ENGINES,
682 #[token("EPOCH", ignore(ascii_case))]
683 EPOCH,
684 #[token("YEARWEEK", ignore(ascii_case))]
685 YEARWEEK,
686 #[token("MICROSECOND", ignore(ascii_case))]
687 MICROSECOND,
688
689 #[token("ERROR_ON_COLUMN_COUNT_MISMATCH", ignore(ascii_case))]
690 ERROR_ON_COLUMN_COUNT_MISMATCH,
691 #[token("ESCAPE", ignore(ascii_case))]
692 ESCAPE,
693 #[token("EXCEPTION_BACKTRACE", ignore(ascii_case))]
694 EXCEPTION_BACKTRACE,
695 #[token("EXISTS", ignore(ascii_case))]
696 EXISTS,
697 #[token("EXPLAIN", ignore(ascii_case))]
698 EXPLAIN,
699 #[token("EXPIRE", ignore(ascii_case))]
700 EXPIRE,
701 #[token("EXTRACT", ignore(ascii_case))]
702 EXTRACT,
703 #[token("ELSEIF", ignore(ascii_case))]
704 ELSEIF,
705 #[token("FALSE", ignore(ascii_case))]
706 FALSE,
707 #[token("FETCH", ignore(ascii_case))]
708 FETCH,
709 #[token("FIELDS", ignore(ascii_case))]
710 FIELDS,
711 #[token("FIELD_DELIMITER", ignore(ascii_case))]
712 FIELD_DELIMITER,
713 #[token("NAN_DISPLAY", ignore(ascii_case))]
714 NAN_DISPLAY,
715 #[token("NULL_DISPLAY", ignore(ascii_case))]
716 NULL_DISPLAY,
717 #[token("NULL_IF", ignore(ascii_case))]
718 NULL_IF,
719 #[token("FILE_FORMAT", ignore(ascii_case))]
720 FILE_FORMAT,
721 #[token("FILE", ignore(ascii_case))]
722 FILE,
723 #[token("FILES", ignore(ascii_case))]
724 FILES,
725 #[token("FINAL", ignore(ascii_case))]
726 FINAL,
727 #[token("FLASHBACK", ignore(ascii_case))]
728 FLASHBACK,
729 #[token("FLOAT", ignore(ascii_case))]
730 FLOAT,
731 #[token("FLOAT32", ignore(ascii_case))]
732 FLOAT32,
733 #[token("FLOAT64", ignore(ascii_case))]
734 FLOAT64,
735 #[token("FOR", ignore(ascii_case))]
736 FOR,
737 #[token("FORCE", ignore(ascii_case))]
738 FORCE,
739 #[token("FORMAT", ignore(ascii_case))]
740 FORMAT,
741 #[token("FOLLOWING", ignore(ascii_case))]
742 FOLLOWING,
743 #[token("FORMAT_NAME", ignore(ascii_case))]
744 FORMAT_NAME,
745 #[token("FORMATS", ignore(ascii_case))]
746 FORMATS,
747 #[token("FLUSH", ignore(ascii_case))]
748 FLUSH,
749 #[token("FRAGMENTS", ignore(ascii_case))]
750 FRAGMENTS,
751 #[token("FRIDAY", ignore(ascii_case))]
752 FRIDAY,
753 #[token("FROM", ignore(ascii_case))]
754 FROM,
755 #[token("FULL", ignore(ascii_case))]
756 FULL,
757 #[token("FUNCTION", ignore(ascii_case))]
758 FUNCTION,
759 #[token("FUNCTIONS", ignore(ascii_case))]
760 FUNCTIONS,
761 #[token("TABLE_FUNCTIONS", ignore(ascii_case))]
762 TABLE_FUNCTIONS,
763 #[token("SET_VAR", ignore(ascii_case))]
764 SET_VAR,
765 #[token("FUSE", ignore(ascii_case))]
766 FUSE,
767 #[token("GET", ignore(ascii_case))]
768 GET,
769 #[token("GENERATED", ignore(ascii_case))]
770 GENERATED,
771 #[token("GEOMETRY", ignore(ascii_case))]
772 GEOMETRY,
773 #[token("GEOGRAPHY", ignore(ascii_case))]
774 GEOGRAPHY,
775 #[token("GLOBAL", ignore(ascii_case))]
776 GLOBAL,
777 #[token("GRAPH", ignore(ascii_case))]
778 GRAPH,
779 #[token("GROUP", ignore(ascii_case))]
780 GROUP,
781 #[token("GZIP", ignore(ascii_case))]
782 GZIP,
783 #[token("HAVING", ignore(ascii_case))]
784 HAVING,
785 #[token("HIGH", ignore(ascii_case))]
786 HIGH,
787 #[token("HILBERT", ignore(ascii_case))]
788 HILBERT,
789 #[token("HISTORY", ignore(ascii_case))]
790 HISTORY,
791 #[token("HIVE", ignore(ascii_case))]
792 HIVE,
793 #[token("HOUR", ignore(ascii_case))]
794 HOUR,
795 #[token("HOURS", ignore(ascii_case))]
796 HOURS,
797 #[token("ICEBERG", ignore(ascii_case))]
798 ICEBERG,
799 #[token("INTERSECT", ignore(ascii_case))]
800 INTERSECT,
801 #[token("IDENTIFIED", ignore(ascii_case))]
802 IDENTIFIED,
803 #[token("IDENTIFIER", ignore(ascii_case))]
804 IDENTIFIER,
805 #[token("IDENTITY", ignore(ascii_case))]
806 IDENTITY,
807 #[token("IF", ignore(ascii_case))]
808 IF,
809 #[token("IMMUTABLE", ignore(ascii_case))]
810 IMMUTABLE,
811 #[token("IN", ignore(ascii_case))]
812 IN,
813 #[token("INCLUDE_QUERY_ID", ignore(ascii_case))]
814 INCLUDE_QUERY_ID,
815 #[token("INCREMENTAL", ignore(ascii_case))]
816 INCREMENTAL,
817 #[token("INCREMENT", ignore(ascii_case))]
818 INCREMENT,
819 #[token("START", ignore(ascii_case))]
820 START,
821 #[token("INDEX", ignore(ascii_case))]
822 INDEX,
823 #[token("INFORMATION", ignore(ascii_case))]
824 INFORMATION,
825 #[token("INITIALIZE", ignore(ascii_case))]
826 INITIALIZE,
827 #[token("INNER", ignore(ascii_case))]
828 INNER,
829 #[token("INSERT", ignore(ascii_case))]
830 INSERT,
831 #[token("INT", ignore(ascii_case))]
832 INT,
833 #[token("INT16", ignore(ascii_case))]
834 INT16,
835 #[token("INT32", ignore(ascii_case))]
836 INT32,
837 #[token("INT64", ignore(ascii_case))]
838 INT64,
839 #[token("INT8", ignore(ascii_case))]
840 INT8,
841 #[token("INTEGER", ignore(ascii_case))]
842 INTEGER,
843 #[token("INTERVAL", ignore(ascii_case))]
844 INTERVAL,
845 #[token("INTO", ignore(ascii_case))]
846 INTO,
847 #[token("INVERTED", ignore(ascii_case))]
848 INVERTED,
849 #[token("PREVIOUS_DAY", ignore(ascii_case))]
850 PREVIOUS_DAY,
851 #[token("PROCEDURE", ignore(ascii_case))]
852 PROCEDURE,
853 #[token("PROCEDURES", ignore(ascii_case))]
854 PROCEDURES,
855 #[token("IMMEDIATE", ignore(ascii_case))]
856 IMMEDIATE,
857 #[token("IS", ignore(ascii_case))]
858 IS,
859 #[token("ISODOW", ignore(ascii_case))]
860 ISODOW,
861 #[token("ISOWEEK", ignore(ascii_case))]
862 ISOWEEK,
863 #[token("ISOYEAR", ignore(ascii_case))]
864 ISOYEAR,
865 #[token("JOIN", ignore(ascii_case))]
866 JOIN,
867 #[token("JSON", ignore(ascii_case))]
868 JSON,
869 #[token("JULIAN", ignore(ascii_case))]
870 JULIAN,
871 #[token("JWT", ignore(ascii_case))]
872 JWT,
873 #[token("KEY", ignore(ascii_case))]
874 KEY,
875 #[token("KILL", ignore(ascii_case))]
876 KILL,
877 #[token("LAST_DAY", ignore(ascii_case))]
878 LAST_DAY,
879 #[token("LATERAL", ignore(ascii_case))]
880 LATERAL,
881 #[token("LINEAR", ignore(ascii_case))]
882 LINEAR,
883 #[token("LOCATION_PREFIX", ignore(ascii_case))]
884 LOCATION_PREFIX,
885 #[token("LOCKS", ignore(ascii_case))]
886 LOCKS,
887 #[token("LOGICAL", ignore(ascii_case))]
888 LOGICAL,
889 #[token("LOOP", ignore(ascii_case))]
890 LOOP,
891 #[token("SECONDARY", ignore(ascii_case))]
892 SECONDARY,
893 #[token("ROLES", ignore(ascii_case))]
894 ROLES,
895 #[token("<+>")]
897 L1DISTANCE,
898 #[token("<->")]
899 L2DISTANCE,
900 #[token("LANCE", ignore(ascii_case))]
901 LANCE,
902 #[token("LEADING", ignore(ascii_case))]
903 LEADING,
904 #[token("LEFT", ignore(ascii_case))]
905 LEFT,
906 #[token("LET", ignore(ascii_case))]
907 LET,
908 #[token("LIKE", ignore(ascii_case))]
909 LIKE,
910 #[token("LIMIT", ignore(ascii_case))]
911 LIMIT,
912 #[token("LIST", ignore(ascii_case))]
913 LIST,
914 #[token("LOW", ignore(ascii_case))]
915 LOW,
916 #[token("LZO", ignore(ascii_case))]
917 LZO,
918 #[token("MASKING", ignore(ascii_case))]
919 MASKING,
920 #[token("MAP", ignore(ascii_case))]
921 MAP,
922 #[token("MAX_FILE_SIZE", ignore(ascii_case))]
923 MAX_FILE_SIZE,
924 #[token("MASTER_KEY", ignore(ascii_case))]
925 MASTER_KEY,
926 #[token("MEDIUM", ignore(ascii_case))]
927 MEDIUM,
928 #[token("MEMO", ignore(ascii_case))]
929 MEMO,
930 #[token("MEMORY", ignore(ascii_case))]
931 MEMORY,
932 #[token("METRICS", ignore(ascii_case))]
933 METRICS,
934 #[token("MICROSECONDS", ignore(ascii_case))]
935 MICROSECONDS,
936 #[token("MILLENNIUM", ignore(ascii_case))]
937 MILLENNIUM,
938 #[token("MILLISECONDS", ignore(ascii_case))]
939 MILLISECONDS,
940 #[token("MINUTE", ignore(ascii_case))]
941 MINUTE,
942 #[token("MONTH", ignore(ascii_case))]
943 MONTH,
944 #[token("MODIFY", ignore(ascii_case))]
945 MODIFY,
946 #[token("MATERIALIZED", ignore(ascii_case))]
947 MATERIALIZED,
948 #[token("MUST_CHANGE_PASSWORD", ignore(ascii_case))]
949 MUST_CHANGE_PASSWORD,
950 #[token("NEXT_DAY", ignore(ascii_case))]
951 NEXT_DAY,
952 #[token("NON_DISPLAY", ignore(ascii_case))]
953 NON_DISPLAY,
954 #[token("NATURAL", ignore(ascii_case))]
955 NATURAL,
956 #[token("NETWORK", ignore(ascii_case))]
957 NETWORK,
958 #[token("DISABLED", ignore(ascii_case))]
959 DISABLED,
960 #[token("NDJSON", ignore(ascii_case))]
961 NDJSON,
962 #[token("NGRAM", ignore(ascii_case))]
963 NGRAM,
964 #[token("NO_PASSWORD", ignore(ascii_case))]
965 NO_PASSWORD,
966 #[token("NONE", ignore(ascii_case))]
967 NONE,
968 #[token("NOORDER", ignore(ascii_case))]
969 NOORDER,
970 #[token("NOSCAN", ignore(ascii_case))]
971 NOSCAN,
972 #[token("NOT", ignore(ascii_case))]
973 NOT,
974 #[token("NOTENANTSETTING", ignore(ascii_case))]
975 NOTENANTSETTING,
976 #[token("DEFAULT_ROLE", ignore(ascii_case))]
977 DEFAULT_ROLE,
978 #[token("DEFAULT_WAREHOUSE", ignore(ascii_case))]
979 DEFAULT_WAREHOUSE,
980 #[token("NULL", ignore(ascii_case))]
981 NULL,
982 #[token("NULLABLE", ignore(ascii_case))]
983 NULLABLE,
984 #[token("NUMERIC", ignore(ascii_case))]
985 NUMERIC,
986 #[token("OBJECT", ignore(ascii_case))]
987 OBJECT,
988 #[token("OF", ignore(ascii_case))]
989 OF,
990 #[token("OFFSET", ignore(ascii_case))]
991 OFFSET,
992 #[token("ON", ignore(ascii_case))]
993 ON,
994 #[token("OPEN", ignore(ascii_case))]
995 OPEN,
996 #[token("ON_CREATE", ignore(ascii_case))]
997 ON_CREATE,
998 #[token("ON_SCHEDULE", ignore(ascii_case))]
999 ON_SCHEDULE,
1000 #[token("OPTIMIZE", ignore(ascii_case))]
1001 OPTIMIZE,
1002 #[token("OPTIONS", ignore(ascii_case))]
1003 OPTIONS,
1004 #[token("OR", ignore(ascii_case))]
1005 OR,
1006 #[token("ORC", ignore(ascii_case))]
1007 ORC,
1008 #[token("ORDER", ignore(ascii_case))]
1009 ORDER,
1010 #[token("OUTPUT_HEADER", ignore(ascii_case))]
1011 OUTPUT_HEADER,
1012 #[token("OUTER", ignore(ascii_case))]
1013 OUTER,
1014 #[token("ON_ERROR", ignore(ascii_case))]
1015 ON_ERROR,
1016 #[token("OVER", ignore(ascii_case))]
1017 OVER,
1018 #[token("OVERWRITE", ignore(ascii_case))]
1019 OVERWRITE,
1020 #[token("PARTITION", ignore(ascii_case))]
1021 PARTITION,
1022 #[token("PROPERTIES", ignore(ascii_case))]
1023 PROPERTIES,
1024 #[token("PARQUET", ignore(ascii_case))]
1025 PARQUET,
1026 #[token("PASSWORD", ignore(ascii_case))]
1027 PASSWORD,
1028 #[token("PASSWORD_MIN_LENGTH", ignore(ascii_case))]
1029 PASSWORD_MIN_LENGTH,
1030 #[token("PASSWORD_MAX_LENGTH", ignore(ascii_case))]
1031 PASSWORD_MAX_LENGTH,
1032 #[token("PASSWORD_MIN_UPPER_CASE_CHARS", ignore(ascii_case))]
1033 PASSWORD_MIN_UPPER_CASE_CHARS,
1034 #[token("PASSWORD_MIN_LOWER_CASE_CHARS", ignore(ascii_case))]
1035 PASSWORD_MIN_LOWER_CASE_CHARS,
1036 #[token("PASSWORD_MIN_NUMERIC_CHARS", ignore(ascii_case))]
1037 PASSWORD_MIN_NUMERIC_CHARS,
1038 #[token("PASSWORD_MIN_SPECIAL_CHARS", ignore(ascii_case))]
1039 PASSWORD_MIN_SPECIAL_CHARS,
1040 #[token("PASSWORD_MIN_AGE_DAYS", ignore(ascii_case))]
1041 PASSWORD_MIN_AGE_DAYS,
1042 #[token("PASSWORD_MAX_AGE_DAYS", ignore(ascii_case))]
1043 PASSWORD_MAX_AGE_DAYS,
1044 #[token("PASSWORD_MAX_RETRIES", ignore(ascii_case))]
1045 PASSWORD_MAX_RETRIES,
1046 #[token("PASSWORD_LOCKOUT_TIME_MINS", ignore(ascii_case))]
1047 PASSWORD_LOCKOUT_TIME_MINS,
1048 #[token("PASSWORD_HISTORY", ignore(ascii_case))]
1049 PASSWORD_HISTORY,
1050 #[token("PATTERN", ignore(ascii_case))]
1051 PATTERN,
1052 #[token("PERF", ignore(ascii_case))]
1053 PERF,
1054 #[token("PIPELINE", ignore(ascii_case))]
1055 PIPELINE,
1056 #[token("PLAINTEXT_PASSWORD", ignore(ascii_case))]
1057 PLAINTEXT_PASSWORD,
1058 #[token("POLICIES", ignore(ascii_case))]
1059 POLICIES,
1060 #[token("POLICY", ignore(ascii_case))]
1061 POLICY,
1062 #[token("POSITION", ignore(ascii_case))]
1063 POSITION,
1064 #[token("PROCESSLIST", ignore(ascii_case))]
1065 PROCESSLIST,
1066 #[token("PRIORITY", ignore(ascii_case))]
1067 PRIORITY,
1068 #[token("PURGE", ignore(ascii_case))]
1069 PURGE,
1070 #[token("PUT", ignore(ascii_case))]
1071 PUT,
1072 #[token("PARTIAL", ignore(ascii_case))]
1073 PARTIAL,
1074 #[token("QUARTER", ignore(ascii_case))]
1075 QUARTER,
1076 #[token("QUERY", ignore(ascii_case))]
1077 QUERY,
1078 #[token("QUOTE", ignore(ascii_case))]
1079 QUOTE,
1080 #[token("QUOTED_EMPTY_FIELD_AS", ignore(ascii_case))]
1081 QUOTED_EMPTY_FIELD_AS,
1082 #[token("QUOTED_IDENTIFIERS", ignore(ascii_case))]
1083 QUOTED_IDENTIFIERS,
1084 #[token("RANGE", ignore(ascii_case))]
1085 RANGE,
1086 #[token("RAWDEFLATE", ignore(ascii_case))]
1087 RAWDEFLATE,
1088 #[token("READ_ONLY", ignore(ascii_case))]
1089 READ_ONLY,
1090 #[token("RECLUSTER", ignore(ascii_case))]
1091 RECLUSTER,
1092 #[token("RECORD_DELIMITER", ignore(ascii_case))]
1093 RECORD_DELIMITER,
1094 #[token("REFERENCE_USAGE", ignore(ascii_case))]
1095 REFERENCE_USAGE,
1096 #[token("REFRESH", ignore(ascii_case))]
1097 REFRESH,
1098 #[token("REGEXP", ignore(ascii_case))]
1099 REGEXP,
1100 #[token("RENAME", ignore(ascii_case))]
1101 RENAME,
1102 #[token("REPLACE", ignore(ascii_case))]
1103 REPLACE,
1104 #[token("RETURN_FAILED_ONLY", ignore(ascii_case))]
1105 RETURN_FAILED_ONLY,
1106 #[token("REVERSE", ignore(ascii_case))]
1107 REVERSE,
1108 #[token("SAMPLE", ignore(ascii_case))]
1109 SAMPLE,
1110 #[token("MERGE", ignore(ascii_case))]
1111 MERGE,
1112 #[token("MATCHED", ignore(ascii_case))]
1113 MATCHED,
1114 #[token("MISSING_FIELD_AS", ignore(ascii_case))]
1115 MISSING_FIELD_AS,
1116 #[token("NULL_FIELD_AS", ignore(ascii_case))]
1117 NULL_FIELD_AS,
1118 #[token("UNMATCHED", ignore(ascii_case))]
1119 UNMATCHED,
1120 #[token("ROW", ignore(ascii_case))]
1121 ROW,
1122 #[token("ROWS", ignore(ascii_case))]
1123 ROWS,
1124 #[token("ROW_TAG", ignore(ascii_case))]
1125 ROW_TAG,
1126 #[token("GRANT", ignore(ascii_case))]
1127 GRANT,
1128 #[token("REAL", ignore(ascii_case))]
1129 REAL,
1130 #[token("REPEAT", ignore(ascii_case))]
1131 REPEAT,
1132 #[token("ROLE", ignore(ascii_case))]
1133 ROLE,
1134 #[token("PRECEDING", ignore(ascii_case))]
1135 PRECEDING,
1136 #[token("PRECISION", ignore(ascii_case))]
1137 PRECISION,
1138 #[token("PRESIGN", ignore(ascii_case))]
1139 PRESIGN,
1140 #[token("PRIVILEGES", ignore(ascii_case))]
1141 PRIVILEGES,
1142 #[token("QUALIFY", ignore(ascii_case))]
1143 QUALIFY,
1144 #[token("REMOVE", ignore(ascii_case))]
1145 REMOVE,
1146 #[token("RETAIN", ignore(ascii_case))]
1147 RETAIN,
1148 #[token("REVOKE", ignore(ascii_case))]
1149 REVOKE,
1150 #[token("RECURSIVE", ignore(ascii_case))]
1151 RECURSIVE,
1152 #[token("RETURN", ignore(ascii_case))]
1153 RETURN,
1154 #[token("RETURNS", ignore(ascii_case))]
1155 RETURNS,
1156 #[token("RESULTSET", ignore(ascii_case))]
1157 RESULTSET,
1158 #[token("RUN", ignore(ascii_case))]
1159 RUN,
1160 #[token("GRANTS", ignore(ascii_case))]
1161 GRANTS,
1162 #[token("REFRESH_MODE", ignore(ascii_case))]
1163 REFRESH_MODE,
1164 #[token("RIGHT", ignore(ascii_case))]
1165 RIGHT,
1166 #[token("RLIKE", ignore(ascii_case))]
1167 RLIKE,
1168 #[token("RAW", ignore(ascii_case))]
1169 RAW,
1170 #[token("OPTIMIZED", ignore(ascii_case))]
1171 OPTIMIZED,
1172 #[token("DECORRELATED", ignore(ascii_case))]
1173 DECORRELATED,
1174 #[token("SATURDAY", ignore(ascii_case))]
1175 SATURDAY,
1176 #[token("SCHEMA", ignore(ascii_case))]
1177 SCHEMA,
1178 #[token("SCHEMAS", ignore(ascii_case))]
1179 SCHEMAS,
1180 #[token("SECOND", ignore(ascii_case))]
1181 SECOND,
1182 #[token("MILLISECOND", ignore(ascii_case))]
1183 MILLISECOND,
1184 #[token("SELECT", ignore(ascii_case))]
1185 SELECT,
1186 #[token("PIVOT", ignore(ascii_case))]
1187 PIVOT,
1188 #[token("UNPIVOT", ignore(ascii_case))]
1189 UNPIVOT,
1190 #[token("SEGMENT", ignore(ascii_case))]
1191 SEGMENT,
1192 #[token("SET", ignore(ascii_case))]
1193 SET,
1194 #[token("UNSET", ignore(ascii_case))]
1195 UNSET,
1196 #[token("SESSION", ignore(ascii_case))]
1197 SESSION,
1198 #[token("SETTINGS", ignore(ascii_case))]
1199 SETTINGS,
1200 #[token("SPATIAL", ignore(ascii_case))]
1201 SPATIAL,
1202 #[token("VARIABLES", ignore(ascii_case))]
1203 VARIABLES,
1204 #[token("STAGES", ignore(ascii_case))]
1205 STAGES,
1206 #[token("STATISTIC", ignore(ascii_case))]
1207 STATISTIC,
1208 #[token("SUMMARY", ignore(ascii_case))]
1209 SUMMARY,
1210 #[token("SHA256_PASSWORD", ignore(ascii_case))]
1211 SHA256_PASSWORD,
1212 #[token("SHOW", ignore(ascii_case))]
1213 SHOW,
1214 #[token("SINCE", ignore(ascii_case))]
1215 SINCE,
1216 #[token("SIGNED", ignore(ascii_case))]
1217 SIGNED,
1218 #[token("SINGLE", ignore(ascii_case))]
1219 SINGLE,
1220 #[token("SIZE_LIMIT", ignore(ascii_case))]
1221 SIZE_LIMIT,
1222 #[token("MAX_FILES", ignore(ascii_case))]
1223 MAX_FILES,
1224 #[token("MONDAY", ignore(ascii_case))]
1225 MONDAY,
1226 #[token("SKIP_HEADER", ignore(ascii_case))]
1227 SKIP_HEADER,
1228 #[token("SMALLINT", ignore(ascii_case))]
1229 SMALLINT,
1230 #[token("SNAPPY", ignore(ascii_case))]
1231 SNAPPY,
1232 #[token("SNAPSHOT", ignore(ascii_case))]
1233 SNAPSHOT,
1234 #[token("SPLIT_SIZE", ignore(ascii_case))]
1235 SPLIT_SIZE,
1236 #[token("STAGE", ignore(ascii_case))]
1237 STAGE,
1238 #[token("STAGE_LOCATION", ignore(ascii_case))]
1239 STAGE_LOCATION,
1240 #[token("SYNTAX", ignore(ascii_case))]
1241 SYNTAX,
1242 #[token("USAGE", ignore(ascii_case))]
1243 USAGE,
1244 #[token("ACCESS", ignore(ascii_case))]
1245 ACCESS,
1246 #[token("USE_LOGIC_TYPE", ignore(ascii_case))]
1247 USE_LOGIC_TYPE,
1248 #[token("USE_RAW_PATH", ignore(ascii_case))]
1249 USE_RAW_PATH,
1250 #[token("UPDATE", ignore(ascii_case))]
1251 UPDATE,
1252 #[token("UPLOAD", ignore(ascii_case))]
1253 UPLOAD,
1254 #[token("SEQUENCE", ignore(ascii_case))]
1255 SEQUENCE,
1256 #[token("SEQUENCES", ignore(ascii_case))]
1257 SEQUENCES,
1258 #[token("SHARE", ignore(ascii_case))]
1259 SHARE,
1260 #[token("SHARES", ignore(ascii_case))]
1261 SHARES,
1262 #[token("SUPER", ignore(ascii_case))]
1263 SUPER,
1264 #[token("SWAP", ignore(ascii_case))]
1265 SWAP,
1266 #[token("STATUS", ignore(ascii_case))]
1267 STATUS,
1268 #[token("STORED", ignore(ascii_case))]
1269 STORED,
1270 #[token("STREAM", ignore(ascii_case))]
1271 STREAM,
1272 #[token("STREAMS", ignore(ascii_case))]
1273 STREAMS,
1274 #[token("STRING", ignore(ascii_case))]
1275 STRING,
1276 #[token("SUBSTRING", ignore(ascii_case))]
1277 SUBSTRING,
1278 #[token("SUBSTR", ignore(ascii_case))]
1279 SUBSTR,
1280 #[token("SEMI", ignore(ascii_case))]
1281 SEMI,
1282 #[token("SOUNDS", ignore(ascii_case))]
1283 SOUNDS,
1284 #[token("STATISTICS", ignore(ascii_case))]
1285 STATISTICS,
1286 #[token("SYNC", ignore(ascii_case))]
1287 SYNC,
1288 #[token("SYSTEM", ignore(ascii_case))]
1289 SYSTEM,
1290 #[token("STORAGE_TYPE", ignore(ascii_case))]
1291 STORAGE_TYPE,
1292 #[token("TABLE", ignore(ascii_case))]
1293 TABLE,
1294 #[token("TABLES", ignore(ascii_case))]
1295 TABLES,
1296 #[token("TAG", ignore(ascii_case))]
1297 TAG,
1298 #[token("TAGS", ignore(ascii_case))]
1299 TAGS,
1300 #[token("TARGET_LAG", ignore(ascii_case))]
1301 TARGET_LAG,
1302 #[token("TEXT", ignore(ascii_case))]
1303 TEXT,
1304 #[token("LONGTEXT", ignore(ascii_case))]
1305 LONGTEXT,
1306 #[token("MEDIUMTEXT", ignore(ascii_case))]
1307 MEDIUMTEXT,
1308 #[token("TINYTEXT", ignore(ascii_case))]
1309 TINYTEXT,
1310 #[token("TENANTSETTING", ignore(ascii_case))]
1311 TENANTSETTING,
1312 #[token("TENANTS", ignore(ascii_case))]
1313 TENANTS,
1314 #[token("TENANT", ignore(ascii_case))]
1315 TENANT,
1316 #[token("THEN", ignore(ascii_case))]
1317 THEN,
1318 #[token("THROW", ignore(ascii_case))]
1319 THROW,
1320 #[token("THURSDAY", ignore(ascii_case))]
1321 THURSDAY,
1322 #[token("TIME", ignore(ascii_case))]
1323 TIME,
1324 #[token("TIMESTAMP", ignore(ascii_case))]
1325 TIMESTAMP,
1326 #[token("TIMESTAMP_TZ", ignore(ascii_case))]
1327 TIMESTAMP_TZ,
1328 #[token("TIMEZONE_HOUR", ignore(ascii_case))]
1329 TIMEZONE_HOUR,
1330 #[token("TIMEZONE_MINUTE", ignore(ascii_case))]
1331 TIMEZONE_MINUTE,
1332 #[token("TIMEZONE", ignore(ascii_case))]
1333 TIMEZONE,
1334 #[token("TINYINT", ignore(ascii_case))]
1335 TINYINT,
1336 #[token("TO", ignore(ascii_case))]
1337 TO,
1338 #[token("TOKEN", ignore(ascii_case))]
1339 TOKEN,
1340 #[token("TRAILING", ignore(ascii_case))]
1341 TRAILING,
1342 #[token("TRANSIENT", ignore(ascii_case))]
1343 TRANSIENT,
1344 #[token("TRIM", ignore(ascii_case))]
1345 TRIM,
1346 #[token("TRUE", ignore(ascii_case))]
1347 TRUE,
1348 #[token("TRUNCATE", ignore(ascii_case))]
1349 TRUNCATE,
1350 #[token("TRY_CAST", ignore(ascii_case))]
1351 TRY_CAST,
1352 #[token("TSV", ignore(ascii_case))]
1353 TSV,
1354 #[token("TUESDAY", ignore(ascii_case))]
1355 TUESDAY,
1356 #[token("TUPLE", ignore(ascii_case))]
1357 TUPLE,
1358 #[token("TYPE", ignore(ascii_case))]
1359 TYPE,
1360 #[token("UNBOUNDED", ignore(ascii_case))]
1361 UNBOUNDED,
1362 #[token("UNION", ignore(ascii_case))]
1363 UNION,
1364 #[token("UINT16", ignore(ascii_case))]
1365 UINT16,
1366 #[token("UINT32", ignore(ascii_case))]
1367 UINT32,
1368 #[token("UINT64", ignore(ascii_case))]
1369 UINT64,
1370 #[token("UINT8", ignore(ascii_case))]
1371 UINT8,
1372 #[token("UNDROP", ignore(ascii_case))]
1373 UNDROP,
1374 #[token("UNSIGNED", ignore(ascii_case))]
1375 UNSIGNED,
1376 #[token("URL", ignore(ascii_case))]
1377 URL,
1378 #[token("METHOD", ignore(ascii_case))]
1379 METHOD,
1380 #[token("AUTHORIZATION_HEADER", ignore(ascii_case))]
1381 AUTHORIZATION_HEADER,
1382 #[token("USE", ignore(ascii_case))]
1383 USE,
1384 #[token("USER", ignore(ascii_case))]
1385 USER,
1386 #[token("USERS", ignore(ascii_case))]
1387 USERS,
1388 #[token("USING", ignore(ascii_case))]
1389 USING,
1390 #[token("VACUUM", ignore(ascii_case))]
1391 VACUUM,
1392 #[token("VALUES", ignore(ascii_case))]
1393 VALUES,
1394 #[token("VARBINARY", ignore(ascii_case))]
1395 VARBINARY,
1396 #[token("VARCHAR", ignore(ascii_case))]
1397 VARCHAR,
1398 #[token("VARIANT", ignore(ascii_case))]
1399 VARIANT,
1400 #[token("VARIABLE", ignore(ascii_case))]
1401 VARIABLE,
1402 #[token("VECTOR", ignore(ascii_case))]
1403 VECTOR,
1404 #[token("VERBOSE", ignore(ascii_case))]
1405 VERBOSE,
1406 #[token("VOLATILE", ignore(ascii_case))]
1407 VOLATILE,
1408 #[token("GRAPHICAL", ignore(ascii_case))]
1409 GRAPHICAL,
1410 #[token("VIEW", ignore(ascii_case))]
1411 VIEW,
1412 #[token("VIEWS", ignore(ascii_case))]
1413 VIEWS,
1414 #[token("VIRTUAL", ignore(ascii_case))]
1415 VIRTUAL,
1416 #[token("WHEN", ignore(ascii_case))]
1417 WHEN,
1418 #[token("WHERE", ignore(ascii_case))]
1419 WHERE,
1420 #[token("WHILE", ignore(ascii_case))]
1421 WHILE,
1422 #[token("WINDOW", ignore(ascii_case))]
1423 WINDOW,
1424 #[token("WITH", ignore(ascii_case))]
1425 WITH,
1426 #[token("WITHIN", ignore(ascii_case))]
1427 WITHIN,
1428 #[token("XML", ignore(ascii_case))]
1429 XML,
1430 #[token("XOR", ignore(ascii_case))]
1431 XOR,
1432 #[token("XZ", ignore(ascii_case))]
1433 XZ,
1434 #[token("YEAR", ignore(ascii_case))]
1435 YEAR,
1436 #[token("ZIP", ignore(ascii_case))]
1437 ZIP,
1438 #[token("ZSTD", ignore(ascii_case))]
1439 ZSTD,
1440 #[token("NULLIF", ignore(ascii_case))]
1441 NULLIF,
1442 #[token("COALESCE", ignore(ascii_case))]
1443 COALESCE,
1444 #[token("RANDOM", ignore(ascii_case))]
1445 RANDOM,
1446 #[token("IFNULL", ignore(ascii_case))]
1447 IFNULL,
1448 #[token("NULLS", ignore(ascii_case))]
1449 NULLS,
1450 #[token("FIRST", ignore(ascii_case))]
1451 FIRST,
1452 #[token("LAST", ignore(ascii_case))]
1453 LAST,
1454 #[token("IGNORE_RESULT", ignore(ascii_case))]
1455 IGNORE_RESULT,
1456 #[token("GROUPING", ignore(ascii_case))]
1457 GROUPING,
1458 #[token("SETS", ignore(ascii_case))]
1459 SETS,
1460 #[token("CUBE", ignore(ascii_case))]
1461 CUBE,
1462 #[token("ROLLUP", ignore(ascii_case))]
1463 ROLLUP,
1464 #[token("INDEXES", ignore(ascii_case))]
1465 INDEXES,
1466 #[token("ADDRESS", ignore(ascii_case))]
1467 ADDRESS,
1468 #[token("OWNERSHIP", ignore(ascii_case))]
1469 OWNERSHIP,
1470 #[token("READ", ignore(ascii_case))]
1471 READ,
1472 #[token("WRITE", ignore(ascii_case))]
1473 WRITE,
1474 #[token("UDF", ignore(ascii_case))]
1475 UDF,
1476 #[token("HANDLER", ignore(ascii_case))]
1477 HANDLER,
1478 #[token("HEADERS", ignore(ascii_case))]
1479 HEADERS,
1480 #[token("LANGUAGE", ignore(ascii_case))]
1481 LANGUAGE,
1482 #[token("IMPORTS", ignore(ascii_case))]
1483 IMPORTS,
1484 #[token("PACKAGES", ignore(ascii_case))]
1485 PACKAGES,
1486 #[token("STATE", ignore(ascii_case))]
1487 STATE,
1488 #[token("TASK", ignore(ascii_case))]
1489 TASK,
1490 #[token("TASKS", ignore(ascii_case))]
1491 TASKS,
1492 #[token("TOP", ignore(ascii_case))]
1493 TOP,
1494 #[token("WAREHOUSE", ignore(ascii_case))]
1495 WAREHOUSE,
1496 #[token("WORKER", ignore(ascii_case))]
1497 WORKER,
1498 #[token("SCHEDULE", ignore(ascii_case))]
1499 SCHEDULE,
1500 #[token("SUSPEND_TASK_AFTER_NUM_FAILURES", ignore(ascii_case))]
1501 SUSPEND_TASK_AFTER_NUM_FAILURES,
1502 #[token("CRON", ignore(ascii_case))]
1503 CRON,
1504 #[token("EXECUTE", ignore(ascii_case))]
1505 EXECUTE,
1506 #[token("SUSPEND", ignore(ascii_case))]
1507 SUSPEND,
1508 #[token("RESUME", ignore(ascii_case))]
1509 RESUME,
1510 #[token("PIPE", ignore(ascii_case))]
1511 PIPE,
1512 #[token("NOTIFICATION", ignore(ascii_case))]
1513 NOTIFICATION,
1514 #[token("INTEGRATION", ignore(ascii_case))]
1515 INTEGRATION,
1516 #[token("ENABLED", ignore(ascii_case))]
1517 ENABLED,
1518 #[token("WEBHOOK", ignore(ascii_case))]
1519 WEBHOOK,
1520 #[token("WEDNESDAY", ignore(ascii_case))]
1521 WEDNESDAY,
1522 #[token("ERROR_INTEGRATION", ignore(ascii_case))]
1523 ERROR_INTEGRATION,
1524 #[token("AUTO_INGEST", ignore(ascii_case))]
1525 AUTO_INGEST,
1526 #[token("PIPE_EXECUTION_PAUSED", ignore(ascii_case))]
1527 PIPE_EXECUTION_PAUSED,
1528 #[token("PREFIX", ignore(ascii_case))]
1529 PREFIX,
1530 #[token("MODIFIED_AFTER", ignore(ascii_case))]
1531 MODIFIED_AFTER,
1532 #[token("UNTIL", ignore(ascii_case))]
1533 UNTIL,
1534 #[token("BEGIN", ignore(ascii_case))]
1535 BEGIN,
1536 #[token("TRANSACTION", ignore(ascii_case))]
1537 TRANSACTION,
1538 #[token("COMMIT", ignore(ascii_case))]
1539 COMMIT,
1540 #[token("ABORT", ignore(ascii_case))]
1541 ABORT,
1542 #[token("ROLLBACK", ignore(ascii_case))]
1543 ROLLBACK,
1544 #[token("TEMPORARY", ignore(ascii_case))]
1545 TEMPORARY,
1546 #[token("TEMP", ignore(ascii_case))]
1547 TEMP,
1548 #[token("SECONDS", ignore(ascii_case))]
1549 SECONDS,
1550 #[token("DAYS", ignore(ascii_case))]
1551 DAYS,
1552 #[token("DICTIONARY", ignore(ascii_case))]
1553 DICTIONARY,
1554 #[token("DICTIONARIES", ignore(ascii_case))]
1555 DICTIONARIES,
1556 #[token("PRIMARY", ignore(ascii_case))]
1557 PRIMARY,
1558 #[token("SOURCE", ignore(ascii_case))]
1559 SOURCE,
1560 #[token("SQL", ignore(ascii_case))]
1561 SQL,
1562 #[token("SUNDAY", ignore(ascii_case))]
1563 SUNDAY,
1564 #[token("WAREHOUSES", ignore(ascii_case))]
1565 WAREHOUSES,
1566 #[token("WORKERS", ignore(ascii_case))]
1567 WORKERS,
1568 #[token("INSPECT", ignore(ascii_case))]
1569 INSPECT,
1570 #[token("ASSIGN", ignore(ascii_case))]
1571 ASSIGN,
1572 #[token("NODES", ignore(ascii_case))]
1573 NODES,
1574 #[token("UNASSIGN", ignore(ascii_case))]
1575 UNASSIGN,
1576 #[token("ONLINE", ignore(ascii_case))]
1577 ONLINE,
1578 #[token("WORKLOAD", ignore(ascii_case))]
1579 WORKLOAD,
1580 #[token("GROUPS", ignore(ascii_case))]
1581 GROUPS,
1582 #[token("REPORT", ignore(ascii_case))]
1583 REPORT,
1584 #[token("ISSUE", ignore(ascii_case))]
1585 ISSUE,
1586 #[token("ZONE", ignore(ascii_case))]
1587 ZONE,
1588}
1589
1590impl TokenKind {
1592 pub fn is_literal(&self) -> bool {
1593 matches!(
1594 self,
1595 LiteralInteger
1596 | LiteralFloat
1597 | LiteralString
1598 | LiteralCodeString
1599 | PGLiteralHex
1600 | MySQLLiteralHex
1601 )
1602 }
1603
1604 pub fn is_keyword(&self) -> bool {
1605 !matches!(
1606 self,
1607 Ident
1608 | LiteralString
1609 | LiteralCodeString
1610 | PGLiteralHex
1611 | MySQLLiteralHex
1612 | LiteralInteger
1613 | LiteralFloat
1614 | HintPrefix
1615 | HintSuffix
1616 | DoubleEq
1617 | Eq
1618 | NotEq
1619 | Lt
1620 | Gt
1621 | Lte
1622 | Gte
1623 | Spaceship
1624 | Plus
1625 | Minus
1626 | Multiply
1627 | Divide
1628 | IntDiv
1629 | Modulo
1630 | StringConcat
1631 | LParen
1632 | RParen
1633 | Comma
1634 | Dot
1635 | Colon
1636 | DoubleColon
1637 | ColonEqual
1638 | SemiColon
1639 | Backslash
1640 | LBracket
1641 | RBracket
1642 | BitWiseAnd
1643 | BitWiseOr
1644 | Caret
1645 | Factorial
1646 | LBrace
1647 | RBrace
1648 | Dollar
1649 | RArrow
1650 | LongRArrow
1651 | HashRArrow
1652 | HashLongRArrow
1653 | FatRArrow
1654 | BitWiseXor
1655 | BitWiseNot
1656 | TildeAsterisk
1657 | ExclamationMarkTilde
1658 | ExclamationMarkTildeAsterisk
1659 | ShiftLeft
1660 | ShiftRight
1661 | DoubleExclamationMark
1662 | Abs
1663 | SquareRoot
1664 | CubeRoot
1665 | L1DISTANCE
1666 | L2DISTANCE
1667 | Placeholder
1668 | QuestionOr
1669 | QuestionAnd
1670 | ArrowAt
1671 | AtArrow
1672 | AtQuestion
1673 | AtAt
1674 | HashMinus
1675 | EOI
1676 )
1677 }
1678
1679 pub fn is_reserved_function_name(&self) -> bool {
1680 matches!(
1681 self,
1682 TokenKind::ALL
1683 | TokenKind::ANALYZE
1685 | TokenKind::AND
1686 | TokenKind::ASC
1688 | TokenKind::BETWEEN
1690 | TokenKind::BIGINT
1691 | TokenKind::BOOLEAN
1693 | TokenKind::BOTH
1694 | TokenKind::CASE
1695 | TokenKind::CAST
1696 | TokenKind::DEFAULT
1710 | TokenKind::DESC
1712 | TokenKind::DISTINCT
1713 | TokenKind::DO
1714 | TokenKind::ELSE
1715 | TokenKind::END
1716 | TokenKind::EXISTS
1717 | TokenKind::EXTRACT
1718 | TokenKind::DATE_PART
1719 | TokenKind::DATEPART
1720 | TokenKind::DATEDIFF
1721 | TokenKind::DATESUB
1722 | TokenKind::DATEBETWEEN
1723 | TokenKind::FALSE
1724 | TokenKind::FLOAT
1725 | TokenKind::CUBE
1729 | TokenKind::ROLLUP
1730 | TokenKind::IN
1732 | TokenKind::IDENTIFIER
1733 | TokenKind::INT
1736 | TokenKind::INTEGER
1737 | TokenKind::INTERVAL
1738 | TokenKind::LATERAL
1739 | TokenKind::LEADING
1740 | TokenKind::NOT
1748 | TokenKind::NULL
1749 | TokenKind::OR
1753 | TokenKind::POSITION
1757 | TokenKind::SELECT
1762 | TokenKind::SHARE
1765 | TokenKind::SHARES
1766 | TokenKind::SMALLINT
1767 | TokenKind::SOME
1768 | TokenKind::SUBSTRING
1769 | TokenKind::SUBSTR
1770 | TokenKind::TABLE
1772 | TokenKind::THEN
1773 | TokenKind::TRAILING
1776 | TokenKind::TRUE
1779 | TokenKind::TRY_CAST
1780 | TokenKind::USING
1783 | TokenKind::VALUES
1784 | TokenKind::VARCHAR
1785 | TokenKind::WHEN
1798 | TokenKind::AS
1800 | TokenKind::CHARACTER
1802 | TokenKind::CREATE
1803 | TokenKind::ATTACH
1804 | TokenKind::EXCEPT
1805 | TokenKind::FETCH
1806 | TokenKind::FOR
1807 | TokenKind::FROM
1808 | TokenKind::GROUP
1810 | TokenKind::HAVING
1811 | TokenKind::INTERSECT
1812 | TokenKind::INTO
1813 | TokenKind::LIMIT
1814 | TokenKind::OFFSET
1815 | TokenKind::ON
1816 | TokenKind::OF
1817 | TokenKind::ORDER
1818 | TokenKind::OVER
1819 | TokenKind::QUALIFY
1820 | TokenKind::ROWS
1821 | TokenKind::TO
1824 | TokenKind::UNION
1825 | TokenKind::WHERE
1826 | TokenKind::WITH
1828 | TokenKind::DATE_ADD
1829 | TokenKind::DATEADD
1830 | TokenKind::DATE_DIFF
1831 | TokenKind::DATE_SUB
1832 | TokenKind::DATE_BETWEEN
1833 | TokenKind::DATE_TRUNC
1834 | TokenKind::TIME_SLICE
1835 | TokenKind::TRUNC
1836 | TokenKind::LAST_DAY
1837 | TokenKind::PREVIOUS_DAY
1838 | TokenKind::NEXT_DAY
1839 | TokenKind::IGNORE_RESULT
1840 )
1841 }
1842
1843 pub fn is_reserved_ident(&self, after_as: bool) -> bool {
1844 match self {
1845 | TokenKind::ALL
1846 | TokenKind::ANALYZE
1848 | TokenKind::AND
1849 | TokenKind::ANY
1850 | TokenKind::FUNCTION
1851 | TokenKind::PROCEDURE
1852 | TokenKind::SEQUENCE
1853 | TokenKind::ASC
1854 | TokenKind::ANTI
1855 | TokenKind::BOTH
1859 | TokenKind::BLOCK
1860 | TokenKind::CASE
1861 | TokenKind::CAST
1862 | TokenKind::CONNECTION
1869 | TokenKind::CROSS
1870 | TokenKind::CURRENT_TIMESTAMP
1876 | TokenKind::DESC
1879 | TokenKind::DISTINCT
1880 | TokenKind::DO
1881 | TokenKind::ELSE
1882 | TokenKind::END
1883 | TokenKind::FALSE
1884 | TokenKind::FOR
1887 | TokenKind::FULL
1888 | TokenKind::IN
1890 | TokenKind::IDENTIFIER
1891 | TokenKind::INNER
1893 | TokenKind::IS
1894 | TokenKind::JOIN
1895 | TokenKind::LATERAL
1896 | TokenKind::LEADING
1897 | TokenKind::LEFT
1898 | TokenKind::LIKE
1899 | TokenKind::NATURAL
1902 | TokenKind::NOT
1903 | TokenKind::NULL
1904 | TokenKind::OR
1906 | TokenKind::RIGHT
1910 | TokenKind::SELECT
1911 | TokenKind::PIVOT
1912 | TokenKind::UNPIVOT
1913 | TokenKind::SOME
1916 | TokenKind::SEMI
1917 | TokenKind::SET
1918 | TokenKind::SAMPLE
1919 | TokenKind::THEN
1922 | TokenKind::TRAILING
1923 | TokenKind::TRUE
1924 | TokenKind::USING
1927 | TokenKind::WHEN => true,
1930 | TokenKind::ARRAY
1931 | TokenKind::AS
1932 | TokenKind::ASOF
1933 | TokenKind::BETWEEN
1934 | TokenKind::CREATE
1935 | TokenKind::ATTACH
1936 | TokenKind::EXCEPT
1937 | TokenKind::FETCH
1938 | TokenKind::FROM
1939 | TokenKind::GRANT
1940 | TokenKind::GROUP
1941 | TokenKind::HAVING
1942 | TokenKind::INTERSECT
1943 | TokenKind::INTO
1944 | TokenKind::LIMIT
1946 | TokenKind::FORMAT
1947 | TokenKind::OFFSET
1949 | TokenKind::ON
1950 | TokenKind::OF
1951 | TokenKind::ORDER
1952 | TokenKind::OVER
1953 | TokenKind::PARTITION
1954 | TokenKind::PROPERTIES
1955 | TokenKind::QUALIFY
1956 | TokenKind::ROWS
1957 | TokenKind::RANGE
1958 | TokenKind::STAGE
1961 | TokenKind::UDF
1962 | TokenKind::SHARE
1963 | TokenKind::SHARES
1964 | TokenKind::TO
1965 | TokenKind::UNION
1966 | TokenKind::WHERE
1967 | TokenKind::WINDOW
1968 | TokenKind::WITH
1969 | TokenKind::IGNORE_RESULT
1970 | TokenKind::MASKING
1971 | TokenKind::ROW
1972 | TokenKind::POLICY
1973 | TokenKind::TASK
1974 | TokenKind::PIPE
1975 | TokenKind::STREAM
1976 | TokenKind::NOTIFICATION
1977 if !after_as => true,
1978 _ => false
1979 }
1980 }
1981
1982 pub(crate) fn is_grant_reserved_ident(&self, after_as: bool, in_grant: bool) -> bool {
1983 match self {
1984 TokenKind::WAREHOUSE | TokenKind::PROCEDURE if in_grant => true,
1985 _ => self.is_reserved_ident(after_as),
1986 }
1987 }
1988}
1989
1990pub fn all_reserved_keywords() -> Vec<String> {
1991 let mut result = Vec::new();
1992 for token in TokenKind::iter() {
1993 result.push(format!("{:?}", token));
1994 }
1995 result
1996}