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