rawsql-ts 0.1.0-beta.3 → 0.1.0-beta.5
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 +143 -199
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/models/BinarySelectQuery.js +140 -0
- package/dist/models/BinarySelectQuery.js.map +1 -0
- package/dist/models/Clause.js +318 -0
- package/dist/models/Clause.js.map +1 -0
- package/dist/models/KeywordTrie.js +52 -0
- package/dist/models/KeywordTrie.js.map +1 -0
- package/dist/models/Lexeme.js +21 -0
- package/dist/models/Lexeme.js.map +1 -0
- package/dist/models/SelectQuery.js +10 -0
- package/dist/models/SelectQuery.js.map +1 -0
- package/dist/models/SimpleSelectQuery.js +290 -0
- package/dist/models/SimpleSelectQuery.js.map +1 -0
- package/dist/models/SqlComponent.js +27 -0
- package/dist/models/SqlComponent.js.map +1 -0
- package/dist/models/ValueComponent.js +250 -0
- package/dist/models/ValueComponent.js.map +1 -0
- package/dist/models/ValuesQuery.js +16 -0
- package/dist/models/ValuesQuery.js.map +1 -0
- package/dist/parsers/CommandExpressionParser.js +124 -0
- package/dist/parsers/CommandExpressionParser.js.map +1 -0
- package/dist/parsers/CommonTableParser.js +60 -0
- package/dist/parsers/CommonTableParser.js.map +1 -0
- package/dist/parsers/ForClauseParser.js +56 -0
- package/dist/parsers/ForClauseParser.js.map +1 -0
- package/dist/parsers/FromClauseParser.js +45 -0
- package/dist/parsers/FromClauseParser.js.map +1 -0
- package/dist/parsers/FunctionExpressionParser.js +178 -0
- package/dist/parsers/FunctionExpressionParser.js.map +1 -0
- package/dist/parsers/GroupByParser.js +56 -0
- package/dist/parsers/GroupByParser.js.map +1 -0
- package/dist/parsers/HavingParser.js +34 -0
- package/dist/parsers/HavingParser.js.map +1 -0
- package/dist/parsers/IdentifierParser.js +39 -0
- package/dist/parsers/IdentifierParser.js.map +1 -0
- package/dist/parsers/JoinClauseParser.js +105 -0
- package/dist/parsers/JoinClauseParser.js.map +1 -0
- package/dist/parsers/KeywordParser.js +91 -0
- package/dist/parsers/KeywordParser.js.map +1 -0
- package/dist/parsers/LimitClauseParser.js +48 -0
- package/dist/parsers/LimitClauseParser.js.map +1 -0
- package/dist/parsers/LiteralParser.js +38 -0
- package/dist/parsers/LiteralParser.js.map +1 -0
- package/dist/parsers/OrderByClauseParser.js +75 -0
- package/dist/parsers/OrderByClauseParser.js.map +1 -0
- package/dist/parsers/OverExpressionParser.js +44 -0
- package/dist/parsers/OverExpressionParser.js.map +1 -0
- package/dist/parsers/ParameterExpressionParser.js +15 -0
- package/dist/parsers/ParameterExpressionParser.js.map +1 -0
- package/dist/parsers/ParenExpressionParser.js +33 -0
- package/dist/parsers/ParenExpressionParser.js.map +1 -0
- package/dist/parsers/PartitionByParser.js +51 -0
- package/dist/parsers/PartitionByParser.js.map +1 -0
- package/dist/parsers/SelectClauseParser.js +82 -0
- package/dist/parsers/SelectClauseParser.js.map +1 -0
- package/dist/parsers/SelectQueryParser.js +151 -0
- package/dist/parsers/SelectQueryParser.js.map +1 -0
- package/dist/parsers/SourceAliasExpressionParser.js +48 -0
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -0
- package/dist/parsers/SourceExpressionParser.js +34 -0
- package/dist/parsers/SourceExpressionParser.js.map +1 -0
- package/dist/parsers/SourceParser.js +116 -0
- package/dist/parsers/SourceParser.js.map +1 -0
- package/dist/parsers/SqlTokenizer.js +174 -0
- package/dist/parsers/SqlTokenizer.js.map +1 -0
- package/dist/parsers/StringSpecifierExpressionParser.js +22 -0
- package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -0
- package/dist/parsers/UnaryExpressionParser.js +30 -0
- package/dist/parsers/UnaryExpressionParser.js.map +1 -0
- package/dist/parsers/ValueParser.js +134 -0
- package/dist/parsers/ValueParser.js.map +1 -0
- package/dist/parsers/ValuesQueryParser.js +86 -0
- package/dist/parsers/ValuesQueryParser.js.map +1 -0
- package/dist/parsers/WhereClauseParser.js +34 -0
- package/dist/parsers/WhereClauseParser.js.map +1 -0
- package/dist/parsers/WindowClauseParser.js +43 -0
- package/dist/parsers/WindowClauseParser.js.map +1 -0
- package/dist/parsers/WindowExpressionParser.js +151 -0
- package/dist/parsers/WindowExpressionParser.js.map +1 -0
- package/dist/parsers/WithClauseParser.js +55 -0
- package/dist/parsers/WithClauseParser.js.map +1 -0
- package/dist/tokenReaders/BaseTokenReader.js +82 -0
- package/dist/tokenReaders/BaseTokenReader.js.map +1 -0
- package/dist/tokenReaders/CommandTokenReader.js +145 -0
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -0
- package/dist/tokenReaders/FunctionTokenReader.js +45 -0
- package/dist/tokenReaders/FunctionTokenReader.js.map +1 -0
- package/dist/tokenReaders/IdentifierTokenReader.js +70 -0
- package/dist/tokenReaders/IdentifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/LiteralTokenReader.js +189 -0
- package/dist/tokenReaders/LiteralTokenReader.js.map +1 -0
- package/dist/tokenReaders/OperatorTokenReader.js +98 -0
- package/dist/tokenReaders/OperatorTokenReader.js.map +1 -0
- package/dist/tokenReaders/ParameterTokenReader.js +44 -0
- package/dist/tokenReaders/ParameterTokenReader.js.map +1 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js +31 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/SymbolTokenReader.js +35 -0
- package/dist/tokenReaders/SymbolTokenReader.js.map +1 -0
- package/dist/tokenReaders/TokenReaderManager.js +110 -0
- package/dist/tokenReaders/TokenReaderManager.js.map +1 -0
- package/dist/tokenReaders/TypeTokenReader.js +59 -0
- package/dist/tokenReaders/TypeTokenReader.js.map +1 -0
- package/dist/transformers/CTEBuilder.js +188 -0
- package/dist/transformers/CTEBuilder.js.map +1 -0
- package/dist/transformers/CTECollector.js +384 -0
- package/dist/transformers/CTECollector.js.map +1 -0
- package/dist/transformers/CTEDisabler.js +325 -0
- package/dist/transformers/CTEDisabler.js.map +1 -0
- package/dist/transformers/CTEInjector.js +83 -0
- package/dist/transformers/CTEInjector.js.map +1 -0
- package/dist/transformers/CTENormalizer.js +42 -0
- package/dist/transformers/CTENormalizer.js.map +1 -0
- package/dist/transformers/Formatter.js +452 -0
- package/dist/transformers/Formatter.js.map +1 -0
- package/dist/transformers/QueryNormalizer.js +114 -0
- package/dist/transformers/QueryNormalizer.js.map +1 -0
- package/dist/transformers/SelectValueCollector.js +249 -0
- package/dist/transformers/SelectValueCollector.js.map +1 -0
- package/dist/transformers/SelectableColumnCollector.js +308 -0
- package/dist/transformers/SelectableColumnCollector.js.map +1 -0
- package/dist/transformers/TableSourceCollector.js +384 -0
- package/dist/transformers/TableSourceCollector.js.map +1 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js +129 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -0
- package/dist/utils/charLookupTable.js +73 -0
- package/dist/utils/charLookupTable.js.map +1 -0
- package/dist/utils/stringUtils.js +168 -0
- package/dist/utils/stringUtils.js.map +1 -0
- package/package.json +2 -2
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/vitest.config.js +0 -15
- package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SqlTokenizer.js","sourceRoot":"","sources":["../../src/parsers/SqlTokenizer.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.StringSpecifierExpressionParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
class StringSpecifierExpressionParser {
|
7
|
+
static parse(lexemes, index) {
|
8
|
+
let idx = index;
|
9
|
+
const specifer = lexemes[idx].value;
|
10
|
+
idx++;
|
11
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.Literal) {
|
12
|
+
throw new Error(`Expected string literal after string specifier at index ${idx}`);
|
13
|
+
}
|
14
|
+
const value = lexemes[idx].value;
|
15
|
+
idx++;
|
16
|
+
// Create StringSpecifierExpression
|
17
|
+
const result = new ValueComponent_1.StringSpecifierExpression(specifer, value);
|
18
|
+
return { value: result, newIndex: idx };
|
19
|
+
}
|
20
|
+
}
|
21
|
+
exports.StringSpecifierExpressionParser = StringSpecifierExpressionParser;
|
22
|
+
//# sourceMappingURL=StringSpecifierExpressionParser.js.map
|
@@ -0,0 +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,KAAK,CAAC,OAAiB,EAAE,KAAa;QAChD,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"}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.UnaryExpressionParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
7
|
+
class UnaryExpressionParser {
|
8
|
+
static parse(lexemes, index) {
|
9
|
+
let idx = index;
|
10
|
+
// Process unary operator
|
11
|
+
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Operator) {
|
12
|
+
const operator = lexemes[idx].value;
|
13
|
+
idx++;
|
14
|
+
// Treat the asterisk as an Identifier, not as a unary operator
|
15
|
+
if (operator === '*') {
|
16
|
+
const v = new ValueComponent_1.ColumnReference(null, '*');
|
17
|
+
return { value: v, newIndex: idx };
|
18
|
+
}
|
19
|
+
// Get the right-hand side value of the unary operator
|
20
|
+
const result = ValueParser_1.ValueParser.parse(lexemes, idx);
|
21
|
+
idx = result.newIndex;
|
22
|
+
// Create unary expression
|
23
|
+
const value = new ValueComponent_1.UnaryExpression(operator, result.value);
|
24
|
+
return { value, newIndex: idx };
|
25
|
+
}
|
26
|
+
throw new Error(`Invalid unary expression at index ${index}: ${lexemes[index].value}`);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
exports.UnaryExpressionParser = UnaryExpressionParser;
|
30
|
+
//# sourceMappingURL=UnaryExpressionParser.js.map
|
@@ -0,0 +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,KAAK,CAAC,OAAiB,EAAE,KAAa;QAChD,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,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC/C,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"}
|
@@ -0,0 +1,134 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ValueParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
|
+
const IdentifierParser_1 = require("./IdentifierParser");
|
8
|
+
const LiteralParser_1 = require("./LiteralParser");
|
9
|
+
const ParenExpressionParser_1 = require("./ParenExpressionParser");
|
10
|
+
const UnaryExpressionParser_1 = require("./UnaryExpressionParser");
|
11
|
+
const ParameterExpressionParser_1 = require("./ParameterExpressionParser");
|
12
|
+
const StringSpecifierExpressionParser_1 = require("./StringSpecifierExpressionParser");
|
13
|
+
const CommandExpressionParser_1 = require("./CommandExpressionParser");
|
14
|
+
const FunctionExpressionParser_1 = require("./FunctionExpressionParser");
|
15
|
+
class ValueParser {
|
16
|
+
static parseFromText(query) {
|
17
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
18
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
19
|
+
// Parse
|
20
|
+
const result = this.parse(lexemes, 0);
|
21
|
+
// Error if there are remaining tokens
|
22
|
+
if (result.newIndex < lexemes.length) {
|
23
|
+
throw new Error(`Unexpected token at index ${result.newIndex}: ${lexemes[result.newIndex].value}`);
|
24
|
+
}
|
25
|
+
return result.value;
|
26
|
+
}
|
27
|
+
static parse(lexemes, index, allowAndOperator = true) {
|
28
|
+
let idx = index;
|
29
|
+
// support comments
|
30
|
+
const comment = lexemes[index].comments;
|
31
|
+
const left = this.parseItem(lexemes, index);
|
32
|
+
left.value.comments = comment;
|
33
|
+
idx = left.newIndex;
|
34
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Operator) {
|
35
|
+
const binaryResult = FunctionExpressionParser_1.FunctionExpressionParser.tryParseBinaryExpression(lexemes, idx, left.value, allowAndOperator);
|
36
|
+
if (binaryResult) {
|
37
|
+
left.value = binaryResult.value;
|
38
|
+
idx = binaryResult.newIndex;
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
// If no binary expression is found, break the loop
|
42
|
+
break;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
return { value: left.value, newIndex: idx };
|
46
|
+
}
|
47
|
+
static parseItem(lexemes, index) {
|
48
|
+
let idx = index;
|
49
|
+
// Range check
|
50
|
+
if (idx >= lexemes.length) {
|
51
|
+
throw new Error(`Unexpected end of lexemes at index ${index}`);
|
52
|
+
}
|
53
|
+
const current = lexemes[idx];
|
54
|
+
if (current.type === Lexeme_1.TokenType.Identifier) {
|
55
|
+
return IdentifierParser_1.IdentifierParser.parse(lexemes, idx);
|
56
|
+
}
|
57
|
+
else if (current.type === Lexeme_1.TokenType.Literal) {
|
58
|
+
return LiteralParser_1.LiteralParser.parse(lexemes, idx);
|
59
|
+
}
|
60
|
+
else if (current.type === Lexeme_1.TokenType.OpenParen) {
|
61
|
+
return ParenExpressionParser_1.ParenExpressionParser.parse(lexemes, idx);
|
62
|
+
}
|
63
|
+
else if (current.type === Lexeme_1.TokenType.Function) {
|
64
|
+
return FunctionExpressionParser_1.FunctionExpressionParser.parse(lexemes, idx);
|
65
|
+
}
|
66
|
+
else if (current.type === Lexeme_1.TokenType.Operator) {
|
67
|
+
return UnaryExpressionParser_1.UnaryExpressionParser.parse(lexemes, idx);
|
68
|
+
}
|
69
|
+
else if (current.type === Lexeme_1.TokenType.Parameter) {
|
70
|
+
return ParameterExpressionParser_1.ParameterExpressionParser.parse(lexemes, idx);
|
71
|
+
}
|
72
|
+
else if (current.type === Lexeme_1.TokenType.StringSpecifier) {
|
73
|
+
return StringSpecifierExpressionParser_1.StringSpecifierExpressionParser.parse(lexemes, idx);
|
74
|
+
}
|
75
|
+
else if (current.type === Lexeme_1.TokenType.Command) {
|
76
|
+
return CommandExpressionParser_1.CommandExpressionParser.parse(lexemes, idx);
|
77
|
+
}
|
78
|
+
throw new Error(`Invalid lexeme. index: ${idx}, type: ${lexemes[idx].type}, value: ${lexemes[idx].value}`);
|
79
|
+
}
|
80
|
+
static parseArgument(openToken, closeToken, lexemes, index) {
|
81
|
+
let idx = index;
|
82
|
+
const args = [];
|
83
|
+
// Check for opening parenthesis
|
84
|
+
if (idx < lexemes.length && lexemes[idx].type === openToken) {
|
85
|
+
idx++;
|
86
|
+
if (idx < lexemes.length && lexemes[idx].type === closeToken) {
|
87
|
+
// If there are no arguments, return an empty ValueList
|
88
|
+
idx++;
|
89
|
+
return { value: new ValueComponent_1.ValueList([]), newIndex: idx };
|
90
|
+
}
|
91
|
+
// If the next element is `*`, treat `*` as an Identifier
|
92
|
+
if (idx < lexemes.length && lexemes[idx].value === "*") {
|
93
|
+
const wildcard = new ValueComponent_1.ColumnReference(null, "*");
|
94
|
+
idx++;
|
95
|
+
// The next element must be closeToken
|
96
|
+
if (idx < lexemes.length && lexemes[idx].type === closeToken) {
|
97
|
+
idx++;
|
98
|
+
return { value: wildcard, newIndex: idx };
|
99
|
+
}
|
100
|
+
else {
|
101
|
+
throw new Error(`Expected closing parenthesis at index ${idx}`);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
// Parse the value inside
|
105
|
+
const result = this.parse(lexemes, idx);
|
106
|
+
idx = result.newIndex;
|
107
|
+
args.push(result.value);
|
108
|
+
// Continue reading if the next element is a comma
|
109
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
110
|
+
idx++;
|
111
|
+
const argResult = this.parse(lexemes, idx);
|
112
|
+
idx = argResult.newIndex;
|
113
|
+
args.push(argResult.value);
|
114
|
+
}
|
115
|
+
// Check for closing parenthesis
|
116
|
+
if (idx < lexemes.length && lexemes[idx].type === closeToken) {
|
117
|
+
idx++;
|
118
|
+
if (args.length === 1) {
|
119
|
+
// Return as is if there is only one argument
|
120
|
+
return { value: args[0], newIndex: idx };
|
121
|
+
}
|
122
|
+
// Create ValueCollection if there are multiple arguments
|
123
|
+
const value = new ValueComponent_1.ValueList(args);
|
124
|
+
return { value, newIndex: idx };
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
throw new Error(`Missing closing parenthesis at index ${idx}`);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
throw new Error(`Expected opening parenthesis at index ${index}`);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
exports.ValueParser = ValueParser;
|
134
|
+
//# sourceMappingURL=ValueParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ValueParser.js","sourceRoot":"","sources":["../../src/parsers/ValueParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ValuesQueryParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const SelectQuery_1 = require("../models/SelectQuery");
|
6
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
7
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
8
|
+
const ValueParser_1 = require("./ValueParser");
|
9
|
+
class ValuesQueryParser {
|
10
|
+
static parseFromText(query) {
|
11
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
12
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
13
|
+
// Parse
|
14
|
+
const result = this.parse(lexemes, 0);
|
15
|
+
// Error if there are remaining tokens
|
16
|
+
if (result.newIndex < lexemes.length) {
|
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
|
+
}
|
19
|
+
return result.value;
|
20
|
+
}
|
21
|
+
static parse(lexemes, index) {
|
22
|
+
let idx = index;
|
23
|
+
if (lexemes[idx].value.toLowerCase() !== 'values') {
|
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.`);
|
25
|
+
}
|
26
|
+
idx++;
|
27
|
+
if (idx >= lexemes.length) {
|
28
|
+
throw new Error(`Syntax error: Unexpected end of input after 'VALUES' keyword. The VALUES clause requires at least one tuple expression.`);
|
29
|
+
}
|
30
|
+
const tuples = [];
|
31
|
+
// Parse the first tuple
|
32
|
+
const firstTuple = this.parseTuple(lexemes, idx);
|
33
|
+
tuples.push(firstTuple.value);
|
34
|
+
idx = firstTuple.newIndex;
|
35
|
+
// Parse additional tuples if they exist
|
36
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
37
|
+
idx++; // Skip comma
|
38
|
+
const tuple = this.parseTuple(lexemes, idx);
|
39
|
+
tuples.push(tuple.value);
|
40
|
+
idx = tuple.newIndex;
|
41
|
+
}
|
42
|
+
const query = new SelectQuery_1.ValuesQuery(tuples);
|
43
|
+
return { value: query, newIndex: idx };
|
44
|
+
}
|
45
|
+
static parseTuple(lexemes, index) {
|
46
|
+
let idx = index;
|
47
|
+
// Check for opening parenthesis
|
48
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
49
|
+
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis but found "${idx < lexemes.length ? lexemes[idx].value : "end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);
|
50
|
+
}
|
51
|
+
idx++;
|
52
|
+
// Parse values inside the tuple
|
53
|
+
const values = [];
|
54
|
+
// Parse first value
|
55
|
+
if (idx >= lexemes.length) {
|
56
|
+
throw new Error(`Syntax error: Unexpected end of input after opening parenthesis in tuple expression.`);
|
57
|
+
}
|
58
|
+
// Check for empty tuple case
|
59
|
+
if (lexemes[idx].type === Lexeme_1.TokenType.CloseParen) {
|
60
|
+
idx++; // Skip closing parenthesis
|
61
|
+
return { value: new ValueComponent_1.TupleExpression([]), newIndex: idx };
|
62
|
+
}
|
63
|
+
// Parse the first value
|
64
|
+
const firstValue = ValueParser_1.ValueParser.parse(lexemes, idx);
|
65
|
+
values.push(firstValue.value);
|
66
|
+
idx = firstValue.newIndex;
|
67
|
+
// Parse additional values
|
68
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
69
|
+
idx++; // Skip comma
|
70
|
+
if (idx >= lexemes.length) {
|
71
|
+
throw new Error(`Syntax error: Unexpected end of input after comma in tuple expression.`);
|
72
|
+
}
|
73
|
+
const value = ValueParser_1.ValueParser.parse(lexemes, idx);
|
74
|
+
values.push(value.value);
|
75
|
+
idx = value.newIndex;
|
76
|
+
}
|
77
|
+
// Check for closing parenthesis
|
78
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.CloseParen) {
|
79
|
+
throw new Error(`Syntax error at position ${idx}: Expected closing parenthesis but found "${idx < lexemes.length ? lexemes[idx].value : "end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);
|
80
|
+
}
|
81
|
+
idx++; // Skip closing parenthesis
|
82
|
+
return { value: new ValueComponent_1.TupleExpression(values), newIndex: idx };
|
83
|
+
}
|
84
|
+
}
|
85
|
+
exports.ValuesQueryParser = ValuesQueryParser;
|
86
|
+
//# sourceMappingURL=ValuesQueryParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.WhereClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
7
|
+
class WhereClauseParser {
|
8
|
+
static parseFromText(query) {
|
9
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
10
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
11
|
+
// Parse
|
12
|
+
const result = this.parse(lexemes, 0);
|
13
|
+
// Error if there are remaining tokens
|
14
|
+
if (result.newIndex < lexemes.length) {
|
15
|
+
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
|
+
return result.value;
|
18
|
+
}
|
19
|
+
static parse(lexemes, index) {
|
20
|
+
let idx = index;
|
21
|
+
if (lexemes[idx].value !== 'where') {
|
22
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'WHERE' keyword but found "${lexemes[idx].value}". WHERE clauses must start with the WHERE keyword.`);
|
23
|
+
}
|
24
|
+
idx++;
|
25
|
+
if (idx >= lexemes.length) {
|
26
|
+
throw new Error(`Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.`);
|
27
|
+
}
|
28
|
+
const item = ValueParser_1.ValueParser.parse(lexemes, idx);
|
29
|
+
const clause = new Clause_1.WhereClause(item.value);
|
30
|
+
return { value: clause, newIndex: item.newIndex };
|
31
|
+
}
|
32
|
+
}
|
33
|
+
exports.WhereClauseParser = WhereClauseParser;
|
34
|
+
//# sourceMappingURL=WhereClauseParser.js.map
|
@@ -0,0 +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;IACnB,MAAM,CAAC,aAAa,CAAC,KAAa;QACrC,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,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEtC,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;IAEM,MAAM,CAAC,KAAK,CAAC,OAAiB,EAAE,KAAa;QAChD,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,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,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;AAjCD,8CAiCC"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.WindowClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
|
+
const WindowExpressionParser_1 = require("./WindowExpressionParser");
|
8
|
+
class WindowClauseParser {
|
9
|
+
static parseFromText(query) {
|
10
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
11
|
+
const lexemes = tokenizer.readLexmes();
|
12
|
+
// Parse
|
13
|
+
const result = this.parse(lexemes, 0);
|
14
|
+
// Error if there are remaining tokens
|
15
|
+
if (result.newIndex < lexemes.length) {
|
16
|
+
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
|
+
return result.value;
|
19
|
+
}
|
20
|
+
static parse(lexemes, index) {
|
21
|
+
let idx = index;
|
22
|
+
if (lexemes[idx].value !== 'window') {
|
23
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'WINDOW' keyword but found "${lexemes[idx].value}". WINDOW clauses must start with the WINDOW keyword.`);
|
24
|
+
}
|
25
|
+
idx++;
|
26
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.Identifier) {
|
27
|
+
throw new Error(`Syntax error: Expected window name after 'WINDOW' keyword.`);
|
28
|
+
}
|
29
|
+
// Get the window name
|
30
|
+
const name = lexemes[idx].value;
|
31
|
+
idx++;
|
32
|
+
if (idx >= lexemes.length || lexemes[idx].value !== 'as') {
|
33
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'AS' keyword after window name.`);
|
34
|
+
}
|
35
|
+
idx++;
|
36
|
+
const expr = WindowExpressionParser_1.WindowExpressionParser.parse(lexemes, idx);
|
37
|
+
idx = expr.newIndex;
|
38
|
+
const windowFrame = new Clause_1.WindowFrameClause(name, expr.value);
|
39
|
+
return { value: windowFrame, newIndex: idx };
|
40
|
+
}
|
41
|
+
}
|
42
|
+
exports.WindowClauseParser = WindowClauseParser;
|
43
|
+
//# sourceMappingURL=WindowClauseParser.js.map
|
@@ -0,0 +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;IACpB,MAAM,CAAC,aAAa,CAAC,KAAa;QACrC,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,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEtC,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;IAEM,MAAM,CAAC,KAAK,CAAC,OAAiB,EAAE,KAAa;QAChD,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,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxD,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;AA3CD,gDA2CC"}
|
@@ -0,0 +1,151 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.WindowExpressionParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
const OrderByClauseParser_1 = require("./OrderByClauseParser");
|
7
|
+
const PartitionByParser_1 = require("./PartitionByParser");
|
8
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
9
|
+
const ValueParser_1 = require("./ValueParser");
|
10
|
+
class WindowExpressionParser {
|
11
|
+
static parseFromText(query) {
|
12
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
13
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
14
|
+
// Parse
|
15
|
+
const result = this.parse(lexemes, 0);
|
16
|
+
// Error if there are remaining tokens
|
17
|
+
if (result.newIndex < lexemes.length) {
|
18
|
+
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
|
+
return result.value;
|
21
|
+
}
|
22
|
+
static parse(lexemes, index) {
|
23
|
+
let idx = index;
|
24
|
+
if (lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
25
|
+
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis '(' but found "${lexemes[idx].value}".`);
|
26
|
+
}
|
27
|
+
idx++;
|
28
|
+
let partition = null;
|
29
|
+
let order = null;
|
30
|
+
let frameSpec = null;
|
31
|
+
if (idx < lexemes.length && lexemes[idx].value === 'partition by') {
|
32
|
+
const partitionResult = PartitionByParser_1.PartitionByParser.parse(lexemes, idx);
|
33
|
+
partition = partitionResult.value;
|
34
|
+
idx = partitionResult.newIndex;
|
35
|
+
}
|
36
|
+
if (idx < lexemes.length && lexemes[idx].value === 'order by') {
|
37
|
+
const orderResult = OrderByClauseParser_1.OrderByClauseParser.parse(lexemes, idx);
|
38
|
+
order = orderResult.value;
|
39
|
+
idx = orderResult.newIndex;
|
40
|
+
}
|
41
|
+
// Parse frame clause (ROWS/RANGE/GROUPS)
|
42
|
+
if (idx < lexemes.length && this.isFrameTypeKeyword(lexemes[idx].value)) {
|
43
|
+
const frameSpecResult = this.parseFrameSpec(lexemes, idx);
|
44
|
+
frameSpec = frameSpecResult.value;
|
45
|
+
idx = frameSpecResult.newIndex;
|
46
|
+
}
|
47
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.CloseParen) {
|
48
|
+
throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis ')' for window frame. Each opening parenthesis must have a matching closing parenthesis.`);
|
49
|
+
}
|
50
|
+
// Read close paren
|
51
|
+
idx++;
|
52
|
+
return { value: new ValueComponent_1.WindowFrameExpression(partition, order, frameSpec), newIndex: idx };
|
53
|
+
}
|
54
|
+
static isFrameTypeKeyword(value) {
|
55
|
+
const lowerValue = value;
|
56
|
+
return lowerValue === 'rows' || lowerValue === 'range' || lowerValue === 'groups';
|
57
|
+
}
|
58
|
+
static parseFrameSpec(lexemes, index) {
|
59
|
+
let idx = index;
|
60
|
+
// Determine frame type (ROWS/RANGE/GROUPS)
|
61
|
+
const frameTypeStr = lexemes[idx].value;
|
62
|
+
let frameType;
|
63
|
+
switch (frameTypeStr) {
|
64
|
+
case 'rows':
|
65
|
+
frameType = ValueComponent_1.WindowFrameType.Rows;
|
66
|
+
break;
|
67
|
+
case 'range':
|
68
|
+
frameType = ValueComponent_1.WindowFrameType.Range;
|
69
|
+
break;
|
70
|
+
case 'groups':
|
71
|
+
frameType = ValueComponent_1.WindowFrameType.Groups;
|
72
|
+
break;
|
73
|
+
default:
|
74
|
+
throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`);
|
75
|
+
}
|
76
|
+
idx++;
|
77
|
+
// Check for BETWEEN ... AND ... syntax
|
78
|
+
if (idx < lexemes.length && lexemes[idx].value === 'between') {
|
79
|
+
// BETWEEN ... AND ... syntax
|
80
|
+
idx++;
|
81
|
+
// Parse start boundary
|
82
|
+
const startBoundResult = this.parseFrameBoundary(lexemes, idx);
|
83
|
+
const startBound = startBoundResult.value;
|
84
|
+
idx = startBoundResult.newIndex;
|
85
|
+
// Check for AND keyword - may be recognized as a separate token or part of a compound token
|
86
|
+
if (idx >= lexemes.length || (lexemes[idx].value !== 'and')) {
|
87
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'AND' keyword in BETWEEN clause.`);
|
88
|
+
}
|
89
|
+
idx++; // Skip AND
|
90
|
+
// Parse end boundary
|
91
|
+
const endBoundResult = this.parseFrameBoundary(lexemes, idx);
|
92
|
+
const endBound = endBoundResult.value;
|
93
|
+
idx = endBoundResult.newIndex;
|
94
|
+
return {
|
95
|
+
value: new ValueComponent_1.WindowFrameSpec(frameType, startBound, endBound),
|
96
|
+
newIndex: idx
|
97
|
+
};
|
98
|
+
}
|
99
|
+
else {
|
100
|
+
// Single boundary specification
|
101
|
+
const boundaryResult = this.parseFrameBoundary(lexemes, idx);
|
102
|
+
const startBound = boundaryResult.value;
|
103
|
+
idx = boundaryResult.newIndex;
|
104
|
+
return {
|
105
|
+
value: new ValueComponent_1.WindowFrameSpec(frameType, startBound, null),
|
106
|
+
newIndex: idx
|
107
|
+
};
|
108
|
+
}
|
109
|
+
}
|
110
|
+
static parseFrameBoundary(lexemes, index) {
|
111
|
+
let idx = index;
|
112
|
+
// Check for predefined boundaries
|
113
|
+
if (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Command) {
|
114
|
+
const currentValue = lexemes[idx].value;
|
115
|
+
let frameBound;
|
116
|
+
switch (currentValue) {
|
117
|
+
case 'current row':
|
118
|
+
frameBound = ValueComponent_1.WindowFrameBound.CurrentRow;
|
119
|
+
break;
|
120
|
+
case 'unbounded preceding':
|
121
|
+
frameBound = ValueComponent_1.WindowFrameBound.UnboundedPreceding;
|
122
|
+
break;
|
123
|
+
case 'unbounded following':
|
124
|
+
frameBound = ValueComponent_1.WindowFrameBound.UnboundedFollowing;
|
125
|
+
break;
|
126
|
+
default:
|
127
|
+
throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`);
|
128
|
+
}
|
129
|
+
const bound = new ValueComponent_1.WindowFrameBoundStatic(frameBound);
|
130
|
+
return { value: bound, newIndex: idx + 1 };
|
131
|
+
}
|
132
|
+
else {
|
133
|
+
// Handle numeric expression + PRECEDING/FOLLOWING
|
134
|
+
const valueResult = ValueParser_1.ValueParser.parse(lexemes, idx);
|
135
|
+
idx = valueResult.newIndex;
|
136
|
+
if (idx >= lexemes.length) {
|
137
|
+
throw new Error(`Syntax error at position ${idx}: Expected PRECEDING or FOLLOWING after numeric expression in window frame.`);
|
138
|
+
}
|
139
|
+
const direction = lexemes[idx].value;
|
140
|
+
idx++;
|
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}".`);
|
144
|
+
}
|
145
|
+
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
146
|
+
return { value: bound, newIndex: idx };
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
exports.WindowExpressionParser = WindowExpressionParser;
|
151
|
+
//# sourceMappingURL=WindowExpressionParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.WithClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
|
+
const CommonTableParser_1 = require("./CommonTableParser");
|
8
|
+
class WithClauseParser {
|
9
|
+
static parseFromText(query) {
|
10
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
11
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
12
|
+
// Parse
|
13
|
+
const result = this.parse(lexemes, 0);
|
14
|
+
// Error if there are remaining tokens
|
15
|
+
if (result.newIndex < lexemes.length) {
|
16
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WITH clause is complete but there are additional tokens.`);
|
17
|
+
}
|
18
|
+
return result.value;
|
19
|
+
}
|
20
|
+
static parse(lexemes, index) {
|
21
|
+
let idx = index;
|
22
|
+
// Expect WITH keyword
|
23
|
+
if (idx < lexemes.length && lexemes[idx].value.toLowerCase() === "with") {
|
24
|
+
idx++;
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
throw new Error(`Syntax error at position ${idx}: Expected WITH keyword.`);
|
28
|
+
}
|
29
|
+
// Check for RECURSIVE keyword
|
30
|
+
const recursive = idx < lexemes.length && lexemes[idx].value.toLowerCase() === "recursive";
|
31
|
+
if (recursive) {
|
32
|
+
idx++;
|
33
|
+
}
|
34
|
+
// Parse CTEs
|
35
|
+
const tables = [];
|
36
|
+
// Parse first CTE (required)
|
37
|
+
const firstCte = CommonTableParser_1.CommonTableParser.parse(lexemes, idx);
|
38
|
+
tables.push(firstCte.value);
|
39
|
+
idx = firstCte.newIndex;
|
40
|
+
// Parse additional CTEs (optional)
|
41
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Comma) {
|
42
|
+
idx++; // Skip comma
|
43
|
+
const cteResult = CommonTableParser_1.CommonTableParser.parse(lexemes, idx);
|
44
|
+
tables.push(cteResult.value);
|
45
|
+
idx = cteResult.newIndex;
|
46
|
+
}
|
47
|
+
// Create WITH clause
|
48
|
+
return {
|
49
|
+
value: new Clause_1.WithClause(recursive, tables),
|
50
|
+
newIndex: idx
|
51
|
+
};
|
52
|
+
}
|
53
|
+
}
|
54
|
+
exports.WithClauseParser = WithClauseParser;
|
55
|
+
//# sourceMappingURL=WithClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAC3D,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD,MAAa,gBAAgB;IAClB,MAAM,CAAC,aAAa,CAAC,KAAa;QACrC,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,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEtC,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,gEAAgE,CAAC,CAAC;QACvL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,OAAiB,EAAE,KAAa;QAChD,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,sBAAsB;QACtB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACtE,GAAG,EAAE,CAAC;QACV,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;QAC/E,CAAC;QAED,8BAA8B;QAC9B,MAAM,SAAS,GAAG,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;QAC3F,IAAI,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,CAAC;QACV,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,qCAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAExB,mCAAmC;QACnC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,KAAK,EAAE,CAAC;YACnE,GAAG,EAAE,CAAC,CAAC,aAAa;YACpB,MAAM,SAAS,GAAG,qCAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,qBAAqB;QACrB,OAAO;YACH,KAAK,EAAE,IAAI,mBAAU,CAAC,SAAS,EAAE,MAAM,CAAC;YACxC,QAAQ,EAAE,GAAG;SAChB,CAAC;IACN,CAAC;CACJ;AAtDD,4CAsDC"}
|