rawsql-ts 0.5.0-beta → 0.6.0-beta
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/README.md +11 -0
- package/dist/esm/models/Clause.js +104 -6
- package/dist/esm/models/Clause.js.map +1 -1
- package/dist/esm/models/CreateTableQuery.js +1 -1
- package/dist/esm/models/CreateTableQuery.js.map +1 -1
- package/dist/esm/models/InsertQuery.js +2 -9
- package/dist/esm/models/InsertQuery.js.map +1 -1
- package/dist/esm/models/UpdateQuery.js +25 -0
- package/dist/esm/models/UpdateQuery.js.map +1 -0
- package/dist/esm/models/ValueComponent.js +31 -14
- package/dist/esm/models/ValueComponent.js.map +1 -1
- package/dist/esm/parsers/FullNameParser.js +89 -0
- package/dist/esm/parsers/FullNameParser.js.map +1 -0
- package/dist/esm/parsers/FunctionExpressionParser.js +33 -32
- package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/parsers/IdentifierParser.js +5 -30
- package/dist/esm/parsers/IdentifierParser.js.map +1 -1
- package/dist/esm/parsers/InsertQueryParser.js +6 -27
- package/dist/esm/parsers/InsertQueryParser.js.map +1 -1
- package/dist/esm/parsers/ReturningClauseParser.js +31 -0
- package/dist/esm/parsers/ReturningClauseParser.js.map +1 -0
- package/dist/esm/parsers/SetClauseParser.js +39 -0
- package/dist/esm/parsers/SetClauseParser.js.map +1 -0
- package/dist/esm/parsers/SourceExpressionParser.js +19 -0
- package/dist/esm/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/esm/parsers/SourceParser.js +16 -8
- package/dist/esm/parsers/SourceParser.js.map +1 -1
- package/dist/esm/parsers/UpdateClauseParser.js +17 -0
- package/dist/esm/parsers/UpdateClauseParser.js.map +1 -0
- package/dist/esm/parsers/UpdateQueryParser.js +84 -0
- package/dist/esm/parsers/UpdateQueryParser.js.map +1 -0
- package/dist/esm/parsers/ValueParser.js +13 -11
- package/dist/esm/parsers/ValueParser.js.map +1 -1
- package/dist/esm/transformers/CTEDisabler.js +2 -2
- package/dist/esm/transformers/CTEDisabler.js.map +1 -1
- package/dist/esm/transformers/Formatter.js +92 -15
- package/dist/esm/transformers/Formatter.js.map +1 -1
- package/dist/esm/transformers/QueryBuilder.js +54 -6
- package/dist/esm/transformers/QueryBuilder.js.map +1 -1
- package/dist/esm/transformers/SelectValueCollector.js +4 -4
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +1 -1
- package/dist/esm/types/models/Clause.d.ts +58 -4
- package/dist/esm/types/models/InsertQuery.d.ts +4 -9
- package/dist/esm/types/models/UpdateQuery.d.ts +31 -0
- package/dist/esm/types/models/ValueComponent.d.ts +7 -4
- package/dist/esm/types/parsers/FullNameParser.d.ts +26 -0
- package/dist/esm/types/parsers/InsertQueryParser.d.ts +0 -1
- package/dist/esm/types/parsers/ReturningClauseParser.d.ts +12 -0
- package/dist/esm/types/parsers/SetClauseParser.d.ts +11 -0
- package/dist/esm/types/parsers/SourceExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/SourceParser.d.ts +14 -0
- package/dist/esm/types/parsers/UpdateClauseParser.d.ts +15 -0
- package/dist/esm/types/parsers/UpdateQueryParser.d.ts +16 -0
- package/dist/esm/types/transformers/Formatter.d.ts +6 -0
- package/dist/esm/types/transformers/QueryBuilder.d.ts +9 -0
- package/dist/models/Clause.d.ts +58 -4
- package/dist/models/Clause.js +110 -7
- package/dist/models/Clause.js.map +1 -1
- package/dist/models/CreateTableQuery.js +1 -1
- package/dist/models/CreateTableQuery.js.map +1 -1
- package/dist/models/InsertQuery.d.ts +4 -9
- package/dist/models/InsertQuery.js +2 -9
- package/dist/models/InsertQuery.js.map +1 -1
- package/dist/models/UpdateQuery.d.ts +31 -0
- package/dist/models/UpdateQuery.js +29 -0
- package/dist/models/UpdateQuery.js.map +1 -0
- package/dist/models/ValueComponent.d.ts +7 -4
- package/dist/models/ValueComponent.js +31 -14
- package/dist/models/ValueComponent.js.map +1 -1
- package/dist/parsers/FullNameParser.d.ts +26 -0
- package/dist/parsers/FullNameParser.js +93 -0
- package/dist/parsers/FullNameParser.js.map +1 -0
- package/dist/parsers/FunctionExpressionParser.js +32 -31
- package/dist/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/parsers/IdentifierParser.js +5 -30
- package/dist/parsers/IdentifierParser.js.map +1 -1
- package/dist/parsers/InsertQueryParser.d.ts +0 -1
- package/dist/parsers/InsertQueryParser.js +6 -27
- package/dist/parsers/InsertQueryParser.js.map +1 -1
- package/dist/parsers/ReturningClauseParser.d.ts +12 -0
- package/dist/parsers/ReturningClauseParser.js +35 -0
- package/dist/parsers/ReturningClauseParser.js.map +1 -0
- package/dist/parsers/SetClauseParser.d.ts +11 -0
- package/dist/parsers/SetClauseParser.js +43 -0
- package/dist/parsers/SetClauseParser.js.map +1 -0
- package/dist/parsers/SourceExpressionParser.d.ts +8 -0
- package/dist/parsers/SourceExpressionParser.js +19 -0
- package/dist/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/parsers/SourceParser.d.ts +14 -0
- package/dist/parsers/SourceParser.js +16 -8
- package/dist/parsers/SourceParser.js.map +1 -1
- package/dist/parsers/UpdateClauseParser.d.ts +15 -0
- package/dist/parsers/UpdateClauseParser.js +21 -0
- package/dist/parsers/UpdateClauseParser.js.map +1 -0
- package/dist/parsers/UpdateQueryParser.d.ts +16 -0
- package/dist/parsers/UpdateQueryParser.js +88 -0
- package/dist/parsers/UpdateQueryParser.js.map +1 -0
- package/dist/parsers/ValueParser.js +13 -11
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/transformers/CTEDisabler.js +2 -2
- package/dist/transformers/CTEDisabler.js.map +1 -1
- package/dist/transformers/Formatter.d.ts +6 -0
- package/dist/transformers/Formatter.js +91 -14
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/QueryBuilder.d.ts +9 -0
- package/dist/transformers/QueryBuilder.js +53 -5
- package/dist/transformers/QueryBuilder.js.map +1 -1
- package/dist/transformers/SelectValueCollector.js +4 -4
- package/dist/transformers/UpstreamSelectQueryFinder.js +1 -1
- package/package.json +1 -1
- package/dist/esm/types/utils/extractNamespacesAndName.d.ts +0 -5
- package/dist/esm/types/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
- package/dist/esm/utils/extractNamespacesAndName.js +0 -16
- package/dist/esm/utils/extractNamespacesAndName.js.map +0 -1
- package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -39
- package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
- package/dist/utils/extractNamespacesAndName.d.ts +0 -5
- package/dist/utils/extractNamespacesAndName.js +0 -18
- package/dist/utils/extractNamespacesAndName.js.map +0 -1
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +0 -9
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js +0 -42
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +0 -1
@@ -1,7 +1,8 @@
|
|
1
1
|
import { TokenType } from "../models/Lexeme";
|
2
|
-
import { FunctionCall, BinaryExpression, TypeValue, CastExpression, BetweenExpression } from "../models/ValueComponent";
|
2
|
+
import { FunctionCall, BinaryExpression, TypeValue, CastExpression, BetweenExpression, RawString } from "../models/ValueComponent";
|
3
3
|
import { OverExpressionParser } from "./OverExpressionParser";
|
4
4
|
import { ValueParser } from "./ValueParser";
|
5
|
+
import { FullNameParser } from "./FullNameParser";
|
5
6
|
export class FunctionExpressionParser {
|
6
7
|
static parseFromLexeme(lexemes, index) {
|
7
8
|
let idx = index;
|
@@ -72,10 +73,12 @@ export class FunctionExpressionParser {
|
|
72
73
|
}
|
73
74
|
static parseFunctionCall(lexemes, index) {
|
74
75
|
let idx = index;
|
75
|
-
//
|
76
|
-
|
77
|
-
const
|
78
|
-
|
76
|
+
// Parse namespaced function name (e.g., myschema.myfunc, dbo.util.myfunc)
|
77
|
+
// Use FullNameParser to get namespaces and function name
|
78
|
+
const fullNameResult = FullNameParser.parseFromLexeme(lexemes, idx);
|
79
|
+
const namespaces = fullNameResult.namespaces;
|
80
|
+
const name = fullNameResult.name;
|
81
|
+
idx = fullNameResult.newIndex;
|
79
82
|
if (idx < lexemes.length && (lexemes[idx].type & TokenType.OpenParen)) {
|
80
83
|
// General argument parsing
|
81
84
|
const arg = ValueParser.parseArgument(TokenType.OpenParen, TokenType.CloseParen, lexemes, idx);
|
@@ -83,22 +86,25 @@ export class FunctionExpressionParser {
|
|
83
86
|
if (idx < lexemes.length && lexemes[idx].value === "over") {
|
84
87
|
const over = OverExpressionParser.parseFromLexeme(lexemes, idx);
|
85
88
|
idx = over.newIndex;
|
86
|
-
const value = new FunctionCall(
|
89
|
+
const value = new FunctionCall(namespaces, name.name, arg.value, over.value);
|
87
90
|
return { value, newIndex: idx };
|
88
91
|
}
|
89
92
|
else {
|
90
|
-
const value = new FunctionCall(
|
93
|
+
const value = new FunctionCall(namespaces, name.name, arg.value, null);
|
91
94
|
return { value, newIndex: idx };
|
92
95
|
}
|
93
96
|
}
|
94
97
|
else {
|
95
|
-
throw new Error(`Expected opening parenthesis after function name '${
|
98
|
+
throw new Error(`Expected opening parenthesis after function name '${name.name}' at index ${idx}`);
|
96
99
|
}
|
97
100
|
}
|
98
101
|
static parseKeywordFunction(lexemes, index, keywords) {
|
99
102
|
let idx = index;
|
100
|
-
|
101
|
-
idx
|
103
|
+
// Parse function name and namespaces at the beginning for consistent usage
|
104
|
+
const fullNameResult = FullNameParser.parseFromLexeme(lexemes, idx);
|
105
|
+
const namespaces = fullNameResult.namespaces;
|
106
|
+
const name = fullNameResult.name;
|
107
|
+
idx = fullNameResult.newIndex;
|
102
108
|
if (idx < lexemes.length && (lexemes[idx].type & TokenType.OpenParen)) {
|
103
109
|
idx++;
|
104
110
|
const input = ValueParser.parseFromLexeme(lexemes, idx);
|
@@ -108,7 +114,7 @@ export class FunctionExpressionParser {
|
|
108
114
|
if (idx < lexemes.length && (lexemes[idx].type & TokenType.Comma)) {
|
109
115
|
return this.parseFunctionCall(lexemes, index);
|
110
116
|
}
|
111
|
-
// Check keywords
|
117
|
+
// Check for required/optional keywords in function arguments
|
112
118
|
for (const { key, required } of keywords) {
|
113
119
|
if (idx < lexemes.length && (lexemes[idx].type & TokenType.Command) && lexemes[idx].value === key) {
|
114
120
|
idx++;
|
@@ -129,46 +135,41 @@ export class FunctionExpressionParser {
|
|
129
135
|
}
|
130
136
|
if (idx < lexemes.length && (lexemes[idx].type & TokenType.CloseParen)) {
|
131
137
|
idx++;
|
138
|
+
// Use the previously parsed namespaces and function name for consistency
|
132
139
|
if (idx < lexemes.length && lexemes[idx].value === "over") {
|
133
140
|
idx++;
|
134
141
|
const over = OverExpressionParser.parseFromLexeme(lexemes, idx);
|
135
142
|
idx = over.newIndex;
|
136
|
-
const value = new FunctionCall(
|
143
|
+
const value = new FunctionCall(namespaces, name.name, arg, over.value);
|
137
144
|
return { value, newIndex: idx };
|
138
145
|
}
|
139
146
|
else {
|
140
|
-
const value = new FunctionCall(
|
147
|
+
const value = new FunctionCall(namespaces, name.name, arg, null);
|
141
148
|
return { value, newIndex: idx };
|
142
149
|
}
|
143
150
|
}
|
144
151
|
else {
|
145
|
-
throw new Error(`Missing closing parenthesis for function '${
|
152
|
+
throw new Error(`Missing closing parenthesis for function '${name.name}' at index ${idx}`);
|
146
153
|
}
|
147
154
|
}
|
148
155
|
else {
|
149
|
-
throw new Error(`Missing opening parenthesis for function '${
|
156
|
+
throw new Error(`Missing opening parenthesis for function '${name.name}' at index ${idx}`);
|
150
157
|
}
|
151
158
|
}
|
152
159
|
static parseTypeValue(lexemes, index) {
|
153
160
|
let idx = index;
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
idx
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
}
|
165
|
-
else {
|
166
|
-
// Create TypeValue
|
167
|
-
const value = new TypeValue(typeName);
|
168
|
-
return { value, newIndex: idx };
|
169
|
-
}
|
161
|
+
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, idx);
|
162
|
+
idx = newIndex;
|
163
|
+
if (idx < lexemes.length && (lexemes[idx].type & TokenType.OpenParen)) {
|
164
|
+
const arg = ValueParser.parseArgument(TokenType.OpenParen, TokenType.CloseParen, lexemes, idx);
|
165
|
+
idx = arg.newIndex;
|
166
|
+
const value = new TypeValue(namespaces, new RawString(name.name), arg.value);
|
167
|
+
return { value, newIndex: idx };
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
const value = new TypeValue(namespaces, new RawString(name.name));
|
171
|
+
return { value, newIndex: idx };
|
170
172
|
}
|
171
|
-
throw new Error(`Expected type value at index ${idx}`);
|
172
173
|
}
|
173
174
|
}
|
174
175
|
//# sourceMappingURL=FunctionExpressionParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FunctionExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/FunctionExpressionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAkB,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
1
|
+
{"version":3,"file":"FunctionExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/FunctionExpressionParser.ts"],"names":[],"mappings":"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"}
|
@@ -1,36 +1,11 @@
|
|
1
|
-
import {
|
2
|
-
import { TokenType } from "../models/Lexeme";
|
1
|
+
import { FullNameParser } from "./FullNameParser";
|
3
2
|
import { ColumnReference } from "../models/ValueComponent";
|
4
3
|
export class IdentifierParser {
|
5
4
|
static parseFromLexeme(lexemes, index) {
|
6
|
-
//
|
7
|
-
|
8
|
-
const
|
9
|
-
|
10
|
-
identifiers.push(lexemes[idx].value);
|
11
|
-
idx++;
|
12
|
-
// Look for dot and identifier pattern
|
13
|
-
// support wildcard '*' as identifier (e.g. select t.* from t)
|
14
|
-
while (idx < lexemes.length &&
|
15
|
-
idx + 1 < lexemes.length &&
|
16
|
-
(lexemes[idx].type & TokenType.Dot) &&
|
17
|
-
((lexemes[idx + 1].type & TokenType.Identifier) || lexemes[idx + 1].value === "*")) {
|
18
|
-
// Skip the dot and add the next identifier
|
19
|
-
idx++;
|
20
|
-
identifiers.push(lexemes[idx].value);
|
21
|
-
idx++;
|
22
|
-
}
|
23
|
-
if (identifiers.length > 1) {
|
24
|
-
// If there are multiple identifiers, treat it as a column reference
|
25
|
-
const { namespaces, name } = extractNamespacesAndName(identifiers);
|
26
|
-
const value = new ColumnReference(namespaces, name);
|
27
|
-
return { value, newIndex: idx };
|
28
|
-
}
|
29
|
-
else {
|
30
|
-
// If there is a single identifier, treat it as a simple identifier
|
31
|
-
const value = new ColumnReference(null, identifiers[0]);
|
32
|
-
return { value, newIndex: idx };
|
33
|
-
}
|
5
|
+
// Use FullNameParser to robustly parse qualified identifiers, including wildcards and escaped names.
|
6
|
+
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, index);
|
7
|
+
const value = new ColumnReference(namespaces, name);
|
8
|
+
return { value, newIndex };
|
34
9
|
}
|
35
10
|
}
|
36
11
|
//# sourceMappingURL=IdentifierParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"IdentifierParser.js","sourceRoot":"","sources":["../../../src/parsers/IdentifierParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"IdentifierParser.js","sourceRoot":"","sources":["../../../src/parsers/IdentifierParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,eAAe,EAAkB,MAAM,0BAA0B,CAAC;AAE3E,MAAM,OAAO,gBAAgB;IAClB,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,qGAAqG;QACrG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACJ"}
|
@@ -5,9 +5,9 @@ import { TokenType } from "../models/Lexeme";
|
|
5
5
|
import { SqlTokenizer } from "./SqlTokenizer";
|
6
6
|
import { SelectQueryParser } from "./SelectQueryParser";
|
7
7
|
import { WithClauseParser } from "./WithClauseParser";
|
8
|
-
import { IdentifierString } from "../models/ValueComponent";
|
9
8
|
import { SimpleSelectQuery } from "../models/SimpleSelectQuery";
|
10
|
-
import {
|
9
|
+
import { SourceExpressionParser } from "./SourceExpressionParser";
|
10
|
+
import { InsertClause } from "../models/Clause";
|
11
11
|
export class InsertQueryParser {
|
12
12
|
/**
|
13
13
|
* Parse SQL string to InsertQuery AST.
|
@@ -39,9 +39,9 @@ export class InsertQueryParser {
|
|
39
39
|
throw new Error(`Syntax error at position ${idx}: Expected 'INSERT INTO' but found '${lexemes[idx].value}'.`);
|
40
40
|
}
|
41
41
|
idx++;
|
42
|
-
//
|
43
|
-
const
|
44
|
-
idx =
|
42
|
+
// Parse table and optional alias/schema using SourceExpressionParser
|
43
|
+
const sourceResult = SourceExpressionParser.parseTableSourceFromLexemes(lexemes, idx);
|
44
|
+
idx = sourceResult.newIndex;
|
45
45
|
// Optional columns
|
46
46
|
let columns = [];
|
47
47
|
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) === TokenType.OpenParen) {
|
@@ -73,32 +73,11 @@ export class InsertQueryParser {
|
|
73
73
|
idx = selectResult.newIndex;
|
74
74
|
return {
|
75
75
|
value: new InsertQuery({
|
76
|
-
|
77
|
-
table,
|
78
|
-
columns,
|
76
|
+
insertClause: new InsertClause(sourceResult.value, columns),
|
79
77
|
selectQuery: selectResult.value
|
80
78
|
}),
|
81
79
|
newIndex: idx
|
82
80
|
};
|
83
81
|
}
|
84
|
-
// Get fully qualified name and split into namespaces/table
|
85
|
-
static parseFullQualifiedName(lexemes, index) {
|
86
|
-
let idx = index;
|
87
|
-
const fullname = [];
|
88
|
-
fullname.push(lexemes[index].value);
|
89
|
-
idx++;
|
90
|
-
while (idx < lexemes.length && lexemes[idx].type === TokenType.Dot) {
|
91
|
-
idx++; // Skip dot
|
92
|
-
if (idx < lexemes.length) {
|
93
|
-
fullname.push(lexemes[idx].value);
|
94
|
-
idx++;
|
95
|
-
}
|
96
|
-
else {
|
97
|
-
throw new Error(`Syntax error at position ${idx}: Expected identifier after '.' but found end of input.`);
|
98
|
-
}
|
99
|
-
}
|
100
|
-
const { namespaces, name } = extractNamespacesAndName(fullname);
|
101
|
-
return { namespaces, table: new IdentifierString(name), newIndex: idx };
|
102
|
-
}
|
103
82
|
}
|
104
83
|
//# sourceMappingURL=InsertQueryParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"InsertQueryParser.js","sourceRoot":"","sources":["../../../src/parsers/InsertQueryParser.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AACrG,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"InsertQueryParser.js","sourceRoot":"","sources":["../../../src/parsers/InsertQueryParser.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,qGAAqG;AACrG,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,OAAO,iBAAiB;IAC1B;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,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;QACD,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,UAAU,GAAsB,IAAI,CAAC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC9D,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC;YAC1B,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC1B,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,uCAAuC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAClH,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,qEAAqE;QACrE,MAAM,YAAY,GAAG,sBAAsB,CAAC,2BAA2B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACtF,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAE5B,mBAAmB;QACnB,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,SAAS,EAAE,CAAC;YAC7C,GAAG,EAAE,CAAC;YACN,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;gBACjC,GAAG,EAAE,CAAC;gBACN,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;oBACzC,GAAG,EAAE,CAAC;gBACV,CAAC;qBAAM,CAAC;oBACJ,MAAM;gBACV,CAAC;YACL,CAAC;YACD,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC9C,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,mCAAmC,CAAC,CAAC;YACxF,CAAC;YACD,GAAG,EAAE,CAAC;QACV,CAAC;QAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACrE,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,YAAY,CAAC,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBAClD,YAAY,CAAC,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;QAED,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAC5B,OAAO;YACH,KAAK,EAAE,IAAI,WAAW,CAAC;gBACnB,YAAY,EAAE,IAAI,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;gBAC3D,WAAW,EAAE,YAAY,CAAC,KAAK;aAClC,CAAC;YACF,QAAQ,EAAE,GAAG;SAChB,CAAC;IACN,CAAC;CACJ"}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
// Provides parsing for RETURNING clauses in SQL (used in UPDATE, INSERT, DELETE, etc.)
|
2
|
+
import { TokenType } from "../models/Lexeme";
|
3
|
+
import { IdentifierString } from "../models/ValueComponent";
|
4
|
+
import { ReturningClause } from "../models/Clause";
|
5
|
+
export class ReturningClauseParser {
|
6
|
+
/**
|
7
|
+
* Parse RETURNING clause from lexemes, starting at the given index.
|
8
|
+
* Returns a ReturningClause instance and the new index after parsing.
|
9
|
+
*/
|
10
|
+
static parseFromLexeme(lexemes, index) {
|
11
|
+
var _a, _b, _c;
|
12
|
+
let idx = index;
|
13
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) !== "returning") {
|
14
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'RETURNING' but found '${(_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value}'.`);
|
15
|
+
}
|
16
|
+
idx++;
|
17
|
+
const columns = [];
|
18
|
+
while (idx < lexemes.length && lexemes[idx].type === TokenType.Identifier) {
|
19
|
+
columns.push(new IdentifierString(lexemes[idx].value));
|
20
|
+
idx++;
|
21
|
+
if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === TokenType.Comma) {
|
22
|
+
idx++;
|
23
|
+
}
|
24
|
+
else {
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
return { value: new ReturningClause(columns), newIndex: idx };
|
29
|
+
}
|
30
|
+
}
|
31
|
+
//# sourceMappingURL=ReturningClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ReturningClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/ReturningClauseParser.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,OAAO,qBAAqB;IAC9B;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,MAAK,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,qCAAqC,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,KAAK,IAAI,CAAC,CAAC;QACjH,CAAC;QACD,GAAG,EAAE,CAAC;QACN,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,GAAG,EAAE,CAAC;YACN,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAClE,CAAC;CACJ"}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
// Provides parsing for SET clauses in UPDATE queries.
|
2
|
+
import { TokenType } from "../models/Lexeme";
|
3
|
+
import { SetClause, SetClauseItem } from "../models/Clause";
|
4
|
+
import { ValueParser } from "./ValueParser";
|
5
|
+
import { FullNameParser } from "./FullNameParser";
|
6
|
+
/**
|
7
|
+
* Parse SET clause from lexemes (including 'SET' keyword check).
|
8
|
+
*/
|
9
|
+
export class SetClauseParser {
|
10
|
+
static parseFromLexeme(lexemes, idx) {
|
11
|
+
var _a, _b;
|
12
|
+
if (lexemes[idx].value !== "set") {
|
13
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'SET' but found '${lexemes[idx].value}'.`);
|
14
|
+
}
|
15
|
+
idx++;
|
16
|
+
let setClauseItems = [];
|
17
|
+
while (idx < lexemes.length && lexemes[idx].type === TokenType.Identifier) {
|
18
|
+
// Parse fully qualified column name (e.g. table.column, schema.table.column)
|
19
|
+
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, idx);
|
20
|
+
idx = newIndex;
|
21
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) !== TokenType.Operator || lexemes[idx].value !== "=") {
|
22
|
+
throw new Error(`Syntax error at position ${idx}: Expected '=' after column name in SET clause.`);
|
23
|
+
}
|
24
|
+
idx++;
|
25
|
+
// Parse value expression
|
26
|
+
const value = ValueParser.parseFromLexeme(lexemes, idx);
|
27
|
+
setClauseItems.push(new SetClauseItem({ namespaces, column: name }, value.value));
|
28
|
+
idx = value.newIndex;
|
29
|
+
if (((_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.type) === TokenType.Comma) {
|
30
|
+
idx++;
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
return { setClause: new SetClause(setClauseItems), newIndex: idx };
|
37
|
+
}
|
38
|
+
}
|
39
|
+
//# sourceMappingURL=SetClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SetClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/SetClauseParser.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;GAEG;AACH,MAAM,OAAO,eAAe;IACjB,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,GAAW;;QACxD,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,+BAA+B,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC1G,CAAC;QAED,GAAG,EAAE,CAAC;QACN,IAAI,cAAc,GAAoB,EAAE,CAAC;QACzC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YACxE,6EAA6E;YAC7E,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACpF,GAAG,GAAG,QAAQ,CAAC;YAEf,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC1E,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,iDAAiD,CAAC,CAAC;YACtG,CAAC;YACD,GAAG,EAAE,CAAC;YAEN,yBAAyB;YACzB,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxD,cAAc,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC;YAErB,IAAI,CAAA,MAAA,OAAO,CAAC,GAAG,CAAC,0CAAE,IAAI,MAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,IAAI,SAAS,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACvE,CAAC;CACJ"}
|
@@ -1,8 +1,27 @@
|
|
1
1
|
import { SourceExpression } from "../models/Clause";
|
2
|
+
import { SqlTokenizer } from "./SqlTokenizer";
|
2
3
|
import { TokenType } from "../models/Lexeme";
|
3
4
|
import { SourceParser } from "./SourceParser";
|
4
5
|
import { SourceAliasExpressionParser } from "./SourceAliasExpressionParser";
|
5
6
|
export class SourceExpressionParser {
|
7
|
+
/**
|
8
|
+
* Parse SQL string to SourceExpression (e.g. "table", "table as t", "schema.table t")
|
9
|
+
*/
|
10
|
+
static parse(query) {
|
11
|
+
const tokenizer = new SqlTokenizer(query);
|
12
|
+
const lexemes = tokenizer.readLexmes();
|
13
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
14
|
+
if (result.newIndex < lexemes.length) {
|
15
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The source expression is complete but there are additional tokens.`);
|
16
|
+
}
|
17
|
+
return result.value;
|
18
|
+
}
|
19
|
+
static parseTableSourceFromLexemes(lexemes, index) {
|
20
|
+
const result = SourceParser.parseTableSourceFromLexemes(lexemes, index);
|
21
|
+
// No alias for table source
|
22
|
+
const sourceExpr = new SourceExpression(result.value, null);
|
23
|
+
return { value: sourceExpr, newIndex: result.newIndex };
|
24
|
+
}
|
6
25
|
// Parse from lexeme array (was: parse)
|
7
26
|
static parseFromLexeme(lexemes, index) {
|
8
27
|
let idx = index;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SourceExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/SourceExpressionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,gBAAgB,EAAe,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,OAAO,sBAAsB;IAC/B,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChE,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC;QAE5B,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC9B,GAAG,EAAE,CAAC;gBACN,MAAM,WAAW,GAAG,2BAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC9E,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3B,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC/E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YAChD,CAAC;YAED,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC3C,MAAM,WAAW,GAAG,2BAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC9E,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3B,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC/E,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YAChD,CAAC;QACL,CAAC;QAED,WAAW;QACX,MAAM,IAAI,GAAG,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;CACJ"}
|
1
|
+
{"version":3,"file":"SourceExpressionParser.js","sourceRoot":"","sources":["../../../src/parsers/SourceExpressionParser.ts"],"names":[],"mappings":"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"}
|
@@ -1,10 +1,9 @@
|
|
1
|
+
import { FullNameParser } from "./FullNameParser";
|
1
2
|
import { FunctionSource, SubQuerySource, TableSource } from "../models/Clause";
|
2
3
|
import { TokenType } from "../models/Lexeme";
|
3
4
|
import { SelectQueryParser } from "./SelectQueryParser";
|
4
5
|
import { SqlTokenizer } from "./SqlTokenizer";
|
5
6
|
import { ValueParser } from "./ValueParser";
|
6
|
-
import { extractNamespacesAndName } from "../utils/extractNamespacesAndName";
|
7
|
-
import { parseEscapedOrDotSeparatedIdentifiers } from "../utils/parseEscapedOrDotSeparatedIdentifiers";
|
8
7
|
export class SourceParser {
|
9
8
|
// Parse SQL string to AST (was: parse)
|
10
9
|
static parse(query) {
|
@@ -18,6 +17,19 @@ export class SourceParser {
|
|
18
17
|
}
|
19
18
|
return result.value;
|
20
19
|
}
|
20
|
+
/**
|
21
|
+
* Parses only a TableSource from the given lexemes, regardless of the presence of parentheses after the identifier.
|
22
|
+
* This method is specifically used for cases like INSERT queries (e.g., "insert into table_name (col1, col2)")
|
23
|
+
* where a parenthesis immediately following the table name could otherwise be misinterpreted as a function call.
|
24
|
+
* By using this method, the parser forcibly treats the source as a TableSource.
|
25
|
+
*
|
26
|
+
* @param lexemes The array of lexemes to parse.
|
27
|
+
* @param index The starting index in the lexeme array.
|
28
|
+
* @returns An object containing the parsed TableSource and the new index.
|
29
|
+
*/
|
30
|
+
static parseTableSourceFromLexemes(lexemes, index) {
|
31
|
+
return this.parseTableSource(lexemes, index);
|
32
|
+
}
|
21
33
|
// Parse from lexeme array (was: parse)
|
22
34
|
static parseFromLexeme(lexemes, index) {
|
23
35
|
const idx = index;
|
@@ -33,12 +45,8 @@ export class SourceParser {
|
|
33
45
|
return this.parseTableSource(lexemes, idx);
|
34
46
|
}
|
35
47
|
static parseTableSource(lexemes, index) {
|
36
|
-
const {
|
37
|
-
|
38
|
-
throw new Error(`No table identifier found at position ${index}`);
|
39
|
-
}
|
40
|
-
const { namespaces, name } = extractNamespacesAndName(identifiers);
|
41
|
-
const value = new TableSource(namespaces, name);
|
48
|
+
const { namespaces, name, newIndex } = FullNameParser.parseFromLexeme(lexemes, index);
|
49
|
+
const value = new TableSource(namespaces, name.name);
|
42
50
|
return { value, newIndex };
|
43
51
|
}
|
44
52
|
static parseFunctionSource(lexemes, index) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SourceParser.js","sourceRoot":"","sources":["../../../src/parsers/SourceParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAmB,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"SourceParser.js","sourceRoot":"","sources":["../../../src/parsers/SourceParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { UpdateClause } from "../models/Clause";
|
2
|
+
import { SourceExpressionParser } from "./SourceExpressionParser";
|
3
|
+
/**
|
4
|
+
* Parses the target of an UPDATE statement (table or source expression with optional alias).
|
5
|
+
*/
|
6
|
+
export class UpdateClauseParser {
|
7
|
+
/**
|
8
|
+
* Parse from lexeme array (returns UpdateClause and new index)
|
9
|
+
* This method parses a table or a table with alias using SourceExpressionParser.
|
10
|
+
*/
|
11
|
+
static parseFromLexeme(lexemes, index) {
|
12
|
+
// Parse table or table with alias using SourceExpressionParser
|
13
|
+
const result = SourceExpressionParser.parseFromLexeme(lexemes, index);
|
14
|
+
return { value: new UpdateClause(result.value), newIndex: result.newIndex };
|
15
|
+
}
|
16
|
+
}
|
17
|
+
//# sourceMappingURL=UpdateClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"UpdateClauseParser.js","sourceRoot":"","sources":["../../../src/parsers/UpdateClauseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC3B;;;OAGG;IACI,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,+DAA+D;QAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtE,OAAO,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChF,CAAC;CACJ"}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
// Provides parsing for UPDATE queries, supporting SET, WHERE, FROM, and RETURNING clauses.
|
2
|
+
import { UpdateQuery } from "../models/UpdateQuery";
|
3
|
+
import { SqlTokenizer } from "./SqlTokenizer";
|
4
|
+
import { UpdateClauseParser } from "./UpdateClauseParser";
|
5
|
+
import { WhereClauseParser } from "./WhereClauseParser";
|
6
|
+
import { ReturningClauseParser } from "./ReturningClauseParser";
|
7
|
+
import { FromClauseParser } from "./FromClauseParser";
|
8
|
+
import { SetClauseParser } from "./SetClauseParser";
|
9
|
+
import { WithClauseParser } from "./WithClauseParser";
|
10
|
+
export class UpdateQueryParser {
|
11
|
+
/**
|
12
|
+
* Parse SQL string to UpdateQuery AST.
|
13
|
+
* @param query SQL string
|
14
|
+
*/
|
15
|
+
static parse(query) {
|
16
|
+
const tokenizer = new SqlTokenizer(query);
|
17
|
+
const lexemes = tokenizer.readLexmes();
|
18
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
19
|
+
if (result.newIndex < lexemes.length) {
|
20
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The UPDATE query is complete but there are additional tokens.`);
|
21
|
+
}
|
22
|
+
return result.value;
|
23
|
+
}
|
24
|
+
/**
|
25
|
+
* Parse from lexeme array (for internal use and tests)
|
26
|
+
*/
|
27
|
+
static parseFromLexeme(lexemes, index) {
|
28
|
+
var _a, _b, _c, _d, _e;
|
29
|
+
let idx = index;
|
30
|
+
// Parse optional WITH clause (CTE)
|
31
|
+
let withClause = null;
|
32
|
+
if (((_b = (_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.toLowerCase()) === "with") {
|
33
|
+
const withResult = WithClauseParser.parseFromLexeme(lexemes, idx);
|
34
|
+
withClause = withResult.value;
|
35
|
+
idx = withResult.newIndex;
|
36
|
+
}
|
37
|
+
// Expect UPDATE
|
38
|
+
if (lexemes[idx].value !== "update") {
|
39
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'UPDATE' but found '${lexemes[idx].value}'.`);
|
40
|
+
}
|
41
|
+
idx++;
|
42
|
+
// Parse updateClause (table or source expression)
|
43
|
+
const updateClauseResult = UpdateClauseParser.parseFromLexeme(lexemes, idx);
|
44
|
+
const updateClause = updateClauseResult.value;
|
45
|
+
idx = updateClauseResult.newIndex;
|
46
|
+
// Parse set clause (including 'SET' keyword check)
|
47
|
+
const setClauseResult = SetClauseParser.parseFromLexeme(lexemes, idx);
|
48
|
+
let setClause = setClauseResult.setClause;
|
49
|
+
idx = setClauseResult.newIndex;
|
50
|
+
// Optional FROM (not always supported in all dialects)
|
51
|
+
let from = null;
|
52
|
+
if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.value) === "from") {
|
53
|
+
const result = FromClauseParser.parseFromLexeme(lexemes, idx);
|
54
|
+
from = result.value;
|
55
|
+
idx = result.newIndex;
|
56
|
+
}
|
57
|
+
// Optional WHERE
|
58
|
+
let where = null;
|
59
|
+
if (((_d = lexemes[idx]) === null || _d === void 0 ? void 0 : _d.value) === "where") {
|
60
|
+
const result = WhereClauseParser.parseFromLexeme(lexemes, idx);
|
61
|
+
where = result.value;
|
62
|
+
idx = result.newIndex;
|
63
|
+
}
|
64
|
+
// Optional RETURNING
|
65
|
+
let returning = null;
|
66
|
+
if (((_e = lexemes[idx]) === null || _e === void 0 ? void 0 : _e.value) === "returning") {
|
67
|
+
const result = ReturningClauseParser.parseFromLexeme(lexemes, idx);
|
68
|
+
returning = result.value;
|
69
|
+
idx = result.newIndex;
|
70
|
+
}
|
71
|
+
return {
|
72
|
+
value: new UpdateQuery({
|
73
|
+
withClause,
|
74
|
+
updateClause,
|
75
|
+
setClause,
|
76
|
+
whereClause: where,
|
77
|
+
fromClause: from,
|
78
|
+
returning
|
79
|
+
}),
|
80
|
+
newIndex: idx
|
81
|
+
};
|
82
|
+
}
|
83
|
+
}
|
84
|
+
//# sourceMappingURL=UpdateQueryParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"UpdateQueryParser.js","sourceRoot":"","sources":["../../../src/parsers/UpdateQueryParser.ts"],"names":[],"mappings":"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"}
|