| 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;
 |