sql-format-plus 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2429 @@
1
+ const INDENT_TYPE_TOP_LEVEL = 'top-level';
2
+ const INDENT_TYPE_BLOCK_LEVEL = 'block-level';
3
+ const INDENT_TYPE_KEYWORD_BLOCK = 'keyword-block';
4
+ /**
5
+ * 管理 SQL 格式化的缩进层级。
6
+ *
7
+ * 跟踪嵌套的格式化层级以计算缩进前缀字符串。
8
+ * 支持三种不同的层级类型:
9
+ * - `block-level`:由左括号增加
10
+ * - `top-level`:由顶级保留关键字(例如 SELECT、FROM)增加
11
+ * - `keyword-block`:由 BEGIN、LOOP 等方言关键字块增加
12
+ */
13
+ class Indentation {
14
+ /**
15
+ * 初始化缩进管理器。
16
+ *
17
+ * @param {string} [indent] 缩进字符/字符串(默认为两个空格:' ')。
18
+ */
19
+ constructor(indent) {
20
+ this.indentTypes = [];
21
+ this.indent = indent || ' ';
22
+ }
23
+ /**
24
+ * 根据当前处于活动状态的缩进层级生成缩进前缀字符串。
25
+ *
26
+ * @returns {string} 累积的缩进空格或制表符。
27
+ */
28
+ getIndent() {
29
+ return this.indent.repeat(this.indentTypes.length);
30
+ }
31
+ /**
32
+ * 增加顶级保留字的缩进层级。
33
+ */
34
+ increaseToplevel() {
35
+ this.indentTypes.push(INDENT_TYPE_TOP_LEVEL);
36
+ }
37
+ /**
38
+ * 增加括号块的缩进层级。
39
+ */
40
+ increaseBlockLevel() {
41
+ this.indentTypes.push(INDENT_TYPE_BLOCK_LEVEL);
42
+ }
43
+ /**
44
+ * 增加关键字块的缩进层级。
45
+ */
46
+ increaseKeywordBlock() {
47
+ this.indentTypes.push(INDENT_TYPE_KEYWORD_BLOCK);
48
+ }
49
+ /**
50
+ * 通过弹出最后一个顶级项来减少顶级缩进层级。
51
+ */
52
+ decreaseTopLevel() {
53
+ if (this.indentTypes[this.indentTypes.length - 1] === INDENT_TYPE_TOP_LEVEL) {
54
+ this.indentTypes.pop();
55
+ }
56
+ }
57
+ /**
58
+ * 减少块级缩进。
59
+ * 弹出所有尾部的顶级缩进,直到移除最近的块级缩进。
60
+ */
61
+ decreaseBlockLevel() {
62
+ while (this.indentTypes[this.indentTypes.length - 1] === INDENT_TYPE_TOP_LEVEL) {
63
+ this.indentTypes.pop();
64
+ }
65
+ if (this.indentTypes[this.indentTypes.length - 1] === INDENT_TYPE_BLOCK_LEVEL) {
66
+ this.indentTypes.pop();
67
+ }
68
+ }
69
+ /**
70
+ * 只在栈顶确实是关键字块时减少缩进,避免污染括号层级。
71
+ */
72
+ decreaseKeywordBlock() {
73
+ while (this.indentTypes[this.indentTypes.length - 1] === INDENT_TYPE_TOP_LEVEL) {
74
+ this.indentTypes.pop();
75
+ }
76
+ if (this.indentTypes[this.indentTypes.length - 1] ===
77
+ INDENT_TYPE_KEYWORD_BLOCK) {
78
+ this.indentTypes.pop();
79
+ }
80
+ }
81
+ isBlockLevel() {
82
+ return (this.indentTypes[this.indentTypes.length - 1] === INDENT_TYPE_BLOCK_LEVEL);
83
+ }
84
+ }
85
+
86
+ /**
87
+ * 表示已解析的 SQL Token 类型的常量。
88
+ */
89
+ const tokenTypes = {
90
+ WHITESPACE: 'whitespace',
91
+ WORD: 'word',
92
+ STRING: 'string',
93
+ RESERVED: 'reserved',
94
+ RESERVED_TOPLEVEL: 'reserved-toplevel',
95
+ RESERVED_NEWLINE: 'reserved-newline',
96
+ RESERVED_KEYWORD_BLOCK_START: 'reserved-keyword-block-start',
97
+ RESERVED_KEYWORD_BLOCK_END: 'reserved-keyword-block-end',
98
+ OPERATOR: 'operator',
99
+ OPEN_PAREN: 'open-paren',
100
+ CLOSE_PAREN: 'close-paren',
101
+ LINE_COMMENT: 'line-comment',
102
+ BLOCK_COMMENT: 'block-comment',
103
+ NUMBER: 'number',
104
+ PLACEHOLDER: 'placeholder',
105
+ };
106
+
107
+ const INLINE_MAX_LENGTH = 50;
108
+ /**
109
+ * 内联块的记账器。
110
+ *
111
+ * 内联块是短于最大长度(例如 50 个字符)的括号表达式。
112
+ * 这些块会保持在单行上,以节省空间并提高可读性,而不是在括号后插入换行。
113
+ */
114
+ class InlineBlock {
115
+ constructor() {
116
+ this.level = 0;
117
+ }
118
+ /**
119
+ * 如果可能,开始将括号表达式作为内联块进行跟踪。
120
+ *
121
+ * @param {Token[]} tokens 查询中的所有 Token。
122
+ * @param {number} index 当前左括号 Token 的索引。
123
+ */
124
+ beginIfPossible(tokens, index) {
125
+ if (this.level === 0 && this.isInlineBlock(tokens, index)) {
126
+ this.level = 1;
127
+ }
128
+ else if (this.level > 0) {
129
+ this.level++;
130
+ }
131
+ else {
132
+ this.level = 0;
133
+ }
134
+ }
135
+ /**
136
+ * 递减当前处于活动状态的嵌套内联块层级。
137
+ */
138
+ end() {
139
+ this.level--;
140
+ }
141
+ /**
142
+ * 检查是否存在活动的内联块。
143
+ *
144
+ * @returns {boolean} 如果在内联块内则返回 true,否则返回 false。
145
+ */
146
+ isActive() {
147
+ return this.level > 0;
148
+ }
149
+ /**
150
+ * 评估当前的括号组是否符合内联块的条件。
151
+ *
152
+ * 向前遍历 Token 直至匹配的右括号。
153
+ * 如果超过最大长度或包含受限 Token(例如注释、换行符、顶级关键字),则取消内联块格式。
154
+ *
155
+ * @param {Token[]} tokens 查询中的 Token。
156
+ * @param {number} index 当前左括号的索引。
157
+ * @returns {boolean} 如果该组可以进行内联格式化则返回 true。
158
+ */
159
+ isInlineBlock(tokens, index) {
160
+ let length = 0;
161
+ let level = 0;
162
+ const openingToken = tokens[index];
163
+ for (let i = index; i < tokens.length; i++) {
164
+ const token = tokens[i];
165
+ length += token.value.length;
166
+ if (length > INLINE_MAX_LENGTH) {
167
+ return false;
168
+ }
169
+ if (token.type === tokenTypes.OPEN_PAREN) {
170
+ level++;
171
+ }
172
+ else if (this.isClosingToken(token, openingToken)) {
173
+ level--;
174
+ if (level === 0) {
175
+ return true;
176
+ }
177
+ }
178
+ if (this.isForbiddenToken(token)) {
179
+ return false;
180
+ }
181
+ }
182
+ return false;
183
+ }
184
+ /**
185
+ * 检查 Token 是否在内联块中被禁用。
186
+ *
187
+ * 禁用的 Token 包括注释、顶级/换行保留字或分号。
188
+ *
189
+ * @param {Token} token 要检查的 Token。
190
+ * @returns {boolean} 如果 Token 在内联块中被禁用则返回 true。
191
+ */
192
+ isForbiddenToken({ type, value }) {
193
+ return (type === tokenTypes.RESERVED_TOPLEVEL ||
194
+ type === tokenTypes.RESERVED_NEWLINE ||
195
+ type === tokenTypes.RESERVED_KEYWORD_BLOCK_START ||
196
+ type === tokenTypes.LINE_COMMENT ||
197
+ type === tokenTypes.BLOCK_COMMENT ||
198
+ value === ';');
199
+ }
200
+ isClosingToken(token, openingToken) {
201
+ return (token.type === tokenTypes.CLOSE_PAREN ||
202
+ (/^CASE$/i.test(openingToken.value) &&
203
+ token.type === tokenTypes.RESERVED_KEYWORD_BLOCK_END));
204
+ }
205
+ }
206
+
207
+ /**
208
+ * 处理 SQL 查询字符串中占位符与参数值的替换。
209
+ */
210
+ class Params {
211
+ /**
212
+ * 初始化参数管理器。
213
+ *
214
+ * @param {ParamsMap} [params] 可选的参数映射(数组或键值对对象)。
215
+ */
216
+ constructor(params) {
217
+ this.index = 0;
218
+ this.params = params;
219
+ }
220
+ /**
221
+ * 获取与给定 Token 对应的参数值。
222
+ *
223
+ * 如果未提供 `params`,则返回原始 Token 值。
224
+ * 对于索引占位符,返回顺序参数或解析索引处的参数值。
225
+ * 对于命名占位符,返回与解析名称匹配的参数值。
226
+ *
227
+ * @param {Token} token 占位符 Token。
228
+ * @returns {string} 字符串形式的参数值或原始占位符。
229
+ */
230
+ get({ key, value }) {
231
+ if (!this.params) {
232
+ return value;
233
+ }
234
+ let param;
235
+ if (Array.isArray(this.params)) {
236
+ param = key ? this.params[Number(key)] : this.params[this.index++];
237
+ }
238
+ else if (key) {
239
+ param = this.params[key];
240
+ }
241
+ else {
242
+ param = this.params[this.index++];
243
+ }
244
+ return param === undefined ? value : String(param);
245
+ }
246
+ }
247
+
248
+ class OutputBuffer {
249
+ constructor() {
250
+ this.chunks = [];
251
+ }
252
+ append(value) {
253
+ if (value) {
254
+ this.chunks.push(value);
255
+ }
256
+ }
257
+ trimEnd() {
258
+ while (this.chunks.length > 0) {
259
+ const lastIndex = this.chunks.length - 1;
260
+ const chunk = this.chunks[lastIndex];
261
+ const trimmed = chunk.replace(/\s+$/, '');
262
+ if (trimmed.length === chunk.length) {
263
+ return;
264
+ }
265
+ if (trimmed.length > 0) {
266
+ this.chunks[lastIndex] = trimmed;
267
+ return;
268
+ }
269
+ this.chunks.pop();
270
+ }
271
+ }
272
+ addNewline(indent) {
273
+ this.trimEnd();
274
+ this.append(`\n${indent}`);
275
+ }
276
+ toString() {
277
+ return this.chunks.join('');
278
+ }
279
+ }
280
+ class Formatter {
281
+ constructor(cfg, tokenizer) {
282
+ this.previousReservedWord = {};
283
+ this.keywordBlockEndPending = false;
284
+ this.cfg = cfg || {};
285
+ this.indentation = new Indentation(this.cfg.indent);
286
+ this.inlineBlock = new InlineBlock();
287
+ this.params = new Params(this.cfg.params);
288
+ this.tokenizer = tokenizer;
289
+ }
290
+ format(query) {
291
+ const tokens = this.tokenizer.tokenize(query);
292
+ const formattedQuery = this.getFormattedQueryFromTokens(tokens);
293
+ return formattedQuery.trim();
294
+ }
295
+ getFormattedQueryFromTokens(tokens) {
296
+ const query = new OutputBuffer();
297
+ tokens.forEach((token, index) => {
298
+ if (token.type === tokenTypes.WHITESPACE) {
299
+ return;
300
+ }
301
+ if (token.type === tokenTypes.LINE_COMMENT) {
302
+ this.formatLineComment(token, query);
303
+ }
304
+ else if (token.type === tokenTypes.BLOCK_COMMENT) {
305
+ this.formatBlockComment(token, query);
306
+ }
307
+ else if (token.type === tokenTypes.RESERVED_KEYWORD_BLOCK_START) {
308
+ this.formatKeywordBlockStart(token, query);
309
+ this.previousReservedWord = token;
310
+ }
311
+ else if (token.type === tokenTypes.RESERVED_KEYWORD_BLOCK_END) {
312
+ this.formatKeywordBlockEnd(token, query);
313
+ this.previousReservedWord = token;
314
+ }
315
+ else if (token.type === tokenTypes.RESERVED_TOPLEVEL) {
316
+ this.formatToplevelReservedWord(token, query);
317
+ this.previousReservedWord = token;
318
+ }
319
+ else if (token.type === tokenTypes.RESERVED_NEWLINE) {
320
+ this.formatNewlineReservedWord(token, query);
321
+ this.previousReservedWord = token;
322
+ }
323
+ else if (token.type === tokenTypes.RESERVED) {
324
+ this.formatWithSpaces(token, query);
325
+ this.previousReservedWord = token;
326
+ }
327
+ else if (token.type === tokenTypes.OPEN_PAREN) {
328
+ this.formatOpeningParentheses(tokens, index, query);
329
+ }
330
+ else if (token.type === tokenTypes.CLOSE_PAREN) {
331
+ this.formatClosingParentheses(token, query);
332
+ }
333
+ else if (token.type === tokenTypes.PLACEHOLDER) {
334
+ this.formatPlaceholder(token, query);
335
+ }
336
+ else if (token.value === ',') {
337
+ this.formatComma(token, query);
338
+ }
339
+ else if (token.value === ':') {
340
+ this.formatWithSpaceAfter(token, query);
341
+ }
342
+ else if (token.value === ';') {
343
+ this.formatSemicolon(token, query);
344
+ }
345
+ else if (token.value === '.') {
346
+ this.formatWithoutSpaces(token, query);
347
+ }
348
+ else {
349
+ this.formatWithSpaces(token, query);
350
+ }
351
+ });
352
+ return query.toString();
353
+ }
354
+ formatLineComment(token, query) {
355
+ query.append(token.value);
356
+ this.addNewline(query);
357
+ }
358
+ formatBlockComment(token, query) {
359
+ this.addNewline(query);
360
+ query.append(this.indentComment(token.value));
361
+ this.addNewline(query);
362
+ }
363
+ indentComment(comment) {
364
+ return comment.replace(/\n/g, `\n${this.indentation.getIndent()}`);
365
+ }
366
+ formatKeywordBlockStart(token, query) {
367
+ if (/^LOOP$/i.test(token.value) &&
368
+ /^END$/i.test(this.previousReservedWord.value || '')) {
369
+ this.formatWithSpaces(token, query);
370
+ this.keywordBlockEndPending = true;
371
+ return;
372
+ }
373
+ this.indentation.decreaseTopLevel();
374
+ this.addNewline(query);
375
+ this.indentation.increaseKeywordBlock();
376
+ query.append(this.equalizeWhitespace(token.value));
377
+ this.addNewline(query);
378
+ }
379
+ formatKeywordBlockEnd(token, query) {
380
+ if (this.inlineBlock.isActive() || this.indentation.isBlockLevel()) {
381
+ this.formatClosingParentheses(token, query);
382
+ return;
383
+ }
384
+ this.indentation.decreaseKeywordBlock();
385
+ this.addNewline(query);
386
+ query.append(`${this.equalizeWhitespace(token.value)} `);
387
+ this.keywordBlockEndPending = true;
388
+ }
389
+ formatToplevelReservedWord(token, query) {
390
+ this.indentation.decreaseTopLevel();
391
+ this.addNewline(query);
392
+ this.indentation.increaseToplevel();
393
+ query.append(this.equalizeWhitespace(token.value));
394
+ this.addNewline(query);
395
+ }
396
+ formatNewlineReservedWord(token, query) {
397
+ this.addNewline(query);
398
+ query.append(`${this.equalizeWhitespace(token.value)} `);
399
+ }
400
+ equalizeWhitespace(value) {
401
+ return value.replace(/\s+/g, ' ');
402
+ }
403
+ formatOpeningParentheses(tokens, index, query) {
404
+ const previousToken = tokens[index - 1];
405
+ if (previousToken &&
406
+ previousToken.type !== tokenTypes.WHITESPACE &&
407
+ previousToken.type !== tokenTypes.OPEN_PAREN) {
408
+ query.trimEnd();
409
+ }
410
+ query.append(tokens[index].value);
411
+ this.inlineBlock.beginIfPossible(tokens, index);
412
+ if (!this.inlineBlock.isActive()) {
413
+ this.indentation.increaseBlockLevel();
414
+ this.addNewline(query);
415
+ }
416
+ }
417
+ formatClosingParentheses(token, query) {
418
+ if (this.inlineBlock.isActive()) {
419
+ this.inlineBlock.end();
420
+ this.formatWithSpaceAfter(token, query);
421
+ return;
422
+ }
423
+ this.indentation.decreaseBlockLevel();
424
+ this.addNewline(query);
425
+ this.formatWithSpaces(token, query);
426
+ }
427
+ formatPlaceholder(token, query) {
428
+ query.append(`${this.params.get(token)} `);
429
+ }
430
+ formatComma(token, query) {
431
+ query.trimEnd();
432
+ query.append(`${token.value} `);
433
+ if (this.inlineBlock.isActive()) {
434
+ return;
435
+ }
436
+ if (/^LIMIT$/i.test(this.previousReservedWord.value || '')) {
437
+ return;
438
+ }
439
+ this.addNewline(query);
440
+ }
441
+ formatWithSpaceAfter(token, query) {
442
+ query.trimEnd();
443
+ query.append(`${token.value} `);
444
+ }
445
+ formatWithoutSpaces(token, query) {
446
+ query.trimEnd();
447
+ query.append(token.value);
448
+ }
449
+ formatSemicolon(token, query) {
450
+ this.formatWithoutSpaces(token, query);
451
+ if (this.keywordBlockEndPending) {
452
+ this.addNewline(query);
453
+ this.keywordBlockEndPending = false;
454
+ }
455
+ }
456
+ formatWithSpaces(token, query) {
457
+ query.append(`${token.value} `);
458
+ }
459
+ addNewline(query) {
460
+ query.addNewline(this.indentation.getIndent());
461
+ }
462
+ }
463
+
464
+ const escapeRegExp = (value) => value.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
465
+ class Tokenizer {
466
+ constructor(cfg) {
467
+ this.WHITESPACE_REGEX = /(\s+)/y;
468
+ this.NUMBER_REGEX = /([0-9]+(\.[0-9]+)?|0x[0-9a-fA-F]+|0b[01]+)\b/y;
469
+ this.SIGNED_NUMBER_REGEX = /(-\s*(?:[0-9]+(\.[0-9]+)?|0x[0-9a-fA-F]+|0b[01]+)\b)/y;
470
+ this.ASSIGNMENT_REGEX = /(:=)/y;
471
+ this.OPERATOR_REGEX = /(!=|<>|==|<=|>=|!<|!>|\|\||::|->>|->|~~\*|~~|!~~\*|!~~|~\*|!~\*|!~|.)/y;
472
+ this.BLOCK_COMMENT_REGEX = /(\/\*[^]*?(?:\*\/|$))/y;
473
+ this.LINE_COMMENT_REGEX = this.createLineCommentRegex(cfg.lineCommentTypes);
474
+ this.RESERVED_TOPLEVEL_REGEX = this.createReservedWordRegex(cfg.reservedToplevelWords);
475
+ this.RESERVED_NEWLINE_REGEX = this.createReservedWordRegex(cfg.reservedNewlineWords);
476
+ this.RESERVED_PLAIN_REGEX = this.createReservedWordRegex(cfg.reservedWords);
477
+ this.KEYWORD_BLOCK_START_REGEX = this.createOptionalReservedWordRegex(cfg.keywordBlockStarts);
478
+ this.KEYWORD_BLOCK_END_REGEX = this.createOptionalReservedWordRegex(cfg.keywordBlockEnds);
479
+ this.WORD_REGEX = this.createWordRegex(cfg.specialWordChars);
480
+ this.STRING_REGEX = this.createStringRegex(cfg.stringTypes);
481
+ this.OPEN_PAREN_REGEX = this.createParenRegex(cfg.openParens);
482
+ this.CLOSE_PAREN_REGEX = this.createParenRegex(cfg.closeParens);
483
+ this.INDEXED_PLACEHOLDER_REGEX = this.createPlaceholderRegex(cfg.indexedPlaceholderTypes, '[0-9]*');
484
+ this.IDENT_NAMED_PLACEHOLDER_REGEX = this.createPlaceholderRegex(cfg.namedPlaceholderTypes, '[a-zA-Z0-9._$]+');
485
+ this.STRING_NAMED_PLACEHOLDER_REGEX = this.createPlaceholderRegex(cfg.namedPlaceholderTypes, this.createStringPattern(cfg.stringTypes));
486
+ }
487
+ tokenize(input) {
488
+ const tokens = [];
489
+ let previousSignificantToken;
490
+ let index = 0;
491
+ while (index < input.length) {
492
+ const token = this.getNextToken(input, index, previousSignificantToken);
493
+ index += token.value.length;
494
+ tokens.push(token);
495
+ if (token.type !== tokenTypes.WHITESPACE) {
496
+ previousSignificantToken = token;
497
+ }
498
+ }
499
+ return tokens;
500
+ }
501
+ createLineCommentRegex(lineCommentTypes) {
502
+ return new RegExp(`((?:${lineCommentTypes.map((c) => escapeRegExp(c)).join('|')}).*?(?:\n|$))`, 'y');
503
+ }
504
+ createReservedWordRegex(reservedWords) {
505
+ const reservedWordsPattern = reservedWords.join('|').replace(/ /g, '\\s+');
506
+ return new RegExp(`(${reservedWordsPattern})\\b`, 'iy');
507
+ }
508
+ createOptionalReservedWordRegex(reservedWords) {
509
+ if (!reservedWords || reservedWords.length === 0) {
510
+ return false;
511
+ }
512
+ return this.createReservedWordRegex(reservedWords);
513
+ }
514
+ createWordRegex(specialChars = []) {
515
+ return new RegExp(`([\\w${specialChars.map((c) => escapeRegExp(c)).join('')}]+)`, 'y');
516
+ }
517
+ createStringRegex(stringTypes) {
518
+ return new RegExp(`(${this.createStringPattern(stringTypes)})`, 'y');
519
+ }
520
+ createStringPattern(stringTypes) {
521
+ const patterns = {
522
+ '``': '((`[^`]*($|`))+)',
523
+ '[]': '((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)',
524
+ '""': '((\\"[^\\"\\\\]*(?:\\\\.[^\\"\\\\]*)*(\\"|$))+)',
525
+ "''": "(('[^'\\\\]*(?:\\\\.[^'\\\\]*)*('|$))+)",
526
+ "N''": "((N'[^N'\\\\]*(?:\\\\.[^N'\\\\]*)*('|$))+)",
527
+ };
528
+ return stringTypes.map((type) => patterns[type]).join('|');
529
+ }
530
+ createParenRegex(parens) {
531
+ return new RegExp(`(${parens.map((p) => this.escapeParen(p)).join('|')})`, 'iy');
532
+ }
533
+ escapeParen(paren) {
534
+ if (paren.length === 1) {
535
+ return escapeRegExp(paren);
536
+ }
537
+ return `\\b${paren}\\b`;
538
+ }
539
+ createPlaceholderRegex(types, pattern) {
540
+ if (!types || types.length === 0) {
541
+ return false;
542
+ }
543
+ const typesRegex = types.map((type) => escapeRegExp(type)).join('|');
544
+ return new RegExp(`((?:${typesRegex})(?:${pattern}))`, 'y');
545
+ }
546
+ getNextToken(input, index, previousToken) {
547
+ return (this.getWhitespaceToken(input, index) ||
548
+ this.getCommentToken(input, index) ||
549
+ this.getStringToken(input, index) ||
550
+ this.getOpenParenToken(input, index) ||
551
+ this.getCloseParenToken(input, index) ||
552
+ this.getAssignmentToken(input, index) ||
553
+ this.getPlaceholderToken(input, index) ||
554
+ this.getNumberToken(input, index, previousToken) ||
555
+ this.getKeywordBlockToken(input, index) ||
556
+ this.getReservedWordToken(input, index, previousToken) ||
557
+ this.getWordToken(input, index) ||
558
+ this.getOperatorToken(input, index));
559
+ }
560
+ getWhitespaceToken(input, index) {
561
+ return this.getTokenOnFirstMatch({
562
+ input,
563
+ index,
564
+ type: tokenTypes.WHITESPACE,
565
+ regex: this.WHITESPACE_REGEX,
566
+ });
567
+ }
568
+ getCommentToken(input, index) {
569
+ return (this.getLineCommentToken(input, index) ||
570
+ this.getBlockCommentToken(input, index));
571
+ }
572
+ getLineCommentToken(input, index) {
573
+ return this.getTokenOnFirstMatch({
574
+ input,
575
+ index,
576
+ type: tokenTypes.LINE_COMMENT,
577
+ regex: this.LINE_COMMENT_REGEX,
578
+ });
579
+ }
580
+ getBlockCommentToken(input, index) {
581
+ return this.getTokenOnFirstMatch({
582
+ input,
583
+ index,
584
+ type: tokenTypes.BLOCK_COMMENT,
585
+ regex: this.BLOCK_COMMENT_REGEX,
586
+ });
587
+ }
588
+ getStringToken(input, index) {
589
+ return this.getTokenOnFirstMatch({
590
+ input,
591
+ index,
592
+ type: tokenTypes.STRING,
593
+ regex: this.STRING_REGEX,
594
+ });
595
+ }
596
+ getOpenParenToken(input, index) {
597
+ return this.getTokenOnFirstMatch({
598
+ input,
599
+ index,
600
+ type: tokenTypes.OPEN_PAREN,
601
+ regex: this.OPEN_PAREN_REGEX,
602
+ });
603
+ }
604
+ getCloseParenToken(input, index) {
605
+ return this.getTokenOnFirstMatch({
606
+ input,
607
+ index,
608
+ type: tokenTypes.CLOSE_PAREN,
609
+ regex: this.CLOSE_PAREN_REGEX,
610
+ });
611
+ }
612
+ getAssignmentToken(input, index) {
613
+ return this.getTokenOnFirstMatch({
614
+ input,
615
+ index,
616
+ type: tokenTypes.OPERATOR,
617
+ regex: this.ASSIGNMENT_REGEX,
618
+ });
619
+ }
620
+ getPlaceholderToken(input, index) {
621
+ return (this.getIdentNamedPlaceholderToken(input, index) ||
622
+ this.getStringNamedPlaceholderToken(input, index) ||
623
+ this.getIndexedPlaceholderToken(input, index));
624
+ }
625
+ getIdentNamedPlaceholderToken(input, index) {
626
+ return this.getPlaceholderTokenWithKey({
627
+ input,
628
+ index,
629
+ regex: this.IDENT_NAMED_PLACEHOLDER_REGEX,
630
+ parseKey: (value) => value.slice(1),
631
+ });
632
+ }
633
+ getStringNamedPlaceholderToken(input, index) {
634
+ return this.getPlaceholderTokenWithKey({
635
+ input,
636
+ index,
637
+ regex: this.STRING_NAMED_PLACEHOLDER_REGEX,
638
+ parseKey: (value) => this.getEscapedPlaceholderKey({
639
+ key: value.slice(2, -1),
640
+ quoteChar: value.slice(-1),
641
+ }),
642
+ });
643
+ }
644
+ getIndexedPlaceholderToken(input, index) {
645
+ return this.getPlaceholderTokenWithKey({
646
+ input,
647
+ index,
648
+ regex: this.INDEXED_PLACEHOLDER_REGEX,
649
+ parseKey: (value) => value.slice(1),
650
+ });
651
+ }
652
+ getPlaceholderTokenWithKey({ input, index, regex, parseKey, }) {
653
+ const token = this.getTokenOnFirstMatch({
654
+ input,
655
+ index,
656
+ regex,
657
+ type: tokenTypes.PLACEHOLDER,
658
+ });
659
+ if (token) {
660
+ token.key = parseKey(token.value);
661
+ }
662
+ return token;
663
+ }
664
+ getEscapedPlaceholderKey({ key, quoteChar, }) {
665
+ return key.replace(new RegExp(`${escapeRegExp('\\')}${quoteChar}`, 'g'), quoteChar);
666
+ }
667
+ getNumberToken(input, index, previousToken) {
668
+ const signedNumber = this.canReadSignedNumber(previousToken)
669
+ ? this.getTokenOnFirstMatch({
670
+ input,
671
+ index,
672
+ type: tokenTypes.NUMBER,
673
+ regex: this.SIGNED_NUMBER_REGEX,
674
+ })
675
+ : undefined;
676
+ if (signedNumber) {
677
+ return signedNumber;
678
+ }
679
+ return this.getTokenOnFirstMatch({
680
+ input,
681
+ index,
682
+ type: tokenTypes.NUMBER,
683
+ regex: this.NUMBER_REGEX,
684
+ });
685
+ }
686
+ canReadSignedNumber(previousToken) {
687
+ return (!previousToken ||
688
+ previousToken.type === tokenTypes.OPERATOR ||
689
+ previousToken.type === tokenTypes.OPEN_PAREN ||
690
+ previousToken.value === ',');
691
+ }
692
+ getOperatorToken(input, index) {
693
+ return this.getTokenOnFirstMatch({
694
+ input,
695
+ index,
696
+ type: tokenTypes.OPERATOR,
697
+ regex: this.OPERATOR_REGEX,
698
+ });
699
+ }
700
+ getKeywordBlockToken(input, index) {
701
+ return (this.getTokenOnFirstMatch({
702
+ input,
703
+ index,
704
+ type: tokenTypes.RESERVED_KEYWORD_BLOCK_END,
705
+ regex: this.KEYWORD_BLOCK_END_REGEX,
706
+ }) ||
707
+ this.getTokenOnFirstMatch({
708
+ input,
709
+ index,
710
+ type: tokenTypes.RESERVED_KEYWORD_BLOCK_START,
711
+ regex: this.KEYWORD_BLOCK_START_REGEX,
712
+ }));
713
+ }
714
+ getReservedWordToken(input, index, previousToken) {
715
+ if ((previousToken === null || previousToken === void 0 ? void 0 : previousToken.value) === '.') {
716
+ return undefined;
717
+ }
718
+ return (this.getToplevelReservedToken(input, index) ||
719
+ this.getNewlineReservedToken(input, index) ||
720
+ this.getPlainReservedToken(input, index));
721
+ }
722
+ getToplevelReservedToken(input, index) {
723
+ return this.getTokenOnFirstMatch({
724
+ input,
725
+ index,
726
+ type: tokenTypes.RESERVED_TOPLEVEL,
727
+ regex: this.RESERVED_TOPLEVEL_REGEX,
728
+ });
729
+ }
730
+ getNewlineReservedToken(input, index) {
731
+ return this.getTokenOnFirstMatch({
732
+ input,
733
+ index,
734
+ type: tokenTypes.RESERVED_NEWLINE,
735
+ regex: this.RESERVED_NEWLINE_REGEX,
736
+ });
737
+ }
738
+ getPlainReservedToken(input, index) {
739
+ return this.getTokenOnFirstMatch({
740
+ input,
741
+ index,
742
+ type: tokenTypes.RESERVED,
743
+ regex: this.RESERVED_PLAIN_REGEX,
744
+ });
745
+ }
746
+ getWordToken(input, index) {
747
+ return this.getTokenOnFirstMatch({
748
+ input,
749
+ index,
750
+ type: tokenTypes.WORD,
751
+ regex: this.WORD_REGEX,
752
+ });
753
+ }
754
+ getTokenOnFirstMatch({ input, index, type, regex, }) {
755
+ if (!regex) {
756
+ return undefined;
757
+ }
758
+ regex.lastIndex = index;
759
+ const matches = regex.exec(input);
760
+ if (matches && matches.index === index) {
761
+ return { type, value: matches[1] };
762
+ }
763
+ return undefined;
764
+ }
765
+ }
766
+
767
+ const reservedWords$3 = [
768
+ 'ABS',
769
+ 'ACTIVATE',
770
+ 'ALIAS',
771
+ 'ALL',
772
+ 'ALLOCATE',
773
+ 'ALLOW',
774
+ 'ALTER',
775
+ 'ANY',
776
+ 'ARE',
777
+ 'ARRAY',
778
+ 'AS',
779
+ 'ASC',
780
+ 'ASENSITIVE',
781
+ 'ASSOCIATE',
782
+ 'ASUTIME',
783
+ 'ASYMMETRIC',
784
+ 'AT',
785
+ 'ATOMIC',
786
+ 'ATTRIBUTES',
787
+ 'AUDIT',
788
+ 'AUTHORIZATION',
789
+ 'AUX',
790
+ 'AUXILIARY',
791
+ 'AVG',
792
+ 'BEFORE',
793
+ 'BEGIN',
794
+ 'BETWEEN',
795
+ 'BIGINT',
796
+ 'BINARY',
797
+ 'BLOB',
798
+ 'BOOLEAN',
799
+ 'BOTH',
800
+ 'BUFFERPOOL',
801
+ 'BY',
802
+ 'CACHE',
803
+ 'CALL',
804
+ 'CALLED',
805
+ 'CAPTURE',
806
+ 'CARDINALITY',
807
+ 'CASCADED',
808
+ 'CASE',
809
+ 'CAST',
810
+ 'CCSID',
811
+ 'CEIL',
812
+ 'CEILING',
813
+ 'CHAR',
814
+ 'CHARACTER',
815
+ 'CHARACTER_LENGTH',
816
+ 'CHAR_LENGTH',
817
+ 'CHECK',
818
+ 'CLOB',
819
+ 'CLONE',
820
+ 'CLOSE',
821
+ 'CLUSTER',
822
+ 'COALESCE',
823
+ 'COLLATE',
824
+ 'COLLECT',
825
+ 'COLLECTION',
826
+ 'COLLID',
827
+ 'COLUMN',
828
+ 'COMMENT',
829
+ 'COMMIT',
830
+ 'CONCAT',
831
+ 'CONDITION',
832
+ 'CONNECT',
833
+ 'CONNECTION',
834
+ 'CONSTRAINT',
835
+ 'CONTAINS',
836
+ 'CONTINUE',
837
+ 'CONVERT',
838
+ 'CORR',
839
+ 'CORRESPONDING',
840
+ 'COUNT',
841
+ 'COUNT_BIG',
842
+ 'COVAR_POP',
843
+ 'COVAR_SAMP',
844
+ 'CREATE',
845
+ 'CROSS',
846
+ 'CUBE',
847
+ 'CUME_DIST',
848
+ 'CURRENT',
849
+ 'CURRENT_DATE',
850
+ 'CURRENT_DEFAULT_TRANSFORM_GROUP',
851
+ 'CURRENT_LC_CTYPE',
852
+ 'CURRENT_PATH',
853
+ 'CURRENT_ROLE',
854
+ 'CURRENT_SCHEMA',
855
+ 'CURRENT_SERVER',
856
+ 'CURRENT_TIME',
857
+ 'CURRENT_TIMESTAMP',
858
+ 'CURRENT_TIMEZONE',
859
+ 'CURRENT_TRANSFORM_GROUP_FOR_TYPE',
860
+ 'CURRENT_USER',
861
+ 'CURSOR',
862
+ 'CYCLE',
863
+ 'DATA',
864
+ 'DATABASE',
865
+ 'DATAPARTITIONNAME',
866
+ 'DATAPARTITIONNUM',
867
+ 'DATE',
868
+ 'DAY',
869
+ 'DAYS',
870
+ 'DB2GENERAL',
871
+ 'DB2GENRL',
872
+ 'DB2SQL',
873
+ 'DBINFO',
874
+ 'DBPARTITIONNAME',
875
+ 'DBPARTITIONNUM',
876
+ 'DEALLOCATE',
877
+ 'DEC',
878
+ 'DECIMAL',
879
+ 'DECLARE',
880
+ 'DEFAULT',
881
+ 'DEFAULTS',
882
+ 'DEFINITION',
883
+ 'DELETE',
884
+ 'DENSERANK',
885
+ 'DENSE_RANK',
886
+ 'DEREF',
887
+ 'DESCRIBE',
888
+ 'DESCRIPTOR',
889
+ 'DETERMINISTIC',
890
+ 'DIAGNOSTICS',
891
+ 'DISABLE',
892
+ 'DISALLOW',
893
+ 'DISCONNECT',
894
+ 'DISTINCT',
895
+ 'DO',
896
+ 'DOCUMENT',
897
+ 'DOUBLE',
898
+ 'DROP',
899
+ 'DSSIZE',
900
+ 'DYNAMIC',
901
+ 'EACH',
902
+ 'EDITPROC',
903
+ 'ELEMENT',
904
+ 'ELSE',
905
+ 'ELSEIF',
906
+ 'ENABLE',
907
+ 'ENCODING',
908
+ 'ENCRYPTION',
909
+ 'END',
910
+ 'END-EXEC',
911
+ 'ENDING',
912
+ 'ERASE',
913
+ 'ESCAPE',
914
+ 'EVERY',
915
+ 'EXCEPTION',
916
+ 'EXCLUDING',
917
+ 'EXCLUSIVE',
918
+ 'EXEC',
919
+ 'EXECUTE',
920
+ 'EXISTS',
921
+ 'EXIT',
922
+ 'EXP',
923
+ 'EXPLAIN',
924
+ 'EXTENDED',
925
+ 'EXTERNAL',
926
+ 'EXTRACT',
927
+ 'FALSE',
928
+ 'FENCED',
929
+ 'FETCH',
930
+ 'FIELDPROC',
931
+ 'FILE',
932
+ 'FILTER',
933
+ 'FINAL',
934
+ 'FIRST',
935
+ 'FLOAT',
936
+ 'FLOOR',
937
+ 'FOR',
938
+ 'FOREIGN',
939
+ 'FREE',
940
+ 'FULL',
941
+ 'FUNCTION',
942
+ 'FUSION',
943
+ 'GENERAL',
944
+ 'GENERATED',
945
+ 'GET',
946
+ 'GLOBAL',
947
+ 'GOTO',
948
+ 'GRANT',
949
+ 'GRAPHIC',
950
+ 'GROUP',
951
+ 'GROUPING',
952
+ 'HANDLER',
953
+ 'HASH',
954
+ 'HASHED_VALUE',
955
+ 'HINT',
956
+ 'HOLD',
957
+ 'HOUR',
958
+ 'HOURS',
959
+ 'IDENTITY',
960
+ 'IF',
961
+ 'IMMEDIATE',
962
+ 'IN',
963
+ 'INCLUDING',
964
+ 'INCLUSIVE',
965
+ 'INCREMENT',
966
+ 'INDEX',
967
+ 'INDICATOR',
968
+ 'INDICATORS',
969
+ 'INF',
970
+ 'INFINITY',
971
+ 'INHERIT',
972
+ 'INNER',
973
+ 'INOUT',
974
+ 'INSENSITIVE',
975
+ 'INSERT',
976
+ 'INT',
977
+ 'INTEGER',
978
+ 'INTEGRITY',
979
+ 'INTERSECTION',
980
+ 'INTERVAL',
981
+ 'INTO',
982
+ 'IS',
983
+ 'ISOBID',
984
+ 'ISOLATION',
985
+ 'ITERATE',
986
+ 'JAR',
987
+ 'JAVA',
988
+ 'KEEP',
989
+ 'KEY',
990
+ 'LABEL',
991
+ 'LANGUAGE',
992
+ 'LARGE',
993
+ 'LATERAL',
994
+ 'LC_CTYPE',
995
+ 'LEADING',
996
+ 'LEAVE',
997
+ 'LEFT',
998
+ 'LIKE',
999
+ 'LINKTYPE',
1000
+ 'LN',
1001
+ 'LOCAL',
1002
+ 'LOCALDATE',
1003
+ 'LOCALE',
1004
+ 'LOCALTIME',
1005
+ 'LOCALTIMESTAMP',
1006
+ 'LOCATOR',
1007
+ 'LOCATORS',
1008
+ 'LOCK',
1009
+ 'LOCKMAX',
1010
+ 'LOCKSIZE',
1011
+ 'LONG',
1012
+ 'LOOP',
1013
+ 'LOWER',
1014
+ 'MAINTAINED',
1015
+ 'MATCH',
1016
+ 'MATERIALIZED',
1017
+ 'MAX',
1018
+ 'MAXVALUE',
1019
+ 'MEMBER',
1020
+ 'MERGE',
1021
+ 'METHOD',
1022
+ 'MICROSECOND',
1023
+ 'MICROSECONDS',
1024
+ 'MIN',
1025
+ 'MINUTE',
1026
+ 'MINUTES',
1027
+ 'MINVALUE',
1028
+ 'MOD',
1029
+ 'MODE',
1030
+ 'MODIFIES',
1031
+ 'MODULE',
1032
+ 'MONTH',
1033
+ 'MONTHS',
1034
+ 'MULTISET',
1035
+ 'NAN',
1036
+ 'NATIONAL',
1037
+ 'NATURAL',
1038
+ 'NCHAR',
1039
+ 'NCLOB',
1040
+ 'NEW',
1041
+ 'NEW_TABLE',
1042
+ 'NEXTVAL',
1043
+ 'NO',
1044
+ 'NOCACHE',
1045
+ 'NOCYCLE',
1046
+ 'NODENAME',
1047
+ 'NODENUMBER',
1048
+ 'NOMAXVALUE',
1049
+ 'NOMINVALUE',
1050
+ 'NONE',
1051
+ 'NOORDER',
1052
+ 'NORMALIZE',
1053
+ 'NORMALIZED',
1054
+ 'NOT',
1055
+ 'NULL',
1056
+ 'NULLIF',
1057
+ 'NULLS',
1058
+ 'NUMERIC',
1059
+ 'NUMPARTS',
1060
+ 'OBID',
1061
+ 'OCTET_LENGTH',
1062
+ 'OF',
1063
+ 'OFFSET',
1064
+ 'OLD',
1065
+ 'OLD_TABLE',
1066
+ 'ON',
1067
+ 'ONLY',
1068
+ 'OPEN',
1069
+ 'OPTIMIZATION',
1070
+ 'OPTIMIZE',
1071
+ 'OPTION',
1072
+ 'ORDER',
1073
+ 'OUT',
1074
+ 'OUTER',
1075
+ 'OVER',
1076
+ 'OVERLAPS',
1077
+ 'OVERLAY',
1078
+ 'OVERRIDING',
1079
+ 'PACKAGE',
1080
+ 'PADDED',
1081
+ 'PAGESIZE',
1082
+ 'PARAMETER',
1083
+ 'PART',
1084
+ 'PARTITION',
1085
+ 'PARTITIONED',
1086
+ 'PARTITIONING',
1087
+ 'PARTITIONS',
1088
+ 'PASSWORD',
1089
+ 'PATH',
1090
+ 'PERCENTILE_CONT',
1091
+ 'PERCENTILE_DISC',
1092
+ 'PERCENT_RANK',
1093
+ 'PIECESIZE',
1094
+ 'PLAN',
1095
+ 'POSITION',
1096
+ 'POWER',
1097
+ 'PRECISION',
1098
+ 'PREPARE',
1099
+ 'PREVVAL',
1100
+ 'PRIMARY',
1101
+ 'PRIQTY',
1102
+ 'PRIVILEGES',
1103
+ 'PROCEDURE',
1104
+ 'PROGRAM',
1105
+ 'PSID',
1106
+ 'PUBLIC',
1107
+ 'QUERY',
1108
+ 'QUERYNO',
1109
+ 'RANGE',
1110
+ 'RANK',
1111
+ 'READ',
1112
+ 'READS',
1113
+ 'REAL',
1114
+ 'RECOVERY',
1115
+ 'RECURSIVE',
1116
+ 'REF',
1117
+ 'REFERENCES',
1118
+ 'REFERENCING',
1119
+ 'REFRESH',
1120
+ 'REGR_AVGX',
1121
+ 'REGR_AVGY',
1122
+ 'REGR_COUNT',
1123
+ 'REGR_INTERCEPT',
1124
+ 'REGR_R2',
1125
+ 'REGR_SLOPE',
1126
+ 'REGR_SXX',
1127
+ 'REGR_SXY',
1128
+ 'REGR_SYY',
1129
+ 'RELEASE',
1130
+ 'RENAME',
1131
+ 'REPEAT',
1132
+ 'RESET',
1133
+ 'RESIGNAL',
1134
+ 'RESTART',
1135
+ 'RESTRICT',
1136
+ 'RESULT',
1137
+ 'RESULT_SET_LOCATOR',
1138
+ 'RETURN',
1139
+ 'RETURNS',
1140
+ 'REVOKE',
1141
+ 'RIGHT',
1142
+ 'ROLE',
1143
+ 'ROLLBACK',
1144
+ 'ROLLUP',
1145
+ 'ROUND_CEILING',
1146
+ 'ROUND_DOWN',
1147
+ 'ROUND_FLOOR',
1148
+ 'ROUND_HALF_DOWN',
1149
+ 'ROUND_HALF_EVEN',
1150
+ 'ROUND_HALF_UP',
1151
+ 'ROUND_UP',
1152
+ 'ROUTINE',
1153
+ 'ROW',
1154
+ 'ROWNUMBER',
1155
+ 'ROWS',
1156
+ 'ROWSET',
1157
+ 'ROW_NUMBER',
1158
+ 'RRN',
1159
+ 'RUN',
1160
+ 'SAVEPOINT',
1161
+ 'SCHEMA',
1162
+ 'SCOPE',
1163
+ 'SCRATCHPAD',
1164
+ 'SCROLL',
1165
+ 'SEARCH',
1166
+ 'SECOND',
1167
+ 'SECONDS',
1168
+ 'SECQTY',
1169
+ 'SECURITY',
1170
+ 'SENSITIVE',
1171
+ 'SEQUENCE',
1172
+ 'SESSION',
1173
+ 'SESSION_USER',
1174
+ 'SIGNAL',
1175
+ 'SIMILAR',
1176
+ 'SIMPLE',
1177
+ 'SMALLINT',
1178
+ 'SNAN',
1179
+ 'SOME',
1180
+ 'SOURCE',
1181
+ 'SPECIFIC',
1182
+ 'SPECIFICTYPE',
1183
+ 'SQL',
1184
+ 'SQLEXCEPTION',
1185
+ 'SQLID',
1186
+ 'SQLSTATE',
1187
+ 'SQLWARNING',
1188
+ 'SQRT',
1189
+ 'STACKED',
1190
+ 'STANDARD',
1191
+ 'START',
1192
+ 'STARTING',
1193
+ 'STATEMENT',
1194
+ 'STATIC',
1195
+ 'STATMENT',
1196
+ 'STAY',
1197
+ 'STDDEV_POP',
1198
+ 'STDDEV_SAMP',
1199
+ 'STOGROUP',
1200
+ 'STORES',
1201
+ 'STYLE',
1202
+ 'SUBMULTISET',
1203
+ 'SUBSTRING',
1204
+ 'SUM',
1205
+ 'SUMMARY',
1206
+ 'SYMMETRIC',
1207
+ 'SYNONYM',
1208
+ 'SYSFUN',
1209
+ 'SYSIBM',
1210
+ 'SYSPROC',
1211
+ 'SYSTEM',
1212
+ 'SYSTEM_USER',
1213
+ 'TABLE',
1214
+ 'TABLESAMPLE',
1215
+ 'TABLESPACE',
1216
+ 'THEN',
1217
+ 'TIME',
1218
+ 'TIMESTAMP',
1219
+ 'TIMEZONE_HOUR',
1220
+ 'TIMEZONE_MINUTE',
1221
+ 'TO',
1222
+ 'TRAILING',
1223
+ 'TRANSACTION',
1224
+ 'TRANSLATE',
1225
+ 'TRANSLATION',
1226
+ 'TREAT',
1227
+ 'TRIGGER',
1228
+ 'TRIM',
1229
+ 'TRUE',
1230
+ 'TRUNCATE',
1231
+ 'TYPE',
1232
+ 'UESCAPE',
1233
+ 'UNDO',
1234
+ 'UNIQUE',
1235
+ 'UNKNOWN',
1236
+ 'UNNEST',
1237
+ 'UNTIL',
1238
+ 'UPPER',
1239
+ 'USAGE',
1240
+ 'USER',
1241
+ 'USING',
1242
+ 'VALIDPROC',
1243
+ 'VALUE',
1244
+ 'VARCHAR',
1245
+ 'VARIABLE',
1246
+ 'VARIANT',
1247
+ 'VARYING',
1248
+ 'VAR_POP',
1249
+ 'VAR_SAMP',
1250
+ 'VCAT',
1251
+ 'VERSION',
1252
+ 'VIEW',
1253
+ 'VOLATILE',
1254
+ 'VOLUMES',
1255
+ 'WHEN',
1256
+ 'WHENEVER',
1257
+ 'WHILE',
1258
+ 'WIDTH_BUCKET',
1259
+ 'WINDOW',
1260
+ 'WITH',
1261
+ 'WITHIN',
1262
+ 'WITHOUT',
1263
+ 'WLM',
1264
+ 'WRITE',
1265
+ 'XMLELEMENT',
1266
+ 'XMLEXISTS',
1267
+ 'XMLNAMESPACES',
1268
+ 'YEAR',
1269
+ 'YEARS',
1270
+ ];
1271
+ const reservedToplevelWords$3 = [
1272
+ 'ADD',
1273
+ 'AFTER',
1274
+ 'ALTER COLUMN',
1275
+ 'ALTER TABLE',
1276
+ 'DELETE FROM',
1277
+ 'EXCEPT',
1278
+ 'FETCH FIRST',
1279
+ 'FROM',
1280
+ 'GROUP BY',
1281
+ 'GO',
1282
+ 'HAVING',
1283
+ 'INSERT INTO',
1284
+ 'INTERSECT',
1285
+ 'LIMIT',
1286
+ 'ORDER BY',
1287
+ 'SELECT',
1288
+ 'SET CURRENT SCHEMA',
1289
+ 'SET SCHEMA',
1290
+ 'SET',
1291
+ 'UNION ALL',
1292
+ 'UPDATE',
1293
+ 'VALUES',
1294
+ 'WHERE',
1295
+ ];
1296
+ const reservedNewlineWords$3 = [
1297
+ 'AND',
1298
+ 'CROSS JOIN',
1299
+ 'INNER JOIN',
1300
+ 'JOIN',
1301
+ 'LEFT JOIN',
1302
+ 'LEFT OUTER JOIN',
1303
+ 'OR',
1304
+ 'OUTER JOIN',
1305
+ 'RIGHT JOIN',
1306
+ 'RIGHT OUTER JOIN',
1307
+ ];
1308
+ let tokenizer$3;
1309
+ /**
1310
+ * IBM DB2 SQL 方言格式化器。
1311
+ */
1312
+ class Db2Formatter {
1313
+ /**
1314
+ * 初始化 Db2Formatter。
1315
+ *
1316
+ * @param {FormatOptions} cfg 格式化配置。
1317
+ */
1318
+ constructor(cfg) {
1319
+ this.cfg = cfg;
1320
+ }
1321
+ /**
1322
+ * 格式化 DB2 查询字符串以提高可读性。
1323
+ *
1324
+ * @param {string} query 原始 DB2 查询字符串。
1325
+ * @returns {string} 格式化后的查询。
1326
+ */
1327
+ format(query) {
1328
+ if (!tokenizer$3) {
1329
+ tokenizer$3 = new Tokenizer({
1330
+ reservedWords: reservedWords$3,
1331
+ reservedToplevelWords: reservedToplevelWords$3,
1332
+ reservedNewlineWords: reservedNewlineWords$3,
1333
+ stringTypes: [`""`, "''", '``', '[]'],
1334
+ openParens: ['('],
1335
+ closeParens: [')'],
1336
+ indexedPlaceholderTypes: ['?'],
1337
+ namedPlaceholderTypes: [':'],
1338
+ lineCommentTypes: ['--'],
1339
+ specialWordChars: ['#', '@'],
1340
+ });
1341
+ }
1342
+ return new Formatter(this.cfg, tokenizer$3).format(query);
1343
+ }
1344
+ }
1345
+
1346
+ const reservedWords$2 = [
1347
+ 'ALL',
1348
+ 'ALTER',
1349
+ 'ANALYZE',
1350
+ 'AND',
1351
+ 'ANY',
1352
+ 'ARRAY',
1353
+ 'AS',
1354
+ 'ASC',
1355
+ 'BEGIN',
1356
+ 'BETWEEN',
1357
+ 'BINARY',
1358
+ 'BOOLEAN',
1359
+ 'BREAK',
1360
+ 'BUCKET',
1361
+ 'BUILD',
1362
+ 'BY',
1363
+ 'CALL',
1364
+ 'CASE',
1365
+ 'CAST',
1366
+ 'CLUSTER',
1367
+ 'COLLATE',
1368
+ 'COLLECTION',
1369
+ 'COMMIT',
1370
+ 'CONNECT',
1371
+ 'CONTINUE',
1372
+ 'CORRELATE',
1373
+ 'COVER',
1374
+ 'CREATE',
1375
+ 'DATABASE',
1376
+ 'DATASET',
1377
+ 'DATASTORE',
1378
+ 'DECLARE',
1379
+ 'DECREMENT',
1380
+ 'DELETE',
1381
+ 'DERIVED',
1382
+ 'DESC',
1383
+ 'DESCRIBE',
1384
+ 'DISTINCT',
1385
+ 'DO',
1386
+ 'DROP',
1387
+ 'EACH',
1388
+ 'ELEMENT',
1389
+ 'ELSE',
1390
+ 'END',
1391
+ 'EVERY',
1392
+ 'EXCEPT',
1393
+ 'EXCLUDE',
1394
+ 'EXECUTE',
1395
+ 'EXISTS',
1396
+ 'EXPLAIN',
1397
+ 'FALSE',
1398
+ 'FETCH',
1399
+ 'FIRST',
1400
+ 'FLATTEN',
1401
+ 'FOR',
1402
+ 'FORCE',
1403
+ 'FROM',
1404
+ 'FUNCTION',
1405
+ 'GRANT',
1406
+ 'GROUP',
1407
+ 'GSI',
1408
+ 'HAVING',
1409
+ 'IF',
1410
+ 'IGNORE',
1411
+ 'ILIKE',
1412
+ 'IN',
1413
+ 'INCLUDE',
1414
+ 'INCREMENT',
1415
+ 'INDEX',
1416
+ 'INFER',
1417
+ 'INLINE',
1418
+ 'INNER',
1419
+ 'INSERT',
1420
+ 'INTERSECT',
1421
+ 'INTO',
1422
+ 'IS',
1423
+ 'JOIN',
1424
+ 'KEY',
1425
+ 'KEYS',
1426
+ 'KEYSPACE',
1427
+ 'KNOWN',
1428
+ 'LAST',
1429
+ 'LEFT',
1430
+ 'LET',
1431
+ 'LETTING',
1432
+ 'LIKE',
1433
+ 'LIMIT',
1434
+ 'LSM',
1435
+ 'MAP',
1436
+ 'MAPPING',
1437
+ 'MATCHED',
1438
+ 'MATERIALIZED',
1439
+ 'MERGE',
1440
+ 'MINUS',
1441
+ 'MISSING',
1442
+ 'NAMESPACE',
1443
+ 'NEST',
1444
+ 'NOT',
1445
+ 'NULL',
1446
+ 'NUMBER',
1447
+ 'OBJECT',
1448
+ 'OFFSET',
1449
+ 'ON',
1450
+ 'OPTION',
1451
+ 'OR',
1452
+ 'ORDER',
1453
+ 'OUTER',
1454
+ 'OVER',
1455
+ 'PARSE',
1456
+ 'PARTITION',
1457
+ 'PASSWORD',
1458
+ 'PATH',
1459
+ 'POOL',
1460
+ 'PREPARE',
1461
+ 'PRIMARY',
1462
+ 'PRIVATE',
1463
+ 'PRIVILEGE',
1464
+ 'PROCEDURE',
1465
+ 'PUBLIC',
1466
+ 'RAW',
1467
+ 'REALM',
1468
+ 'REDUCE',
1469
+ 'RENAME',
1470
+ 'RETURN',
1471
+ 'RETURNING',
1472
+ 'REVOKE',
1473
+ 'RIGHT',
1474
+ 'ROLE',
1475
+ 'ROLLBACK',
1476
+ 'SATISFIES',
1477
+ 'SCHEMA',
1478
+ 'SELECT',
1479
+ 'SELF',
1480
+ 'SEMI',
1481
+ 'SET',
1482
+ 'SHOW',
1483
+ 'SOME',
1484
+ 'START',
1485
+ 'STATISTICS',
1486
+ 'STRING',
1487
+ 'SYSTEM',
1488
+ 'THEN',
1489
+ 'TO',
1490
+ 'TRANSACTION',
1491
+ 'TRIGGER',
1492
+ 'TRUE',
1493
+ 'TRUNCATE',
1494
+ 'UNDER',
1495
+ 'UNION',
1496
+ 'UNIQUE',
1497
+ 'UNKNOWN',
1498
+ 'UNNEST',
1499
+ 'UNSET',
1500
+ 'UPDATE',
1501
+ 'UPSERT',
1502
+ 'USE',
1503
+ 'USER',
1504
+ 'USING',
1505
+ 'VALIDATE',
1506
+ 'VALUE',
1507
+ 'VALUED',
1508
+ 'VALUES',
1509
+ 'VIA',
1510
+ 'VIEW',
1511
+ 'WHEN',
1512
+ 'WHERE',
1513
+ 'WHILE',
1514
+ 'WITH',
1515
+ 'WITHIN',
1516
+ 'WORK',
1517
+ 'XOR',
1518
+ ];
1519
+ const reservedToplevelWords$2 = [
1520
+ 'DELETE FROM',
1521
+ 'EXCEPT ALL',
1522
+ 'EXCEPT',
1523
+ 'EXPLAIN DELETE FROM',
1524
+ 'EXPLAIN UPDATE',
1525
+ 'EXPLAIN UPSERT',
1526
+ 'FROM',
1527
+ 'GROUP BY',
1528
+ 'HAVING',
1529
+ 'INFER',
1530
+ 'INSERT INTO',
1531
+ 'INTERSECT ALL',
1532
+ 'INTERSECT',
1533
+ 'LET',
1534
+ 'LIMIT',
1535
+ 'MERGE',
1536
+ 'NEST',
1537
+ 'ORDER BY',
1538
+ 'PREPARE',
1539
+ 'SELECT',
1540
+ 'SET CURRENT SCHEMA',
1541
+ 'SET SCHEMA',
1542
+ 'SET',
1543
+ 'UNION ALL',
1544
+ 'UNION',
1545
+ 'UNNEST',
1546
+ 'UPDATE',
1547
+ 'UPSERT',
1548
+ 'USE KEYS',
1549
+ 'VALUES',
1550
+ 'WHERE',
1551
+ ];
1552
+ const reservedNewlineWords$2 = [
1553
+ 'AND',
1554
+ 'INNER JOIN',
1555
+ 'JOIN',
1556
+ 'LEFT JOIN',
1557
+ 'LEFT OUTER JOIN',
1558
+ 'OR',
1559
+ 'OUTER JOIN',
1560
+ 'RIGHT JOIN',
1561
+ 'RIGHT OUTER JOIN',
1562
+ 'XOR',
1563
+ ];
1564
+ let tokenizer$2;
1565
+ /**
1566
+ * Couchbase N1QL 方言格式化器。
1567
+ */
1568
+ class N1qlFormatter {
1569
+ /**
1570
+ * 初始化 N1qlFormatter。
1571
+ *
1572
+ * @param {FormatOptions} cfg 格式化配置。
1573
+ */
1574
+ constructor(cfg) {
1575
+ this.cfg = cfg;
1576
+ }
1577
+ /**
1578
+ * 格式化 N1QL 字符串中的空白以提高可读性。
1579
+ *
1580
+ * @param {string} query 原始 N1QL 查询字符串。
1581
+ * @returns {string} 格式化后的查询。
1582
+ */
1583
+ format(query) {
1584
+ if (!tokenizer$2) {
1585
+ tokenizer$2 = new Tokenizer({
1586
+ reservedWords: reservedWords$2,
1587
+ reservedToplevelWords: reservedToplevelWords$2,
1588
+ reservedNewlineWords: reservedNewlineWords$2,
1589
+ stringTypes: [`""`, "''", '``'],
1590
+ openParens: ['(', '[', '{'],
1591
+ closeParens: [')', ']', '}'],
1592
+ namedPlaceholderTypes: ['$'],
1593
+ lineCommentTypes: ['#', '--'],
1594
+ });
1595
+ }
1596
+ return new Formatter(this.cfg, tokenizer$2).format(query);
1597
+ }
1598
+ }
1599
+
1600
+ const reservedWords$1 = [
1601
+ 'A',
1602
+ 'ACCESSIBLE',
1603
+ 'AGENT',
1604
+ 'AGGREGATE',
1605
+ 'ALL',
1606
+ 'ALTER',
1607
+ 'ANY',
1608
+ 'ARRAY',
1609
+ 'AS',
1610
+ 'ASC',
1611
+ 'AT',
1612
+ 'ATTRIBUTE',
1613
+ 'AUTHID',
1614
+ 'AVG',
1615
+ 'BETWEEN',
1616
+ 'BFILE_BASE',
1617
+ 'BINARY_INTEGER',
1618
+ 'BINARY',
1619
+ 'BLOB_BASE',
1620
+ 'BLOCK',
1621
+ 'BODY',
1622
+ 'BOOLEAN',
1623
+ 'BOTH',
1624
+ 'BOUND',
1625
+ 'BULK',
1626
+ 'BY',
1627
+ 'BYTE',
1628
+ 'C',
1629
+ 'CALL',
1630
+ 'CALLING',
1631
+ 'CASCADE',
1632
+ 'CASE',
1633
+ 'CHAR_BASE',
1634
+ 'CHAR',
1635
+ 'CHARACTER',
1636
+ 'CHARSET',
1637
+ 'CHARSETFORM',
1638
+ 'CHARSETID',
1639
+ 'CHECK',
1640
+ 'CLOB_BASE',
1641
+ 'CLONE',
1642
+ 'CLOSE',
1643
+ 'CLUSTER',
1644
+ 'CLUSTERS',
1645
+ 'COALESCE',
1646
+ 'COLAUTH',
1647
+ 'COLLECT',
1648
+ 'COLUMNS',
1649
+ 'COMMENT',
1650
+ 'COMMIT',
1651
+ 'COMMITTED',
1652
+ 'COMPILED',
1653
+ 'COMPRESS',
1654
+ 'CONNECT',
1655
+ 'CONSTANT',
1656
+ 'CONSTRUCTOR',
1657
+ 'CONTEXT',
1658
+ 'CONTINUE',
1659
+ 'CONVERT',
1660
+ 'COUNT',
1661
+ 'CRASH',
1662
+ 'CREATE',
1663
+ 'CREDENTIAL',
1664
+ 'CURRENT',
1665
+ 'CURRVAL',
1666
+ 'CURSOR',
1667
+ 'CUSTOMDATUM',
1668
+ 'DANGLING',
1669
+ 'DATA',
1670
+ 'DATE_BASE',
1671
+ 'DATE',
1672
+ 'DAY',
1673
+ 'DECIMAL',
1674
+ 'DEFAULT',
1675
+ 'DEFINE',
1676
+ 'DELETE',
1677
+ 'DESC',
1678
+ 'DETERMINISTIC',
1679
+ 'DIRECTORY',
1680
+ 'DISTINCT',
1681
+ 'DO',
1682
+ 'DOUBLE',
1683
+ 'DROP',
1684
+ 'DURATION',
1685
+ 'ELEMENT',
1686
+ 'ELSIF',
1687
+ 'EMPTY',
1688
+ 'ESCAPE',
1689
+ 'EXCEPTIONS',
1690
+ 'EXCLUSIVE',
1691
+ 'EXECUTE',
1692
+ 'EXISTS',
1693
+ 'EXIT',
1694
+ 'EXTENDS',
1695
+ 'EXTERNAL',
1696
+ 'EXTRACT',
1697
+ 'FALSE',
1698
+ 'FETCH',
1699
+ 'FINAL',
1700
+ 'FIRST',
1701
+ 'FIXED',
1702
+ 'FLOAT',
1703
+ 'FOR',
1704
+ 'FORALL',
1705
+ 'FORCE',
1706
+ 'FROM',
1707
+ 'FUNCTION',
1708
+ 'GENERAL',
1709
+ 'GOTO',
1710
+ 'GRANT',
1711
+ 'GROUP',
1712
+ 'HASH',
1713
+ 'HEAP',
1714
+ 'HIDDEN',
1715
+ 'HOUR',
1716
+ 'IDENTIFIED',
1717
+ 'IF',
1718
+ 'IMMEDIATE',
1719
+ 'IN',
1720
+ 'INCLUDING',
1721
+ 'INDEX',
1722
+ 'INDEXES',
1723
+ 'INDICATOR',
1724
+ 'INDICES',
1725
+ 'INFINITE',
1726
+ 'INSTANTIABLE',
1727
+ 'INT',
1728
+ 'INTEGER',
1729
+ 'INTERFACE',
1730
+ 'INTERVAL',
1731
+ 'INTO',
1732
+ 'INVALIDATE',
1733
+ 'IS',
1734
+ 'ISOLATION',
1735
+ 'JAVA',
1736
+ 'LANGUAGE',
1737
+ 'LARGE',
1738
+ 'LEADING',
1739
+ 'LENGTH',
1740
+ 'LEVEL',
1741
+ 'LIBRARY',
1742
+ 'LIKE',
1743
+ 'LIKE2',
1744
+ 'LIKE4',
1745
+ 'LIKEC',
1746
+ 'LIMITED',
1747
+ 'LOCAL',
1748
+ 'LOCK',
1749
+ 'LONG',
1750
+ 'MAP',
1751
+ 'MAX',
1752
+ 'MAXLEN',
1753
+ 'MEMBER',
1754
+ 'MERGE',
1755
+ 'MIN',
1756
+ 'MINUS',
1757
+ 'MINUTE',
1758
+ 'MLSLABEL',
1759
+ 'MOD',
1760
+ 'MODE',
1761
+ 'MONTH',
1762
+ 'MULTISET',
1763
+ 'NAME',
1764
+ 'NAN',
1765
+ 'NATIONAL',
1766
+ 'NATIVE',
1767
+ 'NATURAL',
1768
+ 'NATURALN',
1769
+ 'NCHAR',
1770
+ 'NEW',
1771
+ 'NEXTVAL',
1772
+ 'NOCOMPRESS',
1773
+ 'NOCOPY',
1774
+ 'NOT',
1775
+ 'NOWAIT',
1776
+ 'NULL',
1777
+ 'NULLIF',
1778
+ 'NUMBER_BASE',
1779
+ 'NUMBER',
1780
+ 'OBJECT',
1781
+ 'OCICOLL',
1782
+ 'OCIDATE',
1783
+ 'OCIDATETIME',
1784
+ 'OCIDURATION',
1785
+ 'OCIINTERVAL',
1786
+ 'OCILOBLOCATOR',
1787
+ 'OCINUMBER',
1788
+ 'OCIRAW',
1789
+ 'OCIREF',
1790
+ 'OCIREFCURSOR',
1791
+ 'OCIROWID',
1792
+ 'OCISTRING',
1793
+ 'OCITYPE',
1794
+ 'OF',
1795
+ 'OLD',
1796
+ 'ON',
1797
+ 'ONLY',
1798
+ 'OPAQUE',
1799
+ 'OPEN',
1800
+ 'OPERATOR',
1801
+ 'OPTION',
1802
+ 'ORACLE',
1803
+ 'ORADATA',
1804
+ 'ORDER',
1805
+ 'ORGANIZATION',
1806
+ 'ORLANY',
1807
+ 'ORLVARY',
1808
+ 'OTHERS',
1809
+ 'OUT',
1810
+ 'OVERLAPS',
1811
+ 'OVERRIDING',
1812
+ 'PACKAGE',
1813
+ 'PARALLEL_ENABLE',
1814
+ 'PARAMETER',
1815
+ 'PARAMETERS',
1816
+ 'PARENT',
1817
+ 'PARTITION',
1818
+ 'PASCAL',
1819
+ 'PCTFREE',
1820
+ 'PIPE',
1821
+ 'PIPELINED',
1822
+ 'PLS_INTEGER',
1823
+ 'PLUGGABLE',
1824
+ 'POSITIVE',
1825
+ 'POSITIVEN',
1826
+ 'PRAGMA',
1827
+ 'PRECISION',
1828
+ 'PRIOR',
1829
+ 'PRIVATE',
1830
+ 'PROCEDURE',
1831
+ 'PUBLIC',
1832
+ 'RAISE',
1833
+ 'RANGE',
1834
+ 'RAW',
1835
+ 'READ',
1836
+ 'REAL',
1837
+ 'RECORD',
1838
+ 'REF',
1839
+ 'REFERENCE',
1840
+ 'RELEASE',
1841
+ 'RELIES_ON',
1842
+ 'REM',
1843
+ 'REMAINDER',
1844
+ 'RENAME',
1845
+ 'RESOURCE',
1846
+ 'RESULT_CACHE',
1847
+ 'RESULT',
1848
+ 'RETURN',
1849
+ 'RETURNING',
1850
+ 'REVERSE',
1851
+ 'REVOKE',
1852
+ 'ROLLBACK',
1853
+ 'ROW',
1854
+ 'ROWID',
1855
+ 'ROWNUM',
1856
+ 'ROWTYPE',
1857
+ 'SAMPLE',
1858
+ 'SAVE',
1859
+ 'SAVEPOINT',
1860
+ 'SB1',
1861
+ 'SB2',
1862
+ 'SB4',
1863
+ 'SECOND',
1864
+ 'SEGMENT',
1865
+ 'SELF',
1866
+ 'SEPARATE',
1867
+ 'SEQUENCE',
1868
+ 'SERIALIZABLE',
1869
+ 'SHARE',
1870
+ 'SHORT',
1871
+ 'SIZE_T',
1872
+ 'SIZE',
1873
+ 'SMALLINT',
1874
+ 'SOME',
1875
+ 'SPACE',
1876
+ 'SPARSE',
1877
+ 'SQL',
1878
+ 'SQLCODE',
1879
+ 'SQLDATA',
1880
+ 'SQLERRM',
1881
+ 'SQLNAME',
1882
+ 'SQLSTATE',
1883
+ 'STANDARD',
1884
+ 'START',
1885
+ 'STATIC',
1886
+ 'STDDEV',
1887
+ 'STORED',
1888
+ 'STRING',
1889
+ 'STRUCT',
1890
+ 'STYLE',
1891
+ 'SUBMULTISET',
1892
+ 'SUBPARTITION',
1893
+ 'SUBSTITUTABLE',
1894
+ 'SUBTYPE',
1895
+ 'SUCCESSFUL',
1896
+ 'SUM',
1897
+ 'SYNONYM',
1898
+ 'SYSDATE',
1899
+ 'TABAUTH',
1900
+ 'TABLE',
1901
+ 'TDO',
1902
+ 'THE',
1903
+ 'THEN',
1904
+ 'TIME',
1905
+ 'TIMESTAMP',
1906
+ 'TIMEZONE_ABBR',
1907
+ 'TIMEZONE_HOUR',
1908
+ 'TIMEZONE_MINUTE',
1909
+ 'TIMEZONE_REGION',
1910
+ 'TO',
1911
+ 'TRAILING',
1912
+ 'TRANSACTION',
1913
+ 'TRANSACTIONAL',
1914
+ 'TRIGGER',
1915
+ 'TRUE',
1916
+ 'TRUSTED',
1917
+ 'TYPE',
1918
+ 'UB1',
1919
+ 'UB2',
1920
+ 'UB4',
1921
+ 'UID',
1922
+ 'UNDER',
1923
+ 'UNIQUE',
1924
+ 'UNPLUG',
1925
+ 'UNSIGNED',
1926
+ 'UNTRUSTED',
1927
+ 'USE',
1928
+ 'USER',
1929
+ 'USING',
1930
+ 'VALIDATE',
1931
+ 'VALIST',
1932
+ 'VALUE',
1933
+ 'VARCHAR',
1934
+ 'VARCHAR2',
1935
+ 'VARIABLE',
1936
+ 'VARIANCE',
1937
+ 'VARRAY',
1938
+ 'VARYING',
1939
+ 'VIEW',
1940
+ 'VIEWS',
1941
+ 'VOID',
1942
+ 'WHENEVER',
1943
+ 'WHILE',
1944
+ 'WITH',
1945
+ 'WORK',
1946
+ 'WRAPPED',
1947
+ 'WRITE',
1948
+ 'YEAR',
1949
+ 'ZONE',
1950
+ ];
1951
+ const reservedToplevelWords$1 = [
1952
+ 'ADD',
1953
+ 'ALTER COLUMN',
1954
+ 'ALTER TABLE',
1955
+ 'BEGIN',
1956
+ 'CONNECT BY',
1957
+ 'DECLARE',
1958
+ 'DELETE FROM',
1959
+ 'DELETE',
1960
+ 'EXCEPT',
1961
+ 'EXCEPTION',
1962
+ 'FETCH FIRST',
1963
+ 'FROM',
1964
+ 'GROUP BY',
1965
+ 'HAVING',
1966
+ 'INSERT INTO',
1967
+ 'INSERT',
1968
+ 'INTERSECT',
1969
+ 'LIMIT',
1970
+ 'LOOP',
1971
+ 'MODIFY',
1972
+ 'ORDER BY',
1973
+ 'SELECT',
1974
+ 'SET CURRENT SCHEMA',
1975
+ 'SET SCHEMA',
1976
+ 'SET',
1977
+ 'START WITH',
1978
+ 'UNION ALL',
1979
+ 'UNION',
1980
+ 'UPDATE',
1981
+ 'VALUES',
1982
+ 'WHERE',
1983
+ ];
1984
+ const reservedNewlineWords$1 = [
1985
+ 'AND',
1986
+ 'CROSS APPLY',
1987
+ 'CROSS JOIN',
1988
+ 'ELSE',
1989
+ 'INNER JOIN',
1990
+ 'JOIN',
1991
+ 'LEFT JOIN',
1992
+ 'LEFT OUTER JOIN',
1993
+ 'OR',
1994
+ 'OUTER APPLY',
1995
+ 'OUTER JOIN',
1996
+ 'RIGHT JOIN',
1997
+ 'RIGHT OUTER JOIN',
1998
+ 'WHEN',
1999
+ 'XOR',
2000
+ ];
2001
+ let tokenizer$1;
2002
+ /**
2003
+ * Oracle PL/SQL 方言格式化器。
2004
+ */
2005
+ class PlSqlFormatter {
2006
+ /**
2007
+ * 初始化 PlSqlFormatter。
2008
+ *
2009
+ * @param {FormatOptions} cfg 格式化配置。
2010
+ */
2011
+ constructor(cfg) {
2012
+ this.cfg = cfg;
2013
+ }
2014
+ /**
2015
+ * 格式化 PL/SQL 字符串中的空白以提高可读性。
2016
+ *
2017
+ * @param {string} query 原始 PL/SQL 查询字符串。
2018
+ * @returns {string} 格式化后的查询。
2019
+ */
2020
+ format(query) {
2021
+ if (!tokenizer$1) {
2022
+ tokenizer$1 = new Tokenizer({
2023
+ reservedWords: reservedWords$1,
2024
+ reservedToplevelWords: reservedToplevelWords$1,
2025
+ reservedNewlineWords: reservedNewlineWords$1,
2026
+ stringTypes: [`""`, "N''", "''", '``'],
2027
+ openParens: ['(', 'CASE'],
2028
+ closeParens: [')'],
2029
+ keywordBlockStarts: ['BEGIN', 'LOOP'],
2030
+ keywordBlockEnds: ['END'],
2031
+ indexedPlaceholderTypes: ['?'],
2032
+ namedPlaceholderTypes: [':'],
2033
+ lineCommentTypes: ['--'],
2034
+ specialWordChars: ['_', '$', '#', '.', '@'],
2035
+ });
2036
+ }
2037
+ return new Formatter(this.cfg, tokenizer$1).format(query);
2038
+ }
2039
+ }
2040
+
2041
+ const reservedWords = [
2042
+ 'ACCESSIBLE',
2043
+ 'ACTION',
2044
+ 'AGAINST',
2045
+ 'AGGREGATE',
2046
+ 'ALGORITHM',
2047
+ 'ALL',
2048
+ 'ALTER',
2049
+ 'ANALYSE',
2050
+ 'ANALYZE',
2051
+ 'AS',
2052
+ 'ASC',
2053
+ 'AUTOCOMMIT',
2054
+ 'AUTO_INCREMENT',
2055
+ 'BACKUP',
2056
+ 'BEGIN',
2057
+ 'BETWEEN',
2058
+ 'BINLOG',
2059
+ 'BOTH',
2060
+ 'CASCADE',
2061
+ 'CASE',
2062
+ 'CHANGE',
2063
+ 'CHANGED',
2064
+ 'CHARACTER SET',
2065
+ 'CHARSET',
2066
+ 'CHECK',
2067
+ 'CHECKSUM',
2068
+ 'COLLATE',
2069
+ 'COLLATION',
2070
+ 'COLUMN',
2071
+ 'COLUMNS',
2072
+ 'COMMENT',
2073
+ 'COMMIT',
2074
+ 'COMMITTED',
2075
+ 'COMPRESSED',
2076
+ 'CONCURRENT',
2077
+ 'CONSTRAINT',
2078
+ 'CONTAINS',
2079
+ 'CONVERT',
2080
+ 'CREATE',
2081
+ 'CROSS',
2082
+ 'CURRENT_TIMESTAMP',
2083
+ 'DATABASE',
2084
+ 'DATABASES',
2085
+ 'DAY',
2086
+ 'DAY_HOUR',
2087
+ 'DAY_MINUTE',
2088
+ 'DAY_SECOND',
2089
+ 'DEFAULT',
2090
+ 'DEFINER',
2091
+ 'DELAYED',
2092
+ 'DELETE',
2093
+ 'DESC',
2094
+ 'DESCRIBE',
2095
+ 'DETERMINISTIC',
2096
+ 'DISTINCT',
2097
+ 'DISTINCTROW',
2098
+ 'DIV',
2099
+ 'DO',
2100
+ 'DROP',
2101
+ 'DUMPFILE',
2102
+ 'DUPLICATE',
2103
+ 'DYNAMIC',
2104
+ 'ELSE',
2105
+ 'ENCLOSED',
2106
+ 'END',
2107
+ 'ENGINE',
2108
+ 'ENGINES',
2109
+ 'ENGINE_TYPE',
2110
+ 'ESCAPE',
2111
+ 'ESCAPED',
2112
+ 'EVENTS',
2113
+ 'EXEC',
2114
+ 'EXECUTE',
2115
+ 'EXISTS',
2116
+ 'EXPLAIN',
2117
+ 'EXTENDED',
2118
+ 'FAST',
2119
+ 'FETCH',
2120
+ 'FIELDS',
2121
+ 'FILE',
2122
+ 'FIRST',
2123
+ 'FIXED',
2124
+ 'FLUSH',
2125
+ 'FOR',
2126
+ 'FORCE',
2127
+ 'FOREIGN',
2128
+ 'FULL',
2129
+ 'FULLTEXT',
2130
+ 'FUNCTION',
2131
+ 'GLOBAL',
2132
+ 'GRANT',
2133
+ 'GRANTS',
2134
+ 'GROUP_CONCAT',
2135
+ 'HEAP',
2136
+ 'HIGH_PRIORITY',
2137
+ 'HOSTS',
2138
+ 'HOUR',
2139
+ 'HOUR_MINUTE',
2140
+ 'HOUR_SECOND',
2141
+ 'IDENTIFIED',
2142
+ 'IF',
2143
+ 'IFNULL',
2144
+ 'IGNORE',
2145
+ 'IN',
2146
+ 'INDEX',
2147
+ 'INDEXES',
2148
+ 'INFILE',
2149
+ 'INSERT',
2150
+ 'INSERT_ID',
2151
+ 'INSERT_METHOD',
2152
+ 'INTERVAL',
2153
+ 'INTO',
2154
+ 'INVOKER',
2155
+ 'IS',
2156
+ 'ISOLATION',
2157
+ 'KEY',
2158
+ 'KEYS',
2159
+ 'KILL',
2160
+ 'LAST_INSERT_ID',
2161
+ 'LEADING',
2162
+ 'LEVEL',
2163
+ 'LIKE',
2164
+ 'LINEAR',
2165
+ 'LINES',
2166
+ 'LOAD',
2167
+ 'LOCAL',
2168
+ 'LOCK',
2169
+ 'LOCKS',
2170
+ 'LOGS',
2171
+ 'LOW_PRIORITY',
2172
+ 'MARIA',
2173
+ 'MASTER',
2174
+ 'MASTER_CONNECT_RETRY',
2175
+ 'MASTER_HOST',
2176
+ 'MASTER_LOG_FILE',
2177
+ 'MATCH',
2178
+ 'MAX_CONNECTIONS_PER_HOUR',
2179
+ 'MAX_QUERIES_PER_HOUR',
2180
+ 'MAX_ROWS',
2181
+ 'MAX_UPDATES_PER_HOUR',
2182
+ 'MAX_USER_CONNECTIONS',
2183
+ 'MEDIUM',
2184
+ 'MERGE',
2185
+ 'MINUTE',
2186
+ 'MINUTE_SECOND',
2187
+ 'MIN_ROWS',
2188
+ 'MODE',
2189
+ 'MODIFY',
2190
+ 'MONTH',
2191
+ 'MRG_MYISAM',
2192
+ 'MYISAM',
2193
+ 'NAMES',
2194
+ 'NATURAL',
2195
+ 'NOT',
2196
+ 'NOW()',
2197
+ 'NULL',
2198
+ 'OFFSET',
2199
+ 'ON DELETE',
2200
+ 'ON UPDATE',
2201
+ 'ON',
2202
+ 'ONLY',
2203
+ 'OPEN',
2204
+ 'OPTIMIZE',
2205
+ 'OPTION',
2206
+ 'OPTIONALLY',
2207
+ 'OUTFILE',
2208
+ 'PACK_KEYS',
2209
+ 'PAGE',
2210
+ 'PARTIAL',
2211
+ 'PARTITION',
2212
+ 'PARTITIONS',
2213
+ 'PASSWORD',
2214
+ 'PRIMARY',
2215
+ 'PRIVILEGES',
2216
+ 'PROCEDURE',
2217
+ 'PROCESS',
2218
+ 'PROCESSLIST',
2219
+ 'PURGE',
2220
+ 'QUICK',
2221
+ 'RAID0',
2222
+ 'RAID_CHUNKS',
2223
+ 'RAID_CHUNKSIZE',
2224
+ 'RAID_TYPE',
2225
+ 'RANGE',
2226
+ 'READ',
2227
+ 'READ_ONLY',
2228
+ 'READ_WRITE',
2229
+ 'REFERENCES',
2230
+ 'REGEXP',
2231
+ 'RELOAD',
2232
+ 'RENAME',
2233
+ 'REPAIR',
2234
+ 'REPEATABLE',
2235
+ 'REPLACE',
2236
+ 'REPLICATION',
2237
+ 'RESET',
2238
+ 'RESTORE',
2239
+ 'RESTRICT',
2240
+ 'RETURN',
2241
+ 'RETURNS',
2242
+ 'REVOKE',
2243
+ 'RLIKE',
2244
+ 'ROLLBACK',
2245
+ 'ROW',
2246
+ 'ROWS',
2247
+ 'ROW_FORMAT',
2248
+ 'SECOND',
2249
+ 'SECURITY',
2250
+ 'SEPARATOR',
2251
+ 'SERIALIZABLE',
2252
+ 'SESSION',
2253
+ 'SHARE',
2254
+ 'SHOW',
2255
+ 'SHUTDOWN',
2256
+ 'SLAVE',
2257
+ 'SONAME',
2258
+ 'SOUNDS',
2259
+ 'SQL',
2260
+ 'SQL_AUTO_IS_NULL',
2261
+ 'SQL_BIG_RESULT',
2262
+ 'SQL_BIG_SELECTS',
2263
+ 'SQL_BIG_TABLES',
2264
+ 'SQL_BUFFER_RESULT',
2265
+ 'SQL_CACHE',
2266
+ 'SQL_CALC_FOUND_ROWS',
2267
+ 'SQL_LOG_BIN',
2268
+ 'SQL_LOG_OFF',
2269
+ 'SQL_LOG_UPDATE',
2270
+ 'SQL_LOW_PRIORITY_UPDATES',
2271
+ 'SQL_MAX_JOIN_SIZE',
2272
+ 'SQL_NO_CACHE',
2273
+ 'SQL_QUOTE_SHOW_CREATE',
2274
+ 'SQL_SAFE_UPDATES',
2275
+ 'SQL_SELECT_LIMIT',
2276
+ 'SQL_SLAVE_SKIP_COUNTER',
2277
+ 'SQL_SMALL_RESULT',
2278
+ 'SQL_WARNINGS',
2279
+ 'START',
2280
+ 'STARTING',
2281
+ 'STATUS',
2282
+ 'STOP',
2283
+ 'STORAGE',
2284
+ 'STRAIGHT_JOIN',
2285
+ 'STRING',
2286
+ 'STRIPED',
2287
+ 'SUPER',
2288
+ 'TABLE',
2289
+ 'TABLES',
2290
+ 'TEMPORARY',
2291
+ 'TERMINATED',
2292
+ 'THEN',
2293
+ 'TO',
2294
+ 'TRAILING',
2295
+ 'TRANSACTIONAL',
2296
+ 'TRUE',
2297
+ 'TRUNCATE',
2298
+ 'TYPE',
2299
+ 'TYPES',
2300
+ 'UNCOMMITTED',
2301
+ 'UNIQUE',
2302
+ 'UNLOCK',
2303
+ 'UNSIGNED',
2304
+ 'USAGE',
2305
+ 'USE',
2306
+ 'USING',
2307
+ 'VARIABLES',
2308
+ 'VIEW',
2309
+ 'WHEN',
2310
+ 'WITH',
2311
+ 'WORK',
2312
+ 'WRITE',
2313
+ 'YEAR_MONTH',
2314
+ ];
2315
+ const reservedToplevelWords = [
2316
+ 'ADD',
2317
+ 'AFTER',
2318
+ 'ALTER COLUMN',
2319
+ 'ALTER TABLE',
2320
+ 'DELETE FROM',
2321
+ 'EXCEPT',
2322
+ 'FETCH FIRST',
2323
+ 'FROM',
2324
+ 'GROUP BY',
2325
+ 'GO',
2326
+ 'HAVING',
2327
+ 'INSERT INTO',
2328
+ 'INSERT',
2329
+ 'INTERSECT',
2330
+ 'LIMIT',
2331
+ 'MODIFY',
2332
+ 'ORDER BY',
2333
+ 'SELECT',
2334
+ 'SET CURRENT SCHEMA',
2335
+ 'SET SCHEMA',
2336
+ 'SET',
2337
+ 'UNION ALL',
2338
+ 'UNION',
2339
+ 'UPDATE',
2340
+ 'VALUES',
2341
+ 'WHERE',
2342
+ ];
2343
+ const reservedNewlineWords = [
2344
+ 'AND',
2345
+ 'CROSS APPLY',
2346
+ 'CROSS JOIN',
2347
+ 'ELSE',
2348
+ 'INNER JOIN',
2349
+ 'JOIN',
2350
+ 'LEFT JOIN',
2351
+ 'LEFT OUTER JOIN',
2352
+ 'OR',
2353
+ 'OUTER APPLY',
2354
+ 'OUTER JOIN',
2355
+ 'RIGHT JOIN',
2356
+ 'RIGHT OUTER JOIN',
2357
+ 'WHEN',
2358
+ 'XOR',
2359
+ ];
2360
+ let tokenizer;
2361
+ /**
2362
+ * 标准 SQL 方言格式化器。
2363
+ */
2364
+ class StandardSqlFormatter {
2365
+ /**
2366
+ * 初始化 StandardSqlFormatter。
2367
+ *
2368
+ * @param {FormatOptions} cfg 格式化配置。
2369
+ */
2370
+ constructor(cfg) {
2371
+ this.cfg = cfg;
2372
+ }
2373
+ /**
2374
+ * 格式化标准 SQL 字符串中的空白以提高可读性。
2375
+ *
2376
+ * @param {string} query 原始标准 SQL 查询字符串。
2377
+ * @returns {string} 格式化后的查询。
2378
+ */
2379
+ format(query) {
2380
+ if (!tokenizer) {
2381
+ tokenizer = new Tokenizer({
2382
+ reservedWords,
2383
+ reservedToplevelWords,
2384
+ reservedNewlineWords,
2385
+ stringTypes: [`""`, "N''", "''", '``', '[]'],
2386
+ openParens: ['(', 'CASE'],
2387
+ closeParens: [')', 'END'],
2388
+ indexedPlaceholderTypes: ['?'],
2389
+ namedPlaceholderTypes: ['@', ':'],
2390
+ lineCommentTypes: ['#', '--'],
2391
+ });
2392
+ }
2393
+ return new Formatter(this.cfg, tokenizer).format(query);
2394
+ }
2395
+ }
2396
+
2397
+ /**
2398
+ * 格式化 SQL 查询字符串以提高其可读性。
2399
+ *
2400
+ * 根据提供的配置选项,分发给标准 SQL 或特定方言的格式化器(db2、n1ql、pl/sql)。
2401
+ *
2402
+ * @param {string} query 要格式化的 SQL 查询字符串。
2403
+ * @param {FormatOptions} [cfg={}] 格式化配置选项。
2404
+ * @returns {string} 格式化后的 SQL 查询。
2405
+ * @throws {Error} 如果配置中指定了不支持的 SQL 方言,则抛出错误。
2406
+ */
2407
+ function format(query, cfg = {}) {
2408
+ switch (cfg.language) {
2409
+ case 'db2':
2410
+ return new Db2Formatter(cfg).format(query);
2411
+ case 'n1ql':
2412
+ return new N1qlFormatter(cfg).format(query);
2413
+ case 'pl/sql':
2414
+ return new PlSqlFormatter(cfg).format(query);
2415
+ case 'sql':
2416
+ case undefined:
2417
+ return new StandardSqlFormatter(cfg).format(query);
2418
+ default:
2419
+ throw Error(`Unsupported SQL dialect: ${String(cfg.language)}`);
2420
+ }
2421
+ }
2422
+ /**
2423
+ * 默认导出,提供 SQL 格式化函数。
2424
+ */
2425
+ const sqlFormatter = {
2426
+ format,
2427
+ };
2428
+
2429
+ export { sqlFormatter as default, format };