rawsql-ts 0.24.2 → 0.24.3
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.
- package/dist/esm/index.min.js +7 -7
- package/dist/esm/index.min.js.map +2 -2
- package/dist/esm/parsers/CommandExpressionParser.d.ts +2 -0
- package/dist/esm/parsers/CommandExpressionParser.js +49 -4
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/esm/parsers/HavingParser.js +6 -0
- package/dist/esm/parsers/HavingParser.js.map +1 -1
- package/dist/esm/parsers/JoinOnClauseParser.js +6 -0
- package/dist/esm/parsers/JoinOnClauseParser.js.map +1 -1
- package/dist/esm/parsers/LimitClauseParser.js +6 -0
- package/dist/esm/parsers/LimitClauseParser.js.map +1 -1
- package/dist/esm/parsers/OffsetClauseParser.js +6 -0
- package/dist/esm/parsers/OffsetClauseParser.js.map +1 -1
- package/dist/esm/parsers/OrderByClauseParser.d.ts +2 -0
- package/dist/esm/parsers/OrderByClauseParser.js +42 -29
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/esm/parsers/SqlPrintTokenParser.d.ts +3 -0
- package/dist/esm/parsers/SqlPrintTokenParser.js +70 -6
- package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/parsers/ValueParser.js +5 -3
- package/dist/esm/parsers/ValueParser.js.map +1 -1
- package/dist/esm/transformers/SqlPrinter.d.ts +9 -0
- package/dist/esm/transformers/SqlPrinter.js +143 -5
- package/dist/esm/transformers/SqlPrinter.js.map +1 -1
- package/dist/index.min.js +7 -7
- package/dist/index.min.js.map +2 -2
- package/dist/parsers/CommandExpressionParser.js +49 -4
- package/dist/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/parsers/HavingParser.js +6 -0
- package/dist/parsers/HavingParser.js.map +1 -1
- package/dist/parsers/JoinOnClauseParser.js +6 -0
- package/dist/parsers/JoinOnClauseParser.js.map +1 -1
- package/dist/parsers/LimitClauseParser.js +6 -0
- package/dist/parsers/LimitClauseParser.js.map +1 -1
- package/dist/parsers/OffsetClauseParser.js +6 -0
- package/dist/parsers/OffsetClauseParser.js.map +1 -1
- package/dist/parsers/OrderByClauseParser.js +42 -29
- package/dist/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/parsers/SqlPrintTokenParser.js +71 -6
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/parsers/ValueParser.js +5 -3
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/src/parsers/CommandExpressionParser.d.ts +2 -0
- package/dist/src/parsers/OrderByClauseParser.d.ts +2 -0
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +3 -0
- package/dist/src/transformers/SqlPrinter.d.ts +9 -0
- package/dist/transformers/SqlPrinter.js +143 -5
- package/dist/transformers/SqlPrinter.js.map +1 -1
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ export declare class CommandExpressionParser {
|
|
|
8
8
|
private static parseModifierUnaryExpression;
|
|
9
9
|
private static parseCaseExpression;
|
|
10
10
|
private static parseCaseWhenExpression;
|
|
11
|
+
private static splitCaseWhenKeywordComments;
|
|
11
12
|
private static parseSwitchCaseArgument;
|
|
12
13
|
private static parseAdditionalWhenClauses;
|
|
13
14
|
private static parseElseClause;
|
|
@@ -15,6 +16,7 @@ export declare class CommandExpressionParser {
|
|
|
15
16
|
private static extractKeywordComments;
|
|
16
17
|
private static applySwitchCaseComments;
|
|
17
18
|
private static isCommandWithValue;
|
|
19
|
+
private static addPositionedComments;
|
|
18
20
|
private static parseCaseConditionValuePair;
|
|
19
21
|
/**
|
|
20
22
|
* Convert legacy comments to positioned comments format
|
|
@@ -52,9 +52,11 @@ export class CommandExpressionParser {
|
|
|
52
52
|
}
|
|
53
53
|
static parseCaseWhenExpression(lexemes, index, caseWhenKeywordComments, caseWhenKeywordPositionedComments) {
|
|
54
54
|
let idx = index;
|
|
55
|
+
const commentPayload = this.splitCaseWhenKeywordComments(caseWhenKeywordComments, caseWhenKeywordPositionedComments);
|
|
55
56
|
// Parse the first WHEN clause
|
|
56
57
|
const casewhenResult = this.parseCaseConditionValuePair(lexemes, idx);
|
|
57
58
|
idx = casewhenResult.newIndex;
|
|
59
|
+
this.addPositionedComments(casewhenResult.value, commentPayload.firstWhenPositioned);
|
|
58
60
|
// Add the initial WHEN-THEN pair to the list
|
|
59
61
|
const caseWhenList = [casewhenResult.value];
|
|
60
62
|
// Process remaining WHEN-ELSE-END parts
|
|
@@ -63,15 +65,48 @@ export class CommandExpressionParser {
|
|
|
63
65
|
// Create CASE expression with condition null (uses WHEN conditions instead of a simple CASE)
|
|
64
66
|
const result = new CaseExpression(null, switchCaseResult.value);
|
|
65
67
|
// Assign CASE WHEN keyword comments to the CaseExpression (positioned comments only for unified spec)
|
|
66
|
-
if (
|
|
67
|
-
result.positionedComments =
|
|
68
|
+
if (commentPayload.caseExpressionPositioned && commentPayload.caseExpressionPositioned.length > 0) {
|
|
69
|
+
result.positionedComments = commentPayload.caseExpressionPositioned;
|
|
68
70
|
}
|
|
69
|
-
else if (
|
|
71
|
+
else if (commentPayload.firstWhenPositioned && commentPayload.firstWhenPositioned.length > 0) {
|
|
72
|
+
result.positionedComments = [];
|
|
73
|
+
}
|
|
74
|
+
else if (commentPayload.legacyCaseExpression && commentPayload.legacyCaseExpression.length > 0) {
|
|
70
75
|
// Convert legacy comments to positioned comments for unified spec
|
|
71
|
-
result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(
|
|
76
|
+
result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(commentPayload.legacyCaseExpression, 'before')];
|
|
72
77
|
}
|
|
73
78
|
return { value: result, newIndex: idx };
|
|
74
79
|
}
|
|
80
|
+
static splitCaseWhenKeywordComments(caseWhenKeywordComments, caseWhenKeywordPositionedComments) {
|
|
81
|
+
if (!caseWhenKeywordPositionedComments || caseWhenKeywordPositionedComments.length === 0) {
|
|
82
|
+
return {
|
|
83
|
+
caseExpressionPositioned: null,
|
|
84
|
+
firstWhenPositioned: null,
|
|
85
|
+
legacyCaseExpression: caseWhenKeywordComments !== null && caseWhenKeywordComments !== void 0 ? caseWhenKeywordComments : null,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
const caseExpressionPositioned = [];
|
|
89
|
+
const firstWhenPositioned = [];
|
|
90
|
+
for (const comment of caseWhenKeywordPositionedComments) {
|
|
91
|
+
if (comment.position === 'after') {
|
|
92
|
+
firstWhenPositioned.push({
|
|
93
|
+
position: 'before',
|
|
94
|
+
comments: [...comment.comments],
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
caseExpressionPositioned.push({
|
|
99
|
+
position: comment.position,
|
|
100
|
+
comments: [...comment.comments],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
caseExpressionPositioned: caseExpressionPositioned.length > 0 ? caseExpressionPositioned : null,
|
|
106
|
+
firstWhenPositioned: firstWhenPositioned.length > 0 ? firstWhenPositioned : null,
|
|
107
|
+
legacyCaseExpression: null,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
75
110
|
// parseSwitchCaseArgument method processes the WHEN, ELSE, and END clauses of a CASE expression.
|
|
76
111
|
static parseSwitchCaseArgument(lexemes, index, initialWhenThenList) {
|
|
77
112
|
let idx = index;
|
|
@@ -169,6 +204,16 @@ export class CommandExpressionParser {
|
|
|
169
204
|
static isCommandWithValue(lexeme, value) {
|
|
170
205
|
return ((lexeme.type & TokenType.Command) !== 0) && lexeme.value === value;
|
|
171
206
|
}
|
|
207
|
+
static addPositionedComments(target, comments) {
|
|
208
|
+
var _a;
|
|
209
|
+
if (!comments || comments.length === 0) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
target.positionedComments = [
|
|
213
|
+
...((_a = target.positionedComments) !== null && _a !== void 0 ? _a : []),
|
|
214
|
+
...comments,
|
|
215
|
+
];
|
|
216
|
+
}
|
|
172
217
|
static parseCaseConditionValuePair(lexemes, index) {
|
|
173
218
|
let idx = index;
|
|
174
219
|
const condition = ValueParser.parseFromLexeme(lexemes, idx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/CommandExpressionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAmB,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAkB,MAAM,0BAA0B,CAAC;AAClJ,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"CommandExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/CommandExpressionParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,15 +16,21 @@ export class HavingClauseParser {
|
|
|
16
16
|
}
|
|
17
17
|
// Parse from lexeme array (was: parse)
|
|
18
18
|
static parseFromLexeme(lexemes, index) {
|
|
19
|
+
var _a;
|
|
19
20
|
let idx = index;
|
|
20
21
|
if (lexemes[idx].value !== 'having') {
|
|
21
22
|
throw new Error(`Syntax error at position ${idx}: Expected 'HAVING' keyword but found "${lexemes[idx].value}". HAVING clauses must start with the HAVING keyword.`);
|
|
22
23
|
}
|
|
24
|
+
const havingKeywordComments = lexemes[idx].positionedComments;
|
|
23
25
|
idx++;
|
|
24
26
|
if (idx >= lexemes.length) {
|
|
25
27
|
throw new Error(`Syntax error: Unexpected end of input after 'HAVING' keyword. The HAVING clause requires a condition expression.`);
|
|
26
28
|
}
|
|
27
29
|
const item = ValueParser.parseFromLexeme(lexemes, idx);
|
|
30
|
+
const afterKeywordComments = (_a = havingKeywordComments === null || havingKeywordComments === void 0 ? void 0 : havingKeywordComments.filter(comment => comment.position === 'after').flatMap(comment => comment.comments)) !== null && _a !== void 0 ? _a : [];
|
|
31
|
+
if (afterKeywordComments.length > 0) {
|
|
32
|
+
item.value.addPositionedComments('before', afterKeywordComments);
|
|
33
|
+
}
|
|
28
34
|
const clause = new HavingClause(item.value);
|
|
29
35
|
return { value: clause, newIndex: item.newIndex };
|
|
30
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HavingParser.js","sourceRoot":"","sources":["../../../src/parsers/HavingParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"HavingParser.js","sourceRoot":"","sources":["../../../src/parsers/HavingParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,uDAAuD,CAAC,CAAC;QACxK,CAAC;QACD,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;QAC9D,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kHAAkH,CAAC,CAAC;QACxI,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,oBAAoB,GAAG,MAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAC5C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC/C,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC;QAChD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;CACJ"}
|
|
@@ -2,11 +2,17 @@ import { JoinOnClause } from "../models/Clause";
|
|
|
2
2
|
import { ValueParser } from "./ValueParser";
|
|
3
3
|
export class JoinOnClauseParser {
|
|
4
4
|
static tryParse(lexemes, index) {
|
|
5
|
+
var _a;
|
|
5
6
|
let idx = index;
|
|
6
7
|
if (idx < lexemes.length && lexemes[idx].value === 'on') {
|
|
8
|
+
const onKeywordComments = lexemes[idx].positionedComments;
|
|
7
9
|
idx++; // Skip 'on' keyword
|
|
8
10
|
// Parse the condition expression
|
|
9
11
|
const condition = ValueParser.parseFromLexeme(lexemes, idx);
|
|
12
|
+
const afterKeywordComments = (_a = onKeywordComments === null || onKeywordComments === void 0 ? void 0 : onKeywordComments.filter(comment => comment.position === 'after').flatMap(comment => comment.comments)) !== null && _a !== void 0 ? _a : [];
|
|
13
|
+
if (afterKeywordComments.length > 0) {
|
|
14
|
+
condition.value.addPositionedComments('before', afterKeywordComments);
|
|
15
|
+
}
|
|
10
16
|
idx = condition.newIndex;
|
|
11
17
|
const joinOn = new JoinOnClause(condition.value);
|
|
12
18
|
return { value: joinOn, newIndex: idx };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinOnClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/JoinOnClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAC,QAAQ,CAAC,OAAiB,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"JoinOnClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/JoinOnClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IACpB,MAAM,CAAC,QAAQ,CAAC,OAAiB,EAAE,KAAa;;QACnD,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;YAC1D,GAAG,EAAE,CAAC,CAAC,oBAAoB;YAC3B,iCAAiC;YACjC,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,MAAM,oBAAoB,GAAG,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CACxC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC/C,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC;YAChD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;YAC1E,CAAC;YACD,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
|
@@ -16,16 +16,22 @@ export class LimitClauseParser {
|
|
|
16
16
|
}
|
|
17
17
|
// Parse from lexeme array (was: parse)
|
|
18
18
|
static parseFromLexeme(lexemes, index) {
|
|
19
|
+
var _a;
|
|
19
20
|
let idx = index;
|
|
20
21
|
if (lexemes[idx].value !== 'limit') {
|
|
21
22
|
throw new Error(`Syntax error at position ${idx}: Expected 'LIMIT' keyword but found "${lexemes[idx].value}". LIMIT clauses must start with the LIMIT keyword.`);
|
|
22
23
|
}
|
|
24
|
+
const limitKeywordComments = lexemes[idx].positionedComments;
|
|
23
25
|
idx++;
|
|
24
26
|
if (idx >= lexemes.length) {
|
|
25
27
|
throw new Error(`Syntax error: Unexpected end of input after 'LIMIT' keyword. The LIMIT clause requires a numeric expression.`);
|
|
26
28
|
}
|
|
27
29
|
// Parse LIMIT value
|
|
28
30
|
const limitItem = ValueParser.parseFromLexeme(lexemes, idx);
|
|
31
|
+
const afterKeywordComments = (_a = limitKeywordComments === null || limitKeywordComments === void 0 ? void 0 : limitKeywordComments.filter(comment => comment.position === 'after').flatMap(comment => comment.comments)) !== null && _a !== void 0 ? _a : [];
|
|
32
|
+
if (afterKeywordComments.length > 0) {
|
|
33
|
+
limitItem.value.addPositionedComments('before', afterKeywordComments);
|
|
34
|
+
}
|
|
29
35
|
idx = limitItem.newIndex;
|
|
30
36
|
const clause = new LimitClause(limitItem.value);
|
|
31
37
|
return { value: clause, newIndex: idx };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LimitClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/LimitClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"LimitClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/LimitClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yCAAyC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qDAAqD,CAAC,CAAC;QACrK,CAAC;QACD,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;QAC7D,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;QACpI,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,oBAAoB,GAAG,MAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAC3C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC/C,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC;QAChD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC1E,CAAC;QACD,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ"}
|
|
@@ -16,16 +16,22 @@ export class OffsetClauseParser {
|
|
|
16
16
|
}
|
|
17
17
|
// Parse from lexeme array (was: parse)
|
|
18
18
|
static parseFromLexeme(lexemes, index) {
|
|
19
|
+
var _a;
|
|
19
20
|
let idx = index;
|
|
20
21
|
if (lexemes[idx].value !== 'offset') {
|
|
21
22
|
throw new Error(`Syntax error at position ${idx}: Expected 'OFFSET' keyword but found "${lexemes[idx].value}". OFFSET clauses must start with the OFFSET keyword.`);
|
|
22
23
|
}
|
|
24
|
+
const offsetKeywordComments = lexemes[idx].positionedComments;
|
|
23
25
|
idx++;
|
|
24
26
|
if (idx >= lexemes.length) {
|
|
25
27
|
throw new Error(`Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.`);
|
|
26
28
|
}
|
|
27
29
|
// Parse OFFSET value
|
|
28
30
|
const offsetItem = ValueParser.parseFromLexeme(lexemes, idx);
|
|
31
|
+
const afterKeywordComments = (_a = offsetKeywordComments === null || offsetKeywordComments === void 0 ? void 0 : offsetKeywordComments.filter(comment => comment.position === 'after').flatMap(comment => comment.comments)) !== null && _a !== void 0 ? _a : [];
|
|
32
|
+
if (afterKeywordComments.length > 0) {
|
|
33
|
+
offsetItem.value.addPositionedComments('before', afterKeywordComments);
|
|
34
|
+
}
|
|
29
35
|
idx = offsetItem.newIndex;
|
|
30
36
|
// If there is a "row" or "rows" command, skip it
|
|
31
37
|
if (idx < lexemes.length && (lexemes[idx].value === 'row' || lexemes[idx].value === 'rows')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OffsetClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/OffsetClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"OffsetClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/OffsetClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,uDAAuD,CAAC,CAAC;QACxK,CAAC;QACD,MAAM,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC;QAC9D,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACtI,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,oBAAoB,GAAG,MAAA,qBAAqB,aAArB,qBAAqB,uBAArB,qBAAqB,CAC5C,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC/C,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAI,EAAE,CAAC;QAChD,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;QAC3E,CAAC;QACD,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAE1B,iDAAiD;QACjD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;YAC1F,GAAG,EAAE,CAAC;QACV,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAElD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { OrderByClause } from "../models/Clause";
|
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
|
3
3
|
export declare class OrderByClauseParser {
|
|
4
|
+
private static appendUniqueComments;
|
|
5
|
+
private static collectLexemeComments;
|
|
4
6
|
static parse(query: string): OrderByClause;
|
|
5
7
|
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
|
6
8
|
value: OrderByClause;
|
|
@@ -3,6 +3,28 @@ import { TokenType } from "../models/Lexeme";
|
|
|
3
3
|
import { SqlTokenizer } from "./SqlTokenizer";
|
|
4
4
|
import { ValueParser } from "./ValueParser";
|
|
5
5
|
export class OrderByClauseParser {
|
|
6
|
+
static appendUniqueComments(target, comments) {
|
|
7
|
+
if (!comments || comments.length === 0) {
|
|
8
|
+
return target;
|
|
9
|
+
}
|
|
10
|
+
const merged = target ? [...target] : [];
|
|
11
|
+
for (const comment of comments) {
|
|
12
|
+
if (!merged.includes(comment)) {
|
|
13
|
+
merged.push(comment);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return merged;
|
|
17
|
+
}
|
|
18
|
+
static collectLexemeComments(token) {
|
|
19
|
+
let comments = null;
|
|
20
|
+
if (token.positionedComments && token.positionedComments.length > 0) {
|
|
21
|
+
for (const posComment of token.positionedComments) {
|
|
22
|
+
comments = this.appendUniqueComments(comments, posComment.comments);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
comments = this.appendUniqueComments(comments, token.comments);
|
|
26
|
+
return comments;
|
|
27
|
+
}
|
|
6
28
|
// Parse SQL string to AST (was: parse)
|
|
7
29
|
static parse(query) {
|
|
8
30
|
const tokenizer = new SqlTokenizer(query); // Initialize tokenizer
|
|
@@ -48,8 +70,8 @@ export class OrderByClauseParser {
|
|
|
48
70
|
if (idx >= lexemes.length) {
|
|
49
71
|
return { value: value, newIndex: idx };
|
|
50
72
|
}
|
|
51
|
-
// Capture comments from ASC/DESC tokens
|
|
52
|
-
let
|
|
73
|
+
// Capture comments from ASC/DESC/NULLS tokens so they stay adjacent to the full ORDER BY item.
|
|
74
|
+
let orderByItemComments = null;
|
|
53
75
|
let sortDirection = null;
|
|
54
76
|
if (idx < lexemes.length) {
|
|
55
77
|
const token = lexemes[idx];
|
|
@@ -63,42 +85,33 @@ export class OrderByClauseParser {
|
|
|
63
85
|
}
|
|
64
86
|
// Capture comments from the ASC/DESC token
|
|
65
87
|
if (sortDirection !== null) {
|
|
66
|
-
|
|
67
|
-
sortDirectionComments = [];
|
|
68
|
-
for (const posComment of token.positionedComments) {
|
|
69
|
-
if (posComment.comments && posComment.comments.length > 0) {
|
|
70
|
-
sortDirectionComments.push(...posComment.comments);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (token.comments && token.comments.length > 0) {
|
|
75
|
-
if (!sortDirectionComments)
|
|
76
|
-
sortDirectionComments = [];
|
|
77
|
-
sortDirectionComments.push(...token.comments);
|
|
78
|
-
}
|
|
88
|
+
orderByItemComments = this.appendUniqueComments(orderByItemComments, this.collectLexemeComments(token));
|
|
79
89
|
}
|
|
80
90
|
}
|
|
81
91
|
// nulls first, nulls last
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
: null;
|
|
89
|
-
// Apply sort direction comments to the value if captured
|
|
90
|
-
if (sortDirectionComments && sortDirectionComments.length > 0) {
|
|
91
|
-
if (value.comments) {
|
|
92
|
-
value.comments.push(...sortDirectionComments);
|
|
92
|
+
let nullsSortDirection = null;
|
|
93
|
+
if (idx < lexemes.length) {
|
|
94
|
+
const token = lexemes[idx];
|
|
95
|
+
if (token.value === 'nulls first') {
|
|
96
|
+
nullsSortDirection = NullsSortDirection.First;
|
|
97
|
+
idx++;
|
|
93
98
|
}
|
|
94
|
-
else {
|
|
95
|
-
|
|
99
|
+
else if (token.value === 'nulls last') {
|
|
100
|
+
nullsSortDirection = NullsSortDirection.Last;
|
|
101
|
+
idx++;
|
|
102
|
+
}
|
|
103
|
+
if (nullsSortDirection !== null) {
|
|
104
|
+
orderByItemComments = this.appendUniqueComments(orderByItemComments, this.collectLexemeComments(token));
|
|
96
105
|
}
|
|
97
106
|
}
|
|
98
107
|
if (sortDirection === null && nullsSortDirection === null) {
|
|
99
108
|
return { value: value, newIndex: idx };
|
|
100
109
|
}
|
|
101
|
-
|
|
110
|
+
const item = new OrderByItem(value, sortDirection, nullsSortDirection);
|
|
111
|
+
if (orderByItemComments && orderByItemComments.length > 0) {
|
|
112
|
+
item.comments = orderByItemComments;
|
|
113
|
+
}
|
|
114
|
+
return { value: item, newIndex: idx };
|
|
102
115
|
}
|
|
103
116
|
}
|
|
104
117
|
//# sourceMappingURL=OrderByClauseParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/OrderByClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAoB,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACnH,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,OAAO,mBAAmB;
|
|
1
|
+
{"version":3,"file":"OrderByClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/OrderByClauseParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ export declare class SqlPrintTokenParser implements SqlComponentVisitor<SqlPrint
|
|
|
57
57
|
private sourceAliasStyle;
|
|
58
58
|
private orderByDefaultDirectionStyle;
|
|
59
59
|
private readonly normalizeJoinConditionOrder;
|
|
60
|
+
private readonly listContinuationCommentComponents;
|
|
60
61
|
private joinConditionContexts;
|
|
61
62
|
constructor(options?: {
|
|
62
63
|
preset?: FormatterConfig;
|
|
@@ -249,6 +250,8 @@ export declare class SqlPrintTokenParser implements SqlComponentVisitor<SqlPrint
|
|
|
249
250
|
*/
|
|
250
251
|
private visitWindowFrameBoundStatic;
|
|
251
252
|
private visitSelectItem;
|
|
253
|
+
private collectCaseSelectItemDuplicateAfterComments;
|
|
254
|
+
private filterCaseSelectItemDuplicateAfterComments;
|
|
252
255
|
private visitSelectClause;
|
|
253
256
|
private flattenTokenText;
|
|
254
257
|
private visitHintClause;
|
|
@@ -138,6 +138,7 @@ export class SqlPrintTokenParser {
|
|
|
138
138
|
this._selfHandlingComponentTypes = new Set([
|
|
139
139
|
SimpleSelectQuery.kind,
|
|
140
140
|
SelectItem.kind,
|
|
141
|
+
OrderByItem.kind,
|
|
141
142
|
CaseKeyValuePair.kind,
|
|
142
143
|
SwitchCaseArgument.kind,
|
|
143
144
|
ColumnReference.kind,
|
|
@@ -157,6 +158,7 @@ export class SqlPrintTokenParser {
|
|
|
157
158
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
158
159
|
this.handlers = new Map();
|
|
159
160
|
this.index = 1;
|
|
161
|
+
this.listContinuationCommentComponents = new WeakSet();
|
|
160
162
|
this.joinConditionContexts = [];
|
|
161
163
|
if (options === null || options === void 0 ? void 0 : options.preset) {
|
|
162
164
|
const preset = options.preset;
|
|
@@ -346,6 +348,7 @@ export class SqlPrintTokenParser {
|
|
|
346
348
|
}
|
|
347
349
|
visitQualifiedName(arg) {
|
|
348
350
|
const token = new SqlPrintToken(SqlPrintTokenType.container, '', SqlPrintTokenContainerType.QualifiedName);
|
|
351
|
+
const hasOwnComments = this.hasPositionedComments(arg) || this.hasLegacyComments(arg);
|
|
349
352
|
if (arg.namespaces) {
|
|
350
353
|
for (let i = 0; i < arg.namespaces.length; i++) {
|
|
351
354
|
token.innerTokens.push(arg.namespaces[i].accept(this));
|
|
@@ -366,7 +369,7 @@ export class SqlPrintTokenParser {
|
|
|
366
369
|
arg.name.positionedComments = originalNameComments;
|
|
367
370
|
arg.name.comments = originalNameLegacyComments;
|
|
368
371
|
// Apply the name's comments to the qualified name token
|
|
369
|
-
if (this.hasPositionedComments(arg.name) || this.hasLegacyComments(arg.name)) {
|
|
372
|
+
if (!hasOwnComments && (this.hasPositionedComments(arg.name) || this.hasLegacyComments(arg.name))) {
|
|
370
373
|
this.addComponentComments(token, arg.name);
|
|
371
374
|
}
|
|
372
375
|
// Also handle any comments directly on the QualifiedName itself
|
|
@@ -416,6 +419,10 @@ export class SqlPrintTokenParser {
|
|
|
416
419
|
token.innerTokens.push(new SqlPrintToken(SqlPrintTokenType.keyword, 'nulls last'));
|
|
417
420
|
}
|
|
418
421
|
}
|
|
422
|
+
if (arg.comments && arg.comments.length > 0) {
|
|
423
|
+
token.innerTokens.push(SqlPrintTokenParser.SPACE_TOKEN);
|
|
424
|
+
token.innerTokens.push(...this.createInlineCommentSequence(arg.comments));
|
|
425
|
+
}
|
|
419
426
|
return token;
|
|
420
427
|
}
|
|
421
428
|
parse(arg) {
|
|
@@ -894,7 +901,18 @@ export class SqlPrintTokenParser {
|
|
|
894
901
|
}
|
|
895
902
|
visitColumnReference(arg) {
|
|
896
903
|
const token = new SqlPrintToken(SqlPrintTokenType.container, '', SqlPrintTokenContainerType.ColumnReference);
|
|
904
|
+
const hasOwnComments = this.hasPositionedComments(arg) || this.hasLegacyComments(arg);
|
|
905
|
+
const originalNamePositionedComments = arg.qualifiedName.name.positionedComments;
|
|
906
|
+
const originalNameComments = arg.qualifiedName.name.comments;
|
|
907
|
+
if (hasOwnComments) {
|
|
908
|
+
arg.qualifiedName.name.positionedComments = null;
|
|
909
|
+
arg.qualifiedName.name.comments = null;
|
|
910
|
+
}
|
|
897
911
|
token.innerTokens.push(arg.qualifiedName.accept(this));
|
|
912
|
+
if (hasOwnComments) {
|
|
913
|
+
arg.qualifiedName.name.positionedComments = originalNamePositionedComments;
|
|
914
|
+
arg.qualifiedName.name.comments = originalNameComments;
|
|
915
|
+
}
|
|
898
916
|
this.addComponentComments(token, arg);
|
|
899
917
|
return token;
|
|
900
918
|
}
|
|
@@ -1166,6 +1184,7 @@ export class SqlPrintTokenParser {
|
|
|
1166
1184
|
return token;
|
|
1167
1185
|
}
|
|
1168
1186
|
visitParenExpression(arg) {
|
|
1187
|
+
var _a, _b;
|
|
1169
1188
|
const token = new SqlPrintToken(SqlPrintTokenType.container, '', SqlPrintTokenContainerType.ParenExpression);
|
|
1170
1189
|
// Handle positioned comments for ParenExpression - check both self and inner expression
|
|
1171
1190
|
const hasOwnComments = arg.positionedComments && arg.positionedComments.length > 0;
|
|
@@ -1178,6 +1197,11 @@ export class SqlPrintTokenParser {
|
|
|
1178
1197
|
innerAfterComments = arg.expression.getPositionedComments('after');
|
|
1179
1198
|
arg.expression.positionedComments = null;
|
|
1180
1199
|
}
|
|
1200
|
+
if (hasOwnComments && innerBeforeComments.length > 0) {
|
|
1201
|
+
const innerBeforeSet = new Set(innerBeforeComments);
|
|
1202
|
+
arg.positionedComments = (_b = (_a = arg.positionedComments) === null || _a === void 0 ? void 0 : _a.map(comment => comment.position === 'after'
|
|
1203
|
+
? Object.assign(Object.assign({}, comment), { comments: comment.comments.filter(value => !innerBeforeSet.has(value)) }) : comment).filter(comment => comment.comments.length > 0)) !== null && _b !== void 0 ? _b : null;
|
|
1204
|
+
}
|
|
1181
1205
|
// Build basic structure first
|
|
1182
1206
|
token.innerTokens.push(SqlPrintTokenParser.PAREN_OPEN_TOKEN);
|
|
1183
1207
|
token.innerTokens.push(this.visit(arg.expression));
|
|
@@ -1243,7 +1267,6 @@ export class SqlPrintTokenParser {
|
|
|
1243
1267
|
promotedComments.push(...this.collectCaseLeadingCommentBlocks(conditionToken));
|
|
1244
1268
|
}
|
|
1245
1269
|
const switchToken = this.visit(arg.switchCase);
|
|
1246
|
-
promotedComments.push(...this.collectCaseLeadingCommentsFromSwitch(switchToken));
|
|
1247
1270
|
if (promotedComments.length > 0) {
|
|
1248
1271
|
token.innerTokens.push(...promotedComments);
|
|
1249
1272
|
}
|
|
@@ -1587,11 +1610,13 @@ export class SqlPrintTokenParser {
|
|
|
1587
1610
|
// Add positioned comments in recorded order
|
|
1588
1611
|
const beforeComments = arg.getPositionedComments('before');
|
|
1589
1612
|
const afterComments = arg.getPositionedComments('after');
|
|
1613
|
+
const duplicateCaseAfterComments = arg.value instanceof CaseExpression
|
|
1614
|
+
? this.collectCaseSelectItemDuplicateAfterComments(arg.value)
|
|
1615
|
+
: new Set();
|
|
1590
1616
|
if (beforeComments.length > 0) {
|
|
1591
|
-
if (arg.value instanceof CaseExpression) {
|
|
1617
|
+
if (arg.value instanceof CaseExpression || this.listContinuationCommentComponents.has(arg)) {
|
|
1592
1618
|
const commentBlocks = this.createCommentBlocks(beforeComments);
|
|
1593
1619
|
token.innerTokens.push(...commentBlocks);
|
|
1594
|
-
token.innerTokens.push(new SqlPrintToken(SqlPrintTokenType.commentNewline, ''));
|
|
1595
1620
|
}
|
|
1596
1621
|
else {
|
|
1597
1622
|
const commentTokens = this.createInlineCommentSequence(beforeComments);
|
|
@@ -1600,9 +1625,12 @@ export class SqlPrintTokenParser {
|
|
|
1600
1625
|
}
|
|
1601
1626
|
}
|
|
1602
1627
|
token.innerTokens.push(this.visit(arg.value));
|
|
1603
|
-
|
|
1628
|
+
const visibleAfterComments = arg.value instanceof CaseExpression
|
|
1629
|
+
? this.filterCaseSelectItemDuplicateAfterComments(afterComments, duplicateCaseAfterComments)
|
|
1630
|
+
: afterComments;
|
|
1631
|
+
if (visibleAfterComments.length > 0 && !isParenExpression) {
|
|
1604
1632
|
token.innerTokens.push(SqlPrintTokenParser.SPACE_TOKEN);
|
|
1605
|
-
const commentTokens = this.createInlineCommentSequence(
|
|
1633
|
+
const commentTokens = this.createInlineCommentSequence(visibleAfterComments);
|
|
1606
1634
|
token.innerTokens.push(...commentTokens);
|
|
1607
1635
|
}
|
|
1608
1636
|
// Restore original positioned comments to avoid side effects
|
|
@@ -1676,6 +1704,34 @@ export class SqlPrintTokenParser {
|
|
|
1676
1704
|
}
|
|
1677
1705
|
return token;
|
|
1678
1706
|
}
|
|
1707
|
+
collectCaseSelectItemDuplicateAfterComments(value) {
|
|
1708
|
+
const promoted = new Set();
|
|
1709
|
+
if (value.comments) {
|
|
1710
|
+
for (const comment of value.comments) {
|
|
1711
|
+
promoted.add(comment);
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
const firstCase = value.switchCase.cases[0];
|
|
1715
|
+
if (firstCase === null || firstCase === void 0 ? void 0 : firstCase.positionedComments) {
|
|
1716
|
+
for (const positionedComment of firstCase.positionedComments) {
|
|
1717
|
+
if (positionedComment.position === 'before') {
|
|
1718
|
+
for (const comment of positionedComment.comments) {
|
|
1719
|
+
promoted.add(comment);
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
return promoted;
|
|
1725
|
+
}
|
|
1726
|
+
filterCaseSelectItemDuplicateAfterComments(afterComments, promoted) {
|
|
1727
|
+
if (afterComments.length === 0) {
|
|
1728
|
+
return afterComments;
|
|
1729
|
+
}
|
|
1730
|
+
if (promoted.size === 0) {
|
|
1731
|
+
return afterComments;
|
|
1732
|
+
}
|
|
1733
|
+
return afterComments.filter(comment => !promoted.has(comment));
|
|
1734
|
+
}
|
|
1679
1735
|
visitSelectClause(arg) {
|
|
1680
1736
|
const token = new SqlPrintToken(SqlPrintTokenType.keyword, 'select', SqlPrintTokenContainerType.SelectClause);
|
|
1681
1737
|
// Handle positioned comments for SelectClause (unified spec)
|
|
@@ -1711,6 +1767,14 @@ export class SqlPrintTokenParser {
|
|
|
1711
1767
|
for (let i = 0; i < arg.items.length; i++) {
|
|
1712
1768
|
if (i > 0) {
|
|
1713
1769
|
token.innerTokens.push(...SqlPrintTokenParser.commaSpaceTokens());
|
|
1770
|
+
this.listContinuationCommentComponents.add(arg.items[i]);
|
|
1771
|
+
try {
|
|
1772
|
+
token.innerTokens.push(this.visit(arg.items[i]));
|
|
1773
|
+
}
|
|
1774
|
+
finally {
|
|
1775
|
+
this.listContinuationCommentComponents.delete(arg.items[i]);
|
|
1776
|
+
}
|
|
1777
|
+
continue;
|
|
1714
1778
|
}
|
|
1715
1779
|
token.innerTokens.push(this.visit(arg.items[i]));
|
|
1716
1780
|
}
|