Skip to content

Commit 177e21d

Browse files
authored
Merge pull request #21 from mtxr/master
Better formatting for MSSQL when using National Characters
2 parents a363070 + 076761a commit 177e21d

File tree

4 files changed

+33
-22
lines changed

4 files changed

+33
-22
lines changed

src/core/Tokenizer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,12 @@ export default class Tokenizer {
5454
// 2. square bracket quoted string (SQL Server) using ]] to escape
5555
// 3. double quoted string using "" or \" to escape
5656
// 4. single quoted string using '' or \' to escape
57+
// 5. national character quoted string using N'' or N\' to escape
5758
createStringPattern(stringTypes) {
5859
const patterns = {
5960
"\"\"": "((\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*(\"|$))+)",
6061
"''": "(('[^'\\\\]*(?:\\\\.[^'\\\\]*)*('|$))+)",
62+
"N''": "((N'[^N'\\\\]*(?:\\\\.[^N'\\\\]*)*('|$))+)",
6163
"``": "((`[^`]*($|`))+)",
6264
"[]": "((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)",
6365
};

src/languages/StandardSqlFormatter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export default class StandardSqlFormatter {
7373
reservedWords,
7474
reservedToplevelWords,
7575
reservedNewlineWords,
76-
stringTypes: [`""`, "''", "``", "[]"],
76+
stringTypes: [`""`, "N''", "''", "``", "[]"],
7777
openParens: ["("],
7878
closeParens: [")"],
7979
indexedPlaceholderTypes: ["?"],

test/StandardSqlFormatterTest.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,36 @@ describe("StandardSqlFormatter", function() {
202202
);
203203
});
204204

205+
it("formats simple SELECT", function() {
206+
const result = sqlFormatter.format("SELECT 'value'", );
207+
expect(result).toBe(
208+
"SELECT\n" +
209+
" 'value'\n"
210+
);
211+
});
212+
213+
it("formats SELECT with complex WHERE", function() {
214+
const result = sqlFormatter.format(
215+
"SELECT * FROM foo WHERE Column1 = N'testing' AND Column2 = 'testing'" +
216+
"AND ( (Column3 = Column4 OR Column5 >= NOW()) );"
217+
);
218+
expect(result).toBe(
219+
"SELECT\n" +
220+
" *\n" +
221+
"FROM\n" +
222+
" foo\n" +
223+
"WHERE\n" +
224+
" Column1 = N'testing'\n" +
225+
" AND Column2 = 'testing'\n" +
226+
" AND (\n" +
227+
" (\n" +
228+
" Column3 = Column4\n" +
229+
" OR Column5 >= NOW()\n" +
230+
" )\n" +
231+
" );\n"
232+
);
233+
});
234+
205235
it("formats SELECT query with OUTER APPLY", function() {
206236
const result = sqlFormatter.format("SELECT a, b FROM t OUTER APPLY fn(t.id)", {
207237
language: "sql",

test/behavesLikeSqlFormatter.js

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,6 @@ export default function behavesLikeSqlFormatter(language) {
6060
);
6161
});
6262

63-
it("formats SELECT with complex WHERE", function() {
64-
const result = format(
65-
"SELECT * FROM foo WHERE Column1 = 'testing' " +
66-
"AND ( (Column2 = Column3 OR Column4 >= NOW()) );"
67-
);
68-
expect(result).toBe(
69-
"SELECT\n" +
70-
" *\n" +
71-
"FROM\n" +
72-
" foo\n" +
73-
"WHERE\n" +
74-
" Column1 = 'testing'\n" +
75-
" AND (\n" +
76-
" (\n" +
77-
" Column2 = Column3\n" +
78-
" OR Column4 >= NOW()\n" +
79-
" )\n" +
80-
" );\n"
81-
);
82-
});
83-
8463
it("formats SELECT with toplevel reserved words", function() {
8564
const result = format(
8665
"SELECT * FROM foo WHERE name = 'John' GROUP BY some_column " +

0 commit comments

Comments
 (0)