sqltk_parser/
keywords.rs

1// Licensed to the Apache Software Foundation (ASF) under one
2// or more contributor license agreements.  See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership.  The ASF licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License.  You may obtain a copy of the License at
8//
9//   http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied.  See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18//! This module defines
19//! 1) a list of constants for every keyword
20//! 2) an `ALL_KEYWORDS` array with every keyword in it
21//!     This is not a list of *reserved* keywords: some of these can be
22//!     parsed as identifiers if the parser decides so. This means that
23//!     new keywords can be added here without affecting the parse result.
24//!
25//!     As a matter of fact, most of these keywords are not used at all
26//!     and could be removed.
27//! 3) a `RESERVED_FOR_TABLE_ALIAS` array with keywords reserved in a
28//!     "table alias" context.
29
30#[cfg(feature = "serde")]
31use serde::{Deserialize, Serialize};
32
33#[cfg(feature = "visitor")]
34use sqltk_parser_derive::{Visit, VisitMut};
35
36/// Defines a string constant for a single keyword: `kw_def!(SELECT);`
37/// expands to `pub const SELECT = "SELECT";`
38macro_rules! kw_def {
39    ($ident:ident = $string_keyword:expr) => {
40        pub const $ident: &'static str = $string_keyword;
41    };
42    ($ident:ident) => {
43        kw_def!($ident = stringify!($ident));
44    };
45}
46
47/// Expands to a list of `kw_def!()` invocations for each keyword
48/// and defines an ALL_KEYWORDS array of the defined constants.
49macro_rules! define_keywords {
50    ($(
51        $ident:ident $(= $string_keyword:expr)?
52    ),*) => {
53        #[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
54        #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
55        #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
56        #[allow(non_camel_case_types)]
57        pub enum Keyword {
58            NoKeyword,
59            $($ident),*
60        }
61
62        pub const ALL_KEYWORDS_INDEX: &[Keyword] = &[
63            $(Keyword::$ident),*
64        ];
65
66        $(kw_def!($ident $(= $string_keyword)?);)*
67        pub const ALL_KEYWORDS: &[&str] = &[
68            $($ident),*
69        ];
70    };
71}
72
73// The following keywords should be sorted to be able to match using binary search
74define_keywords!(
75    ABORT,
76    ABS,
77    ABSENT,
78    ABSOLUTE,
79    ACCESS,
80    ACCOUNT,
81    ACTION,
82    ADD,
83    ADMIN,
84    AFTER,
85    AGAINST,
86    AGGREGATION,
87    ALIAS,
88    ALL,
89    ALLOCATE,
90    ALTER,
91    ALWAYS,
92    ANALYZE,
93    AND,
94    ANTI,
95    ANY,
96    APPLICATION,
97    APPLY,
98    ARCHIVE,
99    ARE,
100    ARRAY,
101    ARRAY_MAX_CARDINALITY,
102    AS,
103    ASC,
104    ASENSITIVE,
105    ASOF,
106    ASSERT,
107    ASYMMETRIC,
108    AT,
109    ATOMIC,
110    ATTACH,
111    AUTHORIZATION,
112    AUTO,
113    AUTOINCREMENT,
114    AUTO_INCREMENT,
115    AVG,
116    AVRO,
117    BACKWARD,
118    BASE64,
119    BEFORE,
120    BEGIN,
121    BEGIN_FRAME,
122    BEGIN_PARTITION,
123    BETWEEN,
124    BIGDECIMAL,
125    BIGINT,
126    BIGNUMERIC,
127    BINARY,
128    BINDING,
129    BIT,
130    BLOB,
131    BLOOMFILTER,
132    BOOL,
133    BOOLEAN,
134    BOTH,
135    BROWSE,
136    BTREE,
137    BUCKETS,
138    BY,
139    BYPASSRLS,
140    BYTEA,
141    BYTES,
142    CACHE,
143    CALL,
144    CALLED,
145    CARDINALITY,
146    CASCADE,
147    CASCADED,
148    CASE,
149    CAST,
150    CATALOG,
151    CEIL,
152    CEILING,
153    CENTURY,
154    CHAIN,
155    CHANGE,
156    CHANGE_TRACKING,
157    CHANNEL,
158    CHAR,
159    CHARACTER,
160    CHARACTERS,
161    CHARACTER_LENGTH,
162    CHARSET,
163    CHAR_LENGTH,
164    CHECK,
165    CLEAR,
166    CLOB,
167    CLONE,
168    CLOSE,
169    CLUSTER,
170    CLUSTERED,
171    CLUSTERING,
172    COALESCE,
173    COLLATE,
174    COLLATION,
175    COLLECT,
176    COLLECTION,
177    COLUMN,
178    COLUMNS,
179    COLUMNSTORE,
180    COMMENT,
181    COMMIT,
182    COMMITTED,
183    COMPRESSION,
184    COMPUTE,
185    CONCURRENTLY,
186    CONDITION,
187    CONFLICT,
188    CONNECT,
189    CONNECTION,
190    CONSTRAINT,
191    CONTAINS,
192    CONTINUE,
193    CONVERT,
194    COPY,
195    COPY_OPTIONS,
196    CORR,
197    CORRESPONDING,
198    COUNT,
199    COVAR_POP,
200    COVAR_SAMP,
201    CREATE,
202    CREATEDB,
203    CREATEROLE,
204    CREDENTIALS,
205    CROSS,
206    CSV,
207    CUBE,
208    CUME_DIST,
209    CURRENT,
210    CURRENT_CATALOG,
211    CURRENT_DATE,
212    CURRENT_DEFAULT_TRANSFORM_GROUP,
213    CURRENT_PATH,
214    CURRENT_ROLE,
215    CURRENT_ROW,
216    CURRENT_SCHEMA,
217    CURRENT_TIME,
218    CURRENT_TIMESTAMP,
219    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
220    CURRENT_USER,
221    CURSOR,
222    CYCLE,
223    DATA,
224    DATABASE,
225    DATABASES,
226    DATA_RETENTION_TIME_IN_DAYS,
227    DATE,
228    DATE32,
229    DATETIME,
230    DATETIME64,
231    DAY,
232    DAYOFWEEK,
233    DAYOFYEAR,
234    DEALLOCATE,
235    DEC,
236    DECADE,
237    DECIMAL,
238    DECLARE,
239    DEDUPLICATE,
240    DEFAULT,
241    DEFAULT_DDL_COLLATION,
242    DEFERRABLE,
243    DEFERRED,
244    DEFINE,
245    DEFINED,
246    DELAYED,
247    DELETE,
248    DELIMITED,
249    DELIMITER,
250    DELTA,
251    DENSE_RANK,
252    DEREF,
253    DESC,
254    DESCRIBE,
255    DETACH,
256    DETAIL,
257    DETERMINISTIC,
258    DIRECTORY,
259    DISABLE,
260    DISCARD,
261    DISCONNECT,
262    DISTINCT,
263    DISTRIBUTE,
264    DIV,
265    DO,
266    DOUBLE,
267    DOW,
268    DOY,
269    DROP,
270    DRY,
271    DUPLICATE,
272    DYNAMIC,
273    EACH,
274    ELEMENT,
275    ELEMENTS,
276    ELSE,
277    EMPTY,
278    ENABLE,
279    ENABLE_SCHEMA_EVOLUTION,
280    ENCODING,
281    ENCRYPTION,
282    END,
283    END_EXEC = "END-EXEC",
284    ENDPOINT,
285    END_FRAME,
286    END_PARTITION,
287    ENFORCED,
288    ENGINE,
289    ENUM,
290    ENUM16,
291    ENUM8,
292    EPHEMERAL,
293    EPOCH,
294    EQUALS,
295    ERROR,
296    ESCAPE,
297    ESCAPED,
298    EVENT,
299    EVERY,
300    EXCEPT,
301    EXCEPTION,
302    EXCLUDE,
303    EXCLUSIVE,
304    EXEC,
305    EXECUTE,
306    EXISTS,
307    EXP,
308    EXPANSION,
309    EXPLAIN,
310    EXPLICIT,
311    EXPORT,
312    EXTENDED,
313    EXTENSION,
314    EXTERNAL,
315    EXTRACT,
316    FAIL,
317    FALSE,
318    FETCH,
319    FIELDS,
320    FILE,
321    FILES,
322    FILE_FORMAT,
323    FILL,
324    FILTER,
325    FINAL,
326    FIRST,
327    FIRST_VALUE,
328    FIXEDSTRING,
329    FLOAT,
330    FLOAT32,
331    FLOAT4,
332    FLOAT64,
333    FLOAT8,
334    FLOOR,
335    FLUSH,
336    FN,
337    FOLLOWING,
338    FOR,
339    FORCE,
340    FORCE_NOT_NULL,
341    FORCE_NULL,
342    FORCE_QUOTE,
343    FOREIGN,
344    FORMAT,
345    FORMATTED,
346    FORWARD,
347    FRAME_ROW,
348    FREE,
349    FREEZE,
350    FROM,
351    FSCK,
352    FULL,
353    FULLTEXT,
354    FUNCTION,
355    FUNCTIONS,
356    FUSION,
357    GENERAL,
358    GENERATE,
359    GENERATED,
360    GEOGRAPHY,
361    GET,
362    GLOBAL,
363    GRANT,
364    GRANTED,
365    GRANTS,
366    GRAPHVIZ,
367    GROUP,
368    GROUPING,
369    GROUPS,
370    HASH,
371    HAVING,
372    HEADER,
373    HEAP,
374    HIGH_PRIORITY,
375    HISTORY,
376    HIVEVAR,
377    HOLD,
378    HOSTS,
379    HOUR,
380    HOURS,
381    ID,
382    IDENTITY,
383    IF,
384    IGNORE,
385    ILIKE,
386    IMMEDIATE,
387    IMMUTABLE,
388    IN,
389    INCLUDE,
390    INCLUDE_NULL_VALUES,
391    INCREMENT,
392    INDEX,
393    INDICATOR,
394    INHERIT,
395    INITIALLY,
396    INNER,
397    INOUT,
398    INPATH,
399    INPUT,
400    INPUTFORMAT,
401    INSENSITIVE,
402    INSERT,
403    INSTALL,
404    INSTEAD,
405    INT,
406    INT128,
407    INT16,
408    INT2,
409    INT256,
410    INT32,
411    INT4,
412    INT64,
413    INT8,
414    INTEGER,
415    INTERPOLATE,
416    INTERSECT,
417    INTERSECTION,
418    INTERVAL,
419    INTO,
420    IS,
421    ISODOW,
422    ISOLATION,
423    ISOWEEK,
424    ISOYEAR,
425    ITEMS,
426    JAR,
427    JOIN,
428    JSON,
429    JSONB,
430    JSONFILE,
431    JSON_TABLE,
432    JULIAN,
433    KEY,
434    KEYS,
435    KILL,
436    LAG,
437    LANGUAGE,
438    LARGE,
439    LAST,
440    LAST_VALUE,
441    LATERAL,
442    LEAD,
443    LEADING,
444    LEFT,
445    LEVEL,
446    LIKE,
447    LIKE_REGEX,
448    LIMIT,
449    LINES,
450    LISTEN,
451    LN,
452    LOAD,
453    LOCAL,
454    LOCALTIME,
455    LOCALTIMESTAMP,
456    LOCATION,
457    LOCK,
458    LOCKED,
459    LOGIN,
460    LOGS,
461    LONGBLOB,
462    LONGTEXT,
463    LOWCARDINALITY,
464    LOWER,
465    LOW_PRIORITY,
466    MACRO,
467    MANAGEDLOCATION,
468    MAP,
469    MASKING,
470    MATCH,
471    MATCHED,
472    MATCHES,
473    MATCH_CONDITION,
474    MATCH_RECOGNIZE,
475    MATERIALIZE,
476    MATERIALIZED,
477    MAX,
478    MAXVALUE,
479    MAX_DATA_EXTENSION_TIME_IN_DAYS,
480    MEASURES,
481    MEDIUMBLOB,
482    MEDIUMINT,
483    MEDIUMTEXT,
484    MEMBER,
485    MERGE,
486    METADATA,
487    METHOD,
488    MICROSECOND,
489    MICROSECONDS,
490    MILLENIUM,
491    MILLENNIUM,
492    MILLISECOND,
493    MILLISECONDS,
494    MIN,
495    MINUTE,
496    MINVALUE,
497    MOD,
498    MODE,
499    MODIFIES,
500    MODIFY,
501    MODULE,
502    MONTH,
503    MSCK,
504    MULTISET,
505    MUTATION,
506    NAME,
507    NANOSECOND,
508    NANOSECONDS,
509    NATIONAL,
510    NATURAL,
511    NCHAR,
512    NCLOB,
513    NESTED,
514    NEW,
515    NEXT,
516    NO,
517    NOBYPASSRLS,
518    NOCREATEDB,
519    NOCREATEROLE,
520    NOINHERIT,
521    NOLOGIN,
522    NONE,
523    NOORDER,
524    NOREPLICATION,
525    NORMALIZE,
526    NOSCAN,
527    NOSUPERUSER,
528    NOT,
529    NOTHING,
530    NOTIFY,
531    NOWAIT,
532    NO_WRITE_TO_BINLOG,
533    NTH_VALUE,
534    NTILE,
535    NULL,
536    NULLABLE,
537    NULLIF,
538    NULLS,
539    NUMERIC,
540    NVARCHAR,
541    OBJECT,
542    OCCURRENCES_REGEX,
543    OCTETS,
544    OCTET_LENGTH,
545    OF,
546    OFFSET,
547    OLD,
548    OMIT,
549    ON,
550    ONE,
551    ONLY,
552    OPEN,
553    OPENJSON,
554    OPERATOR,
555    OPTIMIZE,
556    OPTIMIZER_COSTS,
557    OPTION,
558    OPTIONS,
559    OR,
560    ORC,
561    ORDER,
562    ORDINALITY,
563    OUT,
564    OUTER,
565    OUTPUTFORMAT,
566    OVER,
567    OVERFLOW,
568    OVERLAPS,
569    OVERLAY,
570    OVERWRITE,
571    OWNED,
572    OWNER,
573    PARALLEL,
574    PARAMETER,
575    PARQUET,
576    PART,
577    PARTITION,
578    PARTITIONED,
579    PARTITIONS,
580    PASSWORD,
581    PAST,
582    PATH,
583    PATTERN,
584    PER,
585    PERCENT,
586    PERCENTILE_CONT,
587    PERCENTILE_DISC,
588    PERCENT_RANK,
589    PERIOD,
590    PERMISSIVE,
591    PERSISTENT,
592    PIVOT,
593    PLACING,
594    PLAN,
595    PLANS,
596    POLICY,
597    PORTION,
598    POSITION,
599    POSITION_REGEX,
600    POWER,
601    PRAGMA,
602    PRECEDES,
603    PRECEDING,
604    PRECISION,
605    PREPARE,
606    PRESERVE,
607    PREWHERE,
608    PRIMARY,
609    PRIOR,
610    PRIVILEGES,
611    PROCEDURE,
612    PROGRAM,
613    PROJECTION,
614    PURGE,
615    QUALIFY,
616    QUARTER,
617    QUERY,
618    QUOTE,
619    RANGE,
620    RANK,
621    RAW,
622    RCFILE,
623    READ,
624    READS,
625    READ_ONLY,
626    REAL,
627    RECLUSTER,
628    RECURSIVE,
629    REF,
630    REFERENCES,
631    REFERENCING,
632    REGCLASS,
633    REGEXP,
634    REGR_AVGX,
635    REGR_AVGY,
636    REGR_COUNT,
637    REGR_INTERCEPT,
638    REGR_R2,
639    REGR_SLOPE,
640    REGR_SXX,
641    REGR_SXY,
642    REGR_SYY,
643    RELATIVE,
644    RELAY,
645    RELEASE,
646    REMOTE,
647    RENAME,
648    REORG,
649    REPAIR,
650    REPEATABLE,
651    REPLACE,
652    REPLICA,
653    REPLICATION,
654    RESET,
655    RESPECT,
656    RESTART,
657    RESTRICT,
658    RESTRICTED,
659    RESTRICTIVE,
660    RESULT,
661    RESULTSET,
662    RESUME,
663    RETAIN,
664    RETURN,
665    RETURNING,
666    RETURNS,
667    REVOKE,
668    RIGHT,
669    RLIKE,
670    ROLE,
671    ROLES,
672    ROLLBACK,
673    ROLLUP,
674    ROOT,
675    ROW,
676    ROWID,
677    ROWS,
678    ROW_NUMBER,
679    RULE,
680    RUN,
681    SAFE,
682    SAFE_CAST,
683    SAVEPOINT,
684    SCHEMA,
685    SCHEMAS,
686    SCOPE,
687    SCROLL,
688    SEARCH,
689    SECOND,
690    SECONDARY,
691    SECRET,
692    SECURITY,
693    SELECT,
694    SEMI,
695    SENSITIVE,
696    SEPARATOR,
697    SEQUENCE,
698    SEQUENCEFILE,
699    SEQUENCES,
700    SERDE,
701    SERDEPROPERTIES,
702    SERIALIZABLE,
703    SESSION,
704    SESSION_USER,
705    SET,
706    SETS,
707    SETTINGS,
708    SHARE,
709    SHOW,
710    SIMILAR,
711    SKIP,
712    SLOW,
713    SMALLINT,
714    SNAPSHOT,
715    SOME,
716    SORT,
717    SORTED,
718    SOURCE,
719    SPATIAL,
720    SPECIFIC,
721    SPECIFICTYPE,
722    SQL,
723    SQLEXCEPTION,
724    SQLSTATE,
725    SQLWARNING,
726    SQRT,
727    STABLE,
728    STAGE,
729    START,
730    STARTS,
731    STATEMENT,
732    STATIC,
733    STATISTICS,
734    STATUS,
735    STDDEV_POP,
736    STDDEV_SAMP,
737    STDIN,
738    STDOUT,
739    STEP,
740    STORAGE_INTEGRATION,
741    STORED,
742    STRICT,
743    STRING,
744    STRUCT,
745    SUBMULTISET,
746    SUBSTRING,
747    SUBSTRING_REGEX,
748    SUCCEEDS,
749    SUM,
750    SUPER,
751    SUPERUSER,
752    SUSPEND,
753    SWAP,
754    SYMMETRIC,
755    SYNC,
756    SYSTEM,
757    SYSTEM_TIME,
758    SYSTEM_USER,
759    TABLE,
760    TABLES,
761    TABLESAMPLE,
762    TAG,
763    TARGET,
764    TBLPROPERTIES,
765    TEMP,
766    TEMPORARY,
767    TERMINATED,
768    TERSE,
769    TEXT,
770    TEXTFILE,
771    THEN,
772    TIES,
773    TIME,
774    TIMESTAMP,
775    TIMESTAMPTZ,
776    TIMETZ,
777    TIMEZONE,
778    TIMEZONE_ABBR,
779    TIMEZONE_HOUR,
780    TIMEZONE_MINUTE,
781    TIMEZONE_REGION,
782    TINYBLOB,
783    TINYINT,
784    TINYTEXT,
785    TO,
786    TOP,
787    TOTALS,
788    TRAILING,
789    TRANSACTION,
790    TRANSIENT,
791    TRANSLATE,
792    TRANSLATE_REGEX,
793    TRANSLATION,
794    TREAT,
795    TRIGGER,
796    TRIM,
797    TRIM_ARRAY,
798    TRUE,
799    TRUNCATE,
800    TRY_CAST,
801    TRY_CONVERT,
802    TUPLE,
803    TYPE,
804    UESCAPE,
805    UINT128,
806    UINT16,
807    UINT256,
808    UINT32,
809    UINT64,
810    UINT8,
811    UNBOUNDED,
812    UNCACHE,
813    UNCOMMITTED,
814    UNFREEZE,
815    UNION,
816    UNIQUE,
817    UNKNOWN,
818    UNLISTEN,
819    UNLOAD,
820    UNLOCK,
821    UNLOGGED,
822    UNMATCHED,
823    UNNEST,
824    UNPIVOT,
825    UNSAFE,
826    UNSIGNED,
827    UNTIL,
828    UPDATE,
829    UPPER,
830    URL,
831    USAGE,
832    USE,
833    USER,
834    USER_RESOURCES,
835    USING,
836    UUID,
837    VACUUM,
838    VALID,
839    VALIDATION_MODE,
840    VALUE,
841    VALUES,
842    VALUE_OF,
843    VARBINARY,
844    VARCHAR,
845    VARIABLES,
846    VARYING,
847    VAR_POP,
848    VAR_SAMP,
849    VERBOSE,
850    VERSION,
851    VERSIONING,
852    VIEW,
853    VIEWS,
854    VIRTUAL,
855    VOLATILE,
856    WAREHOUSE,
857    WEEK,
858    WHEN,
859    WHENEVER,
860    WHERE,
861    WIDTH_BUCKET,
862    WINDOW,
863    WITH,
864    WITHIN,
865    WITHOUT,
866    WITHOUT_ARRAY_WRAPPER,
867    WORK,
868    WRITE,
869    XML,
870    XOR,
871    YEAR,
872    ZONE,
873    ZORDER
874);
875
876/// These keywords can't be used as a table alias, so that `FROM table_name alias`
877/// can be parsed unambiguously without looking ahead.
878pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
879    // Reserved as both a table and a column alias:
880    Keyword::WITH,
881    Keyword::EXPLAIN,
882    Keyword::ANALYZE,
883    Keyword::SELECT,
884    Keyword::WHERE,
885    Keyword::GROUP,
886    Keyword::SORT,
887    Keyword::HAVING,
888    Keyword::ORDER,
889    Keyword::PIVOT,
890    Keyword::UNPIVOT,
891    Keyword::TOP,
892    Keyword::LATERAL,
893    Keyword::VIEW,
894    Keyword::LIMIT,
895    Keyword::OFFSET,
896    Keyword::FETCH,
897    Keyword::UNION,
898    Keyword::EXCEPT,
899    Keyword::INTERSECT,
900    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
901    Keyword::ON,
902    Keyword::JOIN,
903    Keyword::INNER,
904    Keyword::CROSS,
905    Keyword::FULL,
906    Keyword::LEFT,
907    Keyword::RIGHT,
908    Keyword::NATURAL,
909    Keyword::USING,
910    Keyword::CLUSTER,
911    Keyword::DISTRIBUTE,
912    Keyword::GLOBAL,
913    Keyword::ANTI,
914    Keyword::SEMI,
915    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
916    Keyword::OUTER,
917    Keyword::SET,
918    Keyword::QUALIFY,
919    Keyword::WINDOW,
920    Keyword::END,
921    Keyword::FOR,
922    // for MYSQL PARTITION SELECTION
923    Keyword::PARTITION,
924    // for Clickhouse PREWHERE
925    Keyword::PREWHERE,
926    // for ClickHouse SELECT * FROM t SETTINGS ...
927    Keyword::SETTINGS,
928    // for ClickHouse SELECT * FROM t FORMAT...
929    Keyword::FORMAT,
930    // for Snowflake START WITH .. CONNECT BY
931    Keyword::START,
932    Keyword::CONNECT,
933    // Reserved for snowflake MATCH_RECOGNIZE
934    Keyword::MATCH_RECOGNIZE,
935];
936
937/// Can't be used as a column alias, so that `SELECT <expr> alias`
938/// can be parsed unambiguously without looking ahead.
939pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
940    // Reserved as both a table and a column alias:
941    Keyword::WITH,
942    Keyword::EXPLAIN,
943    Keyword::ANALYZE,
944    Keyword::SELECT,
945    Keyword::WHERE,
946    Keyword::GROUP,
947    Keyword::SORT,
948    Keyword::HAVING,
949    Keyword::ORDER,
950    Keyword::TOP,
951    Keyword::LATERAL,
952    Keyword::VIEW,
953    Keyword::LIMIT,
954    Keyword::OFFSET,
955    Keyword::FETCH,
956    Keyword::UNION,
957    Keyword::EXCEPT,
958    Keyword::INTERSECT,
959    Keyword::CLUSTER,
960    Keyword::DISTRIBUTE,
961    Keyword::RETURNING,
962    // Reserved only as a column alias in the `SELECT` clause
963    Keyword::FROM,
964    Keyword::INTO,
965    Keyword::END,
966];
967
968/// Global list of reserved keywords that cannot be parsed as identifiers
969/// without special handling like quoting. Parser should call `Dialect::is_reserved_for_identifier`
970/// to allow for each dialect to customize the list.
971pub const RESERVED_FOR_IDENTIFIER: &[Keyword] = &[
972    Keyword::EXISTS,
973    Keyword::INTERVAL,
974    Keyword::STRUCT,
975    Keyword::TRIM,
976];