sqltk_parser/
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 sqltk_parser_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}
72
73// The following keywords should be sorted to be able to match using binary search
74define_keywords!(
75    ABORT,
76    ABS,
77    ABSOLUTE,
78    ACCESS,
79    ACTION,
80    ADD,
81    ADMIN,
82    AFTER,
83    AGAINST,
84    AGGREGATION,
85    ALIAS,
86    ALL,
87    ALLOCATE,
88    ALTER,
89    ALWAYS,
90    ANALYZE,
91    AND,
92    ANTI,
93    ANY,
94    APPLY,
95    ARCHIVE,
96    ARE,
97    ARRAY,
98    ARRAY_MAX_CARDINALITY,
99    AS,
100    ASC,
101    ASENSITIVE,
102    ASOF,
103    ASSERT,
104    ASYMMETRIC,
105    AT,
106    ATOMIC,
107    ATTACH,
108    AUTHORIZATION,
109    AUTO,
110    AUTOINCREMENT,
111    AUTO_INCREMENT,
112    AVG,
113    AVRO,
114    BACKWARD,
115    BASE64,
116    BEFORE,
117    BEGIN,
118    BEGIN_FRAME,
119    BEGIN_PARTITION,
120    BETWEEN,
121    BIGDECIMAL,
122    BIGINT,
123    BIGNUMERIC,
124    BINARY,
125    BINDING,
126    BLOB,
127    BLOOMFILTER,
128    BOOL,
129    BOOLEAN,
130    BOTH,
131    BROWSE,
132    BTREE,
133    BUCKETS,
134    BY,
135    BYPASSRLS,
136    BYTEA,
137    BYTES,
138    CACHE,
139    CALL,
140    CALLED,
141    CARDINALITY,
142    CASCADE,
143    CASCADED,
144    CASE,
145    CAST,
146    CATALOG,
147    CEIL,
148    CEILING,
149    CENTURY,
150    CHAIN,
151    CHANGE,
152    CHANGE_TRACKING,
153    CHANNEL,
154    CHAR,
155    CHARACTER,
156    CHARACTERS,
157    CHARACTER_LENGTH,
158    CHARSET,
159    CHAR_LENGTH,
160    CHECK,
161    CLEAR,
162    CLOB,
163    CLONE,
164    CLOSE,
165    CLUSTER,
166    CLUSTERED,
167    COALESCE,
168    COLLATE,
169    COLLATION,
170    COLLECT,
171    COLLECTION,
172    COLUMN,
173    COLUMNS,
174    COLUMNSTORE,
175    COMMENT,
176    COMMIT,
177    COMMITTED,
178    COMPRESSION,
179    COMPUTE,
180    CONCURRENTLY,
181    CONDITION,
182    CONFLICT,
183    CONNECT,
184    CONNECTION,
185    CONSTRAINT,
186    CONTAINS,
187    CONTINUE,
188    CONVERT,
189    COPY,
190    COPY_OPTIONS,
191    CORR,
192    CORRESPONDING,
193    COUNT,
194    COVAR_POP,
195    COVAR_SAMP,
196    CREATE,
197    CREATEDB,
198    CREATEROLE,
199    CREDENTIALS,
200    CROSS,
201    CSV,
202    CUBE,
203    CUME_DIST,
204    CURRENT,
205    CURRENT_CATALOG,
206    CURRENT_DATE,
207    CURRENT_DEFAULT_TRANSFORM_GROUP,
208    CURRENT_PATH,
209    CURRENT_ROLE,
210    CURRENT_ROW,
211    CURRENT_SCHEMA,
212    CURRENT_TIME,
213    CURRENT_TIMESTAMP,
214    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
215    CURRENT_USER,
216    CURSOR,
217    CYCLE,
218    DATA,
219    DATABASE,
220    DATABASES,
221    DATA_RETENTION_TIME_IN_DAYS,
222    DATE,
223    DATE32,
224    DATETIME,
225    DATETIME64,
226    DAY,
227    DAYOFWEEK,
228    DAYOFYEAR,
229    DEALLOCATE,
230    DEC,
231    DECADE,
232    DECIMAL,
233    DECLARE,
234    DEDUPLICATE,
235    DEFAULT,
236    DEFAULT_DDL_COLLATION,
237    DEFERRABLE,
238    DEFERRED,
239    DEFINE,
240    DEFINED,
241    DELAYED,
242    DELETE,
243    DELIMITED,
244    DELIMITER,
245    DELTA,
246    DENSE_RANK,
247    DEREF,
248    DESC,
249    DESCRIBE,
250    DETACH,
251    DETAIL,
252    DETERMINISTIC,
253    DIRECTORY,
254    DISABLE,
255    DISCARD,
256    DISCONNECT,
257    DISTINCT,
258    DISTRIBUTE,
259    DIV,
260    DO,
261    DOUBLE,
262    DOW,
263    DOY,
264    DROP,
265    DRY,
266    DUPLICATE,
267    DYNAMIC,
268    EACH,
269    ELEMENT,
270    ELEMENTS,
271    ELSE,
272    EMPTY,
273    ENABLE,
274    ENABLE_SCHEMA_EVOLUTION,
275    ENCODING,
276    ENCRYPTION,
277    END,
278    END_EXEC = "END-EXEC",
279    ENDPOINT,
280    END_FRAME,
281    END_PARTITION,
282    ENFORCED,
283    ENGINE,
284    ENUM,
285    EPHEMERAL,
286    EPOCH,
287    EQUALS,
288    ERROR,
289    ESCAPE,
290    ESCAPED,
291    EVENT,
292    EVERY,
293    EXCEPT,
294    EXCEPTION,
295    EXCLUDE,
296    EXCLUSIVE,
297    EXEC,
298    EXECUTE,
299    EXISTS,
300    EXP,
301    EXPANSION,
302    EXPLAIN,
303    EXPLICIT,
304    EXPORT,
305    EXTENDED,
306    EXTENSION,
307    EXTERNAL,
308    EXTRACT,
309    FAIL,
310    FALSE,
311    FETCH,
312    FIELDS,
313    FILE,
314    FILES,
315    FILE_FORMAT,
316    FILL,
317    FILTER,
318    FINAL,
319    FIRST,
320    FIRST_VALUE,
321    FIXEDSTRING,
322    FLOAT,
323    FLOAT32,
324    FLOAT4,
325    FLOAT64,
326    FLOAT8,
327    FLOOR,
328    FLUSH,
329    FOLLOWING,
330    FOR,
331    FORCE,
332    FORCE_NOT_NULL,
333    FORCE_NULL,
334    FORCE_QUOTE,
335    FOREIGN,
336    FORMAT,
337    FORMATTED,
338    FORWARD,
339    FRAME_ROW,
340    FREE,
341    FREEZE,
342    FROM,
343    FSCK,
344    FULL,
345    FULLTEXT,
346    FUNCTION,
347    FUNCTIONS,
348    FUSION,
349    GENERAL,
350    GENERATE,
351    GENERATED,
352    GEOGRAPHY,
353    GET,
354    GLOBAL,
355    GRANT,
356    GRANTED,
357    GRANTS,
358    GRAPHVIZ,
359    GROUP,
360    GROUPING,
361    GROUPS,
362    HASH,
363    HAVING,
364    HEADER,
365    HEAP,
366    HIGH_PRIORITY,
367    HISTORY,
368    HIVEVAR,
369    HOLD,
370    HOSTS,
371    HOUR,
372    HOURS,
373    ID,
374    IDENTITY,
375    IF,
376    IGNORE,
377    ILIKE,
378    IMMEDIATE,
379    IMMUTABLE,
380    IN,
381    INCLUDE,
382    INCLUDE_NULL_VALUES,
383    INCREMENT,
384    INDEX,
385    INDICATOR,
386    INHERIT,
387    INITIALLY,
388    INNER,
389    INOUT,
390    INPUT,
391    INPUTFORMAT,
392    INSENSITIVE,
393    INSERT,
394    INSTALL,
395    INSTEAD,
396    INT,
397    INT128,
398    INT16,
399    INT2,
400    INT256,
401    INT32,
402    INT4,
403    INT64,
404    INT8,
405    INTEGER,
406    INTERPOLATE,
407    INTERSECT,
408    INTERSECTION,
409    INTERVAL,
410    INTO,
411    IS,
412    ISODOW,
413    ISOLATION,
414    ISOWEEK,
415    ISOYEAR,
416    ITEMS,
417    JAR,
418    JOIN,
419    JSON,
420    JSONB,
421    JSONFILE,
422    JSON_TABLE,
423    JULIAN,
424    KEY,
425    KEYS,
426    KILL,
427    LAG,
428    LANGUAGE,
429    LARGE,
430    LAST,
431    LAST_VALUE,
432    LATERAL,
433    LEAD,
434    LEADING,
435    LEFT,
436    LEVEL,
437    LIKE,
438    LIKE_REGEX,
439    LIMIT,
440    LINES,
441    LISTEN,
442    LN,
443    LOAD,
444    LOCAL,
445    LOCALTIME,
446    LOCALTIMESTAMP,
447    LOCATION,
448    LOCK,
449    LOCKED,
450    LOGIN,
451    LOGS,
452    LOWCARDINALITY,
453    LOWER,
454    LOW_PRIORITY,
455    MACRO,
456    MANAGEDLOCATION,
457    MAP,
458    MASKING,
459    MATCH,
460    MATCHED,
461    MATCHES,
462    MATCH_CONDITION,
463    MATCH_RECOGNIZE,
464    MATERIALIZE,
465    MATERIALIZED,
466    MAX,
467    MAXVALUE,
468    MAX_DATA_EXTENSION_TIME_IN_DAYS,
469    MEASURES,
470    MEDIUMINT,
471    MEMBER,
472    MERGE,
473    METADATA,
474    METHOD,
475    MICROSECOND,
476    MICROSECONDS,
477    MILLENIUM,
478    MILLENNIUM,
479    MILLISECOND,
480    MILLISECONDS,
481    MIN,
482    MINUTE,
483    MINVALUE,
484    MOD,
485    MODE,
486    MODIFIES,
487    MODIFY,
488    MODULE,
489    MONTH,
490    MSCK,
491    MULTISET,
492    MUTATION,
493    NAME,
494    NANOSECOND,
495    NANOSECONDS,
496    NATIONAL,
497    NATURAL,
498    NCHAR,
499    NCLOB,
500    NESTED,
501    NEW,
502    NEXT,
503    NO,
504    NOBYPASSRLS,
505    NOCREATEDB,
506    NOCREATEROLE,
507    NOINHERIT,
508    NOLOGIN,
509    NONE,
510    NOORDER,
511    NOREPLICATION,
512    NORMALIZE,
513    NOSCAN,
514    NOSUPERUSER,
515    NOT,
516    NOTHING,
517    NOTIFY,
518    NOWAIT,
519    NO_WRITE_TO_BINLOG,
520    NTH_VALUE,
521    NTILE,
522    NULL,
523    NULLABLE,
524    NULLIF,
525    NULLS,
526    NUMERIC,
527    NVARCHAR,
528    OBJECT,
529    OCCURRENCES_REGEX,
530    OCTETS,
531    OCTET_LENGTH,
532    OF,
533    OFFSET,
534    OLD,
535    OMIT,
536    ON,
537    ONE,
538    ONLY,
539    OPEN,
540    OPERATOR,
541    OPTIMIZE,
542    OPTIMIZER_COSTS,
543    OPTION,
544    OPTIONS,
545    OR,
546    ORC,
547    ORDER,
548    ORDINALITY,
549    OUT,
550    OUTER,
551    OUTPUTFORMAT,
552    OVER,
553    OVERFLOW,
554    OVERLAPS,
555    OVERLAY,
556    OVERWRITE,
557    OWNED,
558    OWNER,
559    PARALLEL,
560    PARAMETER,
561    PARQUET,
562    PART,
563    PARTITION,
564    PARTITIONED,
565    PARTITIONS,
566    PASSWORD,
567    PAST,
568    PATH,
569    PATTERN,
570    PER,
571    PERCENT,
572    PERCENTILE_CONT,
573    PERCENTILE_DISC,
574    PERCENT_RANK,
575    PERIOD,
576    PERMISSIVE,
577    PERSISTENT,
578    PIVOT,
579    PLACING,
580    PLAN,
581    PLANS,
582    POLICY,
583    PORTION,
584    POSITION,
585    POSITION_REGEX,
586    POWER,
587    PRAGMA,
588    PRECEDES,
589    PRECEDING,
590    PRECISION,
591    PREPARE,
592    PRESERVE,
593    PREWHERE,
594    PRIMARY,
595    PRIOR,
596    PRIVILEGES,
597    PROCEDURE,
598    PROGRAM,
599    PROJECTION,
600    PURGE,
601    QUALIFY,
602    QUARTER,
603    QUERY,
604    QUOTE,
605    RANGE,
606    RANK,
607    RAW,
608    RCFILE,
609    READ,
610    READS,
611    READ_ONLY,
612    REAL,
613    RECURSIVE,
614    REF,
615    REFERENCES,
616    REFERENCING,
617    REGCLASS,
618    REGEXP,
619    REGR_AVGX,
620    REGR_AVGY,
621    REGR_COUNT,
622    REGR_INTERCEPT,
623    REGR_R2,
624    REGR_SLOPE,
625    REGR_SXX,
626    REGR_SXY,
627    REGR_SYY,
628    RELATIVE,
629    RELAY,
630    RELEASE,
631    REMOTE,
632    RENAME,
633    REORG,
634    REPAIR,
635    REPEATABLE,
636    REPLACE,
637    REPLICA,
638    REPLICATION,
639    RESET,
640    RESPECT,
641    RESTART,
642    RESTRICT,
643    RESTRICTED,
644    RESTRICTIVE,
645    RESULT,
646    RESULTSET,
647    RETAIN,
648    RETURN,
649    RETURNING,
650    RETURNS,
651    REVOKE,
652    RIGHT,
653    RLIKE,
654    ROLE,
655    ROLLBACK,
656    ROLLUP,
657    ROOT,
658    ROW,
659    ROWID,
660    ROWS,
661    ROW_NUMBER,
662    RULE,
663    RUN,
664    SAFE,
665    SAFE_CAST,
666    SAVEPOINT,
667    SCHEMA,
668    SCHEMAS,
669    SCOPE,
670    SCROLL,
671    SEARCH,
672    SECOND,
673    SECRET,
674    SECURITY,
675    SELECT,
676    SEMI,
677    SENSITIVE,
678    SEPARATOR,
679    SEQUENCE,
680    SEQUENCEFILE,
681    SEQUENCES,
682    SERDE,
683    SERDEPROPERTIES,
684    SERIALIZABLE,
685    SESSION,
686    SESSION_USER,
687    SET,
688    SETS,
689    SETTINGS,
690    SHARE,
691    SHOW,
692    SIMILAR,
693    SKIP,
694    SLOW,
695    SMALLINT,
696    SNAPSHOT,
697    SOME,
698    SORT,
699    SORTED,
700    SOURCE,
701    SPATIAL,
702    SPECIFIC,
703    SPECIFICTYPE,
704    SQL,
705    SQLEXCEPTION,
706    SQLSTATE,
707    SQLWARNING,
708    SQRT,
709    STABLE,
710    STAGE,
711    START,
712    STATEMENT,
713    STATIC,
714    STATISTICS,
715    STATUS,
716    STDDEV_POP,
717    STDDEV_SAMP,
718    STDIN,
719    STDOUT,
720    STEP,
721    STORAGE_INTEGRATION,
722    STORED,
723    STRICT,
724    STRING,
725    STRUCT,
726    SUBMULTISET,
727    SUBSTRING,
728    SUBSTRING_REGEX,
729    SUCCEEDS,
730    SUM,
731    SUPER,
732    SUPERUSER,
733    SWAP,
734    SYMMETRIC,
735    SYNC,
736    SYSTEM,
737    SYSTEM_TIME,
738    SYSTEM_USER,
739    TABLE,
740    TABLES,
741    TABLESAMPLE,
742    TAG,
743    TARGET,
744    TBLPROPERTIES,
745    TEMP,
746    TEMPORARY,
747    TERMINATED,
748    TEXT,
749    TEXTFILE,
750    THEN,
751    TIES,
752    TIME,
753    TIMESTAMP,
754    TIMESTAMPTZ,
755    TIMETZ,
756    TIMEZONE,
757    TIMEZONE_ABBR,
758    TIMEZONE_HOUR,
759    TIMEZONE_MINUTE,
760    TIMEZONE_REGION,
761    TINYINT,
762    TO,
763    TOP,
764    TOTALS,
765    TRAILING,
766    TRANSACTION,
767    TRANSIENT,
768    TRANSLATE,
769    TRANSLATE_REGEX,
770    TRANSLATION,
771    TREAT,
772    TRIGGER,
773    TRIM,
774    TRIM_ARRAY,
775    TRUE,
776    TRUNCATE,
777    TRY_CAST,
778    TRY_CONVERT,
779    TUPLE,
780    TYPE,
781    UESCAPE,
782    UINT128,
783    UINT16,
784    UINT256,
785    UINT32,
786    UINT64,
787    UINT8,
788    UNBOUNDED,
789    UNCACHE,
790    UNCOMMITTED,
791    UNFREEZE,
792    UNION,
793    UNIQUE,
794    UNKNOWN,
795    UNLOAD,
796    UNLOCK,
797    UNLOGGED,
798    UNMATCHED,
799    UNNEST,
800    UNPIVOT,
801    UNSAFE,
802    UNSIGNED,
803    UNTIL,
804    UPDATE,
805    UPPER,
806    URL,
807    USAGE,
808    USE,
809    USER,
810    USER_RESOURCES,
811    USING,
812    UUID,
813    VACUUM,
814    VALID,
815    VALIDATION_MODE,
816    VALUE,
817    VALUES,
818    VALUE_OF,
819    VARBINARY,
820    VARCHAR,
821    VARIABLES,
822    VARYING,
823    VAR_POP,
824    VAR_SAMP,
825    VERBOSE,
826    VERSION,
827    VERSIONING,
828    VIEW,
829    VIEWS,
830    VIRTUAL,
831    VOLATILE,
832    WAREHOUSE,
833    WEEK,
834    WHEN,
835    WHENEVER,
836    WHERE,
837    WIDTH_BUCKET,
838    WINDOW,
839    WITH,
840    WITHIN,
841    WITHOUT,
842    WITHOUT_ARRAY_WRAPPER,
843    WORK,
844    WRITE,
845    XML,
846    XOR,
847    YEAR,
848    ZONE,
849    ZORDER
850);
851
852/// These keywords can't be used as a table alias, so that `FROM table_name alias`
853/// can be parsed unambiguously without looking ahead.
854pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
855    // Reserved as both a table and a column alias:
856    Keyword::WITH,
857    Keyword::EXPLAIN,
858    Keyword::ANALYZE,
859    Keyword::SELECT,
860    Keyword::WHERE,
861    Keyword::GROUP,
862    Keyword::SORT,
863    Keyword::HAVING,
864    Keyword::ORDER,
865    Keyword::PIVOT,
866    Keyword::UNPIVOT,
867    Keyword::TOP,
868    Keyword::LATERAL,
869    Keyword::VIEW,
870    Keyword::LIMIT,
871    Keyword::OFFSET,
872    Keyword::FETCH,
873    Keyword::UNION,
874    Keyword::EXCEPT,
875    Keyword::INTERSECT,
876    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
877    Keyword::ON,
878    Keyword::JOIN,
879    Keyword::INNER,
880    Keyword::CROSS,
881    Keyword::FULL,
882    Keyword::LEFT,
883    Keyword::RIGHT,
884    Keyword::NATURAL,
885    Keyword::USING,
886    Keyword::CLUSTER,
887    Keyword::DISTRIBUTE,
888    Keyword::GLOBAL,
889    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
890    Keyword::OUTER,
891    Keyword::SET,
892    Keyword::QUALIFY,
893    Keyword::WINDOW,
894    Keyword::END,
895    Keyword::FOR,
896    // for MYSQL PARTITION SELECTION
897    Keyword::PARTITION,
898    // for Clickhouse PREWHERE
899    Keyword::PREWHERE,
900    // for ClickHouse SELECT * FROM t SETTINGS ...
901    Keyword::SETTINGS,
902    // for ClickHouse SELECT * FROM t FORMAT...
903    Keyword::FORMAT,
904    // for Snowflake START WITH .. CONNECT BY
905    Keyword::START,
906    Keyword::CONNECT,
907    // Reserved for snowflake MATCH_RECOGNIZE
908    Keyword::MATCH_RECOGNIZE,
909];
910
911/// Can't be used as a column alias, so that `SELECT <expr> alias`
912/// can be parsed unambiguously without looking ahead.
913pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
914    // Reserved as both a table and a column alias:
915    Keyword::WITH,
916    Keyword::EXPLAIN,
917    Keyword::ANALYZE,
918    Keyword::SELECT,
919    Keyword::WHERE,
920    Keyword::GROUP,
921    Keyword::SORT,
922    Keyword::HAVING,
923    Keyword::ORDER,
924    Keyword::TOP,
925    Keyword::LATERAL,
926    Keyword::VIEW,
927    Keyword::LIMIT,
928    Keyword::OFFSET,
929    Keyword::FETCH,
930    Keyword::UNION,
931    Keyword::EXCEPT,
932    Keyword::INTERSECT,
933    Keyword::CLUSTER,
934    Keyword::DISTRIBUTE,
935    Keyword::RETURNING,
936    // Reserved only as a column alias in the `SELECT` clause
937    Keyword::FROM,
938    Keyword::INTO,
939    Keyword::END,
940];