Skip to main content

databend_common_ast/parser/
token.rs

1// Copyright 2021 Datafuse Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use 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                // Skip hint-like comment that is in the invalid position.
95                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                            // Hint-like comment ended. Return the next token.
110                            Some(Ok(token)) if token.kind == TokenKind::HintSuffix => {
111                                return self.next();
112                            }
113                            // Do not skip EOI.
114                            Some(Ok(token)) if token.kind == TokenKind::EOI => {
115                                return Some(Ok(token));
116                            }
117                            // In the comment, skip the contents.
118                            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
140/// Returns true if `c` can start an unquoted identifier.
141///
142/// ASCII letters and underscore are accepted, plus any Unicode character with
143/// the Alphabetic derived property (`char::is_alphabetic()` — covers CJK,
144/// Cyrillic, Arabic, etc. while excluding separators, punctuation, and symbols).
145pub fn is_ident_start(c: char) -> bool {
146    c == '_' || c.is_alphabetic()
147}
148
149/// Returns true if `c` can continue an unquoted identifier.
150///
151/// Same as `is_ident_start`, plus ASCII digits and `$`.
152/// Non-ASCII digits are also accepted via `char::is_alphanumeric()`.
153pub 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    // Symbols
243    #[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    /// A case insensitive match regular expression operator in PostgreSQL
319    #[token("~*")]
320    TildeAsterisk,
321    /// A case sensitive not match regular expression operator in PostgreSQL
322    #[token("!*")]
323    ExclamationMarkTilde,
324    /// A case insensitive not match regular expression operator in PostgreSQL
325    #[token("!~*")]
326    ExclamationMarkTildeAsterisk,
327    /// A bitwise and operator in PostgreSQL
328    #[token("&")]
329    BitWiseAnd,
330    /// A bitwise or operator in PostgreSQL
331    #[token("|")]
332    BitWiseOr,
333    /// A bitwise xor operator in PostgreSQL
334    #[token("#")]
335    BitWiseXor,
336    /// A bitwise not operator in PostgreSQL
337    #[token("~")]
338    BitWiseNot,
339    /// A bitwise shift left operator in PostgreSQL
340    #[token("<<")]
341    ShiftLeft,
342    /// A bitwise shift right operator in PostgreSQL
343    #[token(">>")]
344    ShiftRight,
345    /// Exclamation Mark `!` used for PostgreSQL factorial operator
346    #[token("!")]
347    Factorial,
348    /// Double Exclamation Mark `!!` used for PostgreSQL prefix factorial operator
349    #[token("!!")]
350    DoubleExclamationMark,
351    /// AtSign `@` used for PostgreSQL abs operator
352    #[token("@")]
353    Abs,
354    /// A square root math operator in PostgreSQL
355    #[token("|/")]
356    SquareRoot,
357    /// A cube root math operator in PostgreSQL
358    #[token("||/")]
359    CubeRoot,
360    /// Placeholder used in prepared stmt
361    /// Also used as JSON operator.
362    #[token("?")]
363    Placeholder,
364    /// Used as JSON operator.
365    #[token("?|")]
366    QuestionOr,
367    /// Used as JSON operator.
368    #[token("?&")]
369    QuestionAnd,
370    /// Used as JSON operator.
371    #[token("<@")]
372    ArrowAt,
373    /// Used as JSON operator.
374    #[token("@>")]
375    AtArrow,
376    /// Used as JSON operator.
377    #[token("@?")]
378    AtQuestion,
379    /// Used as JSON operator.
380    #[token("@@")]
381    AtAt,
382    /// Used as JSON operator.
383    #[token("#-")]
384    HashMinus,
385
386    // Keywords
387    //
388    // Steps to add keyword:
389    // 1. Add the keyword to token kind variants by alphabetical order.
390    // 2. Search in this file to see if the new keyword is a commented out reserved keyword. If
391    //    so, uncomment the keyword in the reserved list.
392    #[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    /// L1DISTANCE and L2DISTANCE op, from https://github.com/pgvector/pgvector
896    #[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
1590// Reference: https://www.postgresql.org/docs/current/sql-keywords-appendix.html
1591impl 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::ANALYSE
1684            | TokenKind::ANALYZE
1685            | TokenKind::AND
1686            // | TokenKind::ANY
1687            | TokenKind::ASC
1688            // | TokenKind::ASYMMETRIC
1689            | TokenKind::BETWEEN
1690            | TokenKind::BIGINT
1691            // | TokenKind::BIT
1692            | TokenKind::BOOLEAN
1693            | TokenKind::BOTH
1694            | TokenKind::CASE
1695            | TokenKind::CAST
1696            // | TokenKind::CHECK
1697            // | TokenKind::COALESCE
1698            // | TokenKind::COLLATE
1699            // | TokenKind::COLUMN
1700            // | TokenKind::CONSTRAINT
1701            // | TokenKind::CURRENT_CATALOG
1702            // | TokenKind::CURRENT_DATE
1703            // | TokenKind::CURRENT_ROLE
1704            // | TokenKind::CURRENT_TIME
1705            // | TokenKind::CURRENT_TIMESTAMP
1706            // | TokenKind::CURRENT_USER
1707            // | TokenKind::DEC
1708            // | TokenKind::DECIMAL
1709            | TokenKind::DEFAULT
1710            // | TokenKind::DEFERRABLE
1711            | 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::FOREIGN
1726            // | TokenKind::GREATEST
1727            // | TokenKind::GROUPING
1728            | TokenKind::CUBE
1729            | TokenKind::ROLLUP
1730            // | TokenKind::IFNULL
1731            | TokenKind::IN
1732            | TokenKind::IDENTIFIER
1733            // | TokenKind::INITIALLY
1734            // | TokenKind::INOUT
1735            | TokenKind::INT
1736            | TokenKind::INTEGER
1737            | TokenKind::INTERVAL
1738            | TokenKind::LATERAL
1739            | TokenKind::LEADING
1740            // | TokenKind::LEAST
1741            // | TokenKind::LOCALTIME
1742            // | TokenKind::LOCALTIMESTAMP
1743            // | TokenKind::NATIONAL
1744            // | TokenKind::NCHAR
1745            // | TokenKind::NONE
1746            // | TokenKind::NORMALIZE
1747            | TokenKind::NOT
1748            | TokenKind::NULL
1749            // | TokenKind::NULLIF
1750            // | TokenKind::NUMERIC
1751            // | TokenKind::ONLY
1752            | TokenKind::OR
1753            // | TokenKind::OUT
1754            // | TokenKind::OVERLAY
1755            // | TokenKind::PLACING
1756            | TokenKind::POSITION
1757            // | TokenKind::PRIMARY
1758            // | TokenKind::REAL
1759            // | TokenKind::REFERENCES
1760            // | TokenKind::ROW
1761            | TokenKind::SELECT
1762            // | TokenKind::SESSION_USER
1763            // | TokenKind::SETOF
1764            | TokenKind::SHARE
1765            | TokenKind::SHARES
1766            | TokenKind::SMALLINT
1767            | TokenKind::SOME
1768            | TokenKind::SUBSTRING
1769            | TokenKind::SUBSTR
1770            // | TokenKind::SYMMETRIC
1771            | TokenKind::TABLE
1772            | TokenKind::THEN
1773            // | TokenKind::TIME
1774            // | TokenKind::TIMESTAMP
1775            | TokenKind::TRAILING
1776            // | TokenKind::TREAT
1777            // | TokenKind::TRIM
1778            | TokenKind::TRUE
1779            | TokenKind::TRY_CAST
1780            // | TokenKind::UNIQUE
1781            //| TokenKind::USER
1782            | TokenKind::USING
1783            | TokenKind::VALUES
1784            | TokenKind::VARCHAR
1785            // | TokenKind::VARIADIC
1786            // | TokenKind::XMLATTRIBUTES
1787            // | TokenKind::XMLCONCAT
1788            // | TokenKind::XMLELEMENT
1789            // | TokenKind::XMLEXISTS
1790            // | TokenKind::XMLFOREST
1791            // | TokenKind::XMLNAMESPACES
1792            // | TokenKind::XMLPARSE
1793            // | TokenKind::XMLPI
1794            // | TokenKind::XMLROOT
1795            // | TokenKind::XMLSERIALIZE
1796            // | TokenKind::XMLTABLE
1797            | TokenKind::WHEN
1798            // | TokenKind::ARRAY
1799            | TokenKind::AS
1800            // | TokenKind::CHAR
1801            | TokenKind::CHARACTER
1802            | TokenKind::CREATE
1803            | TokenKind::ATTACH
1804            | TokenKind::EXCEPT
1805            | TokenKind::FETCH
1806            | TokenKind::FOR
1807            | TokenKind::FROM
1808            // | TokenKind::GRANT
1809            | 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::PRECISION
1822            // | TokenKind::RETURNING
1823            | TokenKind::TO
1824            | TokenKind::UNION
1825            | TokenKind::WHERE
1826            // | TokenKind::WINDOW
1827            | 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::ANALYSE
1847            | 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::ASYMMETRIC
1856            // | TokenKind::AUTHORIZATION
1857            // | TokenKind::BINARY
1858            | TokenKind::BOTH
1859            | TokenKind::BLOCK
1860            | TokenKind::CASE
1861            | TokenKind::CAST
1862            // | TokenKind::CHECK
1863            // | TokenKind::COLLATE
1864            // | TokenKind::COLLATION
1865            // | TokenKind::COLUMN
1866            // | TokenKind::CONCURRENTLY
1867            // | TokenKind::CONSTRAINT
1868            | TokenKind::CONNECTION
1869            | TokenKind::CROSS
1870            // | TokenKind::CURRENT_CATALOG
1871            // | TokenKind::CURRENT_DATE
1872            // | TokenKind::CURRENT_ROLE
1873            // | TokenKind::CURRENT_SCHEMA
1874            // | TokenKind::CURRENT_TIME
1875            | TokenKind::CURRENT_TIMESTAMP
1876            // | TokenKind::CURRENT_USER
1877            // | TokenKind::DEFERRABLE
1878            | TokenKind::DESC
1879            | TokenKind::DISTINCT
1880            | TokenKind::DO
1881            | TokenKind::ELSE
1882            | TokenKind::END
1883            | TokenKind::FALSE
1884            // | TokenKind::FOREIGN
1885            // | TokenKind::FREEZE
1886            | TokenKind::FOR
1887            | TokenKind::FULL
1888            // | TokenKind::ILIKE
1889            | TokenKind::IN
1890            | TokenKind::IDENTIFIER
1891            // | TokenKind::INITIALLY
1892            | TokenKind::INNER
1893            | TokenKind::IS
1894            | TokenKind::JOIN
1895            | TokenKind::LATERAL
1896            | TokenKind::LEADING
1897            | TokenKind::LEFT
1898            | TokenKind::LIKE
1899            // | TokenKind::LOCALTIME
1900            // | TokenKind::LOCALTIMESTAMP
1901            | TokenKind::NATURAL
1902            | TokenKind::NOT
1903            | TokenKind::NULL
1904            // | TokenKind::ONLY
1905            | TokenKind::OR
1906            // | TokenKind::PLACING
1907            // | TokenKind::PRIMARY
1908            // | TokenKind::REFERENCES
1909            | TokenKind::RIGHT
1910            | TokenKind::SELECT
1911            | TokenKind::PIVOT
1912            | TokenKind::UNPIVOT
1913            // | TokenKind::SESSION_USER
1914            // | TokenKind::SIMILAR
1915            | TokenKind::SOME
1916            | TokenKind::SEMI
1917            | TokenKind::SET
1918            | TokenKind::SAMPLE
1919            // | TokenKind::SYMMETRIC
1920            // | TokenKind::TABLESAMPLE
1921            | TokenKind::THEN
1922            | TokenKind::TRAILING
1923            | TokenKind::TRUE
1924            // | TokenKind::UNIQUE
1925            //| TokenKind::USER
1926            | TokenKind::USING
1927            // | TokenKind::VARIADIC
1928            // | TokenKind::VERBOSE
1929            | 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::ISNULL
1945            | TokenKind::LIMIT
1946            | TokenKind::FORMAT
1947            // | TokenKind::NOTNULL
1948            | 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::OVERLAPS
1959            // | TokenKind::RETURNING
1960            | 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}