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