Skip to content

Commit 908082d

Browse files
authored
Merge pull request #63 from nickolay/pr/refactor-keywords
Use smarter macros to avoid duplication in keywords.rs
2 parents 3d1b73a + ed20b8d commit 908082d

File tree

1 file changed

+24
-357
lines changed

1 file changed

+24
-357
lines changed

src/dialect/keywords.rs

Lines changed: 24 additions & 357 deletions
Original file line numberDiff line numberDiff line change
@@ -12,365 +12,32 @@
1212
/// 3) a `RESERVED_FOR_TABLE_ALIAS` array with keywords reserved in a
1313
/// "table alias" context.
1414
15-
macro_rules! keyword {
16-
($($ident:ident),*) => {
17-
$(pub const $ident: &'static str = stringify!($ident);)*
18-
}
15+
/// Defines a string constant for a single keyword: `kw_def!(SELECT);`
16+
/// expands to `pub const SELECT = "SELECT";`
17+
macro_rules! kw_def {
18+
($ident:ident = $string_keyword:expr) => {
19+
pub const $ident: &'static str = $string_keyword;
20+
};
21+
($ident:ident) => {
22+
kw_def!($ident = stringify!($ident));
23+
};
1924
}
2025

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

370-
/// special case of keyword where the it is an invalid identifier
371-
pub const END_EXEC: &str = "END-EXEC";
34+
pub const ALL_KEYWORDS: &[&str] = &[
35+
$($ident),*
36+
];
37+
}
38+
}
37239

373-
pub const ALL_KEYWORDS: &[&str] = &[
40+
define_keywords!(
37441
ABS,
37542
ADD,
37643
ASC,
@@ -717,8 +384,8 @@ pub const ALL_KEYWORDS: &[&str] = &[
717384
WITHOUT,
718385
YEAR,
719386
ZONE,
720-
END_EXEC,
721-
];
387+
END_EXEC = "END-EXEC"
388+
);
722389

723390
/// These keywords can't be used as a table alias, so that `FROM table_name alias`
724391
/// can be parsed unambiguously without looking ahead.

0 commit comments

Comments
 (0)