models_parser/dialect/
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 that
15/// can appear in [Word::keyword]:
16///    pub const KEYWORD = "KEYWORD"
17/// 2) an `ALL_KEYWORDS` array with every keyword in it
18///     This is not a list of *reserved* keywords: some of these can be
19///     parsed as identifiers if the parser decides so. This means that
20///     new keywords can be added here without affecting the parse result.
21///
22///     As a matter of fact, most of these keywords are not used at all
23///     and could be removed.
24/// 3) a `RESERVED_FOR_TABLE_ALIAS` array with keywords reserved in a
25/// "table alias" context.
26#[cfg(feature = "serde")]
27use serde::{Deserialize, Serialize};
28
29/// Defines a string constant for a single keyword: `kw_def!(SELECT);`
30/// expands to `pub const SELECT = "SELECT";`
31macro_rules! kw_def {
32    ($ident:ident = $string_keyword:expr) => {
33        pub const $ident: &'static str = $string_keyword;
34    };
35    ($ident:ident) => {
36        kw_def!($ident = stringify!($ident));
37    };
38}
39
40/// Expands to a list of `kw_def!()` invocations for each keyword
41/// and defines an ALL_KEYWORDS array of the defined constants.
42macro_rules! define_keywords {
43    ($(
44        $ident:ident $(= $string_keyword:expr)?
45    ),*) => {
46        #[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Hash)]
47        #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
48        #[allow(non_camel_case_types)]
49        pub enum Keyword {
50            NoKeyword,
51            $($ident),*
52        }
53
54        pub const ALL_KEYWORDS_INDEX: &[Keyword] = &[
55            $(Keyword::$ident),*
56        ];
57
58        $(kw_def!($ident $(= $string_keyword)?);)*
59        pub const ALL_KEYWORDS: &[&str] = &[
60            $($ident),*
61        ];
62
63    };
64
65}
66
67// The following keywords should be sorted to be able to match using binary search
68define_keywords!(
69    ABORT,
70    ABS,
71    ACTION,
72    ADD,
73    ALL,
74    ALLOCATE,
75    ALTER,
76    ANALYZE,
77    AND,
78    ANY,
79    APPLY,
80    ARE,
81    ARRAY,
82    ARRAY_AGG,
83    ARRAY_MAX_CARDINALITY,
84    AS,
85    ASC,
86    ASENSITIVE,
87    ASSERT,
88    ASYMMETRIC,
89    AT,
90    ATOMIC,
91    AUTHORIZATION,
92    AUTOINCREMENT,
93    AUTO_INCREMENT,
94    AVG,
95    AVRO,
96    BEGIN,
97    BEGIN_FRAME,
98    BEGIN_PARTITION,
99    BETWEEN,
100    BIGINT,
101    BINARY,
102    BLOB,
103    BOOLEAN,
104    BOTH,
105    BY,
106    BYTEA,
107    CACHE,
108    CALL,
109    CALLED,
110    CARDINALITY,
111    CASCADE,
112    CASCADED,
113    CASE,
114    CAST,
115    CEIL,
116    CEILING,
117    CHAIN,
118    CHAR,
119    CHARACTER,
120    CHARACTER_LENGTH,
121    CHAR_LENGTH,
122    CHECK,
123    CLOB,
124    CLOSE,
125    CLUSTER,
126    COALESCE,
127    COLLATE,
128    COLLECT,
129    COLUMN,
130    COLUMNS,
131    COMMIT,
132    COMMITTED,
133    COMPUTE,
134    CONDITION,
135    CONNECT,
136    CONSTRAINT,
137    CONTAINS,
138    CONVERT,
139    COPY,
140    CORR,
141    CORRESPONDING,
142    COUNT,
143    COVAR_POP,
144    COVAR_SAMP,
145    CREATE,
146    CROSS,
147    CSV,
148    CUBE,
149    CUME_DIST,
150    CURRENT,
151    CURRENT_CATALOG,
152    CURRENT_DATE,
153    CURRENT_DEFAULT_TRANSFORM_GROUP,
154    CURRENT_PATH,
155    CURRENT_ROLE,
156    CURRENT_ROW,
157    CURRENT_SCHEMA,
158    CURRENT_TIME,
159    CURRENT_TIMESTAMP,
160    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
161    CURRENT_USER,
162    CURSOR,
163    CYCLE,
164    DATABASE,
165    DATE,
166    DAY,
167    DEALLOCATE,
168    DEC,
169    DECIMAL,
170    DECLARE,
171    DEFAULT,
172    DELETE,
173    DELIMITED,
174    DENSE_RANK,
175    DEREF,
176    DESC,
177    DESCRIBE,
178    DETERMINISTIC,
179    DIRECTORY,
180    DISCONNECT,
181    DISTINCT,
182    DISTRIBUTE,
183    DOUBLE,
184    DROP,
185    DYNAMIC,
186    EACH,
187    ELEMENT,
188    ELSE,
189    END,
190    END_EXEC = "END-EXEC",
191    END_FRAME,
192    END_PARTITION,
193    EQUALS,
194    ERROR,
195    ESCAPE,
196    EVENT,
197    EVERY,
198    EXCEPT,
199    EXEC,
200    EXECUTE,
201    EXISTS,
202    EXP,
203    EXPLAIN,
204    EXTENDED,
205    EXTERNAL,
206    EXTRACT,
207    FAIL,
208    FALSE,
209    FETCH,
210    FIELDS,
211    FILTER,
212    FIRST,
213    FIRST_VALUE,
214    FLOAT,
215    FLOOR,
216    FOLLOWING,
217    FOR,
218    FOREIGN,
219    FORMAT,
220    FRAME_ROW,
221    FREE,
222    FROM,
223    FULL,
224    FUNCTION,
225    FUSION,
226    GET,
227    GLOBAL,
228    GRANT,
229    GROUP,
230    GROUPING,
231    GROUPS,
232    HAVING,
233    HEADER,
234    HIVEVAR,
235    HOLD,
236    HOUR,
237    IDENTITY,
238    IF,
239    IGNORE,
240    ILIKE,
241    IN,
242    INDEX,
243    INDICATOR,
244    INNER,
245    INOUT,
246    INPUTFORMAT,
247    INSENSITIVE,
248    INSERT,
249    INT,
250    INTEGER,
251    INTERSECT,
252    INTERSECTION,
253    INTERVAL,
254    INTO,
255    IS,
256    ISOLATION,
257    JOIN,
258    JSON,
259    JSONFILE,
260    KEY,
261    LAG,
262    LANGUAGE,
263    LARGE,
264    LAST,
265    LAST_VALUE,
266    LATERAL,
267    LEAD,
268    LEADING,
269    LEFT,
270    LEVEL,
271    LIKE,
272    LIKE_REGEX,
273    LIMIT,
274    LISTAGG,
275    LN,
276    LOCAL,
277    LOCALTIME,
278    LOCALTIMESTAMP,
279    LOCATION,
280    LOWER,
281    MANAGEDLOCATION,
282    MATCH,
283    MATERIALIZED,
284    MAX,
285    MEMBER,
286    MERGE,
287    METADATA,
288    METHOD,
289    MIN,
290    MINUTE,
291    MOD,
292    MODIFIES,
293    MODULE,
294    MONTH,
295    MSCK,
296    MULTISET,
297    NATIONAL,
298    NATURAL,
299    NCHAR,
300    NCLOB,
301    NEW,
302    NEXT,
303    NO,
304    NONE,
305    NORMALIZE,
306    NOSCAN,
307    NOT,
308    NTH_VALUE,
309    NTILE,
310    NULL,
311    NULLIF,
312    NULLS,
313    NUMERIC,
314    OBJECT,
315    OCCURRENCES_REGEX,
316    OCTET_LENGTH,
317    OF,
318    OFFSET,
319    OLD,
320    ON,
321    ONLY,
322    OPEN,
323    OR,
324    ORC,
325    ORDER,
326    OUT,
327    OUTER,
328    OUTPUTFORMAT,
329    OVER,
330    OVERFLOW,
331    OVERLAPS,
332    OVERLAY,
333    OVERWRITE,
334    PARAMETER,
335    PARQUET,
336    PARTITION,
337    PARTITIONED,
338    PARTITIONS,
339    PERCENT,
340    PERCENTILE_CONT,
341    PERCENTILE_DISC,
342    PERCENT_RANK,
343    PERIOD,
344    PORTION,
345    POSITION,
346    POSITION_REGEX,
347    POWER,
348    PRECEDES,
349    PRECEDING,
350    PRECISION,
351    PREPARE,
352    PRIMARY,
353    PROCEDURE,
354    PURGE,
355    RANGE,
356    RANK,
357    RCFILE,
358    READ,
359    READS,
360    REAL,
361    RECURSIVE,
362    REF,
363    REFERENCES,
364    REFERENCING,
365    REGCLASS,
366    REGR_AVGX,
367    REGR_AVGY,
368    REGR_COUNT,
369    REGR_INTERCEPT,
370    REGR_R2,
371    REGR_SLOPE,
372    REGR_SXX,
373    REGR_SXY,
374    REGR_SYY,
375    RELEASE,
376    RENAME,
377    REPAIR,
378    REPEATABLE,
379    REPLACE,
380    RESTRICT,
381    RESULT,
382    RETURN,
383    RETURNS,
384    REVOKE,
385    RIGHT,
386    ROLLBACK,
387    ROLLUP,
388    ROW,
389    ROWID,
390    ROWS,
391    ROW_NUMBER,
392    SAVEPOINT,
393    SCHEMA,
394    SCOPE,
395    SCROLL,
396    SEARCH,
397    SECOND,
398    SELECT,
399    SENSITIVE,
400    SEQUENCEFILE,
401    SERDE,
402    SERIAL,
403    SERIALIZABLE,
404    SESSION,
405    SESSION_USER,
406    SET,
407    SHOW,
408    SIMILAR,
409    SMALLINT,
410    SOME,
411    SORT,
412    SPECIFIC,
413    SPECIFICTYPE,
414    SQL,
415    SQLEXCEPTION,
416    SQLSTATE,
417    SQLWARNING,
418    SQRT,
419    START,
420    STATIC,
421    STATISTICS,
422    STDDEV_POP,
423    STDDEV_SAMP,
424    STDIN,
425    STORED,
426    STRING,
427    SUBMULTISET,
428    SUBSTRING,
429    SUBSTRING_REGEX,
430    SUCCEEDS,
431    SUM,
432    SYMMETRIC,
433    SYNC,
434    SYSTEM,
435    SYSTEM_TIME,
436    SYSTEM_USER,
437    TABLE,
438    TABLESAMPLE,
439    TBLPROPERTIES,
440    TEMP,
441    TEMPORARY,
442    TEXT,
443    TEXTFILE,
444    THEN,
445    TIES,
446    TIME,
447    TIMESTAMP,
448    TIMEZONE_HOUR,
449    TIMEZONE_MINUTE,
450    TINYINT,
451    TO,
452    TOP,
453    TRAILING,
454    TRANSACTION,
455    TRANSLATE,
456    TRANSLATE_REGEX,
457    TRANSLATION,
458    TREAT,
459    TRIGGER,
460    TRIM,
461    TRIM_ARRAY,
462    TRUE,
463    TRUNCATE,
464    TRY_CAST,
465    UESCAPE,
466    UNBOUNDED,
467    UNCOMMITTED,
468    UNION,
469    UNIQUE,
470    UNKNOWN,
471    UNNEST,
472    UPDATE,
473    UPPER,
474    USER,
475    USING,
476    UUID,
477    VALUE,
478    VALUES,
479    VALUE_OF,
480    VARBINARY,
481    VARCHAR,
482    VARYING,
483    VAR_POP,
484    VAR_SAMP,
485    VERBOSE,
486    VERSIONING,
487    VIEW,
488    VIRTUAL,
489    WHEN,
490    WHENEVER,
491    WHERE,
492    WIDTH_BUCKET,
493    WINDOW,
494    WITH,
495    WITHIN,
496    WITHOUT,
497    WORK,
498    WRITE,
499    YEAR,
500    ZONE
501);
502
503/// These keywords can't be used as a table alias, so that `FROM table_name alias`
504/// can be parsed unambiguously without looking ahead.
505pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
506    // Reserved as both a table and a column alias:
507    Keyword::WITH,
508    Keyword::EXPLAIN,
509    Keyword::ANALYZE,
510    Keyword::SELECT,
511    Keyword::WHERE,
512    Keyword::GROUP,
513    Keyword::SORT,
514    Keyword::HAVING,
515    Keyword::ORDER,
516    Keyword::TOP,
517    Keyword::LATERAL,
518    Keyword::VIEW,
519    Keyword::LIMIT,
520    Keyword::OFFSET,
521    Keyword::FETCH,
522    Keyword::UNION,
523    Keyword::EXCEPT,
524    Keyword::INTERSECT,
525    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
526    Keyword::ON,
527    Keyword::JOIN,
528    Keyword::INNER,
529    Keyword::CROSS,
530    Keyword::FULL,
531    Keyword::LEFT,
532    Keyword::RIGHT,
533    Keyword::NATURAL,
534    Keyword::USING,
535    Keyword::CLUSTER,
536    Keyword::DISTRIBUTE,
537    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
538    Keyword::OUTER,
539];
540
541/// Can't be used as a column alias, so that `SELECT <expr> alias`
542/// can be parsed unambiguously without looking ahead.
543pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
544    // Reserved as both a table and a column alias:
545    Keyword::WITH,
546    Keyword::EXPLAIN,
547    Keyword::ANALYZE,
548    Keyword::SELECT,
549    Keyword::WHERE,
550    Keyword::GROUP,
551    Keyword::SORT,
552    Keyword::HAVING,
553    Keyword::ORDER,
554    Keyword::TOP,
555    Keyword::LATERAL,
556    Keyword::VIEW,
557    Keyword::LIMIT,
558    Keyword::OFFSET,
559    Keyword::FETCH,
560    Keyword::UNION,
561    Keyword::EXCEPT,
562    Keyword::INTERSECT,
563    Keyword::CLUSTER,
564    Keyword::DISTRIBUTE,
565    // Reserved only as a column alias in the `SELECT` clause
566    Keyword::FROM,
567];