rawsql-ts 0.5.0-beta → 0.7.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 +152 -121
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/models/Clause.js +185 -19
- package/dist/esm/models/Clause.js.map +1 -1
- package/dist/esm/models/CreateTableQuery.js +12 -22
- 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/KeywordTrie.js +2 -0
- package/dist/esm/models/KeywordTrie.js.map +1 -1
- package/dist/esm/models/SimpleSelectQuery.js +17 -15
- package/dist/esm/models/SimpleSelectQuery.js.map +1 -1
- package/dist/esm/models/SqlPrintToken.js +94 -0
- package/dist/esm/models/SqlPrintToken.js.map +1 -0
- package/dist/esm/models/UpdateQuery.js +25 -0
- package/dist/esm/models/UpdateQuery.js.map +1 -0
- package/dist/esm/models/ValueComponent.js +105 -19
- package/dist/esm/models/ValueComponent.js.map +1 -1
- package/dist/esm/parsers/FetchClauseParser.js +84 -0
- package/dist/esm/parsers/FetchClauseParser.js.map +1 -0
- package/dist/esm/parsers/FullNameParser.js +94 -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/IdentifierDecorator.js +13 -0
- package/dist/esm/parsers/IdentifierDecorator.js.map +1 -0
- package/dist/esm/parsers/IdentifierParser.js +5 -30
- package/dist/esm/parsers/IdentifierParser.js.map +1 -1
- package/dist/esm/parsers/InsertQueryParser.js +7 -28
- package/dist/esm/parsers/InsertQueryParser.js.map +1 -1
- package/dist/esm/parsers/JoinClauseParser.js +13 -35
- package/dist/esm/parsers/JoinClauseParser.js.map +1 -1
- package/dist/esm/parsers/JoinOnClauseParser.js +17 -0
- package/dist/esm/parsers/JoinOnClauseParser.js.map +1 -0
- package/dist/esm/parsers/JoinUsingClauseParser.js +19 -0
- package/dist/esm/parsers/JoinUsingClauseParser.js.map +1 -0
- package/dist/esm/parsers/LimitClauseParser.js +1 -13
- package/dist/esm/parsers/LimitClauseParser.js.map +1 -1
- package/dist/esm/parsers/OffsetClauseParser.js +38 -0
- package/dist/esm/parsers/OffsetClauseParser.js.map +1 -0
- package/dist/esm/parsers/ParameterDecorator.js +36 -0
- package/dist/esm/parsers/ParameterDecorator.js.map +1 -0
- package/dist/esm/parsers/ReturningClauseParser.js +31 -0
- package/dist/esm/parsers/ReturningClauseParser.js.map +1 -0
- package/dist/esm/parsers/SelectClauseParser.js +25 -2
- package/dist/esm/parsers/SelectClauseParser.js.map +1 -1
- package/dist/esm/parsers/SelectQueryParser.js +40 -13
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
- 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 +31 -19
- package/dist/esm/parsers/SourceParser.js.map +1 -1
- package/dist/esm/parsers/SqlPrintTokenParser.js +1058 -0
- package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -0
- 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/parsers/WindowClauseParser.js +27 -15
- package/dist/esm/parsers/WindowClauseParser.js.map +1 -1
- package/dist/esm/tokenReaders/BaseTokenReader.js +3 -3
- package/dist/esm/tokenReaders/BaseTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/CommandTokenReader.js +8 -2
- package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/esm/transformers/CTECollector.js +9 -10
- package/dist/esm/transformers/CTECollector.js.map +1 -1
- package/dist/esm/transformers/CTEDisabler.js +12 -11
- package/dist/esm/transformers/CTEDisabler.js.map +1 -1
- package/dist/esm/transformers/CTEInjector.js +2 -2
- package/dist/esm/transformers/Formatter.js +19 -569
- package/dist/esm/transformers/Formatter.js.map +1 -1
- package/dist/esm/transformers/LinePrinter.js +81 -0
- package/dist/esm/transformers/LinePrinter.js.map +1 -0
- package/dist/esm/transformers/QueryBuilder.js +62 -24
- package/dist/esm/transformers/QueryBuilder.js.map +1 -1
- package/dist/esm/transformers/SelectValueCollector.js +4 -4
- package/dist/esm/transformers/SelectableColumnCollector.js +26 -9
- package/dist/esm/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/esm/transformers/SqlFormatter.js +31 -0
- package/dist/esm/transformers/SqlFormatter.js.map +1 -0
- package/dist/esm/transformers/SqlOutputToken.js +9 -0
- package/dist/esm/transformers/SqlOutputToken.js.map +1 -0
- package/dist/esm/transformers/SqlPrinter.js +144 -0
- package/dist/esm/transformers/SqlPrinter.js.map +1 -0
- package/dist/esm/transformers/TableSourceCollector.js +32 -16
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +1 -1
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/models/Clause.d.ts +119 -14
- package/dist/esm/types/models/InsertQuery.d.ts +4 -9
- package/dist/esm/types/models/SimpleSelectQuery.d.ts +20 -5
- package/dist/esm/types/models/SqlPrintToken.d.ts +102 -0
- package/dist/esm/types/models/UpdateQuery.d.ts +31 -0
- package/dist/esm/types/models/ValueComponent.d.ts +45 -8
- package/dist/esm/types/parsers/FetchClauseParser.d.ts +24 -0
- package/dist/esm/types/parsers/FullNameParser.d.ts +27 -0
- package/dist/esm/types/parsers/IdentifierDecorator.d.ts +9 -0
- package/dist/esm/types/parsers/InsertQueryParser.d.ts +0 -1
- package/dist/esm/types/parsers/JoinClauseParser.d.ts +0 -2
- package/dist/esm/types/parsers/JoinOnClauseParser.d.ts +8 -0
- package/dist/esm/types/parsers/JoinUsingClauseParser.d.ts +8 -0
- package/dist/esm/types/parsers/OffsetClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/ParameterDecorator.d.ts +20 -0
- package/dist/esm/types/parsers/ReturningClauseParser.d.ts +12 -0
- package/dist/esm/types/parsers/SelectClauseParser.d.ts +19 -2
- 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/SqlPrintTokenParser.d.ts +144 -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/parsers/WindowClauseParser.d.ts +3 -3
- package/dist/esm/types/transformers/Formatter.d.ts +8 -99
- package/dist/esm/types/transformers/LinePrinter.d.ts +41 -0
- package/dist/esm/types/transformers/QueryBuilder.d.ts +9 -0
- package/dist/esm/types/transformers/SelectableColumnCollector.d.ts +2 -0
- package/dist/esm/types/transformers/SqlFormatter.d.ts +40 -0
- package/dist/esm/types/transformers/SqlOutputToken.d.ts +6 -0
- package/dist/esm/types/transformers/SqlPrinter.d.ts +54 -0
- package/dist/esm/types/transformers/TableSourceCollector.d.ts +2 -0
- package/dist/esm/utils/stringUtils.js +17 -0
- package/dist/esm/utils/stringUtils.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/Clause.d.ts +119 -14
- package/dist/models/Clause.js +194 -20
- package/dist/models/Clause.js.map +1 -1
- package/dist/models/CreateTableQuery.js +12 -22
- 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/KeywordTrie.js +2 -0
- package/dist/models/KeywordTrie.js.map +1 -1
- package/dist/models/SimpleSelectQuery.d.ts +20 -5
- package/dist/models/SimpleSelectQuery.js +17 -15
- package/dist/models/SimpleSelectQuery.js.map +1 -1
- package/dist/models/SqlPrintToken.d.ts +102 -0
- package/dist/models/SqlPrintToken.js +98 -0
- package/dist/models/SqlPrintToken.js.map +1 -0
- 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 +45 -8
- package/dist/models/ValueComponent.js +107 -20
- package/dist/models/ValueComponent.js.map +1 -1
- package/dist/parsers/FetchClauseParser.d.ts +24 -0
- package/dist/parsers/FetchClauseParser.js +89 -0
- package/dist/parsers/FetchClauseParser.js.map +1 -0
- package/dist/parsers/FullNameParser.d.ts +27 -0
- package/dist/parsers/FullNameParser.js +98 -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/IdentifierDecorator.d.ts +9 -0
- package/dist/parsers/IdentifierDecorator.js +17 -0
- package/dist/parsers/IdentifierDecorator.js.map +1 -0
- 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 +7 -28
- package/dist/parsers/InsertQueryParser.js.map +1 -1
- package/dist/parsers/JoinClauseParser.d.ts +0 -2
- package/dist/parsers/JoinClauseParser.js +12 -34
- package/dist/parsers/JoinClauseParser.js.map +1 -1
- package/dist/parsers/JoinOnClauseParser.d.ts +8 -0
- package/dist/parsers/JoinOnClauseParser.js +21 -0
- package/dist/parsers/JoinOnClauseParser.js.map +1 -0
- package/dist/parsers/JoinUsingClauseParser.d.ts +8 -0
- package/dist/parsers/JoinUsingClauseParser.js +23 -0
- package/dist/parsers/JoinUsingClauseParser.js.map +1 -0
- package/dist/parsers/LimitClauseParser.js +1 -13
- package/dist/parsers/LimitClauseParser.js.map +1 -1
- package/dist/parsers/OffsetClauseParser.d.ts +9 -0
- package/dist/parsers/OffsetClauseParser.js +42 -0
- package/dist/parsers/OffsetClauseParser.js.map +1 -0
- package/dist/parsers/ParameterDecorator.d.ts +20 -0
- package/dist/parsers/ParameterDecorator.js +40 -0
- package/dist/parsers/ParameterDecorator.js.map +1 -0
- 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/SelectClauseParser.d.ts +19 -2
- package/dist/parsers/SelectClauseParser.js +28 -4
- package/dist/parsers/SelectClauseParser.js.map +1 -1
- package/dist/parsers/SelectQueryParser.js +40 -13
- package/dist/parsers/SelectQueryParser.js.map +1 -1
- 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 +31 -19
- package/dist/parsers/SourceParser.js.map +1 -1
- package/dist/parsers/SqlPrintTokenParser.d.ts +144 -0
- package/dist/parsers/SqlPrintTokenParser.js +1062 -0
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -0
- 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/parsers/WindowClauseParser.d.ts +3 -3
- package/dist/parsers/WindowClauseParser.js +26 -14
- package/dist/parsers/WindowClauseParser.js.map +1 -1
- package/dist/tokenReaders/BaseTokenReader.js +3 -3
- package/dist/tokenReaders/BaseTokenReader.js.map +1 -1
- package/dist/tokenReaders/CommandTokenReader.js +8 -2
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -1
- package/dist/transformers/CTECollector.js +9 -10
- package/dist/transformers/CTECollector.js.map +1 -1
- package/dist/transformers/CTEDisabler.js +11 -10
- package/dist/transformers/CTEDisabler.js.map +1 -1
- package/dist/transformers/CTEInjector.js +2 -2
- package/dist/transformers/Formatter.d.ts +8 -99
- package/dist/transformers/Formatter.js +20 -570
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/LinePrinter.d.ts +41 -0
- package/dist/transformers/LinePrinter.js +86 -0
- package/dist/transformers/LinePrinter.js.map +1 -0
- package/dist/transformers/QueryBuilder.d.ts +9 -0
- package/dist/transformers/QueryBuilder.js +61 -23
- package/dist/transformers/QueryBuilder.js.map +1 -1
- package/dist/transformers/SelectValueCollector.js +4 -4
- package/dist/transformers/SelectableColumnCollector.d.ts +2 -0
- package/dist/transformers/SelectableColumnCollector.js +25 -8
- package/dist/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/transformers/SqlFormatter.d.ts +40 -0
- package/dist/transformers/SqlFormatter.js +35 -0
- package/dist/transformers/SqlFormatter.js.map +1 -0
- package/dist/transformers/SqlOutputToken.d.ts +6 -0
- package/dist/transformers/SqlOutputToken.js +13 -0
- package/dist/transformers/SqlOutputToken.js.map +1 -0
- package/dist/transformers/SqlPrinter.d.ts +54 -0
- package/dist/transformers/SqlPrinter.js +148 -0
- package/dist/transformers/SqlPrinter.js.map +1 -0
- package/dist/transformers/TableSourceCollector.d.ts +2 -0
- package/dist/transformers/TableSourceCollector.js +30 -14
- package/dist/transformers/TableSourceCollector.js.map +1 -1
- package/dist/transformers/UpstreamSelectQueryFinder.js +1 -1
- package/dist/utils/stringUtils.js +17 -0
- package/dist/utils/stringUtils.js.map +1 -1
- package/package.json +2 -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
@@ -5,7 +5,8 @@ const Clause_1 = require("../models/Clause");
|
|
5
5
|
const Lexeme_1 = require("../models/Lexeme");
|
6
6
|
const CommandTokenReader_1 = require("../tokenReaders/CommandTokenReader");
|
7
7
|
const SourceExpressionParser_1 = require("./SourceExpressionParser");
|
8
|
-
const
|
8
|
+
const JoinOnClauseParser_1 = require("./JoinOnClauseParser");
|
9
|
+
const JoinUsingClauseParser_1 = require("./JoinUsingClauseParser");
|
9
10
|
class JoinClauseParser {
|
10
11
|
static tryParse(lexemes, index) {
|
11
12
|
let idx = index;
|
@@ -60,46 +61,23 @@ class JoinClauseParser {
|
|
60
61
|
const sourceResult = SourceExpressionParser_1.SourceExpressionParser.parseFromLexeme(lexemes, idx);
|
61
62
|
idx = sourceResult.newIndex;
|
62
63
|
if (idx < lexemes.length) {
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
// JoinOnClauseParser
|
65
|
+
const onResult = JoinOnClauseParser_1.JoinOnClauseParser.tryParse(lexemes, idx);
|
66
|
+
if (onResult) {
|
67
|
+
const joinClause = new Clause_1.JoinClause(joinType, sourceResult.value, onResult.value, lateral);
|
68
|
+
return { value: joinClause, newIndex: onResult.newIndex };
|
66
69
|
}
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
+
// JoinUsingClauseParser
|
71
|
+
const usingResult = JoinUsingClauseParser_1.JoinUsingClauseParser.tryParse(lexemes, idx);
|
72
|
+
if (usingResult) {
|
73
|
+
const joinClause = new Clause_1.JoinClause(joinType, sourceResult.value, usingResult.value, lateral);
|
74
|
+
return { value: joinClause, newIndex: usingResult.newIndex };
|
70
75
|
}
|
71
76
|
}
|
72
77
|
// If we reach the end of the input, we can treat it as a natural join
|
73
78
|
const joinClause = new Clause_1.JoinClause(joinType, sourceResult.value, null, lateral);
|
74
79
|
return { value: joinClause, newIndex: idx };
|
75
80
|
}
|
76
|
-
static tryParseJoinOn(lexemes, index, joinType, source, lateral) {
|
77
|
-
let idx = index;
|
78
|
-
if (idx < lexemes.length && lexemes[idx].value === 'on') {
|
79
|
-
idx++; // Skip 'on' keyword
|
80
|
-
// Parse the condition expression
|
81
|
-
const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
82
|
-
idx = condition.newIndex;
|
83
|
-
const joinOn = new Clause_1.JoinOnClause(condition.value);
|
84
|
-
const joinClause = new Clause_1.JoinClause(joinType, source, joinOn, lateral);
|
85
|
-
return { value: joinClause, newIndex: condition.newIndex };
|
86
|
-
}
|
87
|
-
return null;
|
88
|
-
}
|
89
|
-
static tryParseJoinUsing(lexemes, index, joinType, source, lateral) {
|
90
|
-
let idx = index;
|
91
|
-
if (idx < lexemes.length && lexemes[idx].value === 'using') {
|
92
|
-
idx++; // Skip 'using' keyword
|
93
|
-
// Parse the columns in parentheses
|
94
|
-
const result = ValueParser_1.ValueParser.parseArgument(Lexeme_1.TokenType.OpenParen, Lexeme_1.TokenType.CloseParen, lexemes, idx);
|
95
|
-
const usingColumns = result.value;
|
96
|
-
idx = result.newIndex;
|
97
|
-
const joinUsing = new Clause_1.JoinUsingClause(usingColumns);
|
98
|
-
const joinClause = new Clause_1.JoinClause(joinType, source, joinUsing, lateral);
|
99
|
-
return { value: joinClause, newIndex: result.newIndex };
|
100
|
-
}
|
101
|
-
return null;
|
102
|
-
}
|
103
81
|
}
|
104
82
|
exports.JoinClauseParser = JoinClauseParser;
|
105
83
|
//# sourceMappingURL=JoinClauseParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"JoinClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinClauseParser.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"JoinClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinClauseParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.JoinOnClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const ValueParser_1 = require("./ValueParser");
|
6
|
+
class JoinOnClauseParser {
|
7
|
+
static tryParse(lexemes, index) {
|
8
|
+
let idx = index;
|
9
|
+
if (idx < lexemes.length && lexemes[idx].value === 'on') {
|
10
|
+
idx++; // Skip 'on' keyword
|
11
|
+
// Parse the condition expression
|
12
|
+
const condition = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
13
|
+
idx = condition.newIndex;
|
14
|
+
const joinOn = new Clause_1.JoinOnClause(condition.value);
|
15
|
+
return { value: joinOn, newIndex: idx };
|
16
|
+
}
|
17
|
+
return null;
|
18
|
+
}
|
19
|
+
}
|
20
|
+
exports.JoinOnClauseParser = JoinOnClauseParser;
|
21
|
+
//# sourceMappingURL=JoinOnClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"JoinOnClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinOnClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,+CAA4C;AAE5C,MAAa,kBAAkB;IACpB,MAAM,CAAC,QAAQ,CAAC,OAAiB,EAAE,KAAa;QACnD,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACtD,GAAG,EAAE,CAAC,CAAC,oBAAoB;YAC3B,iCAAiC;YACjC,MAAM,SAAS,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5D,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAbD,gDAaC"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.JoinUsingClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
7
|
+
class JoinUsingClauseParser {
|
8
|
+
static tryParse(lexemes, index) {
|
9
|
+
let idx = index;
|
10
|
+
if (idx < lexemes.length && lexemes[idx].value === 'using') {
|
11
|
+
idx++; // Skip 'using' keyword
|
12
|
+
// Parse the columns in parentheses
|
13
|
+
const result = ValueParser_1.ValueParser.parseArgument(Lexeme_1.TokenType.OpenParen, Lexeme_1.TokenType.CloseParen, lexemes, idx);
|
14
|
+
const usingColumns = result.value;
|
15
|
+
idx = result.newIndex;
|
16
|
+
const joinUsing = new Clause_1.JoinUsingClause(usingColumns);
|
17
|
+
return { value: joinUsing, newIndex: idx };
|
18
|
+
}
|
19
|
+
return null;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
exports.JoinUsingClauseParser = JoinUsingClauseParser;
|
23
|
+
//# sourceMappingURL=JoinUsingClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"JoinUsingClauseParser.js","sourceRoot":"","sources":["../../src/parsers/JoinUsingClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AACnD,6CAAqD;AACrD,+CAA4C;AAE5C,MAAa,qBAAqB;IACvB,MAAM,CAAC,QAAQ,CAAC,OAAiB,EAAE,KAAa;QACnD,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACzD,GAAG,EAAE,CAAC,CAAC,uBAAuB;YAC9B,mCAAmC;YACnC,MAAM,MAAM,GAAG,yBAAW,CAAC,aAAa,CAAC,kBAAS,CAAC,SAAS,EAAE,kBAAS,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAClG,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;YAClC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;YACtB,MAAM,SAAS,GAAG,IAAI,wBAAe,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAdD,sDAcC"}
|
@@ -30,19 +30,7 @@ class LimitClauseParser {
|
|
30
30
|
// Parse LIMIT value
|
31
31
|
const limitItem = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
32
32
|
idx = limitItem.newIndex;
|
33
|
-
|
34
|
-
// Check if there is an OFFSET clause
|
35
|
-
if (idx < lexemes.length && lexemes[idx].value === 'offset') {
|
36
|
-
idx++;
|
37
|
-
if (idx >= lexemes.length) {
|
38
|
-
throw new Error(`Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.`);
|
39
|
-
}
|
40
|
-
// Parse OFFSET value
|
41
|
-
const offsetValueItem = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
42
|
-
offsetItem = offsetValueItem.value;
|
43
|
-
idx = offsetValueItem.newIndex;
|
44
|
-
}
|
45
|
-
const clause = new Clause_1.LimitClause(limitItem.value, offsetItem);
|
33
|
+
const clause = new Clause_1.LimitClause(limitItem.value);
|
46
34
|
return { value: clause, newIndex: idx };
|
47
35
|
}
|
48
36
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LimitClauseParser.js","sourceRoot":"","sources":["../../src/parsers/LimitClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA8D;AAE9D,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;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,8GAA8G,CAAC,CAAC;QACpI,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5D,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAEzB,
|
1
|
+
{"version":3,"file":"LimitClauseParser.js","sourceRoot":"","sources":["../../src/parsers/LimitClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA8D;AAE9D,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yCAAyC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qDAAqD,CAAC,CAAC;QACrK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;QACpI,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5D,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC;QAEzB,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ;AAtCD,8CAsCC"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import { OffsetClause } from "../models/Clause";
|
2
|
+
import { Lexeme } from "../models/Lexeme";
|
3
|
+
export declare class OffsetClauseParser {
|
4
|
+
static parse(query: string): OffsetClause;
|
5
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
6
|
+
value: OffsetClause;
|
7
|
+
newIndex: number;
|
8
|
+
};
|
9
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.OffsetClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
7
|
+
class OffsetClauseParser {
|
8
|
+
// Parse SQL string to AST (was: parse)
|
9
|
+
static parse(query) {
|
10
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
11
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
12
|
+
// Parse
|
13
|
+
const result = this.parseFromLexeme(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 OFFSET clause is complete but there are additional tokens.`);
|
17
|
+
}
|
18
|
+
return result.value;
|
19
|
+
}
|
20
|
+
// Parse from lexeme array (was: parse)
|
21
|
+
static parseFromLexeme(lexemes, index) {
|
22
|
+
let idx = index;
|
23
|
+
if (lexemes[idx].value !== 'offset') {
|
24
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'OFFSET' keyword but found "${lexemes[idx].value}". OFFSET clauses must start with the OFFSET keyword.`);
|
25
|
+
}
|
26
|
+
idx++;
|
27
|
+
if (idx >= lexemes.length) {
|
28
|
+
throw new Error(`Syntax error: Unexpected end of input after 'OFFSET' keyword. The OFFSET clause requires a numeric expression.`);
|
29
|
+
}
|
30
|
+
// Parse OFFSET value
|
31
|
+
const offsetItem = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
32
|
+
idx = offsetItem.newIndex;
|
33
|
+
// If there is a "row" or "rows" command, skip it
|
34
|
+
if (idx < lexemes.length && (lexemes[idx].value === 'row' || lexemes[idx].value === 'rows')) {
|
35
|
+
idx++;
|
36
|
+
}
|
37
|
+
const clause = new Clause_1.OffsetClause(offsetItem.value);
|
38
|
+
return { value: clause, newIndex: idx };
|
39
|
+
}
|
40
|
+
}
|
41
|
+
exports.OffsetClauseParser = OffsetClauseParser;
|
42
|
+
//# sourceMappingURL=OffsetClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"OffsetClauseParser.js","sourceRoot":"","sources":["../../src/parsers/OffsetClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAgD;AAEhD,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;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,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACtI,CAAC;QAED,qBAAqB;QACrB,MAAM,UAAU,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC;QAE1B,iDAAiD;QACjD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;YAC1F,GAAG,EAAE,CAAC;QACV,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,qBAAY,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAElD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC5C,CAAC;CACJ;AA3CD,gDA2CC"}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
/**
|
2
|
+
* This decorator formats parameter tokens according to DBMS-specific rules.
|
3
|
+
* It supports prefix/suffix, and parameter style (named, indexed, anonymous).
|
4
|
+
*/
|
5
|
+
export declare class ParameterDecorator {
|
6
|
+
prefix: string;
|
7
|
+
suffix: string;
|
8
|
+
style: 'named' | 'indexed' | 'anonymous';
|
9
|
+
constructor(options?: {
|
10
|
+
prefix?: string;
|
11
|
+
suffix?: string;
|
12
|
+
style?: 'named' | 'indexed' | 'anonymous';
|
13
|
+
});
|
14
|
+
/**
|
15
|
+
* Decorate a parameter token with DBMS-specific format.
|
16
|
+
* @param token The parameter token
|
17
|
+
* @param index The parameter index (for indexed/anonymous)
|
18
|
+
*/
|
19
|
+
decorate(text: string, index: number): string;
|
20
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ParameterDecorator = void 0;
|
4
|
+
/**
|
5
|
+
* This decorator formats parameter tokens according to DBMS-specific rules.
|
6
|
+
* It supports prefix/suffix, and parameter style (named, indexed, anonymous).
|
7
|
+
*/
|
8
|
+
class ParameterDecorator {
|
9
|
+
constructor(options) {
|
10
|
+
var _a, _b, _c;
|
11
|
+
this.prefix = (_a = options === null || options === void 0 ? void 0 : options.prefix) !== null && _a !== void 0 ? _a : ':';
|
12
|
+
this.suffix = (_b = options === null || options === void 0 ? void 0 : options.suffix) !== null && _b !== void 0 ? _b : '';
|
13
|
+
this.style = (_c = options === null || options === void 0 ? void 0 : options.style) !== null && _c !== void 0 ? _c : 'named';
|
14
|
+
}
|
15
|
+
/**
|
16
|
+
* Decorate a parameter token with DBMS-specific format.
|
17
|
+
* @param token The parameter token
|
18
|
+
* @param index The parameter index (for indexed/anonymous)
|
19
|
+
*/
|
20
|
+
decorate(text, index) {
|
21
|
+
let paramText = '';
|
22
|
+
if (this.style === 'anonymous') {
|
23
|
+
// e.g. ?
|
24
|
+
paramText = this.prefix;
|
25
|
+
}
|
26
|
+
else if (this.style === 'indexed') {
|
27
|
+
// e.g. $1, ?1, :1
|
28
|
+
paramText = this.prefix + index;
|
29
|
+
}
|
30
|
+
else if (this.style === 'named') {
|
31
|
+
// e.g. :name, @name, ${name}
|
32
|
+
paramText = this.prefix + text + this.suffix;
|
33
|
+
}
|
34
|
+
// override
|
35
|
+
text = paramText;
|
36
|
+
return text;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
exports.ParameterDecorator = ParameterDecorator;
|
40
|
+
//# sourceMappingURL=ParameterDecorator.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ParameterDecorator.js","sourceRoot":"","sources":["../../src/parsers/ParameterDecorator.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,kBAAkB;IAK3B,YAAY,OAAyF;;QACjG,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,GAAG,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,OAAO,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,IAAY,EAAE,KAAa;QAChC,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;YAC7B,SAAS;YACT,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAClC,kBAAkB;YAClB,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAChC,6BAA6B;YAC7B,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACjD,CAAC;QAED,YAAY;QACZ,IAAI,GAAG,SAAS,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAjCD,gDAiCC"}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { Lexeme } from "../models/Lexeme";
|
2
|
+
import { ReturningClause } from "../models/Clause";
|
3
|
+
export declare class ReturningClauseParser {
|
4
|
+
/**
|
5
|
+
* Parse RETURNING clause from lexemes, starting at the given index.
|
6
|
+
* Returns a ReturningClause instance and the new index after parsing.
|
7
|
+
*/
|
8
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
9
|
+
value: ReturningClause;
|
10
|
+
newIndex: number;
|
11
|
+
};
|
12
|
+
}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ReturningClauseParser = void 0;
|
4
|
+
// Provides parsing for RETURNING clauses in SQL (used in UPDATE, INSERT, DELETE, etc.)
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
6
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
7
|
+
const Clause_1 = require("../models/Clause");
|
8
|
+
class ReturningClauseParser {
|
9
|
+
/**
|
10
|
+
* Parse RETURNING clause from lexemes, starting at the given index.
|
11
|
+
* Returns a ReturningClause instance and the new index after parsing.
|
12
|
+
*/
|
13
|
+
static parseFromLexeme(lexemes, index) {
|
14
|
+
var _a, _b, _c;
|
15
|
+
let idx = index;
|
16
|
+
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.value) !== "returning") {
|
17
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'RETURNING' but found '${(_b = lexemes[idx]) === null || _b === void 0 ? void 0 : _b.value}'.`);
|
18
|
+
}
|
19
|
+
idx++;
|
20
|
+
const columns = [];
|
21
|
+
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Identifier) {
|
22
|
+
columns.push(new ValueComponent_1.IdentifierString(lexemes[idx].value));
|
23
|
+
idx++;
|
24
|
+
if (((_c = lexemes[idx]) === null || _c === void 0 ? void 0 : _c.type) === Lexeme_1.TokenType.Comma) {
|
25
|
+
idx++;
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
break;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
return { value: new Clause_1.ReturningClause(columns), newIndex: idx };
|
32
|
+
}
|
33
|
+
}
|
34
|
+
exports.ReturningClauseParser = ReturningClauseParser;
|
35
|
+
//# sourceMappingURL=ReturningClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ReturningClauseParser.js","sourceRoot":"","sources":["../../src/parsers/ReturningClauseParser.ts"],"names":[],"mappings":";;;AAAA,uFAAuF;AACvF,6CAAqD;AACrD,6DAA4D;AAC5D,6CAAmD;AAEnD,MAAa,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,kBAAS,CAAC,UAAU,EAAE,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,IAAI,iCAAgB,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,kBAAS,CAAC,KAAK,EAAE,CAAC;gBACzC,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,wBAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAClE,CAAC;CACJ;AAvBD,sDAuBC"}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { SelectClause } from "../models/Clause";
|
1
|
+
import { SelectClause, SelectItem } from "../models/Clause";
|
2
2
|
import { Lexeme } from "../models/Lexeme";
|
3
3
|
export declare class SelectClauseParser {
|
4
4
|
static parse(query: string): SelectClause;
|
@@ -6,5 +6,22 @@ export declare class SelectClauseParser {
|
|
6
6
|
value: SelectClause;
|
7
7
|
newIndex: number;
|
8
8
|
};
|
9
|
-
|
9
|
+
}
|
10
|
+
export declare class SelectItemParser {
|
11
|
+
/**
|
12
|
+
* Parses a single select item from a SQL string.
|
13
|
+
* @param query The SQL string representing a select item (e.g. 'id as user_id').
|
14
|
+
* @returns The parsed SelectItem instance.
|
15
|
+
*/
|
16
|
+
static parse(query: string): SelectItem;
|
17
|
+
/**
|
18
|
+
* Parses a single select item from lexemes.
|
19
|
+
* @param lexemes The array of lexemes.
|
20
|
+
* @param index The starting index.
|
21
|
+
* @returns An object containing the SelectItem and the new index.
|
22
|
+
*/
|
23
|
+
static parseItem(lexemes: Lexeme[], index: number): {
|
24
|
+
value: SelectItem;
|
25
|
+
newIndex: number;
|
26
|
+
};
|
10
27
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.SelectClauseParser = void 0;
|
3
|
+
exports.SelectItemParser = exports.SelectClauseParser = void 0;
|
4
4
|
const Clause_1 = require("../models/Clause");
|
5
5
|
const Lexeme_1 = require("../models/Lexeme");
|
6
6
|
const ValueComponent_1 = require("../models/ValueComponent");
|
@@ -38,12 +38,12 @@ class SelectClauseParser {
|
|
38
38
|
idx = argument.newIndex;
|
39
39
|
}
|
40
40
|
const items = [];
|
41
|
-
const item =
|
41
|
+
const item = SelectItemParser.parseItem(lexemes, idx);
|
42
42
|
items.push(item.value);
|
43
43
|
idx = item.newIndex;
|
44
44
|
while (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
45
45
|
idx++;
|
46
|
-
const item =
|
46
|
+
const item = SelectItemParser.parseItem(lexemes, idx);
|
47
47
|
items.push(item.value);
|
48
48
|
idx = item.newIndex;
|
49
49
|
}
|
@@ -55,6 +55,30 @@ class SelectClauseParser {
|
|
55
55
|
return { value: clause, newIndex: idx };
|
56
56
|
}
|
57
57
|
}
|
58
|
+
}
|
59
|
+
exports.SelectClauseParser = SelectClauseParser;
|
60
|
+
// Extracted SelectItemParser for parsing individual select items
|
61
|
+
class SelectItemParser {
|
62
|
+
/**
|
63
|
+
* Parses a single select item from a SQL string.
|
64
|
+
* @param query The SQL string representing a select item (e.g. 'id as user_id').
|
65
|
+
* @returns The parsed SelectItem instance.
|
66
|
+
*/
|
67
|
+
static parse(query) {
|
68
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
69
|
+
const lexemes = tokenizer.readLexmes();
|
70
|
+
const result = this.parseItem(lexemes, 0);
|
71
|
+
if (result.newIndex < lexemes.length) {
|
72
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The select item is complete but there are additional tokens.`);
|
73
|
+
}
|
74
|
+
return result.value;
|
75
|
+
}
|
76
|
+
/**
|
77
|
+
* Parses a single select item from lexemes.
|
78
|
+
* @param lexemes The array of lexemes.
|
79
|
+
* @param index The starting index.
|
80
|
+
* @returns An object containing the SelectItem and the new index.
|
81
|
+
*/
|
58
82
|
static parseItem(lexemes, index) {
|
59
83
|
let idx = index;
|
60
84
|
const parsedValue = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
@@ -86,5 +110,5 @@ class SelectClauseParser {
|
|
86
110
|
};
|
87
111
|
}
|
88
112
|
}
|
89
|
-
exports.
|
113
|
+
exports.SelectItemParser = SelectItemParser;
|
90
114
|
//# sourceMappingURL=SelectClauseParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SelectClauseParser.js","sourceRoot":"","sources":["../../src/parsers/SelectClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqG;AACrG,6CAAqD;AACrD,6DAA2D;AAC3D,iDAA8C;AAC9C,+CAA4C;AAE5C,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,QAAQ,GAA6B,IAAI,CAAC;QAE9C,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,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC5D,GAAG,EAAE,CAAC;YACN,QAAQ,GAAG,IAAI,iBAAQ,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;YACtE,GAAG,EAAE,CAAC;YACN,MAAM,QAAQ,GAAG,yBAAW,CAAC,aAAa,CAAC,kBAAS,CAAC,SAAS,EAAE,kBAAS,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YACpG,QAAQ,GAAG,IAAI,mBAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC1C,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5B,CAAC;QAED,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,
|
1
|
+
{"version":3,"file":"SelectClauseParser.js","sourceRoot":"","sources":["../../src/parsers/SelectClauseParser.ts"],"names":[],"mappings":"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"}
|
@@ -23,6 +23,8 @@ const ForClauseParser_1 = require("./ForClauseParser");
|
|
23
23
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
24
24
|
const WithClauseParser_1 = require("./WithClauseParser");
|
25
25
|
const ValuesQueryParser_1 = require("./ValuesQueryParser");
|
26
|
+
const FetchClauseParser_1 = require("./FetchClauseParser");
|
27
|
+
const OffsetClauseParser_1 = require("./OffsetClauseParser");
|
26
28
|
class SelectQueryParser {
|
27
29
|
// Parse SQL string to AST (was: parse)
|
28
30
|
static parse(query) {
|
@@ -92,58 +94,70 @@ class SelectQueryParser {
|
|
92
94
|
let idx = index;
|
93
95
|
let withClauseResult = null;
|
94
96
|
// Parse optional WITH clause
|
95
|
-
if (idx < lexemes.length && lexemes[idx].value
|
97
|
+
if (idx < lexemes.length && lexemes[idx].value === 'with') {
|
96
98
|
withClauseResult = WithClauseParser_1.WithClauseParser.parseFromLexeme(lexemes, idx);
|
97
99
|
idx = withClauseResult.newIndex;
|
98
100
|
}
|
99
101
|
// Parse SELECT clause (required)
|
100
|
-
if (idx >= lexemes.length || lexemes[idx].value
|
102
|
+
if (idx >= lexemes.length || lexemes[idx].value !== 'select') {
|
101
103
|
throw new Error(`Syntax error at position ${idx}: Expected 'SELECT' keyword but found "${idx < lexemes.length ? lexemes[idx].value : 'end of input'}". SELECT queries must start with the SELECT keyword.`);
|
102
104
|
}
|
103
105
|
const selectClauseResult = SelectClauseParser_1.SelectClauseParser.parseFromLexeme(lexemes, idx);
|
104
106
|
idx = selectClauseResult.newIndex;
|
105
107
|
// Parse FROM clause (optional)
|
106
108
|
let fromClauseResult = null;
|
107
|
-
if (idx < lexemes.length && lexemes[idx].value
|
109
|
+
if (idx < lexemes.length && lexemes[idx].value === 'from') {
|
108
110
|
fromClauseResult = FromClauseParser_1.FromClauseParser.parseFromLexeme(lexemes, idx);
|
109
111
|
idx = fromClauseResult.newIndex;
|
110
112
|
}
|
111
113
|
// Parse WHERE clause (optional)
|
112
114
|
let whereClauseResult = null;
|
113
|
-
if (idx < lexemes.length && lexemes[idx].value
|
115
|
+
if (idx < lexemes.length && lexemes[idx].value === 'where') {
|
114
116
|
whereClauseResult = WhereClauseParser_1.WhereClauseParser.parseFromLexeme(lexemes, idx);
|
115
117
|
idx = whereClauseResult.newIndex;
|
116
118
|
}
|
117
119
|
// Parse GROUP BY clause (optional)
|
118
120
|
let groupByClauseResult = null;
|
119
|
-
if (idx < lexemes.length && lexemes[idx].value
|
121
|
+
if (idx < lexemes.length && lexemes[idx].value === 'group by') {
|
120
122
|
groupByClauseResult = GroupByParser_1.GroupByClauseParser.parseFromLexeme(lexemes, idx);
|
121
123
|
idx = groupByClauseResult.newIndex;
|
122
124
|
}
|
123
125
|
// Parse HAVING clause (optional)
|
124
126
|
let havingClauseResult = null;
|
125
|
-
if (idx < lexemes.length && lexemes[idx].value
|
127
|
+
if (idx < lexemes.length && lexemes[idx].value === 'having') {
|
126
128
|
havingClauseResult = HavingParser_1.HavingClauseParser.parseFromLexeme(lexemes, idx);
|
127
129
|
idx = havingClauseResult.newIndex;
|
128
130
|
}
|
129
131
|
// Parse WINDOW clause (optional)
|
130
|
-
let
|
131
|
-
if (idx < lexemes.length && lexemes[idx].value
|
132
|
-
|
133
|
-
idx =
|
132
|
+
let windowClauseResult = null;
|
133
|
+
if (idx < lexemes.length && lexemes[idx].value === 'window') {
|
134
|
+
windowClauseResult = WindowClauseParser_1.WindowClauseParser.parseFromLexeme(lexemes, idx);
|
135
|
+
idx = windowClauseResult.newIndex;
|
134
136
|
}
|
135
137
|
// Parse ORDER BY clause (optional)
|
136
138
|
let orderByClauseResult = null;
|
137
|
-
if (idx < lexemes.length && lexemes[idx].value
|
139
|
+
if (idx < lexemes.length && lexemes[idx].value === 'order by') {
|
138
140
|
orderByClauseResult = OrderByClauseParser_1.OrderByClauseParser.parseFromLexeme(lexemes, idx);
|
139
141
|
idx = orderByClauseResult.newIndex;
|
140
142
|
}
|
141
143
|
// Parse LIMIT clause (optional)
|
142
144
|
let limitClauseResult = null;
|
143
|
-
if (idx < lexemes.length && lexemes[idx].value
|
145
|
+
if (idx < lexemes.length && lexemes[idx].value === 'limit') {
|
144
146
|
limitClauseResult = LimitClauseParser_1.LimitClauseParser.parseFromLexeme(lexemes, idx);
|
145
147
|
idx = limitClauseResult.newIndex;
|
146
148
|
}
|
149
|
+
// Parse OFFSET clause (optional)
|
150
|
+
let offsetClauseResult = null;
|
151
|
+
if (idx < lexemes.length && lexemes[idx].value === 'offset') {
|
152
|
+
offsetClauseResult = OffsetClauseParser_1.OffsetClauseParser.parseFromLexeme(lexemes, idx);
|
153
|
+
idx = offsetClauseResult.newIndex;
|
154
|
+
}
|
155
|
+
// Parse FETCH clause (optional)
|
156
|
+
let fetchClauseResult = null;
|
157
|
+
if (idx < lexemes.length && lexemes[idx].value === 'fetch') {
|
158
|
+
fetchClauseResult = FetchClauseParser_1.FetchClauseParser.parseFromLexeme(lexemes, idx);
|
159
|
+
idx = fetchClauseResult.newIndex;
|
160
|
+
}
|
147
161
|
// Parse FOR clause (optional)
|
148
162
|
let forClauseResult = null;
|
149
163
|
if (idx < lexemes.length && lexemes[idx].value.toLowerCase() === 'for') {
|
@@ -151,7 +165,20 @@ class SelectQueryParser {
|
|
151
165
|
idx = forClauseResult.newIndex;
|
152
166
|
}
|
153
167
|
// Create and return the SelectQuery object
|
154
|
-
const selectQuery = new SelectQuery_1.SimpleSelectQuery(
|
168
|
+
const selectQuery = new SelectQuery_1.SimpleSelectQuery({
|
169
|
+
withClause: withClauseResult ? withClauseResult.value : null,
|
170
|
+
selectClause: selectClauseResult.value,
|
171
|
+
fromClause: fromClauseResult ? fromClauseResult.value : null,
|
172
|
+
whereClause: whereClauseResult ? whereClauseResult.value : null,
|
173
|
+
groupByClause: groupByClauseResult ? groupByClauseResult.value : null,
|
174
|
+
havingClause: havingClauseResult ? havingClauseResult.value : null,
|
175
|
+
orderByClause: orderByClauseResult ? orderByClauseResult.value : null,
|
176
|
+
windowClause: windowClauseResult ? windowClauseResult.value : null,
|
177
|
+
limitClause: limitClauseResult ? limitClauseResult.value : null,
|
178
|
+
offsetClause: offsetClauseResult ? offsetClauseResult.value : null,
|
179
|
+
fetchClause: fetchClauseResult ? fetchClauseResult.value : null,
|
180
|
+
forClause: forClauseResult ? forClauseResult.value : null
|
181
|
+
});
|
155
182
|
return { value: selectQuery, newIndex: idx };
|
156
183
|
}
|
157
184
|
static parseValuesQuery(lexemes, index) {
|