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