sqlparser/
keywords.rs

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