sqlx_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    JSONFILE,
259    KEY,
260    LAG,
261    LANGUAGE,
262    LARGE,
263    LAST,
264    LAST_VALUE,
265    LATERAL,
266    LEAD,
267    LEADING,
268    LEFT,
269    LEVEL,
270    LIKE,
271    LIKE_REGEX,
272    LIMIT,
273    LISTAGG,
274    LN,
275    LOCAL,
276    LOCALTIME,
277    LOCALTIMESTAMP,
278    LOCATION,
279    LOWER,
280    MANAGEDLOCATION,
281    MATCH,
282    MATERIALIZED,
283    MAX,
284    MEMBER,
285    MERGE,
286    METADATA,
287    METHOD,
288    MIN,
289    MINUTE,
290    MOD,
291    MODIFIES,
292    MODULE,
293    MONTH,
294    MSCK,
295    MULTISET,
296    NATIONAL,
297    NATURAL,
298    NCHAR,
299    NCLOB,
300    NEW,
301    NEXT,
302    NO,
303    NONE,
304    NORMALIZE,
305    NOSCAN,
306    NOT,
307    NTH_VALUE,
308    NTILE,
309    NULL,
310    NULLIF,
311    NULLS,
312    NUMERIC,
313    OBJECT,
314    OCCURRENCES_REGEX,
315    OCTET_LENGTH,
316    OF,
317    OFFSET,
318    OLD,
319    ON,
320    ONLY,
321    OPEN,
322    OR,
323    ORC,
324    ORDER,
325    OUT,
326    OUTER,
327    OUTPUTFORMAT,
328    OVER,
329    OVERFLOW,
330    OVERLAPS,
331    OVERLAY,
332    OVERWRITE,
333    PARAMETER,
334    PARQUET,
335    PARTITION,
336    PARTITIONED,
337    PARTITIONS,
338    PERCENT,
339    PERCENTILE_CONT,
340    PERCENTILE_DISC,
341    PERCENT_RANK,
342    PERIOD,
343    PORTION,
344    POSITION,
345    POSITION_REGEX,
346    POWER,
347    PRECEDES,
348    PRECEDING,
349    PRECISION,
350    PREPARE,
351    PRIMARY,
352    PROCEDURE,
353    PURGE,
354    RANGE,
355    RANK,
356    RCFILE,
357    READ,
358    READS,
359    REAL,
360    RECURSIVE,
361    REF,
362    REFERENCES,
363    REFERENCING,
364    REGCLASS,
365    REGR_AVGX,
366    REGR_AVGY,
367    REGR_COUNT,
368    REGR_INTERCEPT,
369    REGR_R2,
370    REGR_SLOPE,
371    REGR_SXX,
372    REGR_SXY,
373    REGR_SYY,
374    RELEASE,
375    RENAME,
376    REPAIR,
377    REPEATABLE,
378    REPLACE,
379    RESTRICT,
380    RESULT,
381    RETURN,
382    RETURNS,
383    REVOKE,
384    RIGHT,
385    ROLLBACK,
386    ROLLUP,
387    ROW,
388    ROWID,
389    ROWS,
390    ROW_NUMBER,
391    SAVEPOINT,
392    SCHEMA,
393    SCOPE,
394    SCROLL,
395    SEARCH,
396    SECOND,
397    SELECT,
398    SENSITIVE,
399    SEQUENCEFILE,
400    SERDE,
401    SERIALIZABLE,
402    SESSION,
403    SESSION_USER,
404    SET,
405    SHOW,
406    SIMILAR,
407    SMALLINT,
408    SOME,
409    SORT,
410    SPECIFIC,
411    SPECIFICTYPE,
412    SQL,
413    SQLEXCEPTION,
414    SQLSTATE,
415    SQLWARNING,
416    SQRT,
417    START,
418    STATIC,
419    STATISTICS,
420    STDDEV_POP,
421    STDDEV_SAMP,
422    STDIN,
423    STORED,
424    STRING,
425    SUBMULTISET,
426    SUBSTRING,
427    SUBSTRING_REGEX,
428    SUCCEEDS,
429    SUM,
430    SYMMETRIC,
431    SYNC,
432    SYSTEM,
433    SYSTEM_TIME,
434    SYSTEM_USER,
435    TABLE,
436    TABLESAMPLE,
437    TBLPROPERTIES,
438    TEMP,
439    TEMPORARY,
440    TEXT,
441    TEXTFILE,
442    THEN,
443    TIES,
444    TIME,
445    TIMESTAMP,
446    TIMEZONE_HOUR,
447    TIMEZONE_MINUTE,
448    TINYINT,
449    TO,
450    TOP,
451    TRAILING,
452    TRANSACTION,
453    TRANSLATE,
454    TRANSLATE_REGEX,
455    TRANSLATION,
456    TREAT,
457    TRIGGER,
458    TRIM,
459    TRIM_ARRAY,
460    TRUE,
461    TRUNCATE,
462    TRY_CAST,
463    UESCAPE,
464    UNBOUNDED,
465    UNCOMMITTED,
466    UNION,
467    UNIQUE,
468    UNKNOWN,
469    UNNEST,
470    UPDATE,
471    UPPER,
472    USER,
473    USING,
474    UUID,
475    VALUE,
476    VALUES,
477    VALUE_OF,
478    VARBINARY,
479    VARCHAR,
480    VARYING,
481    VAR_POP,
482    VAR_SAMP,
483    VERBOSE,
484    VERSIONING,
485    VIEW,
486    VIRTUAL,
487    WHEN,
488    WHENEVER,
489    WHERE,
490    WIDTH_BUCKET,
491    WINDOW,
492    WITH,
493    WITHIN,
494    WITHOUT,
495    WORK,
496    WRITE,
497    YEAR,
498    ZONE
499);
500
501/// These keywords can't be used as a table alias, so that `FROM table_name alias`
502/// can be parsed unambiguously without looking ahead.
503pub const RESERVED_FOR_TABLE_ALIAS: &[Keyword] = &[
504    // Reserved as both a table and a column alias:
505    Keyword::WITH,
506    Keyword::EXPLAIN,
507    Keyword::ANALYZE,
508    Keyword::SELECT,
509    Keyword::WHERE,
510    Keyword::GROUP,
511    Keyword::SORT,
512    Keyword::HAVING,
513    Keyword::ORDER,
514    Keyword::TOP,
515    Keyword::LATERAL,
516    Keyword::VIEW,
517    Keyword::LIMIT,
518    Keyword::OFFSET,
519    Keyword::FETCH,
520    Keyword::UNION,
521    Keyword::EXCEPT,
522    Keyword::INTERSECT,
523    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
524    Keyword::ON,
525    Keyword::JOIN,
526    Keyword::INNER,
527    Keyword::CROSS,
528    Keyword::FULL,
529    Keyword::LEFT,
530    Keyword::RIGHT,
531    Keyword::NATURAL,
532    Keyword::USING,
533    Keyword::CLUSTER,
534    Keyword::DISTRIBUTE,
535    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
536    Keyword::OUTER,
537];
538
539/// Can't be used as a column alias, so that `SELECT <expr> alias`
540/// can be parsed unambiguously without looking ahead.
541pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[
542    // Reserved as both a table and a column alias:
543    Keyword::WITH,
544    Keyword::EXPLAIN,
545    Keyword::ANALYZE,
546    Keyword::SELECT,
547    Keyword::WHERE,
548    Keyword::GROUP,
549    Keyword::SORT,
550    Keyword::HAVING,
551    Keyword::ORDER,
552    Keyword::TOP,
553    Keyword::LATERAL,
554    Keyword::VIEW,
555    Keyword::LIMIT,
556    Keyword::OFFSET,
557    Keyword::FETCH,
558    Keyword::UNION,
559    Keyword::EXCEPT,
560    Keyword::INTERSECT,
561    Keyword::CLUSTER,
562    Keyword::DISTRIBUTE,
563    // Reserved only as a column alias in the `SELECT` clause
564    Keyword::FROM,
565];