123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 |
- /**
- * @param {string} value
- * @returns {RegExp}
- * */
- /**
- * @param {RegExp | string } re
- * @returns {string}
- */
- function source(re) {
- if (!re) return null;
- if (typeof re === "string") return re;
- return re.source;
- }
- /**
- * @param {...(RegExp | string) } args
- * @returns {string}
- */
- function concat(...args) {
- const joined = args.map((x) => source(x)).join("");
- return joined;
- }
- /**
- * Any of the passed expresssions may match
- *
- * Creates a huge this | this | that | that match
- * @param {(RegExp | string)[] } args
- * @returns {string}
- */
- function either(...args) {
- const joined = '(' + args.map((x) => source(x)).join("|") + ")";
- return joined;
- }
- /*
- Language: SQL
- Website: https://en.wikipedia.org/wiki/SQL
- Category: common, database
- */
- function sql(hljs) {
- const COMMENT_MODE = hljs.COMMENT('--', '$');
- const STRING = {
- className: 'string',
- variants: [
- {
- begin: /'/,
- end: /'/,
- contains: [
- {begin: /''/ }
- ]
- }
- ]
- };
- const QUOTED_IDENTIFIER = {
- begin: /"/,
- end: /"/,
- contains: [ { begin: /""/ } ]
- };
- const LITERALS = [
- "true",
- "false",
- // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.
- // "null",
- "unknown"
- ];
- const MULTI_WORD_TYPES = [
- "double precision",
- "large object",
- "with timezone",
- "without timezone"
- ];
- const TYPES = [
- 'bigint',
- 'binary',
- 'blob',
- 'boolean',
- 'char',
- 'character',
- 'clob',
- 'date',
- 'dec',
- 'decfloat',
- 'decimal',
- 'float',
- 'int',
- 'integer',
- 'interval',
- 'nchar',
- 'nclob',
- 'national',
- 'numeric',
- 'real',
- 'row',
- 'smallint',
- 'time',
- 'timestamp',
- 'varchar',
- 'varying', // modifier (character varying)
- 'varbinary'
- ];
- const NON_RESERVED_WORDS = [
- "add",
- "asc",
- "collation",
- "desc",
- "final",
- "first",
- "last",
- "view"
- ];
- // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word
- const RESERVED_WORDS = [
- "abs",
- "acos",
- "all",
- "allocate",
- "alter",
- "and",
- "any",
- "are",
- "array",
- "array_agg",
- "array_max_cardinality",
- "as",
- "asensitive",
- "asin",
- "asymmetric",
- "at",
- "atan",
- "atomic",
- "authorization",
- "avg",
- "begin",
- "begin_frame",
- "begin_partition",
- "between",
- "bigint",
- "binary",
- "blob",
- "boolean",
- "both",
- "by",
- "call",
- "called",
- "cardinality",
- "cascaded",
- "case",
- "cast",
- "ceil",
- "ceiling",
- "char",
- "char_length",
- "character",
- "character_length",
- "check",
- "classifier",
- "clob",
- "close",
- "coalesce",
- "collate",
- "collect",
- "column",
- "commit",
- "condition",
- "connect",
- "constraint",
- "contains",
- "convert",
- "copy",
- "corr",
- "corresponding",
- "cos",
- "cosh",
- "count",
- "covar_pop",
- "covar_samp",
- "create",
- "cross",
- "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_path",
- "current_role",
- "current_transform_group_for_type",
- "current_user",
- "cursor",
- "cycle",
- "date",
- "day",
- "deallocate",
- "dec",
- "decimal",
- "decfloat",
- "declare",
- "default",
- "define",
- "delete",
- "dense_rank",
- "deref",
- "describe",
- "deterministic",
- "disconnect",
- "distinct",
- "double",
- "drop",
- "dynamic",
- "each",
- "element",
- "else",
- "empty",
- "end",
- "end_frame",
- "end_partition",
- "end-exec",
- "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",
- "hold",
- "hour",
- "identity",
- "in",
- "indicator",
- "initial",
- "inner",
- "inout",
- "insensitive",
- "insert",
- "int",
- "integer",
- "intersect",
- "intersection",
- "interval",
- "into",
- "is",
- "join",
- "json_array",
- "json_arrayagg",
- "json_exists",
- "json_object",
- "json_objectagg",
- "json_query",
- "json_table",
- "json_table_primitive",
- "json_value",
- "lag",
- "language",
- "large",
- "last_value",
- "lateral",
- "lead",
- "leading",
- "left",
- "like",
- "like_regex",
- "listagg",
- "ln",
- "local",
- "localtime",
- "localtimestamp",
- "log",
- "log10",
- "lower",
- "match",
- "match_number",
- "match_recognize",
- "matches",
- "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",
- "octet_length",
- "occurrences_regex",
- "of",
- "offset",
- "old",
- "omit",
- "on",
- "one",
- "only",
- "open",
- "or",
- "order",
- "out",
- "outer",
- "over",
- "overlaps",
- "overlay",
- "parameter",
- "partition",
- "pattern",
- "per",
- "percent",
- "percent_rank",
- "percentile_cont",
- "percentile_disc",
- "period",
- "portion",
- "position",
- "position_regex",
- "power",
- "precedes",
- "precision",
- "prepare",
- "primary",
- "procedure",
- "ptf",
- "range",
- "rank",
- "reads",
- "real",
- "recursive",
- "ref",
- "references",
- "referencing",
- "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",
- "running",
- "savepoint",
- "scope",
- "scroll",
- "search",
- "second",
- "seek",
- "select",
- "sensitive",
- "session_user",
- "set",
- "show",
- "similar",
- "sin",
- "sinh",
- "skip",
- "smallint",
- "some",
- "specific",
- "specifictype",
- "sql",
- "sqlexception",
- "sqlstate",
- "sqlwarning",
- "sqrt",
- "start",
- "static",
- "stddev_pop",
- "stddev_samp",
- "submultiset",
- "subset",
- "substring",
- "substring_regex",
- "succeeds",
- "sum",
- "symmetric",
- "system",
- "system_time",
- "system_user",
- "table",
- "tablesample",
- "tan",
- "tanh",
- "then",
- "time",
- "timestamp",
- "timezone_hour",
- "timezone_minute",
- "to",
- "trailing",
- "translate",
- "translate_regex",
- "translation",
- "treat",
- "trigger",
- "trim",
- "trim_array",
- "true",
- "truncate",
- "uescape",
- "union",
- "unique",
- "unknown",
- "unnest",
- "update ",
- "upper",
- "user",
- "using",
- "value",
- "values",
- "value_of",
- "var_pop",
- "var_samp",
- "varbinary",
- "varchar",
- "varying",
- "versioning",
- "when",
- "whenever",
- "where",
- "width_bucket",
- "window",
- "with",
- "within",
- "without",
- "year",
- ];
- // these are reserved words we have identified to be functions
- // and should only be highlighted in a dispatch-like context
- // ie, array_agg(...), etc.
- const RESERVED_FUNCTIONS = [
- "abs",
- "acos",
- "array_agg",
- "asin",
- "atan",
- "avg",
- "cast",
- "ceil",
- "ceiling",
- "coalesce",
- "corr",
- "cos",
- "cosh",
- "count",
- "covar_pop",
- "covar_samp",
- "cume_dist",
- "dense_rank",
- "deref",
- "element",
- "exp",
- "extract",
- "first_value",
- "floor",
- "json_array",
- "json_arrayagg",
- "json_exists",
- "json_object",
- "json_objectagg",
- "json_query",
- "json_table",
- "json_table_primitive",
- "json_value",
- "lag",
- "last_value",
- "lead",
- "listagg",
- "ln",
- "log",
- "log10",
- "lower",
- "max",
- "min",
- "mod",
- "nth_value",
- "ntile",
- "nullif",
- "percent_rank",
- "percentile_cont",
- "percentile_disc",
- "position",
- "position_regex",
- "power",
- "rank",
- "regr_avgx",
- "regr_avgy",
- "regr_count",
- "regr_intercept",
- "regr_r2",
- "regr_slope",
- "regr_sxx",
- "regr_sxy",
- "regr_syy",
- "row_number",
- "sin",
- "sinh",
- "sqrt",
- "stddev_pop",
- "stddev_samp",
- "substring",
- "substring_regex",
- "sum",
- "tan",
- "tanh",
- "translate",
- "translate_regex",
- "treat",
- "trim",
- "trim_array",
- "unnest",
- "upper",
- "value_of",
- "var_pop",
- "var_samp",
- "width_bucket",
- ];
- // these functions can
- const POSSIBLE_WITHOUT_PARENS = [
- "current_catalog",
- "current_date",
- "current_default_transform_group",
- "current_path",
- "current_role",
- "current_schema",
- "current_transform_group_for_type",
- "current_user",
- "session_user",
- "system_time",
- "system_user",
- "current_time",
- "localtime",
- "current_timestamp",
- "localtimestamp"
- ];
- // those exist to boost relevance making these very
- // "SQL like" keyword combos worth +1 extra relevance
- const COMBOS = [
- "create table",
- "insert into",
- "primary key",
- "foreign key",
- "not null",
- "alter table",
- "add constraint",
- "grouping sets",
- "on overflow",
- "character set",
- "respect nulls",
- "ignore nulls",
- "nulls first",
- "nulls last",
- "depth first",
- "breadth first"
- ];
- const FUNCTIONS = RESERVED_FUNCTIONS;
- const KEYWORDS = [...RESERVED_WORDS, ...NON_RESERVED_WORDS].filter((keyword) => {
- return !RESERVED_FUNCTIONS.includes(keyword);
- });
- const VARIABLE = {
- className: "variable",
- begin: /@[a-z0-9]+/,
- };
- const OPERATOR = {
- className: "operator",
- begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,
- relevance: 0,
- };
- const FUNCTION_CALL = {
- begin: concat(/\b/, either(...FUNCTIONS), /\s*\(/),
- keywords: {
- built_in: FUNCTIONS
- }
- };
- // keywords with less than 3 letters are reduced in relevancy
- function reduceRelevancy(list, {exceptions, when} = {}) {
- const qualifyFn = when;
- exceptions = exceptions || [];
- return list.map((item) => {
- if (item.match(/\|\d+$/) || exceptions.includes(item)) {
- return item;
- } else if (qualifyFn(item)) {
- return `${item}|0`;
- } else {
- return item;
- }
- });
- }
- return {
- name: 'SQL',
- case_insensitive: true,
- // does not include {} or HTML tags `</`
- illegal: /[{}]|<\//,
- keywords: {
- $pattern: /\b[\w\.]+/,
- keyword:
- reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),
- literal: LITERALS,
- type: TYPES,
- built_in: POSSIBLE_WITHOUT_PARENS
- },
- contains: [
- {
- begin: either(...COMBOS),
- keywords: {
- $pattern: /[\w\.]+/,
- keyword: KEYWORDS.concat(COMBOS),
- literal: LITERALS,
- type: TYPES
- },
- },
- {
- className: "type",
- begin: either(...MULTI_WORD_TYPES)
- },
- FUNCTION_CALL,
- VARIABLE,
- STRING,
- QUOTED_IDENTIFIER,
- hljs.C_NUMBER_MODE,
- hljs.C_BLOCK_COMMENT_MODE,
- COMMENT_MODE,
- OPERATOR
- ]
- };
- }
- module.exports = sql;
|