keywords are now generated via macro to avoid misspellings, dialects should lookup to these list of keywords to avoid mispellings

This commit is contained in:
Jovansonlee Cesar 2018-10-01 00:58:20 +08:00
parent d66e4848bd
commit 24153aee53
5 changed files with 822 additions and 464 deletions

View file

@ -22,6 +22,8 @@ mod ansi_sql;
mod generic_sql; mod generic_sql;
mod postgresql; mod postgresql;
mod keywords;
pub trait Dialect { pub trait Dialect {
/// Get a list of keywords for this dialect /// Get a list of keywords for this dialect
fn keywords(&self) -> Vec<&'static str>; fn keywords(&self) -> Vec<&'static str>;

View file

@ -1,334 +1,336 @@
use dialect::Dialect; use dialect::Dialect;
use dialect::keywords::*;
pub struct AnsiSqlDialect {} pub struct AnsiSqlDialect {}
impl Dialect for AnsiSqlDialect { impl Dialect for AnsiSqlDialect {
fn keywords(&self) -> Vec<&'static str> { fn keywords(&self) -> Vec<&'static str> {
return vec![ return vec![
"ABS", ABS,
"ALL", ALL,
"ALLOCATE", ALLOCATE,
"ALTER", ALTER,
"AND", AND,
"ANY", ANY,
"ARE", ARE,
"ARRAY", ARRAY,
"ARRAY_AGG", ARRAY_AGG,
"ARRAY_MAX_CARDINALITY", ARRAY_MAX_CARDINALITY,
"AS", AS,
"ASENSITIVE", ASENSITIVE,
"ASYMMETRIC", ASYMMETRIC,
"AT", AT,
"ATOMIC", ATOMIC,
"AUTHORIZATION", AUTHORIZATION,
"AVG", AVG,
"BEGIN", BEGIN,
"BEGIN_FRAME", BEGIN_FRAME,
"BEGIN_PARTITION", BEGIN_PARTITION,
"BETWEEN", BETWEEN,
"BIGINT", BIGINT,
"BINARY", BINARY,
"BLOB", BLOB,
"BOOLEAN", BOOLEAN,
"BOTH", BOTH,
"BY", BY,
"CALL", CALL,
"CALLED", CALLED,
"CARDINALITY", CARDINALITY,
"CASCADED", CASCADED,
"CASE", CASE,
"CAST", CAST,
"CEIL", CEIL,
"CEILING", CEILING,
"CHAR", CHAR,
"CHAR_LENGTH", CHAR_LENGTH,
"CHARACTER", CHARACTER,
"CHARACTER_LENGTH", CHARACTER_LENGTH,
"CHECK", CHECK,
"CLOB", CLOB,
"CLOSE", CLOSE,
"COALESCE", COALESCE,
"COLLATE", COLLATE,
"COLLECT", COLLECT,
"COLUMN", COLUMN,
"COMMIT", COMMIT,
"CONDITION", CONDITION,
"CONNECT", CONNECT,
"CONSTRAINT", CONSTRAINT,
"CONTAINS", CONTAINS,
"CONVERT", CONVERT,
"CORR", CORR,
"CORRESPONDING", CORRESPONDING,
"COUNT", COUNT,
"COVAR_POP", COVAR_POP,
"COVAR_SAMP", COVAR_SAMP,
"CREATE", CREATE,
"CROSS", CROSS,
"CUBE", CUBE,
"CUME_DIST", CUME_DIST,
"CURRENT", CURRENT,
"CURRENT_CATALOG", CURRENT_CATALOG,
"CURRENT_DATE", CURRENT_DATE,
"CURRENT_DEFAULT_TRANSFORM_GROUP", CURRENT_DEFAULT_TRANSFORM_GROUP,
"CURRENT_PATH", CURRENT_PATH,
"CURRENT_ROLE", CURRENT_ROLE,
"CURRENT_ROW", CURRENT_ROW,
"CURRENT_SCHEMA", CURRENT_SCHEMA,
"CURRENT_TIME", CURRENT_TIME,
"CURRENT_TIMESTAMP", CURRENT_TIMESTAMP,
"CURRENT_TRANSFORM_GROUP_FOR_TYPE", CURRENT_TRANSFORM_GROUP_FOR_TYPE,
"CURRENT_USER", CURRENT_USER,
"CURSOR", CURSOR,
"CYCLE", CYCLE,
"DATE", DATE,
"DAY", DAY,
"DEALLOCATE", DEALLOCATE,
"DEC", DEC,
"DECIMAL", DECIMAL,
"DECLARE", DECLARE,
"DEFAULT", DEFAULT,
"DELETE", DELETE,
"DENSE_RANK", DENSE_RANK,
"DEREF", DEREF,
"DESCRIBE", DESCRIBE,
"DETERMINISTIC", DETERMINISTIC,
"DISCONNECT", DISCONNECT,
"DISTINCT", DISTINCT,
"DOUBLE", DOUBLE,
"DROP", DROP,
"DYNAMIC", DYNAMIC,
"EACH", EACH,
"ELEMENT", ELEMENT,
"ELSE", ELSE,
"END", END,
"END_FRAME", END_FRAME,
"END_PARTITION", END_PARTITION,
"END-EXEC", END_EXEC,
"EQUALS", EQUALS,
"ESCAPE", ESCAPE,
"EVERY", EVERY,
"EXCEPT", EXCEPT,
"EXEC", EXEC,
"EXECUTE", EXECUTE,
"EXISTS", EXISTS,
"EXP", EXP,
"EXTERNAL", EXTERNAL,
"EXTRACT", EXTRACT,
"FALSE", FALSE,
"FETCH", FETCH,
"FILTER", FILTER,
"FIRST_VALUE", FIRST_VALUE,
"FLOAT", FLOAT,
"FLOOR", FLOOR,
"FOR", FOR,
"FOREIGN", FOREIGN,
"FRAME_ROW", FRAME_ROW,
"FREE", FREE,
"FROM", FROM,
"FULL", FULL,
"FUNCTION", FUNCTION,
"FUSION", FUSION,
"GET", GET,
"GLOBAL", GLOBAL,
"GRANT", GRANT,
"GROUP", GROUP,
"GROUPING", GROUPING,
"GROUPS", GROUPS,
"HAVING", HAVING,
"HOLD", HOLD,
"HOUR", HOUR,
"IDENTITY", IDENTITY,
"IN", IN,
"INDICATOR", INDICATOR,
"INNER", INNER,
"INOUT", INOUT,
"INSENSITIVE", INSENSITIVE,
"INSERT", INSERT,
"INT", INT,
"INTEGER", INTEGER,
"INTERSECT", INTERSECT,
"INTERSECTION", INTERSECTION,
"INTERVAL", INTERVAL,
"INTO", INTO,
"IS", IS,
"JOIN", JOIN,
"LAG", LAG,
"LANGUAGE", LANGUAGE,
"LARGE", LARGE,
"LAST_VALUE", LAST_VALUE,
"LATERAL", LATERAL,
"LEAD", LEAD,
"LEADING", LEADING,
"LEFT", LEFT,
"LIKE", LIKE,
"LIKE_REGEX", LIKE_REGEX,
"LN", LN,
"LOCAL", LOCAL,
"LOCALTIME", LOCALTIME,
"LOCALTIMESTAMP", LOCALTIMESTAMP,
"LOWER", LOWER,
"MATCH", MATCH,
"MAX", MAX,
"MEMBER", MEMBER,
"MERGE", MERGE,
"METHOD", METHOD,
"MIN", MIN,
"MINUTE", MINUTE,
"MOD", MOD,
"MODIFIES", MODIFIES,
"MODULE", MODULE,
"MONTH", MONTH,
"MULTISET", MULTISET,
"NATIONAL", NATIONAL,
"NATURAL", NATURAL,
"NCHAR", NCHAR,
"NCLOB", NCLOB,
"NEW", NEW,
"NO", NO,
"NONE", NONE,
"NORMALIZE", NORMALIZE,
"NOT", NOT,
"NTH_VALUE", NTH_VALUE,
"NTILE", NTILE,
"NULL", NULL,
"NULLIF", NULLIF,
"NUMERIC", NUMERIC,
"OCTET_LENGTH", OCTET_LENGTH,
"OCCURRENCES_REGEX", OCCURRENCES_REGEX,
"OF", OF,
"OFFSET", OFFSET,
"OLD", OLD,
"ON", ON,
"ONLY", ONLY,
"OPEN", OPEN,
"OR", OR,
"ORDER", ORDER,
"OUT", OUT,
"OUTER", OUTER,
"OVER", OVER,
"OVERLAPS", OVERLAPS,
"OVERLAY", OVERLAY,
"PARAMETER", PARAMETER,
"PARTITION", PARTITION,
"PERCENT", PERCENT,
"PERCENT_RANK", PERCENT_RANK,
"PERCENTILE_CONT", PERCENTILE_CONT,
"PERCENTILE_DISC", PERCENTILE_DISC,
"PERIOD", PERIOD,
"PORTION", PORTION,
"POSITION", POSITION,
"POSITION_REGEX", POSITION_REGEX,
"POWER", POWER,
"PRECEDES", PRECEDES,
"PRECISION", PRECISION,
"PREPARE", PREPARE,
"PRIMARY", PRIMARY,
"PROCEDURE", PROCEDURE,
"RANGE", RANGE,
"RANK", RANK,
"READS", READS,
"REAL", REAL,
"RECURSIVE", RECURSIVE,
"REF", REF,
"REFERENCES", REFERENCES,
"REFERENCING", REFERENCING,
"REGR_AVGX", REGR_AVGX,
"REGR_AVGY", REGR_AVGY,
"REGR_COUNT", REGR_COUNT,
"REGR_INTERCEPT", REGR_INTERCEPT,
"REGR_R2", REGR_R2,
"REGR_SLOPE", REGR_SLOPE,
"REGR_SXX", REGR_SXX,
"REGR_SXY", REGR_SXY,
"REGR_SYY", REGR_SYY,
"RELEASE", RELEASE,
"RESULT", RESULT,
"RETURN", RETURN,
"RETURNS", RETURNS,
"REVOKE", REVOKE,
"RIGHT", RIGHT,
"ROLLBACK", ROLLBACK,
"ROLLUP", ROLLUP,
"ROW", ROW,
"ROW_NUMBER", ROW_NUMBER,
"ROWS", ROWS,
"SAVEPOINT", SAVEPOINT,
"SCOPE", SCOPE,
"SCROLL", SCROLL,
"SEARCH", SEARCH,
"SECOND", SECOND,
"SELECT", SELECT,
"SENSITIVE", SENSITIVE,
"SESSION_USER", SESSION_USER,
"SET", SET,
"SIMILAR", SIMILAR,
"SMALLINT", SMALLINT,
"SOME", SOME,
"SPECIFIC", SPECIFIC,
"SPECIFICTYPE", SPECIFICTYPE,
"SQL", SQL,
"SQLEXCEPTION", SQLEXCEPTION,
"SQLSTATE", SQLSTATE,
"SQLWARNING", SQLWARNING,
"SQRT", SQRT,
"START", START,
"STATIC", STATIC,
"STDDEV_POP", STDDEV_POP,
"STDDEV_SAMP", STDDEV_SAMP,
"SUBMULTISET", SUBMULTISET,
"SUBSTRING", SUBSTRING,
"SUBSTRING_REGEX", SUBSTRING_REGEX,
"SUCCEEDS", SUCCEEDS,
"SUM", SUM,
"SYMMETRIC", SYMMETRIC,
"SYSTEM", SYSTEM,
"SYSTEM_TIME", SYSTEM_TIME,
"SYSTEM_USER", SYSTEM_USER,
"TABLE", TABLE,
"TABLESAMPLE", TABLESAMPLE,
"THEN", THEN,
"TIME", TIME,
"TIMESTAMP", TIMESTAMP,
"TIMEZONE_HOUR", TIMEZONE_HOUR,
"TIMEZONE_MINUTE", TIMEZONE_MINUTE,
"TO", TO,
"TRAILING", TRAILING,
"TRANSLATE", TRANSLATE,
"TRANSLATE_REGEX", TRANSLATE_REGEX,
"TRANSLATION", TRANSLATION,
"TREAT", TREAT,
"TRIGGER", TRIGGER,
"TRUNCATE", TRUNCATE,
"TRIM", TRIM,
"TRIM_ARRAY", TRIM_ARRAY,
"TRUE", TRUE,
"UESCAPE", UESCAPE,
"UNION", UNION,
"UNIQUE", UNIQUE,
"UNKNOWN", UNKNOWN,
"UNNEST", UNNEST,
"UPDATE", UPDATE,
"UPPER", UPPER,
"USER", USER,
"USING", USING,
"VALUE", VALUE,
"VALUES", VALUES,
"VALUE_OF", VALUE_OF,
"VAR_POP", VAR_POP,
"VAR_SAMP", VAR_SAMP,
"VARBINARY", VARBINARY,
"VARCHAR", VARCHAR,
"VARYING", VARYING,
"VERSIONING", VERSIONING,
"WHEN", WHEN,
"WHENEVER", WHENEVER,
"WHERE", WHERE,
"WIDTH_BUCKET", WIDTH_BUCKET,
"WINDOW", WINDOW,
"WITH", WITH,
"WITHIN", WITHIN,
"WITHOUT", WITHOUT,
"YEAR", YEAR,
]; ];
} }

View file

@ -1,71 +1,72 @@
use dialect::Dialect; use dialect::Dialect;
use dialect::keywords::*;
pub struct GenericSqlDialect {} pub struct GenericSqlDialect {}
impl Dialect for GenericSqlDialect { impl Dialect for GenericSqlDialect {
fn keywords(&self) -> Vec<&'static str> { fn keywords(&self) -> Vec<&'static str> {
return vec![ return vec![
"SELECT", SELECT,
"FROM", FROM,
"WHERE", WHERE,
"LIMIT", LIMIT,
"ORDER", ORDER,
"GROUP", GROUP,
"BY", BY,
"HAVING", HAVING,
"UNION", UNION,
"ALL", ALL,
"INSERT", INSERT,
"INTO", INTO,
"UPDATE", UPDATE,
"DELETE", DELETE,
"IN", IN,
"IS", IS,
"NULL", NULL,
"SET", SET,
"CREATE", CREATE,
"EXTERNAL", EXTERNAL,
"TABLE", TABLE,
"ASC", ASC,
"DESC", DESC,
"AND", AND,
"OR", OR,
"NOT", NOT,
"AS", AS,
"STORED", STORED,
"CSV", CSV,
"PARQUET", PARQUET,
"LOCATION", LOCATION,
"WITH", WITH,
"WITHOUT", WITHOUT,
"HEADER", HEADER,
"ROW", ROW,
// SQL types // SQL types
"CHAR", CHAR,
"CHARACTER", CHARACTER,
"VARYING", VARYING,
"LARGE", LARGE,
"OBJECT", OBJECT,
"VARCHAR", VARCHAR,
"CLOB", CLOB,
"BINARY", BINARY,
"VARBINARY", VARBINARY,
"BLOB", BLOB,
"FLOAT", FLOAT,
"REAL", REAL,
"DOUBLE", DOUBLE,
"PRECISION", PRECISION,
"INT", INT,
"INTEGER", INTEGER,
"SMALLINT", SMALLINT,
"BIGINT", BIGINT,
"NUMERIC", NUMERIC,
"DECIMAL", DECIMAL,
"DEC", DEC,
"BOOLEAN", BOOLEAN,
"DATE", DATE,
"TIME", TIME,
"TIMESTAMP", TIMESTAMP,
]; ];
} }

355
src/dialect/keywords.rs Normal file
View file

@ -0,0 +1,355 @@
/// make a listing of keywords
/// with static str and their stringified value
macro_rules! keyword {
($($ident:ident),*) => {
$(pub static $ident: &'static str = stringify!($ident);)*
}
}
/// enumerate all the keywords here for all dialects to support in this project
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,
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,
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,
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,
UNION,
UNIQUE,
UNKNOWN,
UNNEST,
UPDATE,
UPPER,
USER,
USING,
UUID,
VALUE,
VALUES,
VALUE_OF,
VAR_POP,
VAR_SAMP,
VARBINARY,
VARCHAR,
VARYING,
VERSIONING,
WHEN,
WHENEVER,
WHERE,
WIDTH_BUCKET,
WINDOW,
WITH,
WITHIN,
WITHOUT,
YEAR,
ZONE
);
/// special case of keyword where the it is an invalid identifier
pub static END_EXEC: &'static str = "END-EXEC";

View file

@ -1,91 +1,89 @@
use dialect::Dialect; use dialect::Dialect;
use dialect::keywords::*;
pub struct PostgreSqlDialect {} pub struct PostgreSqlDialect {}
impl Dialect for PostgreSqlDialect { impl Dialect for PostgreSqlDialect {
fn keywords(&self) -> Vec<&'static str> { fn keywords(&self) -> Vec<&'static str> {
return vec![ return vec![
"ALTER", ALTER,
"ONLY", ONLY,
"SELECT", SELECT,
"FROM", FROM,
"WHERE", WHERE,
"LIMIT", LIMIT,
"ORDER", ORDER,
"GROUP", GROUP,
"BY", BY,
"HAVING", HAVING,
"UNION", UNION,
"ALL", ALL,
"INSERT", INSERT,
"INTO", INTO,
"UPDATE", UPDATE,
"DELETE", DELETE,
"IN", IN,
"IS", IS,
"NULL", NULL,
"SET", SET,
"CREATE", CREATE,
"EXTERNAL", EXTERNAL,
"TABLE", TABLE,
"ASC", ASC,
"DESC", DESC,
"AND", AND,
"OR", OR,
"NOT", NOT,
"AS", AS,
"STORED", STORED,
"CSV", CSV,
"PARQUET", WITH,
"LOCATION", WITHOUT,
"WITH", ROW,
"WITHOUT",
"HEADER",
"ROW",
// SQL types // SQL types
"CHAR", CHAR,
"CHARACTER", CHARACTER,
"VARYING", VARYING,
"LARGE", LARGE,
"OBJECT", VARCHAR,
"VARCHAR", CLOB,
"CLOB", BINARY,
"BINARY", VARBINARY,
"VARBINARY", BLOB,
"BLOB", FLOAT,
"FLOAT", REAL,
"REAL", DOUBLE,
"DOUBLE", PRECISION,
"PRECISION", INT,
"INT", INTEGER,
"INTEGER", SMALLINT,
"SMALLINT", BIGINT,
"BIGINT", NUMERIC,
"NUMERIC", DECIMAL,
"DECIMAL", DEC,
"DEC", BOOLEAN,
"BOOLEAN", DATE,
"DATE", TIME,
"TIME", TIMESTAMP,
"TIMESTAMP", VALUES,
"VALUES", DEFAULT,
"DEFAULT", ZONE,
"ZONE", REGCLASS,
"REGCLASS", TEXT,
"TEXT", BYTEA,
"BYTEA", TRUE,
"TRUE", FALSE,
"FALSE", COPY,
"COPY", STDIN,
"STDIN", PRIMARY,
"PRIMARY", KEY,
"KEY", UNIQUE,
"UNIQUE", UUID,
"UUID", ADD,
"ADD", CONSTRAINT,
"CONSTRAINT", FOREIGN,
"FOREIGN", REFERENCES,
"REFERENCES",
]; ];
} }