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    AUTOINCREMENT,
101    AUTO_INCREMENT,
102    AVG,
103    AVRO,
104    BACKWARD,
105    BEGIN,
106    BEGIN_FRAME,
107    BEGIN_PARTITION,
108    BETWEEN,
109    BIGDECIMAL,
110    BIGINT,
111    BIGNUMERIC,
112    BINARY,
113    BINDING,
114    BLOB,
115    BLOOMFILTER,
116    BOOL,
117    BOOLEAN,
118    BOTH,
119    BTREE,
120    BY,
121    BYPASSRLS,
122    BYTEA,
123    BYTES,
124    CACHE,
125    CALL,
126    CALLED,
127    CARDINALITY,
128    CASCADE,
129    CASCADED,
130    CASE,
131    CAST,
132    CEIL,
133    CEILING,
134    CENTURY,
135    CHAIN,
136    CHANGE,
137    CHAR,
138    CHARACTER,
139    CHARACTERS,
140    CHARACTER_LENGTH,
141    CHARSET,
142    CHAR_LENGTH,
143    CHECK,
144    CLOB,
145    CLONE,
146    CLOSE,
147    CLUSTER,
148    COALESCE,
149    COLLATE,
150    COLLATION,
151    COLLECT,
152    COLUMN,
153    COLUMNS,
154    COMMENT,
155    COMMIT,
156    COMMITTED,
157    COMPRESSION,
158    COMPUTE,
159    CONCURRENTLY,
160    CONDITION,
161    CONFLICT,
162    CONNECT,
163    CONNECTION,
164    CONSTRAINT,
165    CONTAINS,
166    CONVERT,
167    COPY,
168    COPY_OPTIONS,
169    CORR,
170    CORRESPONDING,
171    COUNT,
172    COVAR_POP,
173    COVAR_SAMP,
174    CREATE,
175    CREATEDB,
176    CREATEROLE,
177    CREDENTIALS,
178    CROSS,
179    CSV,
180    CUBE,
181    CUME_DIST,
182    CURRENT,
183    CURRENT_CATALOG,
184    CURRENT_DATE,
185    CURRENT_DEFAULT_TRANSFORM_GROUP,
186    CURRENT_PATH,
187    CURRENT_ROLE,
188    CURRENT_ROW,
189    CURRENT_SCHEMA,
190    CURRENT_TIME,
191    CURRENT_TIMESTAMP,
192    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
193    CURRENT_USER,
194    CURSOR,
195    CYCLE,
196    DATA,
197    DATABASE,
198    DATE,
199    DATETIME,
200    DAY,
201    DAYOFWEEK,
202    DAYOFYEAR,
203    DEALLOCATE,
204    DEC,
205    DECADE,
206    DECIMAL,
207    DECLARE,
208    DEFAULT,
209    DELETE,
210    DELIMITED,
211    DELIMITER,
212    DELTA,
213    DENSE_RANK,
214    DEREF,
215    DESC,
216    DESCRIBE,
217    DETAIL,
218    DETERMINISTIC,
219    DIRECTORY,
220    DISCARD,
221    DISCONNECT,
222    DISTINCT,
223    DISTRIBUTE,
224    DIV,
225    DO,
226    DOUBLE,
227    DOW,
228    DOY,
229    DROP,
230    DRY,
231    DUPLICATE,
232    DYNAMIC,
233    EACH,
234    ELEMENT,
235    ELSE,
236    ENCODING,
237    ENCRYPTION,
238    END,
239    END_EXEC = "END-EXEC",
240    ENDPOINT,
241    END_FRAME,
242    END_PARTITION,
243    ENGINE,
244    ENUM,
245    EPOCH,
246    EQUALS,
247    ERROR,
248    ESCAPE,
249    EVENT,
250    EVERY,
251    EXCEPT,
252    EXCLUDE,
253    EXEC,
254    EXECUTE,
255    EXISTS,
256    EXP,
257    EXPANSION,
258    EXPLAIN,
259    EXTENDED,
260    EXTERNAL,
261    EXTRACT,
262    FAIL,
263    FALSE,
264    FETCH,
265    FIELDS,
266    FILE,
267    FILES,
268    FILE_FORMAT,
269    FILTER,
270    FIRST,
271    FIRST_VALUE,
272    FLOAT,
273    FLOAT4,
274    FLOAT64,
275    FLOAT8,
276    FLOOR,
277    FOLLOWING,
278    FOR,
279    FORCE,
280    FORCE_NOT_NULL,
281    FORCE_NULL,
282    FORCE_QUOTE,
283    FOREIGN,
284    FORMAT,
285    FORWARD,
286    FRAME_ROW,
287    FREE,
288    FREEZE,
289    FROM,
290    FSCK,
291    FULL,
292    FULLTEXT,
293    FUNCTION,
294    FUNCTIONS,
295    FUSION,
296    GENERATE,
297    GENERATED,
298    GEOGRAPHY,
299    GET,
300    GLOBAL,
301    GRANT,
302    GRANTED,
303    GRAPHVIZ,
304    GROUP,
305    GROUPING,
306    GROUPS,
307    HASH,
308    HAVING,
309    HEADER,
310    HISTORY,
311    HIVEVAR,
312    HOLD,
313    HOUR,
314    HOURS,
315    IDENTITY,
316    IF,
317    IGNORE,
318    ILIKE,
319    IMMUTABLE,
320    IN,
321    INCLUDE,
322    INCREMENT,
323    INDEX,
324    INDICATOR,
325    INHERIT,
326    INNER,
327    INOUT,
328    INPUTFORMAT,
329    INSENSITIVE,
330    INSERT,
331    INT,
332    INT2,
333    INT4,
334    INT64,
335    INT8,
336    INTEGER,
337    INTERSECT,
338    INTERSECTION,
339    INTERVAL,
340    INTO,
341    IS,
342    ISODOW,
343    ISOLATION,
344    ISOWEEK,
345    ISOYEAR,
346    JAR,
347    JOIN,
348    JSON,
349    JSONFILE,
350    JULIAN,
351    KEY,
352    KILL,
353    LAG,
354    LANGUAGE,
355    LARGE,
356    LAST,
357    LAST_VALUE,
358    LATERAL,
359    LEAD,
360    LEADING,
361    LEFT,
362    LEVEL,
363    LIKE,
364    LIKE_REGEX,
365    LIMIT,
366    LISTAGG,
367    LN,
368    LOCAL,
369    LOCALTIME,
370    LOCALTIMESTAMP,
371    LOCATION,
372    LOCKED,
373    LOGIN,
374    LOWER,
375    MACRO,
376    MANAGEDLOCATION,
377    MATCH,
378    MATCHED,
379    MATERIALIZED,
380    MAX,
381    MAXVALUE,
382    MEDIUMINT,
383    MEMBER,
384    MERGE,
385    METADATA,
386    METHOD,
387    MICROSECOND,
388    MICROSECONDS,
389    MILLENIUM,
390    MILLENNIUM,
391    MILLISECOND,
392    MILLISECONDS,
393    MIN,
394    MINUTE,
395    MINVALUE,
396    MOD,
397    MODE,
398    MODIFIES,
399    MODULE,
400    MONTH,
401    MSCK,
402    MULTISET,
403    MUTATION,
404    NAME,
405    NANOSECOND,
406    NANOSECONDS,
407    NATIONAL,
408    NATURAL,
409    NCHAR,
410    NCLOB,
411    NEW,
412    NEXT,
413    NO,
414    NOBYPASSRLS,
415    NOCREATEDB,
416    NOCREATEROLE,
417    NOINHERIT,
418    NOLOGIN,
419    NONE,
420    NOREPLICATION,
421    NORMALIZE,
422    NOSCAN,
423    NOSUPERUSER,
424    NOT,
425    NOTHING,
426    NOWAIT,
427    NTH_VALUE,
428    NTILE,
429    NULL,
430    NULLIF,
431    NULLS,
432    NUMERIC,
433    NVARCHAR,
434    OBJECT,
435    OCCURRENCES_REGEX,
436    OCTETS,
437    OCTET_LENGTH,
438    OF,
439    OFFSET,
440    OLD,
441    ON,
442    ONLY,
443    OPEN,
444    OPERATOR,
445    OPTIMIZE,
446    OPTION,
447    OPTIONS,
448    OR,
449    ORC,
450    ORDER,
451    OUT,
452    OUTER,
453    OUTPUTFORMAT,
454    OVER,
455    OVERFLOW,
456    OVERLAPS,
457    OVERLAY,
458    OVERWRITE,
459    OWNED,
460    PARAMETER,
461    PARQUET,
462    PARTITION,
463    PARTITIONED,
464    PARTITIONS,
465    PASSWORD,
466    PATTERN,
467    PERCENT,
468    PERCENTILE_CONT,
469    PERCENTILE_DISC,
470    PERCENT_RANK,
471    PERIOD,
472    PIVOT,
473    PLACING,
474    PLANS,
475    PORTION,
476    POSITION,
477    POSITION_REGEX,
478    POWER,
479    PRAGMA,
480    PRECEDES,
481    PRECEDING,
482    PRECISION,
483    PREPARE,
484    PRESERVE,
485    PRIMARY,
486    PRIOR,
487    PRIVILEGES,
488    PROCEDURE,
489    PROGRAM,
490    PURGE,
491    QUALIFY,
492    QUARTER,
493    QUERY,
494    QUOTE,
495    RANGE,
496    RANK,
497    RCFILE,
498    READ,
499    READS,
500    REAL,
501    RECURSIVE,
502    REF,
503    REFERENCES,
504    REFERENCING,
505    REGCLASS,
506    REGEXP,
507    REGR_AVGX,
508    REGR_AVGY,
509    REGR_COUNT,
510    REGR_INTERCEPT,
511    REGR_R2,
512    REGR_SLOPE,
513    REGR_SXX,
514    REGR_SXY,
515    REGR_SYY,
516    RELATIVE,
517    RELEASE,
518    RENAME,
519    REORG,
520    REPAIR,
521    REPEATABLE,
522    REPLACE,
523    REPLICATION,
524    RESET,
525    RESPECT,
526    RESTRICT,
527    RESULT,
528    RETAIN,
529    RETURN,
530    RETURNING,
531    RETURNS,
532    REVOKE,
533    RIGHT,
534    RLIKE,
535    ROLE,
536    ROLLBACK,
537    ROLLUP,
538    ROW,
539    ROWID,
540    ROWS,
541    ROW_NUMBER,
542    RUN,
543    SAFE_CAST,
544    SAVEPOINT,
545    SCHEMA,
546    SCOPE,
547    SCROLL,
548    SEARCH,
549    SECOND,
550    SELECT,
551    SEMI,
552    SENSITIVE,
553    SEQUENCE,
554    SEQUENCEFILE,
555    SEQUENCES,
556    SERDE,
557    SERIALIZABLE,
558    SESSION,
559    SESSION_USER,
560    SET,
561    SETS,
562    SHARE,
563    SHOW,
564    SIMILAR,
565    SKIP,
566    SMALLINT,
567    SNAPSHOT,
568    SOME,
569    SORT,
570    SPATIAL,
571    SPECIFIC,
572    SPECIFICTYPE,
573    SQL,
574    SQLEXCEPTION,
575    SQLSTATE,
576    SQLWARNING,
577    SQRT,
578    STABLE,
579    STAGE,
580    START,
581    STATIC,
582    STATISTICS,
583    STDDEV_POP,
584    STDDEV_SAMP,
585    STDIN,
586    STDOUT,
587    STORAGE_INTEGRATION,
588    STORED,
589    STRICT,
590    STRING,
591    STRUCT,
592    SUBMULTISET,
593    SUBSTRING,
594    SUBSTRING_REGEX,
595    SUCCEEDS,
596    SUM,
597    SUPER,
598    SUPERUSER,
599    SWAP,
600    SYMMETRIC,
601    SYNC,
602    SYSTEM,
603    SYSTEM_TIME,
604    SYSTEM_USER,
605    TABLE,
606    TABLES,
607    TABLESAMPLE,
608    TBLPROPERTIES,
609    TEMP,
610    TEMPORARY,
611    TEXT,
612    TEXTFILE,
613    THEN,
614    TIES,
615    TIME,
616    TIMESTAMP,
617    TIMESTAMPTZ,
618    TIMETZ,
619    TIMEZONE,
620    TIMEZONE_HOUR,
621    TIMEZONE_MINUTE,
622    TINYINT,
623    TO,
624    TOP,
625    TRAILING,
626    TRANSACTION,
627    TRANSIENT,
628    TRANSLATE,
629    TRANSLATE_REGEX,
630    TRANSLATION,
631    TREAT,
632    TRIGGER,
633    TRIM,
634    TRIM_ARRAY,
635    TRUE,
636    TRUNCATE,
637    TRY_CAST,
638    TYPE,
639    UESCAPE,
640    UNBOUNDED,
641    UNCACHE,
642    UNCOMMITTED,
643    UNION,
644    UNIQUE,
645    UNKNOWN,
646    UNLOGGED,
647    UNNEST,
648    UNPIVOT,
649    UNSIGNED,
650    UNTIL,
651    UPDATE,
652    UPPER,
653    URL,
654    USAGE,
655    USE,
656    USER,
657    USING,
658    UUID,
659    VACUUM,
660    VALID,
661    VALIDATION_MODE,
662    VALUE,
663    VALUES,
664    VALUE_OF,
665    VARBINARY,
666    VARCHAR,
667    VARIABLES,
668    VARYING,
669    VAR_POP,
670    VAR_SAMP,
671    VERBOSE,
672    VERSIONING,
673    VIEW,
674    VIRTUAL,
675    VOLATILE,
676    WEEK,
677    WHEN,
678    WHENEVER,
679    WHERE,
680    WIDTH_BUCKET,
681    WINDOW,
682    WITH,
683    WITHIN,
684    WITHOUT,
685    WORK,
686    WRITE,
687    XOR,
688    YEAR,
689    ZONE,
690    ZORDER
691);
692
693/// These keywords can't be used as a table alias, so that `FROM table_name alias`
694/// can be parsed unambiguously without looking ahead.
695pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
696    // Reserved as both a table and a column alias:
697    Keyword::WITH,
698    Keyword::EXPLAIN,
699    Keyword::ANALYZE,
700    Keyword::SELECT,
701    Keyword::WHERE,
702    Keyword::GROUP,
703    Keyword::SORT,
704    Keyword::HAVING,
705    Keyword::ORDER,
706    Keyword::PIVOT,
707    Keyword::UNPIVOT,
708    Keyword::TOP,
709    Keyword::LATERAL,
710    Keyword::VIEW,
711    Keyword::LIMIT,
712    Keyword::OFFSET,
713    Keyword::FETCH,
714    Keyword::UNION,
715    Keyword::EXCEPT,
716    Keyword::INTERSECT,
717    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
718    Keyword::ON,
719    Keyword::JOIN,
720    Keyword::INNER,
721    Keyword::CROSS,
722    Keyword::FULL,
723    Keyword::LEFT,
724    Keyword::RIGHT,
725    Keyword::NATURAL,
726    Keyword::USING,
727    Keyword::CLUSTER,
728    Keyword::DISTRIBUTE,
729    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
730    Keyword::OUTER,
731    Keyword::SET,
732    Keyword::QUALIFY,
733    Keyword::WINDOW,
734    Keyword::END,
735    // for MYSQL PARTITION SELECTION
736    Keyword::PARTITION,
737];
738
739/// Can't be used as a column alias, so that `SELECT <expr> alias`
740/// can be parsed unambiguously without looking ahead.
741pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
742    // Reserved as both a table and a column alias:
743    Keyword::WITH,
744    Keyword::EXPLAIN,
745    Keyword::ANALYZE,
746    Keyword::SELECT,
747    Keyword::WHERE,
748    Keyword::GROUP,
749    Keyword::SORT,
750    Keyword::HAVING,
751    Keyword::ORDER,
752    Keyword::TOP,
753    Keyword::LATERAL,
754    Keyword::VIEW,
755    Keyword::LIMIT,
756    Keyword::OFFSET,
757    Keyword::FETCH,
758    Keyword::UNION,
759    Keyword::EXCEPT,
760    Keyword::INTERSECT,
761    Keyword::CLUSTER,
762    Keyword::DISTRIBUTE,
763    // Reserved only as a column alias in the `SELECT` clause
764    Keyword::FROM,
765    Keyword::INTO,
766    Keyword::END,
767];