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