sql_ast/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
27/// Defines a string constant for a single keyword: `kw_def!(SELECT);`
28/// expands to `pub const SELECT = "SELECT";`
29macro_rules! kw_def {
30    ($ident:ident = $string_keyword:expr) => {
31        pub const $ident: &'static str = $string_keyword;
32    };
33    ($ident:ident) => {
34        kw_def!($ident = stringify!($ident));
35    };
36}
37
38/// Expands to a list of `kw_def!()` invocations for each keyword
39/// and defines an ALL_KEYWORDS array of the defined constants.
40macro_rules! define_keywords {
41    ($(
42        $ident:ident $(= $string_keyword:expr)?
43    ),*) => {
44        $(kw_def!($ident $(= $string_keyword)?);)*
45
46        pub const ALL_KEYWORDS: &[&str] = &[
47            $($ident),*
48        ];
49    }
50}
51
52define_keywords!(
53    ABS,
54    ADD,
55    ASC,
56    ALL,
57    ALLOCATE,
58    ALTER,
59    AND,
60    ANY,
61    APPLY,
62    ARE,
63    ARRAY,
64    ARRAY_AGG,
65    ARRAY_MAX_CARDINALITY,
66    AS,
67    ASENSITIVE,
68    ASYMMETRIC,
69    AT,
70    ATOMIC,
71    AUTHORIZATION,
72    AVG,
73    BEGIN,
74    BEGIN_FRAME,
75    BEGIN_PARTITION,
76    BETWEEN,
77    BIGINT,
78    BINARY,
79    BLOB,
80    BOOLEAN,
81    BOTH,
82    BY,
83    BYTEA,
84    CALL,
85    CALLED,
86    CARDINALITY,
87    CASCADE,
88    CASCADED,
89    CASE,
90    CAST,
91    CEIL,
92    CEILING,
93    CHAIN,
94    CHAR,
95    CHAR_LENGTH,
96    CHARACTER,
97    CHARACTER_LENGTH,
98    CHECK,
99    CLOB,
100    CLOSE,
101    COALESCE,
102    COLLATE,
103    COLLECT,
104    COLUMN,
105    COLUMNS,
106    COMMIT,
107    COMMITTED,
108    CONDITION,
109    CONNECT,
110    CONSTRAINT,
111    CONTAINS,
112    CONVERT,
113    COPY,
114    CORR,
115    CORRESPONDING,
116    COUNT,
117    COVAR_POP,
118    COVAR_SAMP,
119    CREATE,
120    CROSS,
121    CSV,
122    CUBE,
123    CUME_DIST,
124    CURRENT,
125    CURRENT_CATALOG,
126    CURRENT_DATE,
127    CURRENT_DEFAULT_TRANSFORM_GROUP,
128    CURRENT_PATH,
129    CURRENT_ROLE,
130    CURRENT_ROW,
131    CURRENT_SCHEMA,
132    CURRENT_TIME,
133    CURRENT_TIMESTAMP,
134    CURRENT_TRANSFORM_GROUP_FOR_TYPE,
135    CURRENT_USER,
136    CURSOR,
137    CYCLE,
138    DATE,
139    DAY,
140    DEALLOCATE,
141    DEC,
142    DECIMAL,
143    DECLARE,
144    DEFAULT,
145    DELETE,
146    DENSE_RANK,
147    DEREF,
148    DESC,
149    DESCRIBE,
150    DETERMINISTIC,
151    DISCONNECT,
152    DISTINCT,
153    DOUBLE,
154    DROP,
155    DYNAMIC,
156    EACH,
157    ELEMENT,
158    ELSE,
159    END,
160    END_FRAME,
161    END_PARTITION,
162    EQUALS,
163    ESCAPE,
164    EVERY,
165    EXCEPT,
166    EXEC,
167    EXECUTE,
168    EXISTS,
169    EXP,
170    EXTENDED,
171    EXTERNAL,
172    EXTRACT,
173    FALSE,
174    FETCH,
175    FIELDS,
176    FIRST,
177    FILTER,
178    FIRST_VALUE,
179    FLOAT,
180    FLOOR,
181    FOLLOWING,
182    FOR,
183    FOREIGN,
184    FRAME_ROW,
185    FREE,
186    FROM,
187    FULL,
188    FUNCTION,
189    FUSION,
190    GET,
191    GLOBAL,
192    GRANT,
193    GROUP,
194    GROUPING,
195    GROUPS,
196    HAVING,
197    HEADER,
198    HOLD,
199    HOUR,
200    IDENTITY,
201    IF,
202    IN,
203    INDICATOR,
204    INNER,
205    INOUT,
206    INSENSITIVE,
207    INSERT,
208    INT,
209    INTEGER,
210    INTERSECT,
211    INTERSECTION,
212    INTERVAL,
213    INTO,
214    IS,
215    ISOLATION,
216    JOIN,
217    KEY,
218    LAG,
219    LANGUAGE,
220    LARGE,
221    LAST_VALUE,
222    LATERAL,
223    LEAD,
224    LEADING,
225    LEFT,
226    LEVEL,
227    LIKE,
228    LIKE_REGEX,
229    LIMIT,
230    LN,
231    LOCAL,
232    LOCALTIME,
233    LOCALTIMESTAMP,
234    LOCATION,
235    LOWER,
236    MATCH,
237    MATERIALIZED,
238    MAX,
239    MEMBER,
240    MERGE,
241    METHOD,
242    MIN,
243    MINUTE,
244    MOD,
245    MODIFIES,
246    MODULE,
247    MONTH,
248    MULTISET,
249    NATIONAL,
250    NATURAL,
251    NCHAR,
252    NCLOB,
253    NEXT,
254    NEW,
255    NO,
256    NONE,
257    NORMALIZE,
258    NOT,
259    NTH_VALUE,
260    NTILE,
261    NULL,
262    NULLIF,
263    NUMERIC,
264    OBJECT,
265    OCTET_LENGTH,
266    OCCURRENCES_REGEX,
267    OF,
268    OFFSET,
269    OLD,
270    ON,
271    ONLY,
272    OPEN,
273    OR,
274    ORDER,
275    OUT,
276    OUTER,
277    OVER,
278    OVERLAPS,
279    OVERLAY,
280    PARAMETER,
281    PARTITION,
282    PARQUET,
283    PERCENT,
284    PERCENT_RANK,
285    PERCENTILE_CONT,
286    PERCENTILE_DISC,
287    PERIOD,
288    PORTION,
289    POSITION,
290    POSITION_REGEX,
291    POWER,
292    PRECEDES,
293    PRECEDING,
294    PRECISION,
295    PREPARE,
296    PRIMARY,
297    PROCEDURE,
298    RANGE,
299    RANK,
300    READ,
301    READS,
302    REAL,
303    RECURSIVE,
304    REF,
305    REFERENCES,
306    REFERENCING,
307    REGCLASS,
308    REGR_AVGX,
309    REGR_AVGY,
310    REGR_COUNT,
311    REGR_INTERCEPT,
312    REGR_R2,
313    REGR_SLOPE,
314    REGR_SXX,
315    REGR_SXY,
316    REGR_SYY,
317    RELEASE,
318    REPEATABLE,
319    RESTRICT,
320    RESULT,
321    RETURN,
322    RETURNS,
323    REVOKE,
324    RIGHT,
325    ROLLBACK,
326    ROLLUP,
327    ROW,
328    ROW_NUMBER,
329    ROWS,
330    SAVEPOINT,
331    SCOPE,
332    SCROLL,
333    SEARCH,
334    SECOND,
335    SELECT,
336    SENSITIVE,
337    SERIALIZABLE,
338    SESSION,
339    SESSION_USER,
340    SET,
341    SHOW,
342    SIMILAR,
343    SMALLINT,
344    SOME,
345    SPECIFIC,
346    SPECIFICTYPE,
347    SQL,
348    SQLEXCEPTION,
349    SQLSTATE,
350    SQLWARNING,
351    SQRT,
352    START,
353    STATIC,
354    STDDEV_POP,
355    STDDEV_SAMP,
356    STDIN,
357    STORED,
358    SUBMULTISET,
359    SUBSTRING,
360    SUBSTRING_REGEX,
361    SUCCEEDS,
362    SUM,
363    SYMMETRIC,
364    SYSTEM,
365    SYSTEM_TIME,
366    SYSTEM_USER,
367    TABLE,
368    TABLESAMPLE,
369    TEXT,
370    THEN,
371    TIES,
372    TIME,
373    TIMESTAMP,
374    TIMEZONE_HOUR,
375    TIMEZONE_MINUTE,
376    TO,
377    TRAILING,
378    TRANSACTION,
379    TRANSLATE,
380    TRANSLATE_REGEX,
381    TRANSLATION,
382    TREAT,
383    TRIGGER,
384    TRUNCATE,
385    TRIM,
386    TRIM_ARRAY,
387    TRUE,
388    UESCAPE,
389    UNBOUNDED,
390    UNCOMMITTED,
391    UNION,
392    UNIQUE,
393    UNKNOWN,
394    UNNEST,
395    UPDATE,
396    UPPER,
397    USER,
398    USING,
399    UUID,
400    VALUE,
401    VALUES,
402    VALUE_OF,
403    VAR_POP,
404    VAR_SAMP,
405    VARBINARY,
406    VARCHAR,
407    VARYING,
408    VERSIONING,
409    VIEW,
410    WHEN,
411    WHENEVER,
412    WHERE,
413    WIDTH_BUCKET,
414    WINDOW,
415    WITH,
416    WITHIN,
417    WITHOUT,
418    WRITE,
419    WORK,
420    YEAR,
421    ZONE,
422    END_EXEC = "END-EXEC"
423);
424
425/// These keywords can't be used as a table alias, so that `FROM table_name alias`
426/// can be parsed unambiguously without looking ahead.
427pub const RESERVED_FOR_TABLE_ALIAS: &[&str] = &[
428    // Reserved as both a table and a column alias:
429    WITH, SELECT, WHERE, GROUP, HAVING, ORDER, LIMIT, OFFSET, FETCH, UNION, EXCEPT, INTERSECT,
430    // Reserved only as a table alias in the `FROM`/`JOIN` clauses:
431    ON, JOIN, INNER, CROSS, FULL, LEFT, RIGHT, NATURAL, USING,
432    // for MSSQL-specific OUTER APPLY (seems reserved in most dialects)
433    OUTER,
434];
435
436/// Can't be used as a column alias, so that `SELECT <expr> alias`
437/// can be parsed unambiguously without looking ahead.
438pub const RESERVED_FOR_COLUMN_ALIAS: &[&str] = &[
439    // Reserved as both a table and a column alias:
440    WITH, SELECT, WHERE, GROUP, HAVING, ORDER, LIMIT, OFFSET, FETCH, UNION, EXCEPT, INTERSECT,
441    // Reserved only as a column alias in the `SELECT` clause:
442    FROM,
443];