use std::collections::HashSet;
use once_cell::sync::Lazy;
pub static KEYWORDS: Lazy<HashSet<&'static str>> = Lazy::new(|| {
keyword_slice()
.iter()
.copied()
.chain(SQL_STANDARD_EXTRAS.iter().copied())
.collect()
});
pub static TYPES: Lazy<HashSet<&'static str>> =
Lazy::new(|| TYPE_WORDS.iter().copied().collect::<HashSet<_>>());
pub static FUNCTIONS: Lazy<HashSet<&'static str>> =
Lazy::new(|| FUNCTION_WORDS.iter().copied().collect::<HashSet<_>>());
pub static CLAUSE_KEYWORDS: Lazy<HashSet<&'static str>> =
Lazy::new(|| CLAUSE_WORDS.iter().copied().collect::<HashSet<_>>());
pub fn is_keyword(word: &str) -> bool {
KEYWORDS.contains(word.to_ascii_uppercase().as_str())
}
pub fn is_type(word: &str) -> bool {
TYPES.contains(word.to_ascii_uppercase().as_str())
}
pub fn is_function(word: &str) -> bool {
FUNCTIONS.contains(word.to_ascii_lowercase().as_str())
}
pub fn is_clause_keyword(word: &str) -> bool {
CLAUSE_KEYWORDS.contains(word.to_ascii_uppercase().as_str())
}
fn keyword_slice() -> &'static [&'static str] {
&[
"ABORT",
"ABSOLUTE",
"ACCESS",
"ACTION",
"ADD",
"ADMIN",
"AFTER",
"AGGREGATE",
"ALL",
"ALSO",
"ALTER",
"ALWAYS",
"ANALYSE",
"ANALYZE",
"AND",
"ANY",
"ARRAY",
"AS",
"ASC",
"ASSERT",
"ASSERTION",
"ASSIGNMENT",
"ASYMMETRIC",
"AT",
"ATOMIC",
"ATTACH",
"ATTRIBUTE",
"AUTHORIZATION",
"BACKWARD",
"BASE_TYPE",
"BEFORE",
"BEGIN",
"BERNOULLI",
"BETWEEN",
"BINARY",
"BOTH",
"BY",
"CACHE",
"CALL",
"CALLED",
"CASCADE",
"CASCADED",
"CASE",
"CAST",
"CATALOG",
"CHAIN",
"CHARACTERISTICS",
"CHECK",
"CHECKPOINT",
"CLASS",
"CLOSE",
"CLUSTER",
"COALESCE",
"COLLATE",
"COLLATION",
"COLUMN",
"COLUMNS",
"COMMENT",
"COMMENTS",
"COMMIT",
"COMMITTED",
"COMPRESSION",
"CONCURRENTLY",
"CONFIGURATION",
"CONFLICT",
"CONNECTION",
"CONSTRAINT",
"CONSTRAINTS",
"CONTENT",
"CONTINUE",
"CONVERSION",
"COPY",
"COST",
"CREATE",
"CROSS",
"CSV",
"CUBE",
"CURRENT",
"CURRENT_CATALOG",
"CURRENT_DATE",
"CURRENT_ROLE",
"CURRENT_SCHEMA",
"CURRENT_TIME",
"CURRENT_TIMESTAMP",
"CURRENT_USER",
"CURSOR",
"CYCLE",
"DATA",
"DATABASE",
"DATABASES",
"DAY",
"DEALLOCATE",
"DECLARE",
"DEFAULT",
"DEFAULTS",
"DEFERRABLE",
"DEFERRED",
"DEFINER",
"DELETE",
"DELIMITER",
"DELIMITERS",
"DESC",
"DETACH",
"DETAIL",
"DICTIONARY",
"DIAGNOSTICS",
"DISABLE",
"DISCARD",
"DISTINCT",
"DO",
"DOCUMENT",
"DOMAIN",
"DROP",
"EACH",
"ELSE",
"ELSIF",
"ENABLE",
"ENCODING",
"ENCRYPTED",
"END",
"ENFORCED",
"ENUM",
"ESCAPE",
"EVENT",
"EXCEPT",
"EXCEPTION",
"EXCLUDE",
"EXCLUDING",
"EXCLUSIVE",
"EXECUTE",
"EXISTS",
"EXPLAIN",
"EXPRESSION",
"EXTENSION",
"EXTERNAL",
"EXTRACT",
"EXIT",
"FALSE",
"FAMILY",
"FETCH",
"FILTER",
"FINALFUNC",
"FIRST",
"FORMAT",
"FOLLOWING",
"FOR",
"FOREACH",
"FORCE",
"FOREIGN",
"FORWARD",
"FREEZE",
"FROM",
"FULL",
"FUNCTION",
"FUNCTIONS",
"GENERATED",
"GET",
"GLOBAL",
"GRANT",
"GRANTED",
"GREATEST",
"GROUP",
"GROUPING",
"GROUPS",
"HANDLER",
"HAVING",
"HEADER",
"HINT",
"HOLD",
"HOUR",
"IDENTITY",
"IF",
"ILIKE",
"IGNORE",
"IMMEDIATE",
"IMMUTABLE",
"IMPLICIT",
"IN",
"INCLUDE",
"INCLUDING",
"INCREMENT",
"INDEX",
"INDEXES",
"INHERIT",
"INHERITS",
"INITIALLY",
"INLINE",
"INNER",
"INOUT",
"INPUT",
"INSENSITIVE",
"INSERT",
"INSTEAD",
"INTERSECT",
"INTERVAL",
"INTO",
"INVOKER",
"IS",
"ISNULL",
"ISOLATION",
"JOIN",
"KEY",
"LABEL",
"LANGUAGE",
"LARGE",
"LAST",
"LATERAL",
"LC_COLLATE",
"LC_CTYPE",
"LEADING",
"LEAKPROOF",
"LEAST",
"LEFT",
"LEVEL",
"LIKE",
"LIMIT",
"LIST",
"LISTEN",
"LOAD",
"LOCAL",
"LOCALTIME",
"LOCALTIMESTAMP",
"LOCATION",
"LOCK",
"LOCKED",
"LOG",
"LOGGED",
"LOG_VERBOSITY",
"LOGIN",
"LOOP",
"MAPPING",
"MATCH",
"MATCHED",
"MATERIALIZED",
"MAXVALUE",
"MERGE",
"MESSAGE_TEXT",
"MINVALUE",
"MODE",
"MONTH",
"MOVE",
"NAMES",
"NATIONAL",
"NATURAL",
"NEW",
"NEXT",
"NO",
"NOCREATEDB",
"NOCREATEROLE",
"NONE",
"NOSUPERUSER",
"NOT",
"NOTHING",
"NOTIFY",
"NOTICE",
"NOTNULL",
"NOWAIT",
"NULL",
"NULLIF",
"NULLS",
"OBJECT",
"OF",
"OFF",
"OFFSET",
"OIDS",
"OLD",
"ON",
"ON_ERROR",
"ONLY",
"OPERATOR",
"OPTION",
"OPTIONS",
"OR",
"ORDER",
"ORDINALITY",
"OTHERS",
"OUT",
"OUTER",
"OVER",
"OVERLAPS",
"OVERRIDING",
"OWNER",
"PARALLEL",
"PARSER",
"PARTIAL",
"PARTITION",
"PASSING",
"PASSWORD",
"PERFORM",
"PERIOD",
"PG_CONTEXT",
"PG_EXCEPTION_CONTEXT",
"PG_EXCEPTION_DETAIL",
"PG_EXCEPTION_HINT",
"PLACING",
"PLANS",
"POLICY",
"PRECEDING",
"PREPARE",
"PREPARED",
"PRESERVE",
"PRIMARY",
"PRIOR",
"PRIVILEGES",
"PROCEDURAL",
"PROCEDURE",
"PROCEDURES",
"PROGRAM",
"PUBLICATION",
"QUERY",
"QUOTE",
"RAISE",
"RANGE",
"READ",
"READ_ONLY",
"READ_WRITE",
"REJECT_LIMIT",
"REASSIGN",
"RECHECK",
"RECURSIVE",
"REFERENCES",
"REFERENCING",
"REFRESH",
"REINDEX",
"RELATIVE",
"RELEASE",
"RENAME",
"REPEATABLE",
"REPLACE",
"REPLICA",
"RESET",
"RESTART",
"RESTRICT",
"RETURN",
"RETURNED_SQLSTATE",
"RETURNING",
"RETURNS",
"REVOKE",
"RIGHT",
"ROLE",
"ROLLBACK",
"ROLLUP",
"ROUTINE",
"ROUTINES",
"ROW",
"ROW_COUNT",
"ROWS",
"RULE",
"SAVEPOINT",
"SCHEMA",
"SCHEMAS",
"SCROLL",
"SEARCH",
"SECOND",
"SECURITY",
"SELECT",
"SEQUENCE",
"SEQUENCES",
"SERIALIZABLE",
"SERVER",
"SESSION",
"SESSION_USER",
"SET",
"SETOF",
"SETS",
"SHARE",
"SHOW",
"SILENT",
"SIMILAR",
"SIMPLE",
"SKIP",
"SNAPSHOT",
"SOME",
"STABLE",
"STACKED",
"STANDALONE",
"START",
"STATEMENT",
"STATISTICS",
"STDIN",
"STDOUT",
"STORAGE",
"STORED",
"STRICT",
"STRIP",
"SUBSCRIPTION",
"SYMMETRIC",
"SYSID",
"SYSTEM",
"TABLE",
"TABLES",
"TABLESAMPLE",
"TABLESPACE",
"TEMP",
"TEMPLATE",
"TEMPORARY",
"TERMINATED",
"THEN",
"TIES",
"TO",
"TRAILING",
"TRANSACTION",
"TRANSFORM",
"TREAT",
"TRIGGER",
"TRIM",
"TRUE",
"TRUNCATE",
"TRUSTED",
"TYPE",
"TYPES",
"UESCAPE",
"UNBOUNDED",
"UNCOMMITTED",
"UNENCRYPTED",
"UNION",
"UNIQUE",
"UNKNOWN",
"UNLISTEN",
"UNLOGGED",
"UNTIL",
"UPDATE",
"USER",
"USING",
"VACUUM",
"VALID",
"VALIDATE",
"VALIDATOR",
"VALUE",
"VALUES",
"VARIADIC",
"VERBOSE",
"VERSION",
"VIEW",
"VIRTUAL",
"VOLATILE",
"WARNING",
"WHEN",
"WHERE",
"WHITESPACE",
"WINDOW",
"WITH",
"WITHIN",
"WITHOUT",
"WORK",
"WRAPPER",
"WRITE",
"XMLATTRIBUTES",
"XMLCONCAT",
"XMLELEMENT",
"XMLEXISTS",
"XMLFOREST",
"XMLNAMESPACES",
"XMLPARSE",
"XMLPI",
"XMLROOT",
"XMLSERIALIZE",
"XMLTABLE",
"YEAR",
"YES",
"ZONE",
]
}
const SQL_STANDARD_EXTRAS: &[&str] = &[
"ABS",
"ALLOCATE",
"ARE",
"ARRAY_AGG",
"AVG",
"CARDINALITY",
"CHAR_LENGTH",
"CHARACTER_LENGTH",
"COLLECT",
"CORR",
"COUNT",
"COVAR_POP",
"COVAR_SAMP",
"CUME_DIST",
"DENSE_RANK",
"ELEMENT",
"EVERY",
"EXP",
"FLOOR",
"FUSION",
"INTERSECTION",
"JSON_ARRAY",
"JSON_ARRAYAGG",
"JSON_EXISTS",
"JSON_OBJECT",
"JSON_OBJECTAGG",
"JSON_QUERY",
"JSON_SCALAR",
"JSON_SERIALIZE",
"JSON_TABLE",
"JSON_VALUE",
"LAG",
"LEAD",
"LN",
"LOG",
"LOWER",
"MAX",
"MIN",
"MOD",
"PERCENT_RANK",
"PERCENTILE_CONT",
"PERCENTILE_DISC",
"POSITION",
"POWER",
"RANK",
"REGR_AVGX",
"REGR_AVGY",
"REGR_COUNT",
"REGR_INTERCEPT",
"REGR_R2",
"REGR_SLOPE",
"REGR_SXX",
"REGR_SXY",
"REGR_SYY",
"ROW_NUMBER",
"STDDEV_POP",
"STDDEV_SAMP",
"SUBSTRING",
"SUM",
"TRANSLATE",
"UPPER",
"VAR_POP",
"VAR_SAMP",
];
const TYPE_WORDS: &[&str] = &[
"ANYARRAY",
"ANYCOMPATIBLE",
"ANYCOMPATIBLEARRAY",
"ANYCOMPATIBLENONARRAY",
"ANYCOMPATIBLERANGE",
"ANYELEMENT",
"ANYENUM",
"ANYNONARRAY",
"ANYRANGE",
"BIGINT",
"BIGSERIAL",
"BIT",
"BOOLEAN",
"BOOL",
"BOX",
"BYTEA",
"CHAR",
"CHARACTER",
"CIDR",
"CIRCLE",
"DATE",
"DEC",
"DECIMAL",
"DOUBLE",
"FLOAT",
"FLOAT4",
"FLOAT8",
"INET",
"INT",
"INT2",
"INT4",
"INT4RANGE",
"INT8",
"INT8RANGE",
"INTEGER",
"INTERVAL",
"JSON",
"JSONB",
"JSONPATH",
"LINE",
"LSEG",
"MACADDR",
"MACADDR8",
"MONEY",
"NAME",
"NUMERIC",
"NUMRANGE",
"OID",
"PATH",
"PG_LSN",
"POINT",
"POLYGON",
"PRECISION",
"REAL",
"REGCLASS",
"REGCOLLATION",
"REGCONFIG",
"REGDICTIONARY",
"REGNAMESPACE",
"REGOPER",
"REGOPERATOR",
"REGPROC",
"REGPROCEDURE",
"REGROLE",
"REGTYPE",
"SERIAL",
"SMALLINT",
"SMALLSERIAL",
"TEXT",
"TIME",
"TIMESTAMP",
"TIMESTAMPTZ",
"TIMETZ",
"TID",
"TSQUERY",
"TSRANGE",
"TSTZRANGE",
"TSVECTOR",
"TXID_SNAPSHOT",
"UUID",
"VARBIT",
"VARCHAR",
"VARYING",
"XML",
"ZONE",
];
const FUNCTION_WORDS: &[&str] = &[
"abs",
"age",
"array_agg",
"array_append",
"array_cat",
"array_dims",
"array_fill",
"array_length",
"array_lower",
"array_position",
"array_positions",
"array_remove",
"array_replace",
"array_sort",
"array_to_json",
"array_to_string",
"array_upper",
"ascii",
"avg",
"bit_length",
"btrim",
"cardinality",
"casefold",
"cast",
"ceil",
"ceiling",
"char_length",
"character_length",
"chr",
"clock_timestamp",
"coalesce",
"concat",
"concat_ws",
"corr",
"count",
"crc32",
"crc32c",
"cume_dist",
"current_catalog",
"current_database",
"current_date",
"current_role",
"current_schema",
"current_schemas",
"current_setting",
"current_time",
"current_timestamp",
"current_user",
"currval",
"date_bin",
"date_part",
"date_trunc",
"dense_rank",
"div",
"enum_first",
"enum_last",
"enum_range",
"every",
"exp",
"extract",
"factorial",
"first_value",
"floor",
"format",
"gamma",
"gen_random_uuid",
"generate_series",
"generate_subscripts",
"greatest",
"json_agg",
"json_array",
"json_array_elements",
"json_array_elements_text",
"json_array_length",
"json_build_array",
"json_build_object",
"json_each",
"json_each_text",
"json_extract_path",
"json_extract_path_text",
"json_object",
"json_object_agg",
"json_object_keys",
"json_populate_record",
"json_populate_recordset",
"json_strip_nulls",
"json_to_record",
"json_to_recordset",
"json_to_tsvector",
"json_typeof",
"jsonb_agg",
"jsonb_array_elements",
"jsonb_array_elements_text",
"jsonb_array_length",
"jsonb_build_array",
"jsonb_build_object",
"jsonb_each",
"jsonb_each_text",
"jsonb_extract_path",
"jsonb_extract_path_text",
"jsonb_insert",
"jsonb_object",
"jsonb_object_agg",
"jsonb_object_keys",
"jsonb_path_exists",
"jsonb_path_match",
"jsonb_path_query",
"jsonb_path_query_array",
"jsonb_path_query_first",
"jsonb_populate_record",
"jsonb_populate_recordset",
"jsonb_pretty",
"jsonb_set",
"jsonb_set_lax",
"jsonb_strip_nulls",
"jsonb_to_record",
"jsonb_to_recordset",
"jsonb_to_tsvector",
"jsonb_typeof",
"justify_days",
"justify_hours",
"justify_interval",
"lag",
"last_value",
"lastval",
"lead",
"least",
"left",
"length",
"ln",
"localtime",
"localtimestamp",
"log",
"lower",
"lpad",
"ltrim",
"make_date",
"make_interval",
"make_time",
"make_timestamp",
"make_timestamptz",
"max",
"md5",
"min",
"mod",
"now",
"ntile",
"nullif",
"num_nulls",
"num_nonnulls",
"octet_length",
"overlay",
"percent_rank",
"percentile_cont",
"percentile_disc",
"pg_backend_pid",
"pg_blocking_pids",
"pg_cancel_backend",
"pg_client_encoding",
"pg_column_size",
"pg_conf_load_time",
"pg_current_wal_flush_lsn",
"pg_current_wal_insert_lsn",
"pg_current_wal_lsn",
"pg_get_expr",
"pg_get_functiondef",
"pg_get_indexdef",
"pg_get_keywords",
"pg_get_serial_sequence",
"pg_get_viewdef",
"pg_relation_size",
"pg_reload_conf",
"pg_size_pretty",
"pg_table_size",
"pg_terminate_backend",
"position",
"power",
"quote_ident",
"quote_literal",
"quote_nullable",
"random",
"rank",
"regexp_count",
"regexp_instr",
"regexp_like",
"regexp_match",
"regexp_matches",
"regexp_replace",
"regexp_split_to_array",
"regexp_split_to_table",
"repeat",
"replace",
"right",
"round",
"row_number",
"rpad",
"rtrim",
"session_user",
"set_config",
"setseed",
"split_part",
"sqrt",
"starts_with",
"stddev",
"stddev_pop",
"stddev_samp",
"string_agg",
"string_to_array",
"string_to_table",
"strpos",
"substr",
"substring",
"sum",
"timeofday",
"to_ascii",
"to_char",
"to_date",
"to_hex",
"to_json",
"to_jsonb",
"to_number",
"to_regclass",
"to_regcollation",
"to_regnamespace",
"to_regoper",
"to_regoperator",
"to_regproc",
"to_regprocedure",
"to_regrole",
"to_regtype",
"to_timestamp",
"to_tsquery",
"to_tsvector",
"transaction_timestamp",
"translate",
"trim",
"trunc",
"ts_debug",
"ts_headline",
"ts_lexize",
"upper",
"uuid_extract_timestamp",
"uuid_extract_version",
"uuidv4",
"uuidv7",
"var_pop",
"var_samp",
"variance",
"version",
"width_bucket",
"xmlagg",
"xmlconcat",
"xmlelement",
"xmlexists",
"xmlforest",
"xmlparse",
"xmlpi",
"xmlroot",
"xmlserialize",
"xmltable",
];
const CLAUSE_WORDS: &[&str] = &[
"SELECT",
"FROM",
"WHERE",
"GROUP",
"HAVING",
"WINDOW",
"ORDER",
"LIMIT",
"OFFSET",
"FETCH",
"FOR",
"VALUES",
"SET",
"RETURNING",
"INTO",
"USING",
"WITH",
"ON",
"WHEN",
"THEN",
"ELSE",
"ELSIF",
"EXCEPTION",
];