rawsql-ts 0.1.0-beta.8 → 0.1.1-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +231 -173
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/models/BinarySelectQuery.js +9 -8
- package/dist/models/BinarySelectQuery.js.map +1 -1
- package/dist/models/SimpleSelectQuery.js +10 -8
- package/dist/models/SimpleSelectQuery.js.map +1 -1
- package/dist/parsers/CommandExpressionParser.d.ts +1 -1
- package/dist/parsers/CommandExpressionParser.js +6 -6
- package/dist/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/parsers/CommonTableParser.d.ts +2 -2
- package/dist/parsers/CommonTableParser.js +7 -5
- package/dist/parsers/CommonTableParser.js.map +1 -1
- package/dist/parsers/ForClauseParser.d.ts +2 -2
- package/dist/parsers/ForClauseParser.js +5 -3
- package/dist/parsers/ForClauseParser.js.map +1 -1
- package/dist/parsers/FromClauseParser.d.ts +2 -2
- package/dist/parsers/FromClauseParser.js +6 -4
- package/dist/parsers/FromClauseParser.js.map +1 -1
- package/dist/parsers/FunctionExpressionParser.d.ts +1 -1
- package/dist/parsers/FunctionExpressionParser.js +8 -8
- package/dist/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/parsers/GroupByParser.d.ts +2 -2
- package/dist/parsers/GroupByParser.js +6 -4
- package/dist/parsers/GroupByParser.js.map +1 -1
- package/dist/parsers/HavingParser.d.ts +2 -2
- package/dist/parsers/HavingParser.js +6 -4
- package/dist/parsers/HavingParser.js.map +1 -1
- package/dist/parsers/IdentifierParser.d.ts +1 -1
- package/dist/parsers/IdentifierParser.js +1 -1
- package/dist/parsers/IdentifierParser.js.map +1 -1
- package/dist/parsers/JoinClauseParser.js +2 -2
- package/dist/parsers/JoinClauseParser.js.map +1 -1
- package/dist/parsers/LimitClauseParser.d.ts +2 -2
- package/dist/parsers/LimitClauseParser.js +7 -5
- package/dist/parsers/LimitClauseParser.js.map +1 -1
- package/dist/parsers/LiteralParser.d.ts +1 -1
- package/dist/parsers/LiteralParser.js +1 -1
- package/dist/parsers/LiteralParser.js.map +1 -1
- package/dist/parsers/OrderByClauseParser.d.ts +2 -2
- package/dist/parsers/OrderByClauseParser.js +6 -4
- package/dist/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/parsers/OverExpressionParser.d.ts +2 -2
- package/dist/parsers/OverExpressionParser.js +4 -4
- package/dist/parsers/OverExpressionParser.js.map +1 -1
- package/dist/parsers/ParameterExpressionParser.d.ts +1 -1
- package/dist/parsers/ParameterExpressionParser.js +1 -1
- package/dist/parsers/ParameterExpressionParser.js.map +1 -1
- package/dist/parsers/ParenExpressionParser.d.ts +1 -1
- package/dist/parsers/ParenExpressionParser.js +2 -2
- package/dist/parsers/ParenExpressionParser.js.map +1 -1
- package/dist/parsers/PartitionByParser.d.ts +2 -2
- package/dist/parsers/PartitionByParser.js +7 -5
- package/dist/parsers/PartitionByParser.js.map +1 -1
- package/dist/parsers/SelectClauseParser.d.ts +2 -2
- package/dist/parsers/SelectClauseParser.js +6 -4
- package/dist/parsers/SelectClauseParser.js.map +1 -1
- package/dist/parsers/SelectQueryParser.d.ts +2 -2
- package/dist/parsers/SelectQueryParser.js +16 -14
- package/dist/parsers/SelectQueryParser.js.map +1 -1
- package/dist/parsers/SourceAliasExpressionParser.d.ts +1 -1
- package/dist/parsers/SourceAliasExpressionParser.js +2 -1
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -1
- package/dist/parsers/SourceExpressionParser.d.ts +1 -1
- package/dist/parsers/SourceExpressionParser.js +5 -4
- package/dist/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/parsers/SourceParser.d.ts +2 -2
- package/dist/parsers/SourceParser.js +9 -6
- package/dist/parsers/SourceParser.js.map +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.d.ts +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.js +1 -1
- package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -1
- package/dist/parsers/UnaryExpressionParser.d.ts +1 -1
- package/dist/parsers/UnaryExpressionParser.js +2 -2
- package/dist/parsers/UnaryExpressionParser.js.map +1 -1
- package/dist/parsers/ValueParser.d.ts +2 -2
- package/dist/parsers/ValueParser.js +15 -13
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/parsers/ValuesQueryParser.d.ts +2 -2
- package/dist/parsers/ValuesQueryParser.js +5 -5
- package/dist/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/parsers/WhereClauseParser.d.ts +2 -2
- package/dist/parsers/WhereClauseParser.js +6 -4
- package/dist/parsers/WhereClauseParser.js.map +1 -1
- package/dist/parsers/WindowClauseParser.d.ts +2 -2
- package/dist/parsers/WindowClauseParser.js +6 -4
- package/dist/parsers/WindowClauseParser.js.map +1 -1
- package/dist/parsers/WindowExpressionParser.d.ts +2 -2
- package/dist/parsers/WindowExpressionParser.js +29 -17
- package/dist/parsers/WindowExpressionParser.js.map +1 -1
- package/dist/parsers/WithClauseParser.d.ts +2 -2
- package/dist/parsers/WithClauseParser.js +7 -5
- package/dist/parsers/WithClauseParser.js.map +1 -1
- package/dist/transformers/CTEBuilder.js +1 -1
- package/dist/transformers/CTEBuilder.js.map +1 -1
- package/dist/transformers/CTECollector.d.ts +2 -1
- package/dist/transformers/CTECollector.js +5 -1
- package/dist/transformers/CTECollector.js.map +1 -1
- package/dist/transformers/CTEDisabler.js +1 -1
- package/dist/transformers/CTEDisabler.js.map +1 -1
- package/dist/transformers/CTENormalizer.d.ts +5 -5
- package/dist/transformers/CTENormalizer.js +11 -7
- package/dist/transformers/CTENormalizer.js.map +1 -1
- package/dist/transformers/Formatter.d.ts +16 -1
- package/dist/transformers/Formatter.js +17 -2
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/QueryConverter.d.ts +41 -0
- package/dist/transformers/{QueryNormalizer.js → QueryConverter.js} +39 -34
- package/dist/transformers/QueryConverter.js.map +1 -0
- package/dist/transformers/SelectValueCollector.d.ts +2 -4
- package/dist/transformers/SelectValueCollector.js.map +1 -1
- package/dist/transformers/SelectableColumnCollector.d.ts +2 -0
- package/dist/transformers/SelectableColumnCollector.js +17 -3
- package/dist/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/transformers/TableColumnResolver.d.ts +10 -0
- package/dist/transformers/TableColumnResolver.js +3 -0
- package/dist/transformers/TableColumnResolver.js.map +1 -0
- package/package.json +15 -2
- package/dist/transformers/QueryNormalizer.d.ts +0 -37
- package/dist/transformers/QueryNormalizer.js.map +0 -1
@@ -6,20 +6,21 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
6
6
|
const SourceParser_1 = require("./SourceParser");
|
7
7
|
const SourceAliasExpressionParser_1 = require("./SourceAliasExpressionParser");
|
8
8
|
class SourceExpressionParser {
|
9
|
-
|
9
|
+
// Parse from lexeme array (was: parse)
|
10
|
+
static parseFromLexeme(lexemes, index) {
|
10
11
|
let idx = index;
|
11
|
-
const sourceResult = SourceParser_1.SourceParser.
|
12
|
+
const sourceResult = SourceParser_1.SourceParser.parseFromLexeme(lexemes, idx);
|
12
13
|
idx = sourceResult.newIndex;
|
13
14
|
if (idx < lexemes.length) {
|
14
15
|
if (lexemes[idx].value === "as") {
|
15
16
|
idx++;
|
16
|
-
const aliasResult = SourceAliasExpressionParser_1.SourceAliasExpressionParser.
|
17
|
+
const aliasResult = SourceAliasExpressionParser_1.SourceAliasExpressionParser.parseFromLexeme(lexemes, idx);
|
17
18
|
idx = aliasResult.newIndex;
|
18
19
|
const sourceExpr = new Clause_1.SourceExpression(sourceResult.value, aliasResult.value);
|
19
20
|
return { value: sourceExpr, newIndex: idx };
|
20
21
|
}
|
21
22
|
if (lexemes[idx].type === Lexeme_1.TokenType.Identifier) {
|
22
|
-
const aliasResult = SourceAliasExpressionParser_1.SourceAliasExpressionParser.
|
23
|
+
const aliasResult = SourceAliasExpressionParser_1.SourceAliasExpressionParser.parseFromLexeme(lexemes, idx);
|
23
24
|
idx = aliasResult.newIndex;
|
24
25
|
const sourceExpr = new Clause_1.SourceExpression(sourceResult.value, aliasResult.value);
|
25
26
|
return { value: sourceExpr, newIndex: idx };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SourceExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/SourceExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAwF;AACxF,6CAAqD;AACrD,iDAA8C;AAC9C,+EAA4E;AAE5E,MAAa,sBAAsB;
|
1
|
+
{"version":3,"file":"SourceExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/SourceExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAwF;AACxF,6CAAqD;AACrD,iDAA8C;AAC9C,+EAA4E;AAE5E,MAAa,sBAAsB;IAC/B,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,MAAM,YAAY,GAAG,2BAAY,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,yDAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC9E,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3B,MAAM,UAAU,GAAG,IAAI,yBAAgB,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,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,WAAW,GAAG,yDAA2B,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAC9E,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3B,MAAM,UAAU,GAAG,IAAI,yBAAgB,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,yBAAgB,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;CACJ;AA7BD,wDA6BC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { SourceComponent } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class SourceParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): SourceComponent;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: SourceComponent;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -7,18 +7,20 @@ const SelectQueryParser_1 = require("./SelectQueryParser");
|
|
7
7
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
8
8
|
const ValueParser_1 = require("./ValueParser");
|
9
9
|
class SourceParser {
|
10
|
-
|
10
|
+
// Parse SQL string to AST (was: parse)
|
11
|
+
static parse(query) {
|
11
12
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
12
13
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
13
14
|
// Parse
|
14
|
-
const result = this.
|
15
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
15
16
|
// Error if there are remaining tokens
|
16
17
|
if (result.newIndex < lexemes.length) {
|
17
18
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The source component is complete but there are additional tokens.`);
|
18
19
|
}
|
19
20
|
return result.value;
|
20
21
|
}
|
21
|
-
|
22
|
+
// Parse from lexeme array (was: parse)
|
23
|
+
static parseFromLexeme(lexemes, index) {
|
22
24
|
const idx = index;
|
23
25
|
// Handle subquery
|
24
26
|
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.OpenParen) {
|
@@ -106,9 +108,10 @@ class SourceParser {
|
|
106
108
|
}
|
107
109
|
static parseSubQuerySource(lexemes, index) {
|
108
110
|
let idx = index;
|
109
|
-
|
110
|
-
|
111
|
-
|
111
|
+
// Use the new parseFromLexeme method and destructure the result
|
112
|
+
const { value: selectQuery, newIndex } = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, idx);
|
113
|
+
idx = newIndex;
|
114
|
+
const subQuerySource = new Clause_1.SubQuerySource(selectQuery);
|
112
115
|
return { value: subQuerySource, newIndex: idx };
|
113
116
|
}
|
114
117
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SourceParser.js","sourceRoot":"","sources":["../../src/parsers/SourceParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgG;AAChG,6CAAqD;AACrD,2DAAwD;AACxD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,YAAY;
|
1
|
+
{"version":3,"file":"SourceParser.js","sourceRoot":"","sources":["../../src/parsers/SourceParser.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { ValueComponent } from "../models/ValueComponent";
|
3
3
|
export declare class StringSpecifierExpressionParser {
|
4
|
-
static
|
4
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
5
5
|
value: ValueComponent;
|
6
6
|
newIndex: number;
|
7
7
|
};
|
@@ -4,7 +4,7 @@ exports.StringSpecifierExpressionParser = void 0;
|
|
4
4
|
const Lexeme_1 = require("../models/Lexeme");
|
5
5
|
const ValueComponent_1 = require("../models/ValueComponent");
|
6
6
|
class StringSpecifierExpressionParser {
|
7
|
-
static
|
7
|
+
static parseFromLexeme(lexemes, index) {
|
8
8
|
let idx = index;
|
9
9
|
const specifer = lexemes[idx].value;
|
10
10
|
idx++;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"StringSpecifierExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/StringSpecifierExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAAqF;AAErF,MAAa,+BAA+B;IACjC,MAAM,CAAC,
|
1
|
+
{"version":3,"file":"StringSpecifierExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/StringSpecifierExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAAqF;AAErF,MAAa,+BAA+B;IACjC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACpC,GAAG,EAAE,CAAC;QACN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,2DAA2D,GAAG,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QACjC,GAAG,EAAE,CAAC;QACN,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,0CAAyB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ;AAfD,0EAeC"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { ValueComponent } from "../models/ValueComponent";
|
3
3
|
export declare class UnaryExpressionParser {
|
4
|
-
static
|
4
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
5
5
|
value: ValueComponent;
|
6
6
|
newIndex: number;
|
7
7
|
};
|
@@ -5,7 +5,7 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
5
5
|
const ValueComponent_1 = require("../models/ValueComponent");
|
6
6
|
const ValueParser_1 = require("./ValueParser");
|
7
7
|
class UnaryExpressionParser {
|
8
|
-
static
|
8
|
+
static parseFromLexeme(lexemes, index) {
|
9
9
|
let idx = index;
|
10
10
|
// Process unary operator
|
11
11
|
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Operator) {
|
@@ -17,7 +17,7 @@ class UnaryExpressionParser {
|
|
17
17
|
return { value: v, newIndex: idx };
|
18
18
|
}
|
19
19
|
// Get the right-hand side value of the unary operator
|
20
|
-
const result = ValueParser_1.ValueParser.
|
20
|
+
const result = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
21
21
|
idx = result.newIndex;
|
22
22
|
// Create unary expression
|
23
23
|
const value = new ValueComponent_1.UnaryExpression(operator, result.value);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"UnaryExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/UnaryExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAA8G;AAC9G,+CAA4C;AAE5C,MAAa,qBAAqB;IACvB,MAAM,CAAC,
|
1
|
+
{"version":3,"file":"UnaryExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/UnaryExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAA8G;AAC9G,+CAA4C;AAE5C,MAAa,qBAAqB;IACvB,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yBAAyB;QACzB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,QAAQ,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACpC,GAAG,EAAE,CAAC;YAEN,+DAA+D;YAC/D,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAG,IAAI,gCAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACzC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;YACvC,CAAC;YAED,sDAAsD;YACtD,MAAM,MAAM,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACzD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEtB,0BAA0B;YAC1B,MAAM,KAAK,GAAG,IAAI,gCAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;CACJ;AA1BD,sDA0BC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Lexeme, TokenType } from "../models/Lexeme";
|
2
2
|
import { ValueComponent } from "../models/ValueComponent";
|
3
3
|
export declare class ValueParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): ValueComponent;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number, allowAndOperator?: boolean): {
|
6
6
|
value: ValueComponent;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -13,18 +13,20 @@ const StringSpecifierExpressionParser_1 = require("./StringSpecifierExpressionPa
|
|
13
13
|
const CommandExpressionParser_1 = require("./CommandExpressionParser");
|
14
14
|
const FunctionExpressionParser_1 = require("./FunctionExpressionParser");
|
15
15
|
class ValueParser {
|
16
|
-
|
16
|
+
// Parse SQL string to AST (was: parse)
|
17
|
+
static parse(query) {
|
17
18
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
18
19
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
19
20
|
// Parse
|
20
|
-
const result = this.
|
21
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
21
22
|
// Error if there are remaining tokens
|
22
23
|
if (result.newIndex < lexemes.length) {
|
23
24
|
throw new Error(`Unexpected token at index ${result.newIndex}: ${lexemes[result.newIndex].value}`);
|
24
25
|
}
|
25
26
|
return result.value;
|
26
27
|
}
|
27
|
-
|
28
|
+
// Parse from lexeme array (was: parse)
|
29
|
+
static parseFromLexeme(lexemes, index, allowAndOperator = true) {
|
28
30
|
let idx = index;
|
29
31
|
// support comments
|
30
32
|
const comment = lexemes[index].comments;
|
@@ -52,28 +54,28 @@ class ValueParser {
|
|
52
54
|
}
|
53
55
|
const current = lexemes[idx];
|
54
56
|
if (current.type === Lexeme_1.TokenType.Identifier) {
|
55
|
-
return IdentifierParser_1.IdentifierParser.
|
57
|
+
return IdentifierParser_1.IdentifierParser.parseFromLexeme(lexemes, idx);
|
56
58
|
}
|
57
59
|
else if (current.type === Lexeme_1.TokenType.Literal) {
|
58
|
-
return LiteralParser_1.LiteralParser.
|
60
|
+
return LiteralParser_1.LiteralParser.parseFromLexeme(lexemes, idx);
|
59
61
|
}
|
60
62
|
else if (current.type === Lexeme_1.TokenType.OpenParen) {
|
61
|
-
return ParenExpressionParser_1.ParenExpressionParser.
|
63
|
+
return ParenExpressionParser_1.ParenExpressionParser.parseFromLexeme(lexemes, idx);
|
62
64
|
}
|
63
65
|
else if (current.type === Lexeme_1.TokenType.Function) {
|
64
|
-
return FunctionExpressionParser_1.FunctionExpressionParser.
|
66
|
+
return FunctionExpressionParser_1.FunctionExpressionParser.parseFromLexeme(lexemes, idx);
|
65
67
|
}
|
66
68
|
else if (current.type === Lexeme_1.TokenType.Operator) {
|
67
|
-
return UnaryExpressionParser_1.UnaryExpressionParser.
|
69
|
+
return UnaryExpressionParser_1.UnaryExpressionParser.parseFromLexeme(lexemes, idx);
|
68
70
|
}
|
69
71
|
else if (current.type === Lexeme_1.TokenType.Parameter) {
|
70
|
-
return ParameterExpressionParser_1.ParameterExpressionParser.
|
72
|
+
return ParameterExpressionParser_1.ParameterExpressionParser.parseFromLexeme(lexemes, idx);
|
71
73
|
}
|
72
74
|
else if (current.type === Lexeme_1.TokenType.StringSpecifier) {
|
73
|
-
return StringSpecifierExpressionParser_1.StringSpecifierExpressionParser.
|
75
|
+
return StringSpecifierExpressionParser_1.StringSpecifierExpressionParser.parseFromLexeme(lexemes, idx);
|
74
76
|
}
|
75
77
|
else if (current.type === Lexeme_1.TokenType.Command) {
|
76
|
-
return CommandExpressionParser_1.CommandExpressionParser.
|
78
|
+
return CommandExpressionParser_1.CommandExpressionParser.parseFromLexeme(lexemes, idx);
|
77
79
|
}
|
78
80
|
throw new Error(`Invalid lexeme. index: ${idx}, type: ${lexemes[idx].type}, value: ${lexemes[idx].value}`);
|
79
81
|
}
|
@@ -102,13 +104,13 @@ class ValueParser {
|
|
102
104
|
}
|
103
105
|
}
|
104
106
|
// Parse the value inside
|
105
|
-
const result = this.
|
107
|
+
const result = this.parseFromLexeme(lexemes, idx);
|
106
108
|
idx = result.newIndex;
|
107
109
|
args.push(result.value);
|
108
110
|
// Continue reading if the next element is a comma
|
109
111
|
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
110
112
|
idx++;
|
111
|
-
const argResult = this.
|
113
|
+
const argResult = this.parseFromLexeme(lexemes, idx);
|
112
114
|
idx = argResult.newIndex;
|
113
115
|
args.push(argResult.value);
|
114
116
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ValueParser.js","sourceRoot":"","sources":["../../src/parsers/ValueParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6DAAsF;AACtF,iDAA8C;AAC9C,yDAAsD;AACtD,mDAAgD;AAChD,mEAAgE;AAChE,mEAAgE;AAChE,2EAAwE;AACxE,uFAAoF;AACpF,uEAAoE;AACpE,yEAAsE;AAEtE,MAAa,WAAW;
|
1
|
+
{"version":3,"file":"ValueParser.js","sourceRoot":"","sources":["../../src/parsers/ValueParser.ts"],"names":[],"mappings":"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"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { ValuesQuery } from "../models/SelectQuery";
|
3
3
|
export declare class ValuesQueryParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): ValuesQuery;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: ValuesQuery;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -7,18 +7,18 @@ const ValueComponent_1 = require("../models/ValueComponent");
|
|
7
7
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
8
8
|
const ValueParser_1 = require("./ValueParser");
|
9
9
|
class ValuesQueryParser {
|
10
|
-
static
|
10
|
+
static parse(query) {
|
11
11
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
12
12
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
13
13
|
// Parse
|
14
|
-
const result = this.
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
15
15
|
// Error if there are remaining tokens
|
16
16
|
if (result.newIndex < lexemes.length) {
|
17
17
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The VALUES clause is complete but there are additional tokens.`);
|
18
18
|
}
|
19
19
|
return result.value;
|
20
20
|
}
|
21
|
-
static
|
21
|
+
static parseFromLexeme(lexemes, index) {
|
22
22
|
let idx = index;
|
23
23
|
if (lexemes[idx].value.toLowerCase() !== 'values') {
|
24
24
|
throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but found "${lexemes[idx].value}". VALUES clauses must start with the VALUES keyword.`);
|
@@ -61,7 +61,7 @@ class ValuesQueryParser {
|
|
61
61
|
return { value: new ValueComponent_1.TupleExpression([]), newIndex: idx };
|
62
62
|
}
|
63
63
|
// Parse the first value
|
64
|
-
const firstValue = ValueParser_1.ValueParser.
|
64
|
+
const firstValue = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
65
65
|
values.push(firstValue.value);
|
66
66
|
idx = firstValue.newIndex;
|
67
67
|
// Parse additional values
|
@@ -70,7 +70,7 @@ class ValuesQueryParser {
|
|
70
70
|
if (idx >= lexemes.length) {
|
71
71
|
throw new Error(`Syntax error: Unexpected end of input after comma in tuple expression.`);
|
72
72
|
}
|
73
|
-
const value = ValueParser_1.ValueParser.
|
73
|
+
const value = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
74
74
|
values.push(value.value);
|
75
75
|
idx = value.newIndex;
|
76
76
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,uDAAoD;AACpD,6DAA2E;AAC3E,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IACnB,MAAM,CAAC,
|
1
|
+
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":"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"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { WhereClause } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class WhereClauseParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WhereClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WhereClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -5,18 +5,20 @@ const Clause_1 = require("../models/Clause");
|
|
5
5
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
6
6
|
const ValueParser_1 = require("./ValueParser");
|
7
7
|
class WhereClauseParser {
|
8
|
-
|
8
|
+
// Parse SQL string to AST (was: parse)
|
9
|
+
static parse(query) {
|
9
10
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
10
11
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
11
12
|
// Parse
|
12
|
-
const result = this.
|
13
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
13
14
|
// Error if there are remaining tokens
|
14
15
|
if (result.newIndex < lexemes.length) {
|
15
16
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WHERE clause is complete but there are additional tokens.`);
|
16
17
|
}
|
17
18
|
return result.value;
|
18
19
|
}
|
19
|
-
|
20
|
+
// Parse from lexeme array (was: parse)
|
21
|
+
static parseFromLexeme(lexemes, index) {
|
20
22
|
let idx = index;
|
21
23
|
if (lexemes[idx].value !== 'where') {
|
22
24
|
throw new Error(`Syntax error at position ${idx}: Expected 'WHERE' keyword but found "${lexemes[idx].value}". WHERE clauses must start with the WHERE keyword.`);
|
@@ -25,7 +27,7 @@ class WhereClauseParser {
|
|
25
27
|
if (idx >= lexemes.length) {
|
26
28
|
throw new Error(`Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.`);
|
27
29
|
}
|
28
|
-
const item = ValueParser_1.ValueParser.
|
30
|
+
const item = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
29
31
|
const clause = new Clause_1.WhereClause(item.value);
|
30
32
|
return { value: clause, newIndex: item.newIndex };
|
31
33
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WhereClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WhereClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA+C;AAE/C,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;
|
1
|
+
{"version":3,"file":"WhereClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WhereClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA+C;AAE/C,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,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACtI,CAAC;QAED,MAAM,IAAI,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;CACJ;AAnCD,8CAmCC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { WindowFrameClause } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class WindowClauseParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WindowFrameClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WindowFrameClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -6,18 +6,20 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
6
6
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
7
|
const WindowExpressionParser_1 = require("./WindowExpressionParser");
|
8
8
|
class WindowClauseParser {
|
9
|
-
|
9
|
+
// Parse SQL string to AST (was: parse)
|
10
|
+
static parse(query) {
|
10
11
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
11
12
|
const lexemes = tokenizer.readLexmes();
|
12
13
|
// Parse
|
13
|
-
const result = this.
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
14
15
|
// Error if there are remaining tokens
|
15
16
|
if (result.newIndex < lexemes.length) {
|
16
17
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WINDOW clause is complete but there are additional tokens.`);
|
17
18
|
}
|
18
19
|
return result.value;
|
19
20
|
}
|
20
|
-
|
21
|
+
// Parse from lexeme array (was: parse)
|
22
|
+
static parseFromLexeme(lexemes, index) {
|
21
23
|
let idx = index;
|
22
24
|
if (lexemes[idx].value !== 'window') {
|
23
25
|
throw new Error(`Syntax error at position ${idx}: Expected 'WINDOW' keyword but found "${lexemes[idx].value}". WINDOW clauses must start with the WINDOW keyword.`);
|
@@ -33,7 +35,7 @@ class WindowClauseParser {
|
|
33
35
|
throw new Error(`Syntax error at position ${idx}: Expected 'AS' keyword after window name.`);
|
34
36
|
}
|
35
37
|
idx++;
|
36
|
-
const expr = WindowExpressionParser_1.WindowExpressionParser.
|
38
|
+
const expr = WindowExpressionParser_1.WindowExpressionParser.parseFromLexeme(lexemes, idx);
|
37
39
|
idx = expr.newIndex;
|
38
40
|
const windowFrame = new Clause_1.WindowFrameClause(name, expr.value);
|
39
41
|
return { value: windowFrame, newIndex: idx };
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WindowClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WindowClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6CAAqD;AACrD,iDAA8C;AAC9C,qEAAkE;AAElE,MAAa,kBAAkB;
|
1
|
+
{"version":3,"file":"WindowClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WindowClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,6CAAqD;AACrD,iDAA8C;AAC9C,qEAAkE;AAElE,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;QAEvC,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,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAClF,CAAC;QAED,sBAAsB;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;QAChC,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,4CAA4C,CAAC,CAAC;QACjG,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,MAAM,IAAI,GAAG,+CAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEpB,MAAM,WAAW,GAAG,IAAI,0BAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IACjD,CAAC;CACJ;AA7CD,gDA6CC"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Lexeme } from "../models/Lexeme";
|
2
2
|
import { WindowFrameExpression } from "../models/ValueComponent";
|
3
3
|
export declare class WindowExpressionParser {
|
4
|
-
static
|
5
|
-
static
|
4
|
+
static parse(query: string): WindowFrameExpression;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
6
|
value: WindowFrameExpression;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
@@ -8,18 +8,20 @@ const PartitionByParser_1 = require("./PartitionByParser");
|
|
8
8
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
9
9
|
const ValueParser_1 = require("./ValueParser");
|
10
10
|
class WindowExpressionParser {
|
11
|
-
|
11
|
+
// Parse SQL string to AST (was: parse)
|
12
|
+
static parse(query) {
|
12
13
|
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
13
14
|
const lexemes = tokenizer.readLexmes(); // Get tokens
|
14
15
|
// Parse
|
15
|
-
const result = this.
|
16
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
16
17
|
// Error if there are remaining tokens
|
17
18
|
if (result.newIndex < lexemes.length) {
|
18
19
|
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The window frame expression is complete but there are additional tokens.`);
|
19
20
|
}
|
20
21
|
return result.value;
|
21
22
|
}
|
22
|
-
|
23
|
+
// Parse from lexeme array (was: parse)
|
24
|
+
static parseFromLexeme(lexemes, index) {
|
23
25
|
let idx = index;
|
24
26
|
if (lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
25
27
|
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis '(' but found "${lexemes[idx].value}".`);
|
@@ -29,12 +31,12 @@ class WindowExpressionParser {
|
|
29
31
|
let order = null;
|
30
32
|
let frameSpec = null;
|
31
33
|
if (idx < lexemes.length && lexemes[idx].value === 'partition by') {
|
32
|
-
const partitionResult = PartitionByParser_1.PartitionByParser.
|
34
|
+
const partitionResult = PartitionByParser_1.PartitionByParser.parseFromLexeme(lexemes, idx);
|
33
35
|
partition = partitionResult.value;
|
34
36
|
idx = partitionResult.newIndex;
|
35
37
|
}
|
36
38
|
if (idx < lexemes.length && lexemes[idx].value === 'order by') {
|
37
|
-
const orderResult = OrderByClauseParser_1.OrderByClauseParser.
|
39
|
+
const orderResult = OrderByClauseParser_1.OrderByClauseParser.parseFromLexeme(lexemes, idx);
|
38
40
|
order = orderResult.value;
|
39
41
|
idx = orderResult.newIndex;
|
40
42
|
}
|
@@ -129,22 +131,32 @@ class WindowExpressionParser {
|
|
129
131
|
const bound = new ValueComponent_1.WindowFrameBoundStatic(frameBound);
|
130
132
|
return { value: bound, newIndex: idx + 1 };
|
131
133
|
}
|
132
|
-
else {
|
133
|
-
//
|
134
|
-
const valueResult = ValueParser_1.ValueParser.
|
134
|
+
else if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Literal) {
|
135
|
+
// Parse the numeric/literal value
|
136
|
+
const valueResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
135
137
|
idx = valueResult.newIndex;
|
136
|
-
|
137
|
-
|
138
|
+
// Next token must be 'preceding' or 'following'
|
139
|
+
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Command) {
|
140
|
+
const direction = lexemes[idx].value;
|
141
|
+
let isFollowing;
|
142
|
+
if (direction === 'preceding') {
|
143
|
+
isFollowing = false;
|
144
|
+
}
|
145
|
+
else if (direction === 'following') {
|
146
|
+
isFollowing = true;
|
147
|
+
}
|
148
|
+
else {
|
149
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
150
|
+
}
|
151
|
+
idx++;
|
152
|
+
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
153
|
+
return { value: bound, newIndex: idx };
|
138
154
|
}
|
139
|
-
|
140
|
-
|
141
|
-
const isFollowing = direction === 'following' ? true : direction === 'preceding' ? false : undefined;
|
142
|
-
if (isFollowing === undefined) {
|
143
|
-
throw new Error(`Syntax error at position ${idx}: Expected PRECEDING or FOLLOWING after numeric expression in window frame, but found "${lexemes[idx].value}".`);
|
155
|
+
else {
|
156
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
144
157
|
}
|
145
|
-
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
146
|
-
return { value: bound, newIndex: idx };
|
147
158
|
}
|
159
|
+
throw new Error(`Syntax error at position ${idx}: Expected a valid frame boundary component.`);
|
148
160
|
}
|
149
161
|
}
|
150
162
|
exports.WindowExpressionParser = WindowExpressionParser;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":";;;AACA,6CAAqD;AACrD,6DAA+L;AAC/L,+DAA4D;AAC5D,2DAAwD;AACxD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,sBAAsB;
|
1
|
+
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":"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"}
|