Skip to main content

sqlparser/
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 sqlparser_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    ALERT,
88    ALGORITHM,
89    ALIAS,
90    ALL,
91    ALLOCATE,
92    ALTER,
93    ALWAYS,
94    ANALYZE,
95    AND,
96    ANTI,
97    ANY,
98    APPLICATION,
99    APPLY,
100    APPLYBUDGET,
101    ARCHIVE,
102    ARE,
103    ARRAY,
104    ARRAY_MAX_CARDINALITY,
105    AS,
106    ASC,
107    ASENSITIVE,
108    ASOF,
109    ASSERT,
110    ASYMMETRIC,
111    AT,
112    ATOMIC,
113    ATTACH,
114    AUDIT,
115    AUTHENTICATION,
116    AUTHORIZATION,
117    AUTO,
118    AUTOINCREMENT,
119    AUTO_INCREMENT,
120    AVG,
121    AVRO,
122    BACKWARD,
123    BASE64,
124    BASE_LOCATION,
125    BEFORE,
126    BEGIN,
127    BEGIN_FRAME,
128    BEGIN_PARTITION,
129    BERNOULLI,
130    BETWEEN,
131    BIGDECIMAL,
132    BIGINT,
133    BIGNUMERIC,
134    BINARY,
135    BIND,
136    BINDING,
137    BIT,
138    BLOB,
139    BLOCK,
140    BLOOMFILTER,
141    BOOL,
142    BOOLEAN,
143    BOTH,
144    BOX,
145    BROWSE,
146    BTREE,
147    BUCKET,
148    BUCKETS,
149    BY,
150    BYPASSRLS,
151    BYTEA,
152    BYTES,
153    CACHE,
154    CALL,
155    CALLED,
156    CARDINALITY,
157    CASCADE,
158    CASCADED,
159    CASE,
160    CASES,
161    CAST,
162    CATALOG,
163    CATALOG_SYNC,
164    CATCH,
165    CEIL,
166    CEILING,
167    CENTURY,
168    CHAIN,
169    CHANGE,
170    CHANGE_TRACKING,
171    CHANNEL,
172    CHAR,
173    CHARACTER,
174    CHARACTERS,
175    CHARACTER_LENGTH,
176    CHARSET,
177    CHAR_LENGTH,
178    CHECK,
179    CIRCLE,
180    CLEAR,
181    CLOB,
182    CLONE,
183    CLOSE,
184    CLUSTER,
185    CLUSTERED,
186    CLUSTERING,
187    COALESCE,
188    COLLATE,
189    COLLATION,
190    COLLECT,
191    COLLECTION,
192    COLUMN,
193    COLUMNS,
194    COLUMNSTORE,
195    COMMENT,
196    COMMIT,
197    COMMITTED,
198    COMPATIBLE,
199    COMPRESSION,
200    COMPUTE,
201    CONCURRENTLY,
202    CONDITION,
203    CONFLICT,
204    CONNECT,
205    CONNECTION,
206    CONNECTOR,
207    CONSTRAINT,
208    CONTAINS,
209    CONTINUE,
210    CONVERT,
211    COPY,
212    COPY_OPTIONS,
213    CORR,
214    CORRESPONDING,
215    COUNT,
216    COVAR_POP,
217    COVAR_SAMP,
218    CREATE,
219    CREATEDB,
220    CREATEROLE,
221    CREDENTIALS,
222    CROSS,
223    CSV,
224    CUBE,
225    CUME_DIST,
226    CURRENT,
227    CURRENT_CATALOG,
228    CURRENT_DATE,
229    CURRENT_DEFAULT_TRANSFORM_GROUP,
230    CURRENT_PATH,
231    CURRENT_ROLE,
232    CURRENT_ROW,
233    CURRENT_SCHEMA,
234    CURRENT_TIME,
235    CURRENT_TIMESTAMP,
236    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
237    CURRENT_USER,
238    CURSOR,
239    CYCLE,
240    DATA,
241    DATABASE,
242    DATABASES,
243    DATA_RETENTION_TIME_IN_DAYS,
244    DATE,
245    DATE32,
246    DATETIME,
247    DATETIME64,
248    DAY,
249    DAYOFWEEK,
250    DAYOFYEAR,
251    DAYS,
252    DCPROPERTIES,
253    DEALLOCATE,
254    DEC,
255    DECADE,
256    DECIMAL,
257    DECLARE,
258    DEDUPLICATE,
259    DEFAULT,
260    DEFAULT_DDL_COLLATION,
261    DEFERRABLE,
262    DEFERRED,
263    DEFINE,
264    DEFINED,
265    DEFINER,
266    DELAYED,
267    DELETE,
268    DELIMITED,
269    DELIMITER,
270    DELTA,
271    DENSE_RANK,
272    DEREF,
273    DESC,
274    DESCRIBE,
275    DETACH,
276    DETAIL,
277    DETERMINISTIC,
278    DIRECTORY,
279    DISABLE,
280    DISCARD,
281    DISCONNECT,
282    DISTINCT,
283    DISTRIBUTE,
284    DIV,
285    DO,
286    DOUBLE,
287    DOW,
288    DOY,
289    DROP,
290    DRY,
291    DUPLICATE,
292    DYNAMIC,
293    EACH,
294    ELEMENT,
295    ELEMENTS,
296    ELSE,
297    EMPTY,
298    ENABLE,
299    ENABLE_SCHEMA_EVOLUTION,
300    ENCODING,
301    ENCRYPTION,
302    END,
303    END_EXEC = "END-EXEC",
304    ENDPOINT,
305    END_FRAME,
306    END_PARTITION,
307    ENFORCED,
308    ENGINE,
309    ENUM,
310    ENUM16,
311    ENUM8,
312    EPHEMERAL,
313    EPOCH,
314    EQUALS,
315    ERROR,
316    ESCAPE,
317    ESCAPED,
318    ESTIMATE,
319    EVENT,
320    EVERY,
321    EVOLVE,
322    EXCEPT,
323    EXCEPTION,
324    EXCHANGE,
325    EXCLUDE,
326    EXCLUSIVE,
327    EXEC,
328    EXECUTE,
329    EXECUTION,
330    EXISTS,
331    EXP,
332    EXPANSION,
333    EXPLAIN,
334    EXPLICIT,
335    EXPORT,
336    EXTENDED,
337    EXTENSION,
338    EXTERNAL,
339    EXTERNAL_VOLUME,
340    EXTRACT,
341    FAIL,
342    FAILOVER,
343    FALSE,
344    FETCH,
345    FIELDS,
346    FILE,
347    FILES,
348    FILE_FORMAT,
349    FILL,
350    FILTER,
351    FINAL,
352    FIRST,
353    FIRST_VALUE,
354    FIXEDSTRING,
355    FLOAT,
356    FLOAT32,
357    FLOAT4,
358    FLOAT64,
359    FLOAT8,
360    FLOOR,
361    FLUSH,
362    FN,
363    FOLLOWING,
364    FOR,
365    FORCE,
366    FORCE_NOT_NULL,
367    FORCE_NULL,
368    FORCE_QUOTE,
369    FOREIGN,
370    FORMAT,
371    FORMATTED,
372    FORWARD,
373    FRAME_ROW,
374    FREE,
375    FREEZE,
376    FROM,
377    FSCK,
378    FULFILLMENT,
379    FULL,
380    FULLTEXT,
381    FUNCTION,
382    FUNCTIONS,
383    FUSION,
384    GENERAL,
385    GENERATE,
386    GENERATED,
387    GEOGRAPHY,
388    GET,
389    GLOBAL,
390    GRANT,
391    GRANTED,
392    GRANTS,
393    GRAPHVIZ,
394    GROUP,
395    GROUPING,
396    GROUPS,
397    HASH,
398    HAVING,
399    HEADER,
400    HEAP,
401    HIGH_PRIORITY,
402    HISTORY,
403    HIVEVAR,
404    HOLD,
405    HOSTS,
406    HOUR,
407    HOURS,
408    ICEBERG,
409    ID,
410    IDENTITY,
411    IDENTITY_INSERT,
412    IF,
413    IGNORE,
414    ILIKE,
415    IMMEDIATE,
416    IMMUTABLE,
417    IMPORT,
418    IMPORTED,
419    IN,
420    INCLUDE,
421    INCLUDE_NULL_VALUES,
422    INCREMENT,
423    INDEX,
424    INDICATOR,
425    INHERIT,
426    INITIALLY,
427    INNER,
428    INOUT,
429    INPATH,
430    INPLACE,
431    INPUT,
432    INPUTFORMAT,
433    INSENSITIVE,
434    INSERT,
435    INSTALL,
436    INSTANT,
437    INSTEAD,
438    INT,
439    INT128,
440    INT16,
441    INT2,
442    INT256,
443    INT32,
444    INT4,
445    INT64,
446    INT8,
447    INTEGER,
448    INTEGRATION,
449    INTERPOLATE,
450    INTERSECT,
451    INTERSECTION,
452    INTERVAL,
453    INTO,
454    INVOKER,
455    IO,
456    IS,
457    ISODOW,
458    ISOLATION,
459    ISOWEEK,
460    ISOYEAR,
461    ITEMS,
462    JAR,
463    JOIN,
464    JSON,
465    JSONB,
466    JSONFILE,
467    JSON_TABLE,
468    JULIAN,
469    KEY,
470    KEYS,
471    KILL,
472    LAG,
473    LAMBDA,
474    LANGUAGE,
475    LARGE,
476    LAST,
477    LAST_VALUE,
478    LATERAL,
479    LEAD,
480    LEADING,
481    LEFT,
482    LEVEL,
483    LIKE,
484    LIKE_REGEX,
485    LIMIT,
486    LINE,
487    LINES,
488    LIST,
489    LISTEN,
490    LISTING,
491    LN,
492    LOAD,
493    LOCAL,
494    LOCALTIME,
495    LOCALTIMESTAMP,
496    LOCATION,
497    LOCK,
498    LOCKED,
499    LOG,
500    LOGIN,
501    LOGS,
502    LONGBLOB,
503    LONGTEXT,
504    LOWCARDINALITY,
505    LOWER,
506    LOW_PRIORITY,
507    LS,
508    LSEG,
509    MACRO,
510    MANAGE,
511    MANAGED,
512    MANAGEDLOCATION,
513    MAP,
514    MASKING,
515    MATCH,
516    MATCHED,
517    MATCHES,
518    MATCH_CONDITION,
519    MATCH_RECOGNIZE,
520    MATERIALIZE,
521    MATERIALIZED,
522    MAX,
523    MAXVALUE,
524    MAX_DATA_EXTENSION_TIME_IN_DAYS,
525    MEASURES,
526    MEDIUMBLOB,
527    MEDIUMINT,
528    MEDIUMTEXT,
529    MEMBER,
530    MERGE,
531    METADATA,
532    METHOD,
533    METRIC,
534    MICROSECOND,
535    MICROSECONDS,
536    MILLENIUM,
537    MILLENNIUM,
538    MILLISECOND,
539    MILLISECONDS,
540    MIN,
541    MINUS,
542    MINUTE,
543    MINUTES,
544    MINVALUE,
545    MOD,
546    MODE,
547    MODIFIES,
548    MODIFY,
549    MODULE,
550    MONITOR,
551    MONTH,
552    MONTHS,
553    MSCK,
554    MULTISET,
555    MUTATION,
556    NAME,
557    NANOSECOND,
558    NANOSECONDS,
559    NATIONAL,
560    NATURAL,
561    NCHAR,
562    NCLOB,
563    NESTED,
564    NETWORK,
565    NEW,
566    NEXT,
567    NFC,
568    NFD,
569    NFKC,
570    NFKD,
571    NO,
572    NOBYPASSRLS,
573    NOCREATEDB,
574    NOCREATEROLE,
575    NOINHERIT,
576    NOLOGIN,
577    NONE,
578    NOORDER,
579    NOREPLICATION,
580    NORMALIZE,
581    NORMALIZED,
582    NOSCAN,
583    NOSUPERUSER,
584    NOT,
585    NOTHING,
586    NOTIFY,
587    NOWAIT,
588    NO_WRITE_TO_BINLOG,
589    NTH_VALUE,
590    NTILE,
591    NULL,
592    NULLABLE,
593    NULLIF,
594    NULLS,
595    NUMERIC,
596    NVARCHAR,
597    OBJECT,
598    OBJECTS,
599    OCCURRENCES_REGEX,
600    OCTETS,
601    OCTET_LENGTH,
602    OF,
603    OFF,
604    OFFSET,
605    OFFSETS,
606    OLD,
607    OMIT,
608    ON,
609    ONE,
610    ONLY,
611    OPEN,
612    OPENJSON,
613    OPERATE,
614    OPERATOR,
615    OPTIMIZATION,
616    OPTIMIZE,
617    OPTIMIZED,
618    OPTIMIZER_COSTS,
619    OPTION,
620    OPTIONS,
621    OR,
622    ORC,
623    ORDER,
624    ORDINALITY,
625    ORGANIZATION,
626    OUT,
627    OUTER,
628    OUTPUTFORMAT,
629    OVER,
630    OVERFLOW,
631    OVERLAPS,
632    OVERLAY,
633    OVERRIDE,
634    OVERWRITE,
635    OWNED,
636    OWNER,
637    OWNERSHIP,
638    PACKAGE,
639    PACKAGES,
640    PARALLEL,
641    PARAMETER,
642    PARQUET,
643    PART,
644    PARTITION,
645    PARTITIONED,
646    PARTITIONS,
647    PASSWORD,
648    PAST,
649    PATH,
650    PATTERN,
651    PER,
652    PERCENT,
653    PERCENTILE_CONT,
654    PERCENTILE_DISC,
655    PERCENT_RANK,
656    PERIOD,
657    PERMISSIVE,
658    PERSISTENT,
659    PIVOT,
660    PLACING,
661    PLAN,
662    PLANS,
663    POINT,
664    POLICY,
665    POLYGON,
666    POOL,
667    PORTION,
668    POSITION,
669    POSITION_REGEX,
670    POWER,
671    PRAGMA,
672    PRECEDES,
673    PRECEDING,
674    PRECISION,
675    PREPARE,
676    PRESERVE,
677    PREWHERE,
678    PRIMARY,
679    PRIOR,
680    PRIVILEGES,
681    PROCEDURE,
682    PROFILE,
683    PROGRAM,
684    PROJECTION,
685    PUBLIC,
686    PURCHASE,
687    PURGE,
688    QUALIFY,
689    QUARTER,
690    QUERY,
691    QUOTE,
692    RAISERROR,
693    RANGE,
694    RANK,
695    RAW,
696    RCFILE,
697    READ,
698    READS,
699    READ_ONLY,
700    REAL,
701    RECLUSTER,
702    RECURSIVE,
703    REF,
704    REFERENCES,
705    REFERENCING,
706    REGCLASS,
707    REGEXP,
708    REGR_AVGX,
709    REGR_AVGY,
710    REGR_COUNT,
711    REGR_INTERCEPT,
712    REGR_R2,
713    REGR_SLOPE,
714    REGR_SXX,
715    REGR_SXY,
716    REGR_SYY,
717    RELATIVE,
718    RELAY,
719    RELEASE,
720    RELEASES,
721    REMOTE,
722    REMOVE,
723    RENAME,
724    REORG,
725    REPAIR,
726    REPEATABLE,
727    REPLACE,
728    REPLICA,
729    REPLICATE,
730    REPLICATION,
731    RESET,
732    RESOLVE,
733    RESPECT,
734    RESTART,
735    RESTRICT,
736    RESTRICTED,
737    RESTRICTIONS,
738    RESTRICTIVE,
739    RESULT,
740    RESULTSET,
741    RESUME,
742    RETAIN,
743    RETURN,
744    RETURNING,
745    RETURNS,
746    REVOKE,
747    RIGHT,
748    RLIKE,
749    RM,
750    ROLE,
751    ROLES,
752    ROLLBACK,
753    ROLLUP,
754    ROOT,
755    ROW,
756    ROWID,
757    ROWS,
758    ROW_NUMBER,
759    RULE,
760    RUN,
761    SAFE,
762    SAFE_CAST,
763    SAMPLE,
764    SAVEPOINT,
765    SCHEMA,
766    SCHEMAS,
767    SCOPE,
768    SCROLL,
769    SEARCH,
770    SECOND,
771    SECONDARY,
772    SECONDS,
773    SECRET,
774    SECURITY,
775    SEED,
776    SELECT,
777    SEMI,
778    SENSITIVE,
779    SEPARATOR,
780    SEQUENCE,
781    SEQUENCEFILE,
782    SEQUENCES,
783    SERDE,
784    SERDEPROPERTIES,
785    SERIALIZABLE,
786    SERVICE,
787    SESSION,
788    SESSION_USER,
789    SET,
790    SETERROR,
791    SETS,
792    SETTINGS,
793    SHARE,
794    SHARING,
795    SHOW,
796    SIGNED,
797    SIMILAR,
798    SKIP,
799    SLOW,
800    SMALLINT,
801    SNAPSHOT,
802    SOME,
803    SORT,
804    SORTED,
805    SOURCE,
806    SPATIAL,
807    SPECIFIC,
808    SPECIFICTYPE,
809    SQL,
810    SQLEXCEPTION,
811    SQLSTATE,
812    SQLWARNING,
813    SQRT,
814    STABLE,
815    STAGE,
816    START,
817    STARTS,
818    STATEMENT,
819    STATIC,
820    STATISTICS,
821    STATUS,
822    STDDEV_POP,
823    STDDEV_SAMP,
824    STDIN,
825    STDOUT,
826    STEP,
827    STORAGE_INTEGRATION,
828    STORAGE_SERIALIZATION_POLICY,
829    STORED,
830    STRICT,
831    STRING,
832    STRUCT,
833    SUBMULTISET,
834    SUBSTRING,
835    SUBSTRING_REGEX,
836    SUCCEEDS,
837    SUM,
838    SUPER,
839    SUPERUSER,
840    SUPPORT,
841    SUSPEND,
842    SWAP,
843    SYMMETRIC,
844    SYNC,
845    SYSTEM,
846    SYSTEM_TIME,
847    SYSTEM_USER,
848    TABLE,
849    TABLES,
850    TABLESAMPLE,
851    TAG,
852    TARGET,
853    TASK,
854    TBLPROPERTIES,
855    TEMP,
856    TEMPORARY,
857    TEMPTABLE,
858    TERMINATED,
859    TERSE,
860    TEXT,
861    TEXTFILE,
862    THEN,
863    TIES,
864    TIME,
865    TIMESTAMP,
866    TIMESTAMPTZ,
867    TIMETZ,
868    TIMEZONE,
869    TIMEZONE_ABBR,
870    TIMEZONE_HOUR,
871    TIMEZONE_MINUTE,
872    TIMEZONE_REGION,
873    TINYBLOB,
874    TINYINT,
875    TINYTEXT,
876    TO,
877    TOP,
878    TOTALS,
879    TRACE,
880    TRAILING,
881    TRANSACTION,
882    TRANSIENT,
883    TRANSLATE,
884    TRANSLATE_REGEX,
885    TRANSLATION,
886    TREAT,
887    TRIGGER,
888    TRIM,
889    TRIM_ARRAY,
890    TRUE,
891    TRUNCATE,
892    TRY,
893    TRY_CAST,
894    TRY_CONVERT,
895    TUPLE,
896    TYPE,
897    UESCAPE,
898    UINT128,
899    UINT16,
900    UINT256,
901    UINT32,
902    UINT64,
903    UINT8,
904    UNBOUNDED,
905    UNCACHE,
906    UNCOMMITTED,
907    UNDEFINED,
908    UNFREEZE,
909    UNION,
910    UNIQUE,
911    UNKNOWN,
912    UNLISTEN,
913    UNLOAD,
914    UNLOCK,
915    UNLOGGED,
916    UNMATCHED,
917    UNNEST,
918    UNPIVOT,
919    UNSAFE,
920    UNSET,
921    UNSIGNED,
922    UNTIL,
923    UPDATE,
924    UPPER,
925    URL,
926    USAGE,
927    USE,
928    USER,
929    USER_RESOURCES,
930    USING,
931    UUID,
932    VACUUM,
933    VALID,
934    VALIDATION_MODE,
935    VALUE,
936    VALUES,
937    VALUE_OF,
938    VARBINARY,
939    VARBIT,
940    VARCHAR,
941    // Non-reserved, DuckDB `SET VARIABLE <name> = <expr>` only — see
942    // `Parser::parse_set`. Kept out of every `RESERVED_FOR_*` list, the same
943    // way this fork's `LAMBDA` keyword is, so it still parses as a plain
944    // identifier everywhere else (e.g. a column literally named `variable`).
945    VARIABLE,
946    VARIABLES,
947    VARYING,
948    VAR_POP,
949    VAR_SAMP,
950    VERBOSE,
951    VERSION,
952    VERSIONING,
953    VERSIONS,
954    VIEW,
955    VIEWS,
956    VIRTUAL,
957    VOLATILE,
958    VOLUME,
959    WAREHOUSE,
960    WAREHOUSES,
961    WEEK,
962    WEEKS,
963    WHEN,
964    WHENEVER,
965    WHERE,
966    WIDTH_BUCKET,
967    WINDOW,
968    WITH,
969    WITHIN,
970    WITHOUT,
971    WITHOUT_ARRAY_WRAPPER,
972    WORK,
973    WRITE,
974    XML,
975    XOR,
976    YEAR,
977    YEARS,
978    ZONE,
979    ZORDER
980);
981
982/// These keywords can't be used as a table alias, so that `FROM table_name alias`
983/// can be parsed unambiguously without looking ahead.
984pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
985    // Reserved as both a table and a column alias:
986    Keyword::WITH,
987    Keyword::EXPLAIN,
988    Keyword::ANALYZE,
989    Keyword::SELECT,
990    Keyword::WHERE,
991    Keyword::GROUP,
992    Keyword::SORT,
993    Keyword::HAVING,
994    Keyword::ORDER,
995    Keyword::PIVOT,
996    Keyword::UNPIVOT,
997    Keyword::TOP,
998    Keyword::LATERAL,
999    Keyword::VIEW,
1000    Keyword::LIMIT,
1001    Keyword::OFFSET,
1002    Keyword::FETCH,
1003    Keyword::UNION,
1004    Keyword::EXCEPT,
1005    Keyword::INTERSECT,
1006    Keyword::MINUS,
1007    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
1008    Keyword::ON,
1009    Keyword::JOIN,
1010    Keyword::INNER,
1011    Keyword::CROSS,
1012    Keyword::FULL,
1013    Keyword::LEFT,
1014    Keyword::RIGHT,
1015    Keyword::NATURAL,
1016    Keyword::USING,
1017    Keyword::CLUSTER,
1018    Keyword::DISTRIBUTE,
1019    Keyword::GLOBAL,
1020    Keyword::ANTI,
1021    Keyword::SEMI,
1022    Keyword::RETURNING,
1023    Keyword::ASOF,
1024    Keyword::MATCH_CONDITION,
1025    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
1026    Keyword::OUTER,
1027    Keyword::SET,
1028    Keyword::QUALIFY,
1029    Keyword::WINDOW,
1030    Keyword::END,
1031    Keyword::FOR,
1032    // for MYSQL PARTITION SELECTION
1033    Keyword::PARTITION,
1034    // for Clickhouse PREWHERE
1035    Keyword::PREWHERE,
1036    Keyword::SETTINGS,
1037    Keyword::FORMAT,
1038    // for Snowflake START WITH .. CONNECT BY
1039    Keyword::START,
1040    Keyword::CONNECT,
1041    // Reserved for snowflake MATCH_RECOGNIZE
1042    Keyword::MATCH_RECOGNIZE,
1043    // Reserved for Snowflake table sample
1044    Keyword::SAMPLE,
1045    Keyword::TABLESAMPLE,
1046    Keyword::FROM,
1047];
1048
1049/// Can't be used as a column alias, so that `SELECT <expr> alias`
1050/// can be parsed unambiguously without looking ahead.
1051pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
1052    // Reserved as both a table and a column alias:
1053    Keyword::WITH,
1054    Keyword::EXPLAIN,
1055    Keyword::ANALYZE,
1056    Keyword::SELECT,
1057    Keyword::WHERE,
1058    Keyword::GROUP,
1059    Keyword::SORT,
1060    Keyword::HAVING,
1061    Keyword::ORDER,
1062    Keyword::TOP,
1063    Keyword::LATERAL,
1064    Keyword::VIEW,
1065    Keyword::LIMIT,
1066    Keyword::OFFSET,
1067    Keyword::FETCH,
1068    Keyword::UNION,
1069    Keyword::EXCEPT,
1070    Keyword::INTERSECT,
1071    Keyword::MINUS,
1072    Keyword::CLUSTER,
1073    Keyword::DISTRIBUTE,
1074    Keyword::RETURNING,
1075    // Reserved only as a column alias in the `SELECT` clause
1076    Keyword::FROM,
1077    Keyword::INTO,
1078    Keyword::END,
1079];
1080
1081// Global list of reserved keywords alloweed after FROM.
1082// Parser should call Dialect::get_reserved_keyword_after_from
1083// to allow for each dialect to customize the list.
1084pub const RESERVED_FOR_TABLE_FACTOR: &[Keyword] = &[
1085    Keyword::INTO,
1086    Keyword::LIMIT,
1087    Keyword::HAVING,
1088    Keyword::WHERE,
1089];
1090
1091/// Global list of reserved keywords that cannot be parsed as identifiers
1092/// without special handling like quoting. Parser should call `Dialect::is_reserved_for_identifier`
1093/// to allow for each dialect to customize the list.
1094pub const RESERVED_FOR_IDENTIFIER: &[Keyword] = &[
1095    Keyword::EXISTS,
1096    Keyword::INTERVAL,
1097    Keyword::STRUCT,
1098    Keyword::TRIM,
1099];