rawsql-ts 0.24.1 → 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/SqlFormatter.d.ts +7 -1
- package/dist/esm/transformers/SqlFormatter.js.map +1 -1
- package/dist/esm/transformers/SqlPrinter.d.ts +32 -2
- package/dist/esm/transformers/SqlPrinter.js +255 -33
- 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/SqlFormatter.d.ts +7 -1
- package/dist/src/transformers/SqlPrinter.d.ts +32 -2
- package/dist/transformers/SqlFormatter.js.map +1 -1
- package/dist/transformers/SqlPrinter.js +255 -33
- package/dist/transformers/SqlPrinter.js.map +1 -1
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -55,9 +55,11 @@ class CommandExpressionParser {
|
|
|
55
55
|
}
|
|
56
56
|
static parseCaseWhenExpression(lexemes, index, caseWhenKeywordComments, caseWhenKeywordPositionedComments) {
|
|
57
57
|
let idx = index;
|
|
58
|
+
const commentPayload = this.splitCaseWhenKeywordComments(caseWhenKeywordComments, caseWhenKeywordPositionedComments);
|
|
58
59
|
// Parse the first WHEN clause
|
|
59
60
|
const casewhenResult = this.parseCaseConditionValuePair(lexemes, idx);
|
|
60
61
|
idx = casewhenResult.newIndex;
|
|
62
|
+
this.addPositionedComments(casewhenResult.value, commentPayload.firstWhenPositioned);
|
|
61
63
|
// Add the initial WHEN-THEN pair to the list
|
|
62
64
|
const caseWhenList = [casewhenResult.value];
|
|
63
65
|
// Process remaining WHEN-ELSE-END parts
|
|
@@ -66,15 +68,48 @@ class CommandExpressionParser {
|
|
|
66
68
|
// Create CASE expression with condition null (uses WHEN conditions instead of a simple CASE)
|
|
67
69
|
const result = new ValueComponent_1.CaseExpression(null, switchCaseResult.value);
|
|
68
70
|
// Assign CASE WHEN keyword comments to the CaseExpression (positioned comments only for unified spec)
|
|
69
|
-
if (
|
|
70
|
-
result.positionedComments =
|
|
71
|
+
if (commentPayload.caseExpressionPositioned && commentPayload.caseExpressionPositioned.length > 0) {
|
|
72
|
+
result.positionedComments = commentPayload.caseExpressionPositioned;
|
|
71
73
|
}
|
|
72
|
-
else if (
|
|
74
|
+
else if (commentPayload.firstWhenPositioned && commentPayload.firstWhenPositioned.length > 0) {
|
|
75
|
+
result.positionedComments = [];
|
|
76
|
+
}
|
|
77
|
+
else if (commentPayload.legacyCaseExpression && commentPayload.legacyCaseExpression.length > 0) {
|
|
73
78
|
// Convert legacy comments to positioned comments for unified spec
|
|
74
|
-
result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(
|
|
79
|
+
result.positionedComments = [CommandExpressionParser.convertLegacyToPositioned(commentPayload.legacyCaseExpression, 'before')];
|
|
75
80
|
}
|
|
76
81
|
return { value: result, newIndex: idx };
|
|
77
82
|
}
|
|
83
|
+
static splitCaseWhenKeywordComments(caseWhenKeywordComments, caseWhenKeywordPositionedComments) {
|
|
84
|
+
if (!caseWhenKeywordPositionedComments || caseWhenKeywordPositionedComments.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
caseExpressionPositioned: null,
|
|
87
|
+
firstWhenPositioned: null,
|
|
88
|
+
legacyCaseExpression: caseWhenKeywordComments !== null && caseWhenKeywordComments !== void 0 ? caseWhenKeywordComments : null,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
const caseExpressionPositioned = [];
|
|
92
|
+
const firstWhenPositioned = [];
|
|
93
|
+
for (const comment of caseWhenKeywordPositionedComments) {
|
|
94
|
+
if (comment.position === 'after') {
|
|
95
|
+
firstWhenPositioned.push({
|
|
96
|
+
position: 'before',
|
|
97
|
+
comments: [...comment.comments],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
caseExpressionPositioned.push({
|
|
102
|
+
position: comment.position,
|
|
103
|
+
comments: [...comment.comments],
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
caseExpressionPositioned: caseExpressionPositioned.length > 0 ? caseExpressionPositioned : null,
|
|
109
|
+
firstWhenPositioned: firstWhenPositioned.length > 0 ? firstWhenPositioned : null,
|
|
110
|
+
legacyCaseExpression: null,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
78
113
|
// parseSwitchCaseArgument method processes the WHEN, ELSE, and END clauses of a CASE expression.
|
|
79
114
|
static parseSwitchCaseArgument(lexemes, index, initialWhenThenList) {
|
|
80
115
|
let idx = index;
|
|
@@ -172,6 +207,16 @@ class CommandExpressionParser {
|
|
|
172
207
|
static isCommandWithValue(lexeme, value) {
|
|
173
208
|
return ((lexeme.type & Lexeme_1.TokenType.Command) !== 0) && lexeme.value === value;
|
|
174
209
|
}
|
|
210
|
+
static addPositionedComments(target, comments) {
|
|
211
|
+
var _a;
|
|
212
|
+
if (!comments || comments.length === 0) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
target.positionedComments = [
|
|
216
|
+
...((_a = target.positionedComments) !== null && _a !== void 0 ? _a : []),
|
|
217
|
+
...comments,
|
|
218
|
+
];
|
|
219
|
+
}
|
|
175
220
|
static parseCaseConditionValuePair(lexemes, index) {
|
|
176
221
|
let idx = index;
|
|
177
222
|
const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/CommandExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAA8E;AAC9E,6DAAkJ;AAClJ,+CAA4C;
|
|
1
|
+
{"version":3,"file":"CommandExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/CommandExpressionParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,15 +19,21 @@ class HavingClauseParser {
|
|
|
19
19
|
}
|
|
20
20
|
// Parse from lexeme array (was: parse)
|
|
21
21
|
static parseFromLexeme(lexemes, index) {
|
|
22
|
+
var _a;
|
|
22
23
|
let idx = index;
|
|
23
24
|
if (lexemes[idx].value !== 'having') {
|
|
24
25
|
throw new Error(`Syntax error at position ${idx}: Expected 'HAVING' keyword but found "${lexemes[idx].value}". HAVING clauses must start with the HAVING keyword.`);
|
|
25
26
|
}
|
|
27
|
+
const havingKeywordComments = lexemes[idx].positionedComments;
|
|
26
28
|
idx++;
|
|
27
29
|
if (idx >= lexemes.length) {
|
|
28
30
|
throw new Error(`Syntax error: Unexpected end of input after 'HAVING' keyword. The HAVING clause requires a condition expression.`);
|
|
29
31
|
}
|
|
30
32
|
const item = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
33
|
+
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 : [];
|
|
34
|
+
if (afterKeywordComments.length > 0) {
|
|
35
|
+
item.value.addPositionedComments('before', afterKeywordComments);
|
|
36
|
+
}
|
|
31
37
|
const clause = new Clause_1.HavingClause(item.value);
|
|
32
38
|
return { value: clause, newIndex: item.newIndex };
|
|
33
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HavingParser.js","sourceRoot":"","sources":["../../src/parsers/HavingParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,6CAAgD;AAEhD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,yBAAW,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,qBAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;CACJ;AA1CD,gDA0CC"}
|
|
@@ -5,11 +5,17 @@ const Clause_1 = require("../models/Clause");
|
|
|
5
5
|
const ValueParser_1 = require("./ValueParser");
|
|
6
6
|
class JoinOnClauseParser {
|
|
7
7
|
static tryParse(lexemes, index) {
|
|
8
|
+
var _a;
|
|
8
9
|
let idx = index;
|
|
9
10
|
if (idx < lexemes.length && lexemes[idx].value === 'on') {
|
|
11
|
+
const onKeywordComments = lexemes[idx].positionedComments;
|
|
10
12
|
idx++; // Skip 'on' keyword
|
|
11
13
|
// Parse the condition expression
|
|
12
14
|
const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
15
|
+
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 : [];
|
|
16
|
+
if (afterKeywordComments.length > 0) {
|
|
17
|
+
condition.value.addPositionedComments('before', afterKeywordComments);
|
|
18
|
+
}
|
|
13
19
|
idx = condition.newIndex;
|
|
14
20
|
const joinOn = new Clause_1.JoinOnClause(condition.value);
|
|
15
21
|
return { value: joinOn, newIndex: idx };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JoinOnClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinOnClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,+CAA4C;AAE5C,MAAa,kBAAkB;IACpB,MAAM,CAAC,QAAQ,CAAC,OAAiB,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"JoinOnClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinOnClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,+CAA4C;AAE5C,MAAa,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,yBAAW,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,qBAAY,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;AApBD,gDAoBC"}
|
|
@@ -19,16 +19,22 @@ class LimitClauseParser {
|
|
|
19
19
|
}
|
|
20
20
|
// Parse from lexeme array (was: parse)
|
|
21
21
|
static parseFromLexeme(lexemes, index) {
|
|
22
|
+
var _a;
|
|
22
23
|
let idx = index;
|
|
23
24
|
if (lexemes[idx].value !== 'limit') {
|
|
24
25
|
throw new Error(`Syntax error at position ${idx}: Expected 'LIMIT' keyword but found "${lexemes[idx].value}". LIMIT clauses must start with the LIMIT keyword.`);
|
|
25
26
|
}
|
|
27
|
+
const limitKeywordComments = lexemes[idx].positionedComments;
|
|
26
28
|
idx++;
|
|
27
29
|
if (idx >= lexemes.length) {
|
|
28
30
|
throw new Error(`Syntax error: Unexpected end of input after 'LIMIT' keyword. The LIMIT clause requires a numeric expression.`);
|
|
29
31
|
}
|
|
30
32
|
// Parse LIMIT value
|
|
31
33
|
const limitItem = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
34
|
+
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 : [];
|
|
35
|
+
if (afterKeywordComments.length > 0) {
|
|
36
|
+
limitItem.value.addPositionedComments('before', afterKeywordComments);
|
|
37
|
+
}
|
|
32
38
|
idx = limitItem.newIndex;
|
|
33
39
|
const clause = new Clause_1.LimitClause(limitItem.value);
|
|
34
40
|
return { value: clause, newIndex: idx };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LimitClauseParser.js","sourceRoot":"","sources":["../../src/parsers/LimitClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA8D;AAE9D,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,6CAA8D;AAE9D,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,yBAAW,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,oBAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ;AA7CD,8CA6CC"}
|
|
@@ -19,16 +19,22 @@ class OffsetClauseParser {
|
|
|
19
19
|
}
|
|
20
20
|
// Parse from lexeme array (was: parse)
|
|
21
21
|
static parseFromLexeme(lexemes, index) {
|
|
22
|
+
var _a;
|
|
22
23
|
let idx = index;
|
|
23
24
|
if (lexemes[idx].value !== 'offset') {
|
|
24
25
|
throw new Error(`Syntax error at position ${idx}: Expected 'OFFSET' keyword but found "${lexemes[idx].value}". OFFSET clauses must start with the OFFSET keyword.`);
|
|
25
26
|
}
|
|
27
|
+
const offsetKeywordComments = lexemes[idx].positionedComments;
|
|
26
28
|
idx++;
|
|
27
29
|
if (idx >= lexemes.length) {
|
|
28
30
|
throw new Error(`Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.`);
|
|
29
31
|
}
|
|
30
32
|
// Parse OFFSET value
|
|
31
33
|
const offsetItem = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
34
|
+
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 : [];
|
|
35
|
+
if (afterKeywordComments.length > 0) {
|
|
36
|
+
offsetItem.value.addPositionedComments('before', afterKeywordComments);
|
|
37
|
+
}
|
|
32
38
|
idx = offsetItem.newIndex;
|
|
33
39
|
// If there is a "row" or "rows" command, skip it
|
|
34
40
|
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,6CAAgD;AAEhD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,6CAAgD;AAEhD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,yBAAW,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,qBAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAElD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ;AAlDD,gDAkDC"}
|
|
@@ -6,6 +6,28 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
|
6
6
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
7
7
|
const ValueParser_1 = require("./ValueParser");
|
|
8
8
|
class OrderByClauseParser {
|
|
9
|
+
static appendUniqueComments(target, comments) {
|
|
10
|
+
if (!comments || comments.length === 0) {
|
|
11
|
+
return target;
|
|
12
|
+
}
|
|
13
|
+
const merged = target ? [...target] : [];
|
|
14
|
+
for (const comment of comments) {
|
|
15
|
+
if (!merged.includes(comment)) {
|
|
16
|
+
merged.push(comment);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return merged;
|
|
20
|
+
}
|
|
21
|
+
static collectLexemeComments(token) {
|
|
22
|
+
let comments = null;
|
|
23
|
+
if (token.positionedComments && token.positionedComments.length > 0) {
|
|
24
|
+
for (const posComment of token.positionedComments) {
|
|
25
|
+
comments = this.appendUniqueComments(comments, posComment.comments);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
comments = this.appendUniqueComments(comments, token.comments);
|
|
29
|
+
return comments;
|
|
30
|
+
}
|
|
9
31
|
// Parse SQL string to AST (was: parse)
|
|
10
32
|
static parse(query) {
|
|
11
33
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
|
@@ -51,8 +73,8 @@ class OrderByClauseParser {
|
|
|
51
73
|
if (idx >= lexemes.length) {
|
|
52
74
|
return { value: value, newIndex: idx };
|
|
53
75
|
}
|
|
54
|
-
// Capture comments from ASC/DESC tokens
|
|
55
|
-
let
|
|
76
|
+
// Capture comments from ASC/DESC/NULLS tokens so they stay adjacent to the full ORDER BY item.
|
|
77
|
+
let orderByItemComments = null;
|
|
56
78
|
let sortDirection = null;
|
|
57
79
|
if (idx < lexemes.length) {
|
|
58
80
|
const token = lexemes[idx];
|
|
@@ -66,42 +88,33 @@ class OrderByClauseParser {
|
|
|
66
88
|
}
|
|
67
89
|
// Capture comments from the ASC/DESC token
|
|
68
90
|
if (sortDirection !== null) {
|
|
69
|
-
|
|
70
|
-
sortDirectionComments = [];
|
|
71
|
-
for (const posComment of token.positionedComments) {
|
|
72
|
-
if (posComment.comments && posComment.comments.length > 0) {
|
|
73
|
-
sortDirectionComments.push(...posComment.comments);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (token.comments && token.comments.length > 0) {
|
|
78
|
-
if (!sortDirectionComments)
|
|
79
|
-
sortDirectionComments = [];
|
|
80
|
-
sortDirectionComments.push(...token.comments);
|
|
81
|
-
}
|
|
91
|
+
orderByItemComments = this.appendUniqueComments(orderByItemComments, this.collectLexemeComments(token));
|
|
82
92
|
}
|
|
83
93
|
}
|
|
84
94
|
// nulls first, nulls last
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
: null;
|
|
92
|
-
// Apply sort direction comments to the value if captured
|
|
93
|
-
if (sortDirectionComments && sortDirectionComments.length > 0) {
|
|
94
|
-
if (value.comments) {
|
|
95
|
-
value.comments.push(...sortDirectionComments);
|
|
95
|
+
let nullsSortDirection = null;
|
|
96
|
+
if (idx < lexemes.length) {
|
|
97
|
+
const token = lexemes[idx];
|
|
98
|
+
if (token.value === 'nulls first') {
|
|
99
|
+
nullsSortDirection = Clause_1.NullsSortDirection.First;
|
|
100
|
+
idx++;
|
|
96
101
|
}
|
|
97
|
-
else {
|
|
98
|
-
|
|
102
|
+
else if (token.value === 'nulls last') {
|
|
103
|
+
nullsSortDirection = Clause_1.NullsSortDirection.Last;
|
|
104
|
+
idx++;
|
|
105
|
+
}
|
|
106
|
+
if (nullsSortDirection !== null) {
|
|
107
|
+
orderByItemComments = this.appendUniqueComments(orderByItemComments, this.collectLexemeComments(token));
|
|
99
108
|
}
|
|
100
109
|
}
|
|
101
110
|
if (sortDirection === null && nullsSortDirection === null) {
|
|
102
111
|
return { value: value, newIndex: idx };
|
|
103
112
|
}
|
|
104
|
-
|
|
113
|
+
const item = new Clause_1.OrderByItem(value, sortDirection, nullsSortDirection);
|
|
114
|
+
if (orderByItemComments && orderByItemComments.length > 0) {
|
|
115
|
+
item.comments = orderByItemComments;
|
|
116
|
+
}
|
|
117
|
+
return { value: item, newIndex: idx };
|
|
105
118
|
}
|
|
106
119
|
}
|
|
107
120
|
exports.OrderByClauseParser = OrderByClauseParser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByClauseParser.js","sourceRoot":"","sources":["../../src/parsers/OrderByClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAmH;AACnH,6CAAqD;AACrD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,mBAAmB;
|
|
1
|
+
{"version":3,"file":"OrderByClauseParser.js","sourceRoot":"","sources":["../../src/parsers/OrderByClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAmH;AACnH,6CAAqD;AACrD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,mBAAmB;IACpB,MAAM,CAAC,oBAAoB,CAAC,MAAuB,EAAE,QAAqC;QAC9F,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,KAAa;QAC9C,IAAI,QAAQ,GAAoB,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;gBAChD,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxE,CAAC;QACL,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/D,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,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,oEAAoE,CAAC,CAAC;QAC3L,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,UAAU,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,4CAA4C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,4DAA4D,CAAC,CAAC;QAC/K,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,MAAM,KAAK,GAAuB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEpB,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,oGAAoG,CAAC,CAAC;QAC3J,CAAC;aAAM,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,sBAAa,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC5C,CAAC;IACL,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,OAAiB,EAAE,KAAa;QACrD,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,WAAW,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAChC,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC3B,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC3C,CAAC;QAED,+FAA+F;QAC/F,IAAI,mBAAmB,GAAoB,IAAI,CAAC;QAChD,IAAI,aAAa,GAAyB,IAAI,CAAC;QAE/C,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACxB,aAAa,GAAG,sBAAa,CAAC,SAAS,CAAC;gBACxC,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBAChC,aAAa,GAAG,sBAAa,CAAC,UAAU,CAAC;gBACzC,GAAG,EAAE,CAAC;YACV,CAAC;YAED,2CAA2C;YAC3C,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBACzB,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5G,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,kBAAkB,GAA8B,IAAI,CAAC;QACzD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;gBAChC,kBAAkB,GAAG,2BAAkB,CAAC,KAAK,CAAC;gBAC9C,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;gBACtC,kBAAkB,GAAG,2BAAkB,CAAC,IAAI,CAAC;gBAC7C,GAAG,EAAE,CAAC;YACV,CAAC;YAED,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBAC9B,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5G,CAAC;QACL,CAAC;QAED,IAAI,aAAa,KAAK,IAAI,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC3C,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,oBAAW,CAAC,KAAK,EAAE,aAAa,EAAE,kBAAkB,CAAC,CAAC;QACvE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC;QACxC,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;CACJ;AA/HD,kDA+HC"}
|
|
@@ -141,6 +141,7 @@ class SqlPrintTokenParser {
|
|
|
141
141
|
this._selfHandlingComponentTypes = new Set([
|
|
142
142
|
SelectQuery_1.SimpleSelectQuery.kind,
|
|
143
143
|
Clause_1.SelectItem.kind,
|
|
144
|
+
Clause_1.OrderByItem.kind,
|
|
144
145
|
ValueComponent_1.CaseKeyValuePair.kind,
|
|
145
146
|
ValueComponent_1.SwitchCaseArgument.kind,
|
|
146
147
|
ValueComponent_1.ColumnReference.kind,
|
|
@@ -160,6 +161,7 @@ class SqlPrintTokenParser {
|
|
|
160
161
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
161
162
|
this.handlers = new Map();
|
|
162
163
|
this.index = 1;
|
|
164
|
+
this.listContinuationCommentComponents = new WeakSet();
|
|
163
165
|
this.joinConditionContexts = [];
|
|
164
166
|
if (options === null || options === void 0 ? void 0 : options.preset) {
|
|
165
167
|
const preset = options.preset;
|
|
@@ -349,6 +351,7 @@ class SqlPrintTokenParser {
|
|
|
349
351
|
}
|
|
350
352
|
visitQualifiedName(arg) {
|
|
351
353
|
const token = new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.container, '', SqlPrintToken_1.SqlPrintTokenContainerType.QualifiedName);
|
|
354
|
+
const hasOwnComments = this.hasPositionedComments(arg) || this.hasLegacyComments(arg);
|
|
352
355
|
if (arg.namespaces) {
|
|
353
356
|
for (let i = 0; i < arg.namespaces.length; i++) {
|
|
354
357
|
token.innerTokens.push(arg.namespaces[i].accept(this));
|
|
@@ -369,7 +372,7 @@ class SqlPrintTokenParser {
|
|
|
369
372
|
arg.name.positionedComments = originalNameComments;
|
|
370
373
|
arg.name.comments = originalNameLegacyComments;
|
|
371
374
|
// Apply the name's comments to the qualified name token
|
|
372
|
-
if (this.hasPositionedComments(arg.name) || this.hasLegacyComments(arg.name)) {
|
|
375
|
+
if (!hasOwnComments && (this.hasPositionedComments(arg.name) || this.hasLegacyComments(arg.name))) {
|
|
373
376
|
this.addComponentComments(token, arg.name);
|
|
374
377
|
}
|
|
375
378
|
// Also handle any comments directly on the QualifiedName itself
|
|
@@ -419,6 +422,10 @@ class SqlPrintTokenParser {
|
|
|
419
422
|
token.innerTokens.push(new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.keyword, 'nulls last'));
|
|
420
423
|
}
|
|
421
424
|
}
|
|
425
|
+
if (arg.comments && arg.comments.length > 0) {
|
|
426
|
+
token.innerTokens.push(SqlPrintTokenParser.SPACE_TOKEN);
|
|
427
|
+
token.innerTokens.push(...this.createInlineCommentSequence(arg.comments));
|
|
428
|
+
}
|
|
422
429
|
return token;
|
|
423
430
|
}
|
|
424
431
|
parse(arg) {
|
|
@@ -897,7 +904,18 @@ class SqlPrintTokenParser {
|
|
|
897
904
|
}
|
|
898
905
|
visitColumnReference(arg) {
|
|
899
906
|
const token = new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.container, '', SqlPrintToken_1.SqlPrintTokenContainerType.ColumnReference);
|
|
907
|
+
const hasOwnComments = this.hasPositionedComments(arg) || this.hasLegacyComments(arg);
|
|
908
|
+
const originalNamePositionedComments = arg.qualifiedName.name.positionedComments;
|
|
909
|
+
const originalNameComments = arg.qualifiedName.name.comments;
|
|
910
|
+
if (hasOwnComments) {
|
|
911
|
+
arg.qualifiedName.name.positionedComments = null;
|
|
912
|
+
arg.qualifiedName.name.comments = null;
|
|
913
|
+
}
|
|
900
914
|
token.innerTokens.push(arg.qualifiedName.accept(this));
|
|
915
|
+
if (hasOwnComments) {
|
|
916
|
+
arg.qualifiedName.name.positionedComments = originalNamePositionedComments;
|
|
917
|
+
arg.qualifiedName.name.comments = originalNameComments;
|
|
918
|
+
}
|
|
901
919
|
this.addComponentComments(token, arg);
|
|
902
920
|
return token;
|
|
903
921
|
}
|
|
@@ -1169,6 +1187,7 @@ class SqlPrintTokenParser {
|
|
|
1169
1187
|
return token;
|
|
1170
1188
|
}
|
|
1171
1189
|
visitParenExpression(arg) {
|
|
1190
|
+
var _a, _b;
|
|
1172
1191
|
const token = new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.container, '', SqlPrintToken_1.SqlPrintTokenContainerType.ParenExpression);
|
|
1173
1192
|
// Handle positioned comments for ParenExpression - check both self and inner expression
|
|
1174
1193
|
const hasOwnComments = arg.positionedComments && arg.positionedComments.length > 0;
|
|
@@ -1181,6 +1200,12 @@ class SqlPrintTokenParser {
|
|
|
1181
1200
|
innerAfterComments = arg.expression.getPositionedComments('after');
|
|
1182
1201
|
arg.expression.positionedComments = null;
|
|
1183
1202
|
}
|
|
1203
|
+
if (hasOwnComments && innerBeforeComments.length > 0) {
|
|
1204
|
+
const innerBeforeSet = new Set(innerBeforeComments);
|
|
1205
|
+
arg.positionedComments = (_b = (_a = arg.positionedComments) === null || _a === void 0 ? void 0 : _a.map(comment => comment.position === 'after'
|
|
1206
|
+
? { ...comment, comments: comment.comments.filter(value => !innerBeforeSet.has(value)) }
|
|
1207
|
+
: comment).filter(comment => comment.comments.length > 0)) !== null && _b !== void 0 ? _b : null;
|
|
1208
|
+
}
|
|
1184
1209
|
// Build basic structure first
|
|
1185
1210
|
token.innerTokens.push(SqlPrintTokenParser.PAREN_OPEN_TOKEN);
|
|
1186
1211
|
token.innerTokens.push(this.visit(arg.expression));
|
|
@@ -1246,7 +1271,6 @@ class SqlPrintTokenParser {
|
|
|
1246
1271
|
promotedComments.push(...this.collectCaseLeadingCommentBlocks(conditionToken));
|
|
1247
1272
|
}
|
|
1248
1273
|
const switchToken = this.visit(arg.switchCase);
|
|
1249
|
-
promotedComments.push(...this.collectCaseLeadingCommentsFromSwitch(switchToken));
|
|
1250
1274
|
if (promotedComments.length > 0) {
|
|
1251
1275
|
token.innerTokens.push(...promotedComments);
|
|
1252
1276
|
}
|
|
@@ -1590,11 +1614,13 @@ class SqlPrintTokenParser {
|
|
|
1590
1614
|
// Add positioned comments in recorded order
|
|
1591
1615
|
const beforeComments = arg.getPositionedComments('before');
|
|
1592
1616
|
const afterComments = arg.getPositionedComments('after');
|
|
1617
|
+
const duplicateCaseAfterComments = arg.value instanceof ValueComponent_1.CaseExpression
|
|
1618
|
+
? this.collectCaseSelectItemDuplicateAfterComments(arg.value)
|
|
1619
|
+
: new Set();
|
|
1593
1620
|
if (beforeComments.length > 0) {
|
|
1594
|
-
if (arg.value instanceof ValueComponent_1.CaseExpression) {
|
|
1621
|
+
if (arg.value instanceof ValueComponent_1.CaseExpression || this.listContinuationCommentComponents.has(arg)) {
|
|
1595
1622
|
const commentBlocks = this.createCommentBlocks(beforeComments);
|
|
1596
1623
|
token.innerTokens.push(...commentBlocks);
|
|
1597
|
-
token.innerTokens.push(new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.commentNewline, ''));
|
|
1598
1624
|
}
|
|
1599
1625
|
else {
|
|
1600
1626
|
const commentTokens = this.createInlineCommentSequence(beforeComments);
|
|
@@ -1603,9 +1629,12 @@ class SqlPrintTokenParser {
|
|
|
1603
1629
|
}
|
|
1604
1630
|
}
|
|
1605
1631
|
token.innerTokens.push(this.visit(arg.value));
|
|
1606
|
-
|
|
1632
|
+
const visibleAfterComments = arg.value instanceof ValueComponent_1.CaseExpression
|
|
1633
|
+
? this.filterCaseSelectItemDuplicateAfterComments(afterComments, duplicateCaseAfterComments)
|
|
1634
|
+
: afterComments;
|
|
1635
|
+
if (visibleAfterComments.length > 0 && !isParenExpression) {
|
|
1607
1636
|
token.innerTokens.push(SqlPrintTokenParser.SPACE_TOKEN);
|
|
1608
|
-
const commentTokens = this.createInlineCommentSequence(
|
|
1637
|
+
const commentTokens = this.createInlineCommentSequence(visibleAfterComments);
|
|
1609
1638
|
token.innerTokens.push(...commentTokens);
|
|
1610
1639
|
}
|
|
1611
1640
|
// Restore original positioned comments to avoid side effects
|
|
@@ -1679,6 +1708,34 @@ class SqlPrintTokenParser {
|
|
|
1679
1708
|
}
|
|
1680
1709
|
return token;
|
|
1681
1710
|
}
|
|
1711
|
+
collectCaseSelectItemDuplicateAfterComments(value) {
|
|
1712
|
+
const promoted = new Set();
|
|
1713
|
+
if (value.comments) {
|
|
1714
|
+
for (const comment of value.comments) {
|
|
1715
|
+
promoted.add(comment);
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
const firstCase = value.switchCase.cases[0];
|
|
1719
|
+
if (firstCase === null || firstCase === void 0 ? void 0 : firstCase.positionedComments) {
|
|
1720
|
+
for (const positionedComment of firstCase.positionedComments) {
|
|
1721
|
+
if (positionedComment.position === 'before') {
|
|
1722
|
+
for (const comment of positionedComment.comments) {
|
|
1723
|
+
promoted.add(comment);
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
}
|
|
1727
|
+
}
|
|
1728
|
+
return promoted;
|
|
1729
|
+
}
|
|
1730
|
+
filterCaseSelectItemDuplicateAfterComments(afterComments, promoted) {
|
|
1731
|
+
if (afterComments.length === 0) {
|
|
1732
|
+
return afterComments;
|
|
1733
|
+
}
|
|
1734
|
+
if (promoted.size === 0) {
|
|
1735
|
+
return afterComments;
|
|
1736
|
+
}
|
|
1737
|
+
return afterComments.filter(comment => !promoted.has(comment));
|
|
1738
|
+
}
|
|
1682
1739
|
visitSelectClause(arg) {
|
|
1683
1740
|
const token = new SqlPrintToken_1.SqlPrintToken(SqlPrintToken_1.SqlPrintTokenType.keyword, 'select', SqlPrintToken_1.SqlPrintTokenContainerType.SelectClause);
|
|
1684
1741
|
// Handle positioned comments for SelectClause (unified spec)
|
|
@@ -1714,6 +1771,14 @@ class SqlPrintTokenParser {
|
|
|
1714
1771
|
for (let i = 0; i < arg.items.length; i++) {
|
|
1715
1772
|
if (i > 0) {
|
|
1716
1773
|
token.innerTokens.push(...SqlPrintTokenParser.commaSpaceTokens());
|
|
1774
|
+
this.listContinuationCommentComponents.add(arg.items[i]);
|
|
1775
|
+
try {
|
|
1776
|
+
token.innerTokens.push(this.visit(arg.items[i]));
|
|
1777
|
+
}
|
|
1778
|
+
finally {
|
|
1779
|
+
this.listContinuationCommentComponents.delete(arg.items[i]);
|
|
1780
|
+
}
|
|
1781
|
+
continue;
|
|
1717
1782
|
}
|
|
1718
1783
|
token.innerTokens.push(this.visit(arg.items[i]));
|
|
1719
1784
|
}
|