--- name: SQL fileTypes: - sql - ddl - dml scopeName: source.sql repository: string_interpolation: name: string.interpolated.sql captures: "1": name: punctuation.definition.string.end.sql match: (#\{)([^\}]*)(\}) comments: patterns: - name: comment.line.double-dash.sql captures: "1": name: punctuation.definition.comment.sql match: (--).*$\n? - name: comment.line.number-sign.sql captures: "1": name: punctuation.definition.comment.sql match: (#).*$\n? - name: comment.block.c captures: "0": name: punctuation.definition.comment.sql begin: /\* end: \*/ string_escape: name: constant.character.escape.sql match: \\. strings: patterns: - name: string.quoted.single.sql captures: "1": name: punctuation.definition.string.begin.sql "3": name: punctuation.definition.string.end.sql match: (')[^'\\]*(') comment: this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines. - name: string.quoted.single.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: "'" beginCaptures: "0": name: punctuation.definition.string.begin.sql end: "'" patterns: - include: "#string_escape" - name: string.quoted.other.backtick.sql captures: "1": name: punctuation.definition.string.begin.sql "3": name: punctuation.definition.string.end.sql match: (`)[^`\\]*(`) comment: this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines. - name: string.quoted.other.backtick.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: "`" beginCaptures: "0": name: punctuation.definition.string.begin.sql end: "`" patterns: - include: "#string_escape" - name: string.quoted.double.sql captures: "1": name: punctuation.definition.string.begin.sql "3": name: punctuation.definition.string.end.sql match: (")[^"#]*(") comment: this is faster than the next begin/end rule since sub-pattern will match till end-of-line and SQL files tend to have very long lines. - name: string.quoted.double.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: "\"" beginCaptures: "0": name: punctuation.definition.string.begin.sql end: "\"" patterns: - include: "#string_interpolation" - name: string.other.quoted.brackets.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: "%\\{" beginCaptures: "0": name: punctuation.definition.string.begin.sql end: \} patterns: - include: "#string_interpolation" regexps: patterns: - name: string.regexp.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: /(?=\S.*/) beginCaptures: "0": name: punctuation.definition.string.begin.sql end: / patterns: - include: "#string_interpolation" - name: constant.character.escape.slash.sql match: \\/ - name: string.regexp.modr.sql endCaptures: "0": name: punctuation.definition.string.end.sql begin: "%r\\{" beginCaptures: "0": name: punctuation.definition.string.begin.sql end: \} patterns: - include: "#string_interpolation" comment: We should probably handle nested bracket pairs!?! -- Allan uuid: C49120AC-6ECC-11D9-ACC8-000D93589AF6 foldingStartMarker: \s*\(\s*$ patterns: - name: meta.create.sql captures: "1": name: keyword.other.create.sql "2": name: keyword.other.sql "5": name: entity.name.function.sql match: (?i:^\s*(create)\s+(aggregate|conversion|database|domain|function|group|(unique\s+)?index|language|operator class|operator|rule|schema|sequence|table|tablespace|trigger|type|user|view)\s+)(['"`]?)(\w+)\4 - name: meta.drop.sql captures: "1": name: keyword.other.create.sql "2": name: keyword.other.sql match: (?i:^\s*(drop)\s+(aggregate|conversion|database|domain|function|group|index|language|operator class|operator|rule|schema|sequence|table|tablespace|trigger|type|user|view)) - name: meta.drop.sql captures: "1": name: keyword.other.create.sql "2": name: keyword.other.table.sql "3": name: entity.name.function.sql "4": name: keyword.other.cascade.sql match: (?i:\s*(drop)\s+(table)\s+(\w+)(\s+cascade)?\b) - name: meta.alter.sql captures: "1": name: keyword.other.create.sql "2": name: keyword.other.table.sql match: (?i:^\s*(alter)\s+(aggregate|conversion|database|domain|function|group|index|language|operator class|operator|rule|schema|sequence|table|tablespace|trigger|type|user|view)\s+) - captures: "6": name: storage.type.sql "11": name: storage.type.sql "7": name: constant.numeric.sql "12": name: storage.type.sql "8": name: constant.numeric.sql "13": name: storage.type.sql "9": name: storage.type.sql "14": name: constant.numeric.sql "15": name: storage.type.sql "1": name: storage.type.sql "2": name: storage.type.sql "3": name: constant.numeric.sql "4": name: storage.type.sql "10": name: constant.numeric.sql "5": name: constant.numeric.sql match: "(?xi)\n\n\ \t\t\t\t# normal stuff, capture 1\n\ \t\t\t\t \\b(bigint|bigserial|bit|boolean|box|bytea|cidr|circle|date|double\\sprecision|inet|int|integer|line|lseg|macaddr|money|oid|path|point|polygon|real|serial|smallint|sysdate|text)\\b\n\n\ \t\t\t\t# numeric suffix, capture 2 + 3i\n\ \t\t\t\t|\\b(bit\\svarying|character\\s(?:varying)?|tinyint|var\\schar|float|interval)\\((\\d+)\\)\n\n\ \t\t\t\t# optional numeric suffix, capture 4 + 5i\n\ \t\t\t\t|\\b(char|number|varchar\\d?)\\b(?:\\((\\d+)\\))?\n\n\ \t\t\t\t# special case, capture 6 + 7i + 8i\n\ \t\t\t\t|\\b(numeric)\\b(?:\\((\\d+),(\\d+)\\))?\n\n\ \t\t\t\t# special case, captures 9, 10i, 11\n\ \t\t\t\t|\\b(times)(?:\\((\\d+)\\))(\\swithoutstimeszone\\b)?\n\n\ \t\t\t\t# special case, captures 12, 13, 14i, 15\n\ \t\t\t\t|\\b(timestamp)(?:(s)\\((\\d+)\\)(\\swithoutstimeszone\\b)?)?\n\n\ \t\t\t" - name: storage.modifier.sql match: (?i:\b((?:primary|foreign)\s+key|references|on\sdelete(\s+cascade)?|check|constraint)\b) - name: constant.numeric.sql match: \d+ - name: keyword.other.DML.sql match: (?i:\b(select(\s+distinct)?|insert\s+(ignore\s+)?into|update|delete|from|set|where|group\sby|and|union(\s+all)?|having|order\sby|limit|(inner|cross)\s+join|straight_join|(left|right)(\s+outer)?\s+join|natural(\s+(left|right)(\s+outer)?)?\s+join)\b) - name: keyword.other.DDL.create.II.sql match: (?i:\b(on\s+|(not\s+)?null)\b) - name: keyword.other.DML.II.sql match: (?i:\bvalues\b) - name: keyword.other.LUW.sql match: (?i:\b(begin(\s+work)?|start\s+transaction|commit(\s+work)?|rollback(\s+work)?)\b) - name: keyword.other.authorization.sql match: (?i:\b(grant(\swith\sgrant\soption)?|revoke)\b) - name: keyword.other.data-integrity.sql match: (?i:\bin\b) - name: keyword.other.object-comments.sql match: (?i:^\s*(comment\s+on\s+(table|column|aggregate|constraint|database|domain|function|index|operator|rule|schema|sequence|trigger|type|view))\s+.*?\s+(is)\s+) - include: "#comments" - include: "#strings" - include: "#regexps" foldingStopMarker: ^\s*\) keyEquivalent: ^~S