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        #[doc = concat!("The `", $string_keyword, "` SQL keyword.")]
41        pub const $ident: &'static str = $string_keyword;
42    };
43    ($ident:ident) => {
44        kw_def!($ident = stringify!($ident));
45    };
46}
47
48/// Expands to a list of `kw_def!()` invocations for each keyword
49/// and defines an ALL_KEYWORDS array of the defined constants.
50macro_rules! define_keywords {
51    ($(
52        $ident:ident $(= $string_keyword:expr)?
53    ),*) => {
54        #[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
55        #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56        #[cfg_attr(feature = "visitor", derive(Visit, VisitMut))]
57        #[allow(non_camel_case_types)]
58        /// An enumeration of SQL keywords recognized by the parser.
59        pub enum Keyword {
60            /// Represents no keyword.
61            NoKeyword,
62            $(
63                #[doc = concat!("The `", stringify!($ident), "` SQL keyword.")]
64                $ident
65            ),*
66        }
67
68        /// Array of all `Keyword` enum values in declaration order.
69        pub const ALL_KEYWORDS_INDEX: &[Keyword] = &[
70            $(Keyword::$ident),*
71        ];
72
73        $(kw_def!($ident $(= $string_keyword)?);)*
74        /// Array of all SQL keywords as string constants.
75        pub const ALL_KEYWORDS: &[&str] = &[
76            $($ident),*
77        ];
78
79        impl core::fmt::Display for Keyword {
80            fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
81                match self {
82                    Keyword::NoKeyword => write!(f, "NoKeyword"),
83                    $(Keyword::$ident => write!(f, "{}", $ident),)*
84                }
85            }
86        }
87    };
88}
89
90// The following keywords should be sorted to be able to match using binary search
91define_keywords!(
92    ABORT,
93    ABS,
94    ABSENT,
95    ABSOLUTE,
96    ACCEPTANYDATE,
97    ACCEPTINVCHARS,
98    ACCESS,
99    ACCOUNT,
100    ACTION,
101    ADD,
102    ADDQUOTES,
103    ADMIN,
104    AFTER,
105    AGAINST,
106    AGGREGATE,
107    AGGREGATION,
108    ALERT,
109    ALGORITHM,
110    ALIAS,
111    ALIGNMENT,
112    ALL,
113    ALLOCATE,
114    ALLOWOVERWRITE,
115    ALTER,
116    ALWAYS,
117    ANALYZE,
118    AND,
119    ANTI,
120    ANY,
121    APPLICATION,
122    APPLY,
123    APPLYBUDGET,
124    APPROXIMATE,
125    ARCHIVE,
126    ARE,
127    ARRAY,
128    ARRAY_MAX_CARDINALITY,
129    AS,
130    ASC,
131    ASENSITIVE,
132    ASOF,
133    ASSERT,
134    ASYMMETRIC,
135    ASYNC,
136    AT,
137    ATOMIC,
138    ATTACH,
139    AUDIT,
140    AUTHENTICATION,
141    AUTHORIZATION,
142    AUTHORIZATIONS,
143    AUTO,
144    AUTOEXTEND_SIZE,
145    AUTOINCREMENT,
146    AUTO_INCREMENT,
147    AVG,
148    AVG_ROW_LENGTH,
149    AVRO,
150    BACKUP,
151    BACKWARD,
152    BASE64,
153    BASE_LOCATION,
154    BEFORE,
155    BEGIN,
156    BEGIN_FRAME,
157    BEGIN_PARTITION,
158    BERNOULLI,
159    BETWEEN,
160    BIGDECIMAL,
161    BIGINT,
162    BIGNUMERIC,
163    BINARY,
164    BIND,
165    BINDING,
166    BIT,
167    BLANKSASNULL,
168    BLOB,
169    BLOCK,
170    BLOOM,
171    BLOOMFILTER,
172    BOOL,
173    BOOLEAN,
174    BOOST,
175    BOTH,
176    BOX,
177    BRIN,
178    BROWSE,
179    BTREE,
180    BUCKET,
181    BUCKETS,
182    BY,
183    BYPASSRLS,
184    BYTEA,
185    BYTES,
186    BZIP2,
187    CACHE,
188    CALL,
189    CALLED,
190    CANONICAL,
191    CARDINALITY,
192    CASCADE,
193    CASCADED,
194    CASE,
195    CASES,
196    CAST,
197    CATALOG,
198    CATALOGS,
199    CATALOG_SYNC,
200    CATALOG_SYNC_NAMESPACE_FLATTEN_DELIMITER,
201    CATALOG_SYNC_NAMESPACE_MODE,
202    CATCH,
203    CATEGORY,
204    CEIL,
205    CEILING,
206    CENTURY,
207    CHAIN,
208    CHANGE,
209    CHANGES,
210    CHANGE_TRACKING,
211    CHANNEL,
212    CHAR,
213    CHARACTER,
214    CHARACTERISTICS,
215    CHARACTERS,
216    CHARACTER_LENGTH,
217    CHARSET,
218    CHAR_LENGTH,
219    CHECK,
220    CHECKSUM,
221    CIRCLE,
222    CLASS,
223    CLEANPATH,
224    CLEAR,
225    CLOB,
226    CLONE,
227    CLOSE,
228    CLUSTER,
229    CLUSTERED,
230    CLUSTERING,
231    COALESCE,
232    COLLATABLE,
233    COLLATE,
234    COLLATION,
235    COLLECT,
236    COLLECTION,
237    COLUMN,
238    COLUMNS,
239    COLUMNSTORE,
240    COMMENT,
241    COMMIT,
242    COMMITTED,
243    COMMUTATOR,
244    COMPATIBLE,
245    COMPRESS,
246    COMPRESSION,
247    COMPUPDATE,
248    COMPUTE,
249    CONCURRENTLY,
250    CONDITION,
251    CONFIGURATION,
252    CONFLICT,
253    CONNECT,
254    CONNECTION,
255    CONNECTOR,
256    CONNECT_BY_ROOT,
257    CONSTRAINT,
258    CONTACT,
259    CONTAINS,
260    CONTINUE,
261    CONVERT,
262    COPY,
263    COPY_OPTIONS,
264    CORR,
265    CORRESPONDING,
266    COST,
267    COUNT,
268    COVAR_POP,
269    COVAR_SAMP,
270    CREATE,
271    CREATEDB,
272    CREATEROLE,
273    CREDENTIALS,
274    CROSS,
275    CSV,
276    CUBE,
277    CUME_DIST,
278    CURRENT,
279    CURRENT_CATALOG,
280    CURRENT_DATE,
281    CURRENT_DEFAULT_TRANSFORM_GROUP,
282    CURRENT_PATH,
283    CURRENT_ROLE,
284    CURRENT_ROW,
285    CURRENT_SCHEMA,
286    CURRENT_TIME,
287    CURRENT_TIMESTAMP,
288    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
289    CURRENT_USER,
290    CURSOR,
291    CYCLE,
292    DATA,
293    DATABASE,
294    DATABASES,
295    DATA_RETENTION_TIME_IN_DAYS,
296    DATE,
297    DATE32,
298    DATEFORMAT,
299    DATETIME,
300    DATETIME64,
301    DAY,
302    DAYOFWEEK,
303    DAYOFYEAR,
304    DAYS,
305    DCPROPERTIES,
306    DEALLOCATE,
307    DEC,
308    DECADE,
309    DECIMAL,
310    DECLARE,
311    DEDUPLICATE,
312    DEFAULT,
313    DEFAULTS,
314    DEFAULT_DDL_COLLATION,
315    DEFAULT_MFA_METHOD,
316    DEFAULT_SECONDARY_ROLES,
317    DEFERRABLE,
318    DEFERRED,
319    DEFINE,
320    DEFINED,
321    DEFINER,
322    DELAY,
323    DELAYED,
324    DELAY_KEY_WRITE,
325    DELEGATED,
326    DELETE,
327    DELIMITED,
328    DELIMITER,
329    DELTA,
330    DENSE_RANK,
331    DENY,
332    DEPENDS,
333    DEREF,
334    DESC,
335    DESCRIBE,
336    DETACH,
337    DETAIL,
338    DETERMINISTIC,
339    DIAGNOSTICS,
340    DICTIONARY,
341    DIMENSIONS,
342    DIRECTORY,
343    DISABLE,
344    DISCARD,
345    DISCONNECT,
346    DISTINCT,
347    DISTINCTROW,
348    DISTKEY,
349    DISTRIBUTE,
350    DISTSTYLE,
351    DIV,
352    DO,
353    DOMAIN,
354    DOUBLE,
355    DOW,
356    DOWNSTREAM,
357    DOY,
358    DROP,
359    DRY,
360    DUO,
361    DUPLICATE,
362    DYNAMIC,
363    EACH,
364    ELEMENT,
365    ELEMENTS,
366    ELSE,
367    ELSEIF,
368    ELSIF,
369    EMPTY,
370    EMPTYASNULL,
371    ENABLE,
372    ENABLE_SCHEMA_EVOLUTION,
373    ENCODING,
374    ENCRYPTED,
375    ENCRYPTION,
376    END,
377    END_EXEC = "END-EXEC",
378    ENDPOINT,
379    END_FRAME,
380    END_PARTITION,
381    ENFORCED,
382    ENGINE,
383    ENGINE_ATTRIBUTE,
384    ENROLL,
385    ENUM,
386    ENUM16,
387    ENUM8,
388    EPHEMERAL,
389    EPOCH,
390    EQUALS,
391    ERROR,
392    ESCAPE,
393    ESCAPED,
394    ESTIMATE,
395    EVEN,
396    EVENT,
397    EVERY,
398    EVOLVE,
399    EXCEPT,
400    EXCEPTION,
401    EXCHANGE,
402    EXCLUDE,
403    EXCLUDING,
404    EXCLUSIVE,
405    EXEC,
406    EXECUTE,
407    EXECUTION,
408    EXISTS,
409    EXP,
410    EXPANSION,
411    EXPLAIN,
412    EXPLICIT,
413    EXPORT,
414    EXTEND,
415    EXTENDED,
416    EXTENSION,
417    EXTERNAL,
418    EXTERNAL_VOLUME,
419    EXTRACT,
420    FACTS,
421    FAIL,
422    FAILOVER,
423    FALLBACK,
424    FALSE,
425    FAMILY,
426    FETCH,
427    FIELDS,
428    FILE,
429    FILES,
430    FILE_FORMAT,
431    FILL,
432    FILTER,
433    FINAL,
434    FIRST,
435    FIRST_VALUE,
436    FIXEDSTRING,
437    FIXEDWIDTH,
438    FLATTEN,
439    FLOAT,
440    FLOAT32,
441    FLOAT4,
442    FLOAT64,
443    FLOAT8,
444    FLOOR,
445    FLUSH,
446    FN,
447    FOLLOWING,
448    FOR,
449    FORCE,
450    FORCE_NOT_NULL,
451    FORCE_NULL,
452    FORCE_QUOTE,
453    FOREIGN,
454    FORMAT,
455    FORMATTED,
456    FORWARD,
457    FRAME_ROW,
458    FREE,
459    FREEZE,
460    FROM,
461    FSCK,
462    FULFILLMENT,
463    FULL,
464    FULLTEXT,
465    FUNCTION,
466    FUNCTIONS,
467    FUSION,
468    FUTURE,
469    GB,
470    GENERAL,
471    GENERATE,
472    GENERATED,
473    GEOGRAPHY,
474    GET,
475    GIN,
476    GIST,
477    GLOB,
478    GLOBAL,
479    GRANT,
480    GRANTED,
481    GRANTS,
482    GRAPHVIZ,
483    GROUP,
484    GROUPING,
485    GROUPS,
486    GZIP,
487    HASH,
488    HASHES,
489    HAVING,
490    HEADER,
491    HEAP,
492    HIGH_PRIORITY,
493    HINT,
494    HISTORY,
495    HIVEVAR,
496    HOLD,
497    HOSTS,
498    HOUR,
499    HOURS,
500    HUGEINT,
501    IAM_ROLE,
502    ICEBERG,
503    ID,
504    IDENTIFIED,
505    IDENTITY,
506    IDENTITY_INSERT,
507    IF,
508    IGNORE,
509    IGNOREHEADER,
510    ILIKE,
511    IMMEDIATE,
512    IMMUTABLE,
513    IMPORT,
514    IMPORTED,
515    IN,
516    INCLUDE,
517    INCLUDE_NULL_VALUES,
518    INCLUDING,
519    INCREMENT,
520    INCREMENTAL,
521    INDEX,
522    INDICATOR,
523    INHERIT,
524    INHERITS,
525    INITIALIZE,
526    INITIALLY,
527    INNER,
528    INOUT,
529    INPATH,
530    INPLACE,
531    INPUT,
532    INPUTFORMAT,
533    INSENSITIVE,
534    INSERT,
535    INSERT_METHOD,
536    INSTALL,
537    INSTANT,
538    INSTEAD,
539    INT,
540    INT128,
541    INT16,
542    INT2,
543    INT256,
544    INT32,
545    INT4,
546    INT64,
547    INT8,
548    INTEGER,
549    INTEGRATION,
550    INTERNALLENGTH,
551    INTERPOLATE,
552    INTERSECT,
553    INTERSECTION,
554    INTERVAL,
555    INTO,
556    INVISIBLE,
557    INVOKER,
558    IO,
559    IS,
560    ISODOW,
561    ISOLATION,
562    ISOWEEK,
563    ISOYEAR,
564    ITEMS,
565    JAR,
566    JOIN,
567    JSON,
568    JSONB,
569    JSONFILE,
570    JSON_TABLE,
571    JULIAN,
572    KEY,
573    KEYS,
574    KEY_BLOCK_SIZE,
575    KILL,
576    LAG,
577    LAMBDA,
578    LANGUAGE,
579    LARGE,
580    LAST,
581    LAST_VALUE,
582    LATERAL,
583    LEAD,
584    LEADING,
585    LEAKPROOF,
586    LEAST,
587    LEFT,
588    LEFTARG,
589    LEVEL,
590    LIFECYCLE,
591    LIKE,
592    LIKE_REGEX,
593    LIMIT,
594    LINE,
595    LINES,
596    LIST,
597    LISTEN,
598    LISTING,
599    LN,
600    LOAD,
601    LOCAL,
602    LOCALTIME,
603    LOCALTIMESTAMP,
604    LOCATION,
605    LOCK,
606    LOCKED,
607    LOG,
608    LOGGED,
609    LOGIN,
610    LOGS,
611    LONG,
612    LONGBLOB,
613    LONGTEXT,
614    LOWCARDINALITY,
615    LOWER,
616    LOW_PRIORITY,
617    LS,
618    LSEG,
619    MACRO,
620    MAIN,
621    MANAGE,
622    MANAGED,
623    MANAGEDLOCATION,
624    MANIFEST,
625    MAP,
626    MASKING,
627    MATCH,
628    MATCHED,
629    MATCHES,
630    MATCH_CONDITION,
631    MATCH_RECOGNIZE,
632    MATERIALIZE,
633    MATERIALIZED,
634    MAX,
635    MAXFILESIZE,
636    MAXVALUE,
637    MAX_DATA_EXTENSION_TIME_IN_DAYS,
638    MAX_ROWS,
639    MB,
640    MEASURES,
641    MEDIUMBLOB,
642    MEDIUMINT,
643    MEDIUMTEXT,
644    MEMBER,
645    MERGE,
646    MERGES,
647    MESSAGE,
648    METADATA,
649    METHOD,
650    METRIC,
651    METRICS,
652    MFA,
653    MICROSECOND,
654    MICROSECONDS,
655    MILLENIUM,
656    MILLENNIUM,
657    MILLISECOND,
658    MILLISECONDS,
659    MIN,
660    MINUS,
661    MINUTE,
662    MINUTES,
663    MINVALUE,
664    MIN_ROWS,
665    MOD,
666    MODE,
667    MODIFIES,
668    MODIFY,
669    MODULE,
670    MODULUS,
671    MONITOR,
672    MONTH,
673    MONTHS,
674    MSCK,
675    MULTIRANGE_TYPE_NAME,
676    MULTISET,
677    MUTATION,
678    NAME,
679    NAMES,
680    NANOSECOND,
681    NANOSECONDS,
682    NATIONAL,
683    NATURAL,
684    NCHAR,
685    NCLOB,
686    NEGATOR,
687    NEST,
688    NESTED,
689    NETWORK,
690    NEW,
691    NEXT,
692    NFC,
693    NFD,
694    NFKC,
695    NFKD,
696    NO,
697    NOBYPASSRLS,
698    NOCOMPRESS,
699    NOCREATEDB,
700    NOCREATEROLE,
701    NOCYCLE,
702    NOINHERIT,
703    NOLOGIN,
704    NONE,
705    NOORDER,
706    NOREPLICATION,
707    NORMALIZE,
708    NORMALIZED,
709    NOSCAN,
710    NOSUPERUSER,
711    NOT,
712    NOTHING,
713    NOTIFY,
714    NOTNULL,
715    NOWAIT,
716    NO_WRITE_TO_BINLOG,
717    NTH_VALUE,
718    NTILE,
719    NULL,
720    NULLABLE,
721    NULLIF,
722    NULLS,
723    NUMBER,
724    NUMERIC,
725    NVARCHAR,
726    OBJECT,
727    OBJECTS,
728    OCCURRENCES_REGEX,
729    OCTETS,
730    OCTET_LENGTH,
731    OF,
732    OFF,
733    OFFSET,
734    OFFSETS,
735    OLD,
736    OMIT,
737    ON,
738    ONE,
739    ONLY,
740    ON_CREATE,
741    ON_SCHEDULE,
742    OPEN,
743    OPENJSON,
744    OPERATE,
745    OPERATOR,
746    OPTIMIZATION,
747    OPTIMIZE,
748    OPTIMIZED,
749    OPTIMIZER_COSTS,
750    OPTION,
751    OPTIONS,
752    OR,
753    ORC,
754    ORDER,
755    ORDINALITY,
756    ORGANIZATION,
757    OTHER,
758    OTP,
759    OUT,
760    OUTER,
761    OUTPUT,
762    OUTPUTFORMAT,
763    OVER,
764    OVERFLOW,
765    OVERLAPS,
766    OVERLAY,
767    OVERRIDE,
768    OVERWRITE,
769    OWNED,
770    OWNER,
771    OWNERSHIP,
772    PACKAGE,
773    PACKAGES,
774    PACK_KEYS,
775    PARALLEL,
776    PARAMETER,
777    PARQUET,
778    PARSER,
779    PART,
780    PARTIAL,
781    PARTITION,
782    PARTITIONED,
783    PARTITIONS,
784    PASSEDBYVALUE,
785    PASSING,
786    PASSKEY,
787    PASSWORD,
788    PAST,
789    PATH,
790    PATTERN,
791    PCTFREE,
792    PER,
793    PERCENT,
794    PERCENTILE_CONT,
795    PERCENTILE_DISC,
796    PERCENT_RANK,
797    PERIOD,
798    PERMISSIVE,
799    PERSISTENT,
800    PIVOT,
801    PLACING,
802    PLAIN,
803    PLAN,
804    PLANS,
805    POINT,
806    POLICY,
807    POLYGON,
808    POOL,
809    PORTION,
810    POSITION,
811    POSITION_REGEX,
812    POWER,
813    PRAGMA,
814    PRECEDES,
815    PRECEDING,
816    PRECISION,
817    PREFERRED,
818    PREPARE,
819    PRESERVE,
820    PRESET,
821    PREWHERE,
822    PRIMARY,
823    PRINT,
824    PRIOR,
825    PRIVILEGES,
826    PROC,
827    PROCEDURE,
828    PROCESSLIST,
829    PROFILE,
830    PROGRAM,
831    PROJECTION,
832    PUBLIC,
833    PURCHASE,
834    PURGE,
835    PUT,
836    QUALIFY,
837    QUARTER,
838    QUERIES,
839    QUERY,
840    QUOTE,
841    RAISE,
842    RAISERROR,
843    RANGE,
844    RANK,
845    RAW,
846    RCFILE,
847    READ,
848    READS,
849    READ_ONLY,
850    REAL,
851    RECEIVE,
852    RECLUSTER,
853    RECURSIVE,
854    REF,
855    REFERENCES,
856    REFERENCING,
857    REFRESH,
858    REFRESH_MODE,
859    REGCLASS,
860    REGEXP,
861    REGION,
862    REGR_AVGX,
863    REGR_AVGY,
864    REGR_COUNT,
865    REGR_INTERCEPT,
866    REGR_R2,
867    REGR_SLOPE,
868    REGR_SXX,
869    REGR_SXY,
870    REGR_SYY,
871    REINDEX,
872    RELATIVE,
873    RELAY,
874    RELEASE,
875    RELEASES,
876    REMAINDER,
877    REMOTE,
878    REMOVE,
879    REMOVEQUOTES,
880    RENAME,
881    REORG,
882    REPAIR,
883    REPEATABLE,
884    REPLACE,
885    REPLACE_INVALID_CHARACTERS,
886    REPLICA,
887    REPLICATE,
888    REPLICATION,
889    REQUIRE,
890    RESET,
891    RESOLVE,
892    RESOURCE,
893    RESPECT,
894    RESTART,
895    RESTRICT,
896    RESTRICTED,
897    RESTRICTIONS,
898    RESTRICTIVE,
899    RESULT,
900    RESULTSET,
901    RESUME,
902    RETAIN,
903    RETURN,
904    RETURNING,
905    RETURNS,
906    REVOKE,
907    RIGHT,
908    RIGHTARG,
909    RLIKE,
910    RM,
911    ROLE,
912    ROLES,
913    ROLLBACK,
914    ROLLUP,
915    ROOT,
916    ROW,
917    ROWGROUPSIZE,
918    ROWID,
919    ROWS,
920    ROW_COUNT,
921    ROW_FORMAT,
922    ROW_NUMBER,
923    RULE,
924    RUN,
925    SAFE,
926    SAFE_CAST,
927    SAMPLE,
928    SAVEPOINT,
929    SCALAR,
930    SCHEMA,
931    SCHEMAS,
932    SCOPE,
933    SCROLL,
934    SEARCH,
935    SECOND,
936    SECONDARY,
937    SECONDARY_ENGINE_ATTRIBUTE,
938    SECONDS,
939    SECRET,
940    SECURE,
941    SECURITY,
942    SEED,
943    SELECT,
944    SEMANTIC_VIEW,
945    SEMI,
946    SEND,
947    SENSITIVE,
948    SEPARATOR,
949    SEQUENCE,
950    SEQUENCEFILE,
951    SEQUENCES,
952    SERDE,
953    SERDEPROPERTIES,
954    SERIALIZABLE,
955    SERVER,
956    SERVICE,
957    SESSION,
958    SESSION_USER,
959    SET,
960    SETERROR,
961    SETOF,
962    SETS,
963    SETTINGS,
964    SHARE,
965    SHARED,
966    SHARING,
967    SHOW,
968    SIGNED,
969    SIMILAR,
970    SIMPLE,
971    SIZE,
972    SKIP,
973    SLOW,
974    SMALLINT,
975    SNAPSHOT,
976    SOME,
977    SORT,
978    SORTED,
979    SORTKEY,
980    SOURCE,
981    SPATIAL,
982    SPECIFIC,
983    SPECIFICTYPE,
984    SPGIST,
985    SQL,
986    SQLEXCEPTION,
987    SQLSTATE,
988    SQLWARNING,
989    SQL_BIG_RESULT,
990    SQL_BUFFER_RESULT,
991    SQL_CALC_FOUND_ROWS,
992    SQL_NO_CACHE,
993    SQL_SMALL_RESULT,
994    SQRT,
995    SRID,
996    STABLE,
997    STAGE,
998    START,
999    STARTS,
1000    STATEMENT,
1001    STATIC,
1002    STATISTICS,
1003    STATS_AUTO_RECALC,
1004    STATS_PERSISTENT,
1005    STATS_SAMPLE_PAGES,
1006    STATUPDATE,
1007    STATUS,
1008    STDDEV_POP,
1009    STDDEV_SAMP,
1010    STDIN,
1011    STDOUT,
1012    STEP,
1013    STORAGE,
1014    STORAGE_INTEGRATION,
1015    STORAGE_SERIALIZATION_POLICY,
1016    STORED,
1017    STRAIGHT_JOIN,
1018    STREAM,
1019    STRICT,
1020    STRING,
1021    STRUCT,
1022    SUBMULTISET,
1023    SUBSCRIPT,
1024    SUBSTR,
1025    SUBSTRING,
1026    SUBSTRING_REGEX,
1027    SUBTYPE,
1028    SUBTYPE_DIFF,
1029    SUBTYPE_OPCLASS,
1030    SUCCEEDS,
1031    SUM,
1032    SUPER,
1033    SUPERUSER,
1034    SUPPORT,
1035    SUSPEND,
1036    SWAP,
1037    SYMMETRIC,
1038    SYNC,
1039    SYNONYM,
1040    SYSTEM,
1041    SYSTEM_TIME,
1042    SYSTEM_USER,
1043    TABLE,
1044    TABLES,
1045    TABLESAMPLE,
1046    TABLESPACE,
1047    TAG,
1048    TARGET,
1049    TARGET_LAG,
1050    TASK,
1051    TBLPROPERTIES,
1052    TEMP,
1053    TEMPLATE,
1054    TEMPORARY,
1055    TEMPTABLE,
1056    TERMINATED,
1057    TERSE,
1058    TEXT,
1059    TEXTFILE,
1060    THEN,
1061    THROW,
1062    TIES,
1063    TIME,
1064    TIMEFORMAT,
1065    TIMESTAMP,
1066    TIMESTAMPTZ,
1067    TIMESTAMP_NTZ,
1068    TIMETZ,
1069    TIMEZONE,
1070    TIMEZONE_ABBR,
1071    TIMEZONE_HOUR,
1072    TIMEZONE_MINUTE,
1073    TIMEZONE_REGION,
1074    TINYBLOB,
1075    TINYINT,
1076    TINYTEXT,
1077    TO,
1078    TOP,
1079    TOTALS,
1080    TOTP,
1081    TRACE,
1082    TRAILING,
1083    TRAN,
1084    TRANSACTION,
1085    TRANSIENT,
1086    TRANSLATE,
1087    TRANSLATE_REGEX,
1088    TRANSLATION,
1089    TREAT,
1090    TREE,
1091    TRIGGER,
1092    TRIM,
1093    TRIM_ARRAY,
1094    TRUE,
1095    TRUNCATE,
1096    TRUNCATECOLUMNS,
1097    TRY,
1098    TRY_CAST,
1099    TRY_CONVERT,
1100    TSQUERY,
1101    TSVECTOR,
1102    TUPLE,
1103    TYPE,
1104    TYPMOD_IN,
1105    TYPMOD_OUT,
1106    UBIGINT,
1107    UESCAPE,
1108    UHUGEINT,
1109    UINT128,
1110    UINT16,
1111    UINT256,
1112    UINT32,
1113    UINT64,
1114    UINT8,
1115    UNBOUNDED,
1116    UNCACHE,
1117    UNCOMMITTED,
1118    UNDEFINED,
1119    UNFREEZE,
1120    UNION,
1121    UNIQUE,
1122    UNKNOWN,
1123    UNLISTEN,
1124    UNLOAD,
1125    UNLOCK,
1126    UNLOGGED,
1127    UNMATCHED,
1128    UNNEST,
1129    UNPIVOT,
1130    UNSAFE,
1131    UNSET,
1132    UNSIGNED,
1133    UNTIL,
1134    UPDATE,
1135    UPPER,
1136    URL,
1137    USAGE,
1138    USE,
1139    USER,
1140    USER_RESOURCES,
1141    USING,
1142    USMALLINT,
1143    UTINYINT,
1144    UUID,
1145    VACUUM,
1146    VALID,
1147    VALIDATE,
1148    VALIDATION_MODE,
1149    VALUE,
1150    VALUES,
1151    VALUE_OF,
1152    VARBINARY,
1153    VARBIT,
1154    VARCHAR,
1155    VARCHAR2,
1156    VARIABLE,
1157    VARIABLES,
1158    VARIADIC,
1159    VARYING,
1160    VAR_POP,
1161    VAR_SAMP,
1162    VERBOSE,
1163    VERSION,
1164    VERSIONING,
1165    VERSIONS,
1166    VIEW,
1167    VIEWS,
1168    VIRTUAL,
1169    VOLATILE,
1170    VOLUME,
1171    WAITFOR,
1172    WAREHOUSE,
1173    WAREHOUSES,
1174    WEEK,
1175    WEEKS,
1176    WHEN,
1177    WHENEVER,
1178    WHERE,
1179    WHILE,
1180    WIDTH_BUCKET,
1181    WINDOW,
1182    WITH,
1183    WITHIN,
1184    WITHOUT,
1185    WITHOUT_ARRAY_WRAPPER,
1186    WORK,
1187    WORKLOAD_IDENTITY,
1188    WRAPPER,
1189    WRITE,
1190    XML,
1191    XMLNAMESPACES,
1192    XMLTABLE,
1193    XOR,
1194    YEAR,
1195    YEARS,
1196    YES,
1197    ZONE,
1198    ZORDER,
1199    ZSTD
1200);
1201
1202/// These keywords can't be used as a table alias, so that `FROM table_name alias`
1203/// can be parsed unambiguously without looking ahead.
1204pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
1205    // Reserved as both a table and a column alias:
1206    Keyword::WITH,
1207    Keyword::EXPLAIN,
1208    Keyword::ANALYZE,
1209    Keyword::SELECT,
1210    Keyword::WHERE,
1211    Keyword::GROUP,
1212    Keyword::SORT,
1213    Keyword::HAVING,
1214    Keyword::ORDER,
1215    Keyword::PIVOT,
1216    Keyword::UNPIVOT,
1217    Keyword::TOP,
1218    Keyword::LATERAL,
1219    Keyword::VIEW,
1220    Keyword::LIMIT,
1221    Keyword::OFFSET,
1222    Keyword::FETCH,
1223    Keyword::UNION,
1224    Keyword::EXCEPT,
1225    Keyword::INTERSECT,
1226    Keyword::MINUS,
1227    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
1228    Keyword::ON,
1229    Keyword::JOIN,
1230    Keyword::INNER,
1231    Keyword::CROSS,
1232    Keyword::FULL,
1233    Keyword::LEFT,
1234    Keyword::RIGHT,
1235    Keyword::NATURAL,
1236    Keyword::USING,
1237    Keyword::CLUSTER,
1238    Keyword::DISTRIBUTE,
1239    Keyword::GLOBAL,
1240    Keyword::ANTI,
1241    Keyword::SEMI,
1242    Keyword::RETURNING,
1243    Keyword::OUTPUT,
1244    Keyword::ASOF,
1245    Keyword::MATCH_CONDITION,
1246    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
1247    Keyword::OUTER,
1248    Keyword::SET,
1249    Keyword::QUALIFY,
1250    Keyword::WINDOW,
1251    Keyword::END,
1252    Keyword::FOR,
1253    // for MYSQL PARTITION SELECTION
1254    Keyword::PARTITION,
1255    // for Clickhouse ARRAY JOIN (ARRAY must not be parsed as a table alias)
1256    Keyword::ARRAY,
1257    // for Clickhouse PREWHERE
1258    Keyword::PREWHERE,
1259    Keyword::SETTINGS,
1260    Keyword::FORMAT,
1261    // for Snowflake START WITH .. CONNECT BY
1262    Keyword::START,
1263    Keyword::CONNECT,
1264    // Reserved for snowflake MATCH_RECOGNIZE
1265    Keyword::MATCH_RECOGNIZE,
1266    // Reserved for Snowflake table sample
1267    Keyword::SAMPLE,
1268    Keyword::TABLESAMPLE,
1269    Keyword::FROM,
1270    Keyword::OPEN,
1271];
1272
1273/// Can't be used as a column alias, so that `SELECT <expr> alias`
1274/// can be parsed unambiguously without looking ahead.
1275pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
1276    // Reserved as both a table and a column alias:
1277    Keyword::WITH,
1278    Keyword::EXPLAIN,
1279    Keyword::ANALYZE,
1280    Keyword::SELECT,
1281    Keyword::WHERE,
1282    Keyword::GROUP,
1283    Keyword::SORT,
1284    Keyword::HAVING,
1285    Keyword::ORDER,
1286    Keyword::TOP,
1287    Keyword::LATERAL,
1288    Keyword::VIEW,
1289    Keyword::LIMIT,
1290    Keyword::OFFSET,
1291    Keyword::FETCH,
1292    Keyword::UNION,
1293    Keyword::EXCEPT,
1294    Keyword::EXCLUDE,
1295    Keyword::INTERSECT,
1296    Keyword::MINUS,
1297    Keyword::CLUSTER,
1298    Keyword::DISTRIBUTE,
1299    Keyword::RETURNING,
1300    Keyword::VALUES,
1301    // Reserved only as a column alias in the `SELECT` clause
1302    Keyword::FROM,
1303    Keyword::INTO,
1304    Keyword::END,
1305];
1306
1307/// Global list of reserved keywords allowed after FROM.
1308/// Parser should call Dialect::get_reserved_keyword_after_from
1309/// to allow for each dialect to customize the list.
1310pub const RESERVED_FOR_TABLE_FACTOR: &[Keyword] = &[
1311    Keyword::INTO,
1312    Keyword::LIMIT,
1313    Keyword::HAVING,
1314    Keyword::WHERE,
1315];
1316
1317/// Global list of reserved keywords that cannot be parsed as identifiers
1318/// without special handling like quoting. Parser should call `Dialect::is_reserved_for_identifier`
1319/// to allow for each dialect to customize the list.
1320pub const RESERVED_FOR_IDENTIFIER: &[Keyword] = &[
1321    Keyword::EXISTS,
1322    Keyword::INTERVAL,
1323    Keyword::STRUCT,
1324    Keyword::TRIM,
1325];