From ed20b8dde889277dd9ea554a150d4205ac194338 Mon Sep 17 00:00:00 2001 From: Nickolay Ponomarev Date: Sat, 4 May 2019 16:46:57 +0300 Subject: [PATCH] Use smarter macros to avoid duplication in keywords.rs --- src/dialect/keywords.rs | 381 +++------------------------------------- 1 file changed, 24 insertions(+), 357 deletions(-) diff --git a/src/dialect/keywords.rs b/src/dialect/keywords.rs index c7eedfd04..1d4d99939 100644 --- a/src/dialect/keywords.rs +++ b/src/dialect/keywords.rs @@ -12,365 +12,32 @@ /// 3) a `RESERVED_FOR_TABLE_ALIAS` array with keywords reserved in a /// "table alias" context. -macro_rules! keyword { - ($($ident:ident),*) => { - $(pub const $ident: &'static str = stringify!($ident);)* - } +/// Defines a string constant for a single keyword: `kw_def!(SELECT);` +/// expands to `pub const SELECT = "SELECT";` +macro_rules! kw_def { + ($ident:ident = $string_keyword:expr) => { + pub const $ident: &'static str = $string_keyword; + }; + ($ident:ident) => { + kw_def!($ident = stringify!($ident)); + }; } -keyword!( - ABS, - ADD, - ASC, - ALL, - ALLOCATE, - ALTER, - AND, - ANY, - ARE, - ARRAY, - ARRAY_AGG, - ARRAY_MAX_CARDINALITY, - AS, - ASENSITIVE, - ASYMMETRIC, - AT, - ATOMIC, - AUTHORIZATION, - AVG, - BEGIN, - BEGIN_FRAME, - BEGIN_PARTITION, - BETWEEN, - BIGINT, - BINARY, - BLOB, - BOOLEAN, - BOTH, - BY, - BYTEA, - CALL, - CALLED, - CARDINALITY, - CASCADED, - CASE, - CAST, - CEIL, - CEILING, - CHAR, - CHAR_LENGTH, - CHARACTER, - CHARACTER_LENGTH, - CHECK, - CLOB, - CLOSE, - COALESCE, - COLLATE, - COLLECT, - COLUMN, - COMMIT, - CONDITION, - CONNECT, - CONSTRAINT, - CONTAINS, - CONVERT, - COPY, - CORR, - CORRESPONDING, - COUNT, - COVAR_POP, - COVAR_SAMP, - CREATE, - CROSS, - CSV, - CUBE, - CUME_DIST, - CURRENT, - CURRENT_CATALOG, - CURRENT_DATE, - CURRENT_DEFAULT_TRANSFORM_GROUP, - CURRENT_PATH, - CURRENT_ROLE, - CURRENT_ROW, - CURRENT_SCHEMA, - CURRENT_TIME, - CURRENT_TIMESTAMP, - CURRENT_TRANSFORM_GROUP_FOR_TYPE, - CURRENT_USER, - CURSOR, - CYCLE, - DATE, - DAY, - DEALLOCATE, - DEC, - DECIMAL, - DECLARE, - DEFAULT, - DELETE, - DENSE_RANK, - DEREF, - DESC, - DESCRIBE, - DETERMINISTIC, - DISCONNECT, - DISTINCT, - DOUBLE, - DROP, - DYNAMIC, - EACH, - ELEMENT, - ELSE, - END, - END_FRAME, - END_PARTITION, - EQUALS, - ESCAPE, - EVERY, - EXCEPT, - EXEC, - EXECUTE, - EXISTS, - EXP, - EXTERNAL, - EXTRACT, - FALSE, - FETCH, - FILTER, - FIRST_VALUE, - FLOAT, - FLOOR, - FOLLOWING, - FOR, - FOREIGN, - FRAME_ROW, - FREE, - FROM, - FULL, - FUNCTION, - FUSION, - GET, - GLOBAL, - GRANT, - GROUP, - GROUPING, - GROUPS, - HAVING, - HEADER, - HOLD, - HOUR, - IDENTITY, - IN, - INDICATOR, - INNER, - INOUT, - INSENSITIVE, - INSERT, - INT, - INTEGER, - INTERSECT, - INTERSECTION, - INTERVAL, - INTO, - IS, - JOIN, - KEY, - LAG, - LANGUAGE, - LARGE, - LAST_VALUE, - LATERAL, - LEAD, - LEADING, - LEFT, - LIKE, - LIKE_REGEX, - LIMIT, - LN, - LOCAL, - LOCALTIME, - LOCALTIMESTAMP, - LOCATION, - LOWER, - MATCH, - MATERIALIZED, - MAX, - MEMBER, - MERGE, - METHOD, - MIN, - MINUTE, - MOD, - MODIFIES, - MODULE, - MONTH, - MULTISET, - NATIONAL, - NATURAL, - NCHAR, - NCLOB, - NEW, - NO, - NONE, - NORMALIZE, - NOT, - NTH_VALUE, - NTILE, - NULL, - NULLIF, - NUMERIC, - OBJECT, - OCTET_LENGTH, - OCCURRENCES_REGEX, - OF, - OFFSET, - OLD, - ON, - ONLY, - OPEN, - OR, - ORDER, - OUT, - OUTER, - OVER, - OVERLAPS, - OVERLAY, - PARAMETER, - PARTITION, - PARQUET, - PERCENT, - PERCENT_RANK, - PERCENTILE_CONT, - PERCENTILE_DISC, - PERIOD, - PORTION, - POSITION, - POSITION_REGEX, - POWER, - PRECEDES, - PRECEDING, - PRECISION, - PREPARE, - PRIMARY, - PROCEDURE, - RANGE, - RANK, - READS, - REAL, - RECURSIVE, - REF, - REFERENCES, - REFERENCING, - REGCLASS, - REGR_AVGX, - REGR_AVGY, - REGR_COUNT, - REGR_INTERCEPT, - REGR_R2, - REGR_SLOPE, - REGR_SXX, - REGR_SXY, - REGR_SYY, - RELEASE, - RESULT, - RETURN, - RETURNS, - REVOKE, - RIGHT, - ROLLBACK, - ROLLUP, - ROW, - ROW_NUMBER, - ROWS, - SAVEPOINT, - SCOPE, - SCROLL, - SEARCH, - SECOND, - SELECT, - SENSITIVE, - SESSION_USER, - SET, - SIMILAR, - SMALLINT, - SOME, - SPECIFIC, - SPECIFICTYPE, - SQL, - SQLEXCEPTION, - SQLSTATE, - SQLWARNING, - SQRT, - START, - STATIC, - STDDEV_POP, - STDDEV_SAMP, - STDIN, - STORED, - SUBMULTISET, - SUBSTRING, - SUBSTRING_REGEX, - SUCCEEDS, - SUM, - SYMMETRIC, - SYSTEM, - SYSTEM_TIME, - SYSTEM_USER, - TABLE, - TABLESAMPLE, - TEXT, - THEN, - TIME, - TIMESTAMP, - TIMEZONE_HOUR, - TIMEZONE_MINUTE, - TO, - TRAILING, - TRANSLATE, - TRANSLATE_REGEX, - TRANSLATION, - TREAT, - TRIGGER, - TRUNCATE, - TRIM, - TRIM_ARRAY, - TRUE, - UESCAPE, - UNBOUNDED, - UNION, - UNIQUE, - UNKNOWN, - UNNEST, - UPDATE, - UPPER, - USER, - USING, - UUID, - VALUE, - VALUES, - VALUE_OF, - VAR_POP, - VAR_SAMP, - VARBINARY, - VARCHAR, - VARYING, - VERSIONING, - VIEW, - WHEN, - WHENEVER, - WHERE, - WIDTH_BUCKET, - WINDOW, - WITH, - WITHIN, - WITHOUT, - YEAR, - ZONE -); +/// Expands to a list of `kw_def!()` invocations for each keyword +/// and defines an ALL_KEYWORDS array of the defined constants. +macro_rules! define_keywords { + ($( + $ident:ident $(= $string_keyword:expr)? + ),*) => { + $(kw_def!($ident $(= $string_keyword)?);)* -/// special case of keyword where the it is an invalid identifier -pub const END_EXEC: &str = "END-EXEC"; + pub const ALL_KEYWORDS: &[&str] = &[ + $($ident),* + ]; + } +} -pub const ALL_KEYWORDS: &[&str] = &[ +define_keywords!( ABS, ADD, ASC, @@ -717,8 +384,8 @@ pub const ALL_KEYWORDS: &[&str] = &[ WITHOUT, YEAR, ZONE, - END_EXEC, -]; + END_EXEC = "END-EXEC" +); /// These keywords can't be used as a table alias, so that `FROM table_name alias` /// can be parsed unambiguously without looking ahead.