/ src / theme / languages / sql.js
sql.js
  1  /*! `sql` grammar compiled for Highlight.js 11.10.0 */
  2    (function(){
  3      var hljsGrammar = (function () {
  4    'use strict';
  5  
  6    /*
  7     Language: SQL
  8     Website: https://en.wikipedia.org/wiki/SQL
  9     Category: common, database
 10     */
 11  
 12    /*
 13  
 14    Goals:
 15  
 16    SQL is intended to highlight basic/common SQL keywords and expressions
 17  
 18    - If pretty much every single SQL server includes supports, then it's a canidate.
 19    - It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,
 20      PostgreSQL) although the list of data types is purposely a bit more expansive.
 21    - For more specific SQL grammars please see:
 22      - PostgreSQL and PL/pgSQL - core
 23      - T-SQL - https://github.com/highlightjs/highlightjs-tsql
 24      - sql_more (core)
 25  
 26     */
 27  
 28    function sql(hljs) {
 29      const regex = hljs.regex;
 30      const COMMENT_MODE = hljs.COMMENT('--', '$');
 31      const STRING = {
 32        className: 'string',
 33        variants: [
 34          {
 35            begin: /'/,
 36            end: /'/,
 37            contains: [ { begin: /''/ } ]
 38          }
 39        ]
 40      };
 41      const QUOTED_IDENTIFIER = {
 42        begin: /"/,
 43        end: /"/,
 44        contains: [ { begin: /""/ } ]
 45      };
 46  
 47      const LITERALS = [
 48        "true",
 49        "false",
 50        // Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.
 51        // "null",
 52        "unknown"
 53      ];
 54  
 55      const MULTI_WORD_TYPES = [
 56        "double precision",
 57        "large object",
 58        "with timezone",
 59        "without timezone"
 60      ];
 61  
 62      const TYPES = [
 63        'bigint',
 64        'binary',
 65        'blob',
 66        'boolean',
 67        'char',
 68        'character',
 69        'clob',
 70        'date',
 71        'dec',
 72        'decfloat',
 73        'decimal',
 74        'float',
 75        'int',
 76        'integer',
 77        'interval',
 78        'nchar',
 79        'nclob',
 80        'national',
 81        'numeric',
 82        'real',
 83        'row',
 84        'smallint',
 85        'time',
 86        'timestamp',
 87        'varchar',
 88        'varying', // modifier (character varying)
 89        'varbinary'
 90      ];
 91  
 92      const NON_RESERVED_WORDS = [
 93        "add",
 94        "asc",
 95        "collation",
 96        "desc",
 97        "final",
 98        "first",
 99        "last",
100        "view"
101      ];
102  
103      // https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word
104      const RESERVED_WORDS = [
105        "abs",
106        "acos",
107        "all",
108        "allocate",
109        "alter",
110        "and",
111        "any",
112        "are",
113        "array",
114        "array_agg",
115        "array_max_cardinality",
116        "as",
117        "asensitive",
118        "asin",
119        "asymmetric",
120        "at",
121        "atan",
122        "atomic",
123        "authorization",
124        "avg",
125        "begin",
126        "begin_frame",
127        "begin_partition",
128        "between",
129        "bigint",
130        "binary",
131        "blob",
132        "boolean",
133        "both",
134        "by",
135        "call",
136        "called",
137        "cardinality",
138        "cascaded",
139        "case",
140        "cast",
141        "ceil",
142        "ceiling",
143        "char",
144        "char_length",
145        "character",
146        "character_length",
147        "check",
148        "classifier",
149        "clob",
150        "close",
151        "coalesce",
152        "collate",
153        "collect",
154        "column",
155        "commit",
156        "condition",
157        "connect",
158        "constraint",
159        "contains",
160        "convert",
161        "copy",
162        "corr",
163        "corresponding",
164        "cos",
165        "cosh",
166        "count",
167        "covar_pop",
168        "covar_samp",
169        "create",
170        "cross",
171        "cube",
172        "cume_dist",
173        "current",
174        "current_catalog",
175        "current_date",
176        "current_default_transform_group",
177        "current_path",
178        "current_role",
179        "current_row",
180        "current_schema",
181        "current_time",
182        "current_timestamp",
183        "current_path",
184        "current_role",
185        "current_transform_group_for_type",
186        "current_user",
187        "cursor",
188        "cycle",
189        "date",
190        "day",
191        "deallocate",
192        "dec",
193        "decimal",
194        "decfloat",
195        "declare",
196        "default",
197        "define",
198        "delete",
199        "dense_rank",
200        "deref",
201        "describe",
202        "deterministic",
203        "disconnect",
204        "distinct",
205        "double",
206        "drop",
207        "dynamic",
208        "each",
209        "element",
210        "else",
211        "empty",
212        "end",
213        "end_frame",
214        "end_partition",
215        "end-exec",
216        "equals",
217        "escape",
218        "every",
219        "except",
220        "exec",
221        "execute",
222        "exists",
223        "exp",
224        "external",
225        "extract",
226        "false",
227        "fetch",
228        "filter",
229        "first_value",
230        "float",
231        "floor",
232        "for",
233        "foreign",
234        "frame_row",
235        "free",
236        "from",
237        "full",
238        "function",
239        "fusion",
240        "get",
241        "global",
242        "grant",
243        "group",
244        "grouping",
245        "groups",
246        "having",
247        "hold",
248        "hour",
249        "identity",
250        "in",
251        "indicator",
252        "initial",
253        "inner",
254        "inout",
255        "insensitive",
256        "insert",
257        "int",
258        "integer",
259        "intersect",
260        "intersection",
261        "interval",
262        "into",
263        "is",
264        "join",
265        "json_array",
266        "json_arrayagg",
267        "json_exists",
268        "json_object",
269        "json_objectagg",
270        "json_query",
271        "json_table",
272        "json_table_primitive",
273        "json_value",
274        "lag",
275        "language",
276        "large",
277        "last_value",
278        "lateral",
279        "lead",
280        "leading",
281        "left",
282        "like",
283        "like_regex",
284        "listagg",
285        "ln",
286        "local",
287        "localtime",
288        "localtimestamp",
289        "log",
290        "log10",
291        "lower",
292        "match",
293        "match_number",
294        "match_recognize",
295        "matches",
296        "max",
297        "member",
298        "merge",
299        "method",
300        "min",
301        "minute",
302        "mod",
303        "modifies",
304        "module",
305        "month",
306        "multiset",
307        "national",
308        "natural",
309        "nchar",
310        "nclob",
311        "new",
312        "no",
313        "none",
314        "normalize",
315        "not",
316        "nth_value",
317        "ntile",
318        "null",
319        "nullif",
320        "numeric",
321        "octet_length",
322        "occurrences_regex",
323        "of",
324        "offset",
325        "old",
326        "omit",
327        "on",
328        "one",
329        "only",
330        "open",
331        "or",
332        "order",
333        "out",
334        "outer",
335        "over",
336        "overlaps",
337        "overlay",
338        "parameter",
339        "partition",
340        "pattern",
341        "per",
342        "percent",
343        "percent_rank",
344        "percentile_cont",
345        "percentile_disc",
346        "period",
347        "portion",
348        "position",
349        "position_regex",
350        "power",
351        "precedes",
352        "precision",
353        "prepare",
354        "primary",
355        "procedure",
356        "ptf",
357        "range",
358        "rank",
359        "reads",
360        "real",
361        "recursive",
362        "ref",
363        "references",
364        "referencing",
365        "regr_avgx",
366        "regr_avgy",
367        "regr_count",
368        "regr_intercept",
369        "regr_r2",
370        "regr_slope",
371        "regr_sxx",
372        "regr_sxy",
373        "regr_syy",
374        "release",
375        "result",
376        "return",
377        "returns",
378        "revoke",
379        "right",
380        "rollback",
381        "rollup",
382        "row",
383        "row_number",
384        "rows",
385        "running",
386        "savepoint",
387        "scope",
388        "scroll",
389        "search",
390        "second",
391        "seek",
392        "select",
393        "sensitive",
394        "session_user",
395        "set",
396        "show",
397        "similar",
398        "sin",
399        "sinh",
400        "skip",
401        "smallint",
402        "some",
403        "specific",
404        "specifictype",
405        "sql",
406        "sqlexception",
407        "sqlstate",
408        "sqlwarning",
409        "sqrt",
410        "start",
411        "static",
412        "stddev_pop",
413        "stddev_samp",
414        "submultiset",
415        "subset",
416        "substring",
417        "substring_regex",
418        "succeeds",
419        "sum",
420        "symmetric",
421        "system",
422        "system_time",
423        "system_user",
424        "table",
425        "tablesample",
426        "tan",
427        "tanh",
428        "then",
429        "time",
430        "timestamp",
431        "timezone_hour",
432        "timezone_minute",
433        "to",
434        "trailing",
435        "translate",
436        "translate_regex",
437        "translation",
438        "treat",
439        "trigger",
440        "trim",
441        "trim_array",
442        "true",
443        "truncate",
444        "uescape",
445        "union",
446        "unique",
447        "unknown",
448        "unnest",
449        "update",
450        "upper",
451        "user",
452        "using",
453        "value",
454        "values",
455        "value_of",
456        "var_pop",
457        "var_samp",
458        "varbinary",
459        "varchar",
460        "varying",
461        "versioning",
462        "when",
463        "whenever",
464        "where",
465        "width_bucket",
466        "window",
467        "with",
468        "within",
469        "without",
470        "year",
471      ];
472  
473      // these are reserved words we have identified to be functions
474      // and should only be highlighted in a dispatch-like context
475      // ie, array_agg(...), etc.
476      const RESERVED_FUNCTIONS = [
477        "abs",
478        "acos",
479        "array_agg",
480        "asin",
481        "atan",
482        "avg",
483        "cast",
484        "ceil",
485        "ceiling",
486        "coalesce",
487        "corr",
488        "cos",
489        "cosh",
490        "count",
491        "covar_pop",
492        "covar_samp",
493        "cume_dist",
494        "dense_rank",
495        "deref",
496        "element",
497        "exp",
498        "extract",
499        "first_value",
500        "floor",
501        "json_array",
502        "json_arrayagg",
503        "json_exists",
504        "json_object",
505        "json_objectagg",
506        "json_query",
507        "json_table",
508        "json_table_primitive",
509        "json_value",
510        "lag",
511        "last_value",
512        "lead",
513        "listagg",
514        "ln",
515        "log",
516        "log10",
517        "lower",
518        "max",
519        "min",
520        "mod",
521        "nth_value",
522        "ntile",
523        "nullif",
524        "percent_rank",
525        "percentile_cont",
526        "percentile_disc",
527        "position",
528        "position_regex",
529        "power",
530        "rank",
531        "regr_avgx",
532        "regr_avgy",
533        "regr_count",
534        "regr_intercept",
535        "regr_r2",
536        "regr_slope",
537        "regr_sxx",
538        "regr_sxy",
539        "regr_syy",
540        "row_number",
541        "sin",
542        "sinh",
543        "sqrt",
544        "stddev_pop",
545        "stddev_samp",
546        "substring",
547        "substring_regex",
548        "sum",
549        "tan",
550        "tanh",
551        "translate",
552        "translate_regex",
553        "treat",
554        "trim",
555        "trim_array",
556        "unnest",
557        "upper",
558        "value_of",
559        "var_pop",
560        "var_samp",
561        "width_bucket",
562      ];
563  
564      // these functions can
565      const POSSIBLE_WITHOUT_PARENS = [
566        "current_catalog",
567        "current_date",
568        "current_default_transform_group",
569        "current_path",
570        "current_role",
571        "current_schema",
572        "current_transform_group_for_type",
573        "current_user",
574        "session_user",
575        "system_time",
576        "system_user",
577        "current_time",
578        "localtime",
579        "current_timestamp",
580        "localtimestamp"
581      ];
582  
583      // those exist to boost relevance making these very
584      // "SQL like" keyword combos worth +1 extra relevance
585      const COMBOS = [
586        "create table",
587        "insert into",
588        "primary key",
589        "foreign key",
590        "not null",
591        "alter table",
592        "add constraint",
593        "grouping sets",
594        "on overflow",
595        "character set",
596        "respect nulls",
597        "ignore nulls",
598        "nulls first",
599        "nulls last",
600        "depth first",
601        "breadth first"
602      ];
603  
604      const FUNCTIONS = RESERVED_FUNCTIONS;
605  
606      const KEYWORDS = [
607        ...RESERVED_WORDS,
608        ...NON_RESERVED_WORDS
609      ].filter((keyword) => {
610        return !RESERVED_FUNCTIONS.includes(keyword);
611      });
612  
613      const VARIABLE = {
614        className: "variable",
615        begin: /@[a-z0-9][a-z0-9_]*/,
616      };
617  
618      const OPERATOR = {
619        className: "operator",
620        begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,
621        relevance: 0,
622      };
623  
624      const FUNCTION_CALL = {
625        begin: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/),
626        relevance: 0,
627        keywords: { built_in: FUNCTIONS }
628      };
629  
630      // keywords with less than 3 letters are reduced in relevancy
631      function reduceRelevancy(list, {
632        exceptions, when
633      } = {}) {
634        const qualifyFn = when;
635        exceptions = exceptions || [];
636        return list.map((item) => {
637          if (item.match(/\|\d+$/) || exceptions.includes(item)) {
638            return item;
639          } else if (qualifyFn(item)) {
640            return `${item}|0`;
641          } else {
642            return item;
643          }
644        });
645      }
646  
647      return {
648        name: 'SQL',
649        case_insensitive: true,
650        // does not include {} or HTML tags `</`
651        illegal: /[{}]|<\//,
652        keywords: {
653          $pattern: /\b[\w\.]+/,
654          keyword:
655            reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),
656          literal: LITERALS,
657          type: TYPES,
658          built_in: POSSIBLE_WITHOUT_PARENS
659        },
660        contains: [
661          {
662            begin: regex.either(...COMBOS),
663            relevance: 0,
664            keywords: {
665              $pattern: /[\w\.]+/,
666              keyword: KEYWORDS.concat(COMBOS),
667              literal: LITERALS,
668              type: TYPES
669            },
670          },
671          {
672            className: "type",
673            begin: regex.either(...MULTI_WORD_TYPES)
674          },
675          FUNCTION_CALL,
676          VARIABLE,
677          STRING,
678          QUOTED_IDENTIFIER,
679          hljs.C_NUMBER_MODE,
680          hljs.C_BLOCK_COMMENT_MODE,
681          COMMENT_MODE,
682          OPERATOR
683        ]
684      };
685    }
686  
687    return sql;
688  
689  })();
690  
691      hljs.registerLanguage('sql', hljsGrammar);
692    })();