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 @@
+
+CREATE TABLE users (
+ id INT PRIMARY KEY,
+ username VARCHAR(50),
+ email VARCHAR(100)
+);
+
+
+CREATE TABLE orders (
+ order_id INT,
+ user_id INT,
+ PRIMARY KEY (order_id, user_id)
+);
+
+
+CREATE TABLE products (
+ product_id INT PRIMARY KEY AUTO_INCREMENT,
+ name VARCHAR(100),
+ price DECIMAL(10, 2)
+);
+
+
+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)
+);
+
+
+CREATE TABLE events (
+ event_id INT PRIMARY KEY,
+ event_name VARCHAR(100),
+ event_date DATE
+);
+
+
+CREATE
+TABLE
+users
+(
+id
+INT
+PRIMARY
+KEY,
+username
+VARCHAR(50),
+email
+VARCHAR(100)
+);
+
+
+CREATE
+TABLE
+orders
+(
+order_id
+INT,
+user_id
+INT,
+PRIMARY
+KEY
+(order_id,
+user_id)
+);
+
+
+CREATE
+TABLE
+products
+(
+product_id
+INT
+PRIMARY
+KEY
+AUTO_INCREMENT,
+name
+VARCHAR(100),
+price
+DECIMAL(10, 2)
+);
+
+
+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)
+);
+
+
+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
+);