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