From ff3985d0279520518d612ae8b89abe2b2b670319 Mon Sep 17 00:00:00 2001 From: Dxuian <92696836+Dxuian@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:33:36 +0530 Subject: [PATCH] fix(sql) fix multi-word combos with flexible spacing (#4106) Co-authored-by: Josh Goebel --- CHANGES.md | 1 + src/languages/sql.js | 51 ++++++++----- test/markup/sql/combos.expect.txt | 118 ++++++++++++++++++++++++++++++ test/markup/sql/combos.txt | 118 ++++++++++++++++++++++++++++++ 4 files changed, 268 insertions(+), 20 deletions(-) create mode 100644 test/markup/sql/combos.expect.txt create mode 100644 test/markup/sql/combos.txt diff --git a/CHANGES.md b/CHANGES.md index f42f4d4304..660d950582 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -20,6 +20,7 @@ Core Grammars: - fix(c) - Fixed hex numbers with decimals [Dxuian] - fix(typescript) - Fixedoptional property not highlighted correctly [Dxuian] - fix(ruby) - fix `|=` operator false positives (as block arguments) [Aboobacker MK] +- fix(sql) - Fixed sql primary key and foreign key spacing issue [Dxuian] New Grammars: diff --git a/src/languages/sql.js b/src/languages/sql.js index 1093f19abc..1db7380285 100644 --- a/src/languages/sql.js +++ b/src/languages/sql.js @@ -24,19 +24,19 @@ export default function(hljs) { const regex = hljs.regex; const COMMENT_MODE = hljs.COMMENT('--', '$'); const STRING = { - className: 'string', + scope: 'string', variants: [ { begin: /'/, end: /'/, - contains: [ { begin: /''/ } ] + contains: [ { match: /''/ } ] } ] }; const QUOTED_IDENTIFIER = { begin: /"/, end: /"/, - contains: [ { begin: /""/ } ] + contains: [ { match: /""/ } ] }; const LITERALS = [ @@ -606,22 +606,42 @@ export default function(hljs) { }); const VARIABLE = { - className: "variable", - begin: /@[a-z0-9][a-z0-9_]*/, + scope: "variable", + match: /@[a-z0-9][a-z0-9_]*/, }; const OPERATOR = { - className: "operator", - begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + scope: "operator", + match: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, relevance: 0, }; const FUNCTION_CALL = { - begin: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/), + match: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/), relevance: 0, keywords: { built_in: FUNCTIONS } }; + // turns a multi-word keyword combo into a regex that doesn't + // care about extra whitespace etc. + // input: "START QUERY" + // output: /\bSTART\s+QUERY\b/ + function kws_to_regex(list) { + return regex.concat( + /\b/, + regex.either(...list.map((kw) => { + return kw.replace(/\s+/, "\\s+") + })), + /\b/ + ) + } + + const MULTI_WORD_KEYWORDS = { + scope: "keyword", + match: kws_to_regex(COMBOS), + relevance: 0, + }; + // keywords with less than 3 letters are reduced in relevancy function reduceRelevancy(list, { exceptions, when @@ -654,19 +674,10 @@ export default function(hljs) { }, contains: [ { - begin: regex.either(...COMBOS), - relevance: 0, - keywords: { - $pattern: /[\w\.]+/, - keyword: KEYWORDS.concat(COMBOS), - literal: LITERALS, - type: TYPES - }, - }, - { - className: "type", - begin: regex.either(...MULTI_WORD_TYPES) + scope: "type", + match: kws_to_regex(MULTI_WORD_TYPES) }, + MULTI_WORD_KEYWORDS, FUNCTION_CALL, VARIABLE, STRING, diff --git a/test/markup/sql/combos.expect.txt b/test/markup/sql/combos.expect.txt new file mode 100644 index 0000000000..660d324198 --- /dev/null +++ b/test/markup/sql/combos.expect.txt @@ -0,0 +1,118 @@ +-- Basic Table with a Single Primary Key +CREATE TABLE users ( + id INT PRIMARY KEY, + username VARCHAR(50), + email VARCHAR(100) +); + +-- Table with Composite Primary Key +CREATE TABLE orders ( + order_id INT, + user_id INT, + PRIMARY KEY (order_id, user_id) +); + +-- Table with Primary Key and Auto Increment +CREATE TABLE products ( + product_id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100), + price DECIMAL(10, 2) +); + +-- Table with Primary Key and Foreign Key +CREATE TABLE order_items ( + item_id INT, + order_id INT, + product_id INT, + PRIMARY KEY (item_id), + FOREIGN KEY (order_id) REFERENCES orders(order_id) +); + +-- Table with Date and Primary Key +CREATE TABLE events ( + event_id INT PRIMARY KEY, + event_name VARCHAR(100), + event_date DATE +); + +-- Basic Table with a Single Primary Key +CREATE +TABLE +users +( +id +INT +PRIMARY +KEY, +username +VARCHAR(50), +email +VARCHAR(100) +); + +-- Table with Composite Primary Key +CREATE +TABLE +orders +( +order_id +INT, +user_id +INT, +PRIMARY +KEY +(order_id, +user_id) +); + +-- Table with Primary Key and Auto Increment +CREATE +TABLE +products +( +product_id +INT +PRIMARY +KEY +AUTO_INCREMENT, +name +VARCHAR(100), +price +DECIMAL(10, 2) +); + +-- Table with Primary Key and Foreign Key +CREATE +TABLE +order_items +( +item_id +INT, +order_id +INT, +product_id +INT, +PRIMARY +KEY +(item_id), +FOREIGN +KEY +(order_id) +REFERENCES +orders(order_id) +); + +-- Table with Date and Primary Key +CREATE +TABLE +events +( +event_id +INT +PRIMARY +KEY, +event_name +VARCHAR(100), +event_date +DATE with timezone +); diff --git a/test/markup/sql/combos.txt b/test/markup/sql/combos.txt new file mode 100644 index 0000000000..def888929a --- /dev/null +++ b/test/markup/sql/combos.txt @@ -0,0 +1,118 @@ +-- Basic Table with a Single Primary Key +CREATE TABLE users ( + id INT PRIMARY KEY, + username VARCHAR(50), + email VARCHAR(100) +); + +-- Table with Composite Primary Key +CREATE TABLE orders ( + order_id INT, + user_id INT, + PRIMARY KEY (order_id, user_id) +); + +-- Table with Primary Key and Auto Increment +CREATE TABLE products ( + product_id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(100), + price DECIMAL(10, 2) +); + +-- Table with Primary Key and Foreign Key +CREATE TABLE order_items ( + item_id INT, + order_id INT, + product_id INT, + PRIMARY KEY (item_id), + FOREIGN KEY (order_id) REFERENCES orders(order_id) +); + +-- Table with Date and Primary Key +CREATE TABLE events ( + event_id INT PRIMARY KEY, + event_name VARCHAR(100), + event_date DATE +); + +-- Basic Table with a Single Primary Key +CREATE +TABLE +users +( +id +INT +PRIMARY +KEY, +username +VARCHAR(50), +email +VARCHAR(100) +); + +-- Table with Composite Primary Key +CREATE +TABLE +orders +( +order_id +INT, +user_id +INT, +PRIMARY +KEY +(order_id, +user_id) +); + +-- Table with Primary Key and Auto Increment +CREATE +TABLE +products +( +product_id +INT +PRIMARY +KEY +AUTO_INCREMENT, +name +VARCHAR(100), +price +DECIMAL(10, 2) +); + +-- Table with Primary Key and Foreign Key +CREATE +TABLE +order_items +( +item_id +INT, +order_id +INT, +product_id +INT, +PRIMARY +KEY +(item_id), +FOREIGN +KEY +(order_id) +REFERENCES +orders(order_id) +); + +-- Table with Date and Primary Key +CREATE +TABLE +events +( +event_id +INT +PRIMARY +KEY, +event_name +VARCHAR(100), +event_date +DATE with timezone +);