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
@@ -0,0 +1,89 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.FetchExpressionParser = exports.FetchClauseParser = void 0;
|
4
|
+
const Clause_1 = require("../models/Clause");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
7
|
+
class FetchClauseParser {
|
8
|
+
/**
|
9
|
+
* Parses a FETCH clause from a lexeme array starting at the given index.
|
10
|
+
* Supports syntax like: FETCH [FIRST|NEXT] <count> ROWS ONLY
|
11
|
+
* @param lexemes The array of lexemes
|
12
|
+
* @param index The starting index
|
13
|
+
* @returns { value: FetchSpecification, newIndex: number }
|
14
|
+
*/
|
15
|
+
static parseFromLexeme(lexemes, index) {
|
16
|
+
let idx = index;
|
17
|
+
if (lexemes[idx].value !== 'fetch') {
|
18
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'FETCH' keyword but found "${lexemes[idx].value}".`);
|
19
|
+
}
|
20
|
+
idx++;
|
21
|
+
if (idx >= lexemes.length) {
|
22
|
+
throw new Error(`Syntax error: Unexpected end of input after 'FETCH' keyword.`);
|
23
|
+
}
|
24
|
+
const fetchExprResult = FetchExpressionParser.parseFromLexeme(lexemes, idx);
|
25
|
+
const fetchExpr = fetchExprResult.value;
|
26
|
+
idx = fetchExprResult.newIndex;
|
27
|
+
return { value: new Clause_1.FetchClause(fetchExpr), newIndex: idx };
|
28
|
+
}
|
29
|
+
}
|
30
|
+
exports.FetchClauseParser = FetchClauseParser;
|
31
|
+
// FetchExpressionParser: parses FETCH [FIRST|NEXT] <count> ROWS ONLY ...
|
32
|
+
class FetchExpressionParser {
|
33
|
+
/**
|
34
|
+
* Parses a FETCH expression (not the whole clause, just the fetch part)
|
35
|
+
*/
|
36
|
+
static parseFromLexeme(lexemes, index) {
|
37
|
+
let idx = index;
|
38
|
+
let type;
|
39
|
+
const typeToken = lexemes[idx].value;
|
40
|
+
if (typeToken === 'first') {
|
41
|
+
type = Clause_1.FetchType.First;
|
42
|
+
}
|
43
|
+
else if (typeToken === 'next') {
|
44
|
+
type = Clause_1.FetchType.Next;
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'FIRST' or 'NEXT' after 'FETCH' but found "${lexemes[idx].value}".`);
|
48
|
+
}
|
49
|
+
idx++;
|
50
|
+
if (idx >= lexemes.length) {
|
51
|
+
throw new Error(`Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT'.`);
|
52
|
+
}
|
53
|
+
let count = null;
|
54
|
+
let unit = null;
|
55
|
+
// Omitted count notation
|
56
|
+
if (lexemes[idx].value === 'row only' || lexemes[idx].value === 'rows only') {
|
57
|
+
count = new ValueComponent_1.LiteralValue(1);
|
58
|
+
unit = Clause_1.FetchUnit.RowsOnly;
|
59
|
+
idx++;
|
60
|
+
return { value: new Clause_1.FetchExpression(type, count, unit), newIndex: idx };
|
61
|
+
}
|
62
|
+
// <count>
|
63
|
+
const countResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
64
|
+
count = countResult.value;
|
65
|
+
idx = countResult.newIndex;
|
66
|
+
if (idx >= lexemes.length) {
|
67
|
+
throw new Error(`Syntax error: Unexpected end of input after 'FETCH FIRST|NEXT <count>'.`);
|
68
|
+
}
|
69
|
+
// ROWS ONLY (or other unit)
|
70
|
+
if (lexemes[idx].value === 'rows only') {
|
71
|
+
unit = Clause_1.FetchUnit.RowsOnly;
|
72
|
+
idx++;
|
73
|
+
}
|
74
|
+
else if (lexemes[idx].value === 'percent') {
|
75
|
+
unit = Clause_1.FetchUnit.Percent;
|
76
|
+
idx++;
|
77
|
+
}
|
78
|
+
else if (lexemes[idx].value === 'percent with ties') {
|
79
|
+
unit = Clause_1.FetchUnit.PercentWithTies;
|
80
|
+
idx++;
|
81
|
+
}
|
82
|
+
if (!unit) {
|
83
|
+
throw new Error(`Syntax error: Expected 'ROWS ONLY', 'PERCENT', or 'PERCENT WITH TIES' after 'FETCH FIRST|NEXT <count>'.`);
|
84
|
+
}
|
85
|
+
return { value: new Clause_1.FetchExpression(type, count, unit), newIndex: idx };
|
86
|
+
}
|
87
|
+
}
|
88
|
+
exports.FetchExpressionParser = FetchExpressionParser;
|
89
|
+
//# sourceMappingURL=FetchClauseParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FetchClauseParser.js","sourceRoot":"","sources":["../../src/parsers/FetchClauseParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { Lexeme } from "../models/Lexeme";
|
2
|
+
import { IdentifierString } from "../models/ValueComponent";
|
3
|
+
/**
|
4
|
+
* Utility class for parsing fully qualified names (e.g. db.schema.table or db.schema.table.column_name)
|
5
|
+
* This can be used for both table and column references.
|
6
|
+
*/
|
7
|
+
export declare class FullNameParser {
|
8
|
+
/**
|
9
|
+
* Parses a fully qualified name from lexemes, returning namespaces, table, and new index.
|
10
|
+
*/
|
11
|
+
static parseFromLexeme(lexemes: Lexeme[], index: number): {
|
12
|
+
namespaces: string[] | null;
|
13
|
+
name: IdentifierString;
|
14
|
+
newIndex: number;
|
15
|
+
lastTokenType: number;
|
16
|
+
};
|
17
|
+
/**
|
18
|
+
* Parses a fully qualified name from a string (e.g. 'db.schema.table')
|
19
|
+
* Returns { namespaces, name }
|
20
|
+
*/
|
21
|
+
static parse(str: string): {
|
22
|
+
namespaces: string[] | null;
|
23
|
+
name: IdentifierString;
|
24
|
+
};
|
25
|
+
private static parseEscapedOrDotSeparatedIdentifiers;
|
26
|
+
private static extractNamespacesAndName;
|
27
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.FullNameParser = void 0;
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
7
|
+
/**
|
8
|
+
* Utility class for parsing fully qualified names (e.g. db.schema.table or db.schema.table.column_name)
|
9
|
+
* This can be used for both table and column references.
|
10
|
+
*/
|
11
|
+
class FullNameParser {
|
12
|
+
/**
|
13
|
+
* Parses a fully qualified name from lexemes, returning namespaces, table, and new index.
|
14
|
+
*/
|
15
|
+
static parseFromLexeme(lexemes, index) {
|
16
|
+
const { identifiers, newIndex } = FullNameParser.parseEscapedOrDotSeparatedIdentifiers(lexemes, index);
|
17
|
+
const { namespaces, name } = FullNameParser.extractNamespacesAndName(identifiers);
|
18
|
+
// Returns the type of the last token in the identifier sequence
|
19
|
+
let lastTokenType = 0;
|
20
|
+
if (newIndex > index) {
|
21
|
+
lastTokenType = lexemes[newIndex - 1].type;
|
22
|
+
}
|
23
|
+
return { namespaces, name: new ValueComponent_1.IdentifierString(name), newIndex, lastTokenType };
|
24
|
+
}
|
25
|
+
/**
|
26
|
+
* Parses a fully qualified name from a string (e.g. 'db.schema.table')
|
27
|
+
* Returns { namespaces, name }
|
28
|
+
*/
|
29
|
+
static parse(str) {
|
30
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(str);
|
31
|
+
const lexemes = tokenizer.readLexmes();
|
32
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
33
|
+
if (result.newIndex < lexemes.length) {
|
34
|
+
// Use a context-agnostic error message since FullNameParser is used in multiple query types
|
35
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The name is complete but additional tokens were found.`);
|
36
|
+
}
|
37
|
+
return { namespaces: result.namespaces, name: result.name };
|
38
|
+
}
|
39
|
+
// Parses SQL Server-style escaped identifiers ([table]) and dot-separated identifiers, including namespaced wildcards (e.g., db.schema.*, [db].[schema].*)
|
40
|
+
static parseEscapedOrDotSeparatedIdentifiers(lexemes, index) {
|
41
|
+
let idx = index;
|
42
|
+
const identifiers = [];
|
43
|
+
while (idx < lexemes.length) {
|
44
|
+
if (lexemes[idx].type & Lexeme_1.TokenType.OpenBracket) {
|
45
|
+
idx++; // skip [
|
46
|
+
if (idx >= lexemes.length || !((lexemes[idx].type & Lexeme_1.TokenType.Identifier) || (lexemes[idx].type & Lexeme_1.TokenType.Command))) {
|
47
|
+
throw new Error(`Expected identifier after '[' at position ${idx}`);
|
48
|
+
}
|
49
|
+
identifiers.push(lexemes[idx].value);
|
50
|
+
idx++;
|
51
|
+
if (idx >= lexemes.length || lexemes[idx].value !== "]") {
|
52
|
+
throw new Error(`Expected closing ']' after identifier at position ${idx}`);
|
53
|
+
}
|
54
|
+
idx++; // skip ]
|
55
|
+
}
|
56
|
+
else if (lexemes[idx].type & Lexeme_1.TokenType.Identifier) {
|
57
|
+
identifiers.push(lexemes[idx].value);
|
58
|
+
idx++;
|
59
|
+
}
|
60
|
+
else if (lexemes[idx].type & Lexeme_1.TokenType.Function) {
|
61
|
+
identifiers.push(lexemes[idx].value);
|
62
|
+
idx++;
|
63
|
+
}
|
64
|
+
else if (lexemes[idx].type & Lexeme_1.TokenType.Type) {
|
65
|
+
identifiers.push(lexemes[idx].value);
|
66
|
+
idx++;
|
67
|
+
}
|
68
|
+
else if (lexemes[idx].value === "*") {
|
69
|
+
// The wildcard '*' is always treated as the terminal part of a qualified name in SQL (e.g., db.schema.* or [db].[schema].*).
|
70
|
+
// No valid SQL syntax allows a wildcard in the middle of a multi-part name.
|
71
|
+
identifiers.push(lexemes[idx].value);
|
72
|
+
idx++;
|
73
|
+
break;
|
74
|
+
}
|
75
|
+
// Handle dot for schema.table or db.schema.table
|
76
|
+
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Dot)) {
|
77
|
+
idx++; // skip dot
|
78
|
+
}
|
79
|
+
else {
|
80
|
+
break;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
return { identifiers, newIndex: idx };
|
84
|
+
}
|
85
|
+
// Utility to extract namespaces and the final name from an array of identifiers
|
86
|
+
// Example: ["db", "schema", "users"] => { namespaces: ["db", "schema"], name: "users" }
|
87
|
+
static extractNamespacesAndName(identifiers) {
|
88
|
+
if (!identifiers || identifiers.length === 0) {
|
89
|
+
throw new Error("Identifier list is empty");
|
90
|
+
}
|
91
|
+
if (identifiers.length === 1) {
|
92
|
+
return { namespaces: null, name: identifiers[0] };
|
93
|
+
}
|
94
|
+
return { namespaces: identifiers.slice(0, -1), name: identifiers[identifiers.length - 1] };
|
95
|
+
}
|
96
|
+
}
|
97
|
+
exports.FullNameParser = FullNameParser;
|
98
|
+
//# sourceMappingURL=FullNameParser.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FullNameParser.js","sourceRoot":"","sources":["../../src/parsers/FullNameParser.ts"],"names":[],"mappings":"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"}
|
@@ -5,6 +5,7 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
5
5
|
const ValueComponent_1 = require("../models/ValueComponent");
|
6
6
|
const OverExpressionParser_1 = require("./OverExpressionParser");
|
7
7
|
const ValueParser_1 = require("./ValueParser");
|
8
|
+
const FullNameParser_1 = require("./FullNameParser");
|
8
9
|
class FunctionExpressionParser {
|
9
10
|
static parseFromLexeme(lexemes, index) {
|
10
11
|
let idx = index;
|
@@ -75,10 +76,12 @@ class FunctionExpressionParser {
|
|
75
76
|
}
|
76
77
|
static parseFunctionCall(lexemes, index) {
|
77
78
|
let idx = index;
|
78
|
-
//
|
79
|
-
|
80
|
-
const
|
81
|
-
|
79
|
+
// Parse namespaced function name (e.g., myschema.myfunc, dbo.util.myfunc)
|
80
|
+
// Use FullNameParser to get namespaces and function name
|
81
|
+
const fullNameResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
|
82
|
+
const namespaces = fullNameResult.namespaces;
|
83
|
+
const name = fullNameResult.name;
|
84
|
+
idx = fullNameResult.newIndex;
|
82
85
|
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.OpenParen)) {
|
83
86
|
// General argument parsing
|
84
87
|
const arg = ValueParser_1.ValueParser.parseArgument(Lexeme_1.TokenType.OpenParen, Lexeme_1.TokenType.CloseParen, lexemes, idx);
|
@@ -86,22 +89,25 @@ class FunctionExpressionParser {
|
|
86
89
|
if (idx < lexemes.length && lexemes[idx].value === "over") {
|
87
90
|
const over = OverExpressionParser_1.OverExpressionParser.parseFromLexeme(lexemes, idx);
|
88
91
|
idx = over.newIndex;
|
89
|
-
const value = new ValueComponent_1.FunctionCall(
|
92
|
+
const value = new ValueComponent_1.FunctionCall(namespaces, name.name, arg.value, over.value);
|
90
93
|
return { value, newIndex: idx };
|
91
94
|
}
|
92
95
|
else {
|
93
|
-
const value = new ValueComponent_1.FunctionCall(
|
96
|
+
const value = new ValueComponent_1.FunctionCall(namespaces, name.name, arg.value, null);
|
94
97
|
return { value, newIndex: idx };
|
95
98
|
}
|
96
99
|
}
|
97
100
|
else {
|
98
|
-
throw new Error(`Expected opening parenthesis after function name '${
|
101
|
+
throw new Error(`Expected opening parenthesis after function name '${name.name}' at index ${idx}`);
|
99
102
|
}
|
100
103
|
}
|
101
104
|
static parseKeywordFunction(lexemes, index, keywords) {
|
102
105
|
let idx = index;
|
103
|
-
|
104
|
-
idx
|
106
|
+
// Parse function name and namespaces at the beginning for consistent usage
|
107
|
+
const fullNameResult = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
|
108
|
+
const namespaces = fullNameResult.namespaces;
|
109
|
+
const name = fullNameResult.name;
|
110
|
+
idx = fullNameResult.newIndex;
|
105
111
|
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.OpenParen)) {
|
106
112
|
idx++;
|
107
113
|
const input = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
@@ -111,7 +117,7 @@ class FunctionExpressionParser {
|
|
111
117
|
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
112
118
|
return this.parseFunctionCall(lexemes, index);
|
113
119
|
}
|
114
|
-
// Check keywords
|
120
|
+
// Check for required/optional keywords in function arguments
|
115
121
|
for (const { key, required } of keywords) {
|
116
122
|
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Command) && lexemes[idx].value === key) {
|
117
123
|
idx++;
|
@@ -132,46 +138,41 @@ class FunctionExpressionParser {
|
|
132
138
|
}
|
133
139
|
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.CloseParen)) {
|
134
140
|
idx++;
|
141
|
+
// Use the previously parsed namespaces and function name for consistency
|
135
142
|
if (idx < lexemes.length && lexemes[idx].value === "over") {
|
136
143
|
idx++;
|
137
144
|
const over = OverExpressionParser_1.OverExpressionParser.parseFromLexeme(lexemes, idx);
|
138
145
|
idx = over.newIndex;
|
139
|
-
const value = new ValueComponent_1.FunctionCall(
|
146
|
+
const value = new ValueComponent_1.FunctionCall(namespaces, name.name, arg, over.value);
|
140
147
|
return { value, newIndex: idx };
|
141
148
|
}
|
142
149
|
else {
|
143
|
-
const value = new ValueComponent_1.FunctionCall(
|
150
|
+
const value = new ValueComponent_1.FunctionCall(namespaces, name.name, arg, null);
|
144
151
|
return { value, newIndex: idx };
|
145
152
|
}
|
146
153
|
}
|
147
154
|
else {
|
148
|
-
throw new Error(`Missing closing parenthesis for function '${
|
155
|
+
throw new Error(`Missing closing parenthesis for function '${name.name}' at index ${idx}`);
|
149
156
|
}
|
150
157
|
}
|
151
158
|
else {
|
152
|
-
throw new Error(`Missing opening parenthesis for function '${
|
159
|
+
throw new Error(`Missing opening parenthesis for function '${name.name}' at index ${idx}`);
|
153
160
|
}
|
154
161
|
}
|
155
162
|
static parseTypeValue(lexemes, index) {
|
156
163
|
let idx = index;
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
idx
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
}
|
168
|
-
else {
|
169
|
-
// Create TypeValue
|
170
|
-
const value = new ValueComponent_1.TypeValue(typeName);
|
171
|
-
return { value, newIndex: idx };
|
172
|
-
}
|
164
|
+
const { namespaces, name, newIndex } = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, idx);
|
165
|
+
idx = newIndex;
|
166
|
+
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.OpenParen)) {
|
167
|
+
const arg = ValueParser_1.ValueParser.parseArgument(Lexeme_1.TokenType.OpenParen, Lexeme_1.TokenType.CloseParen, lexemes, idx);
|
168
|
+
idx = arg.newIndex;
|
169
|
+
const value = new ValueComponent_1.TypeValue(namespaces, new ValueComponent_1.RawString(name.name), arg.value);
|
170
|
+
return { value, newIndex: idx };
|
171
|
+
}
|
172
|
+
else {
|
173
|
+
const value = new ValueComponent_1.TypeValue(namespaces, new ValueComponent_1.RawString(name.name));
|
174
|
+
return { value, newIndex: idx };
|
173
175
|
}
|
174
|
-
throw new Error(`Expected type value at index ${idx}`);
|
175
176
|
}
|
176
177
|
}
|
177
178
|
exports.FunctionExpressionParser = FunctionExpressionParser;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FunctionExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/FunctionExpressionParser.ts"],"names":[],"mappings":";;;AAAA,6CAAqD;AACrD,
|
1
|
+
{"version":3,"file":"FunctionExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/FunctionExpressionParser.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.IdentifierDecorator = void 0;
|
4
|
+
class IdentifierDecorator {
|
5
|
+
constructor(identifierEscape) {
|
6
|
+
var _a, _b;
|
7
|
+
this.start = (_a = identifierEscape === null || identifierEscape === void 0 ? void 0 : identifierEscape.start) !== null && _a !== void 0 ? _a : '"';
|
8
|
+
this.end = (_b = identifierEscape === null || identifierEscape === void 0 ? void 0 : identifierEscape.end) !== null && _b !== void 0 ? _b : '"';
|
9
|
+
}
|
10
|
+
decorate(text) {
|
11
|
+
// override
|
12
|
+
text = this.start + text + this.end;
|
13
|
+
return text;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
exports.IdentifierDecorator = IdentifierDecorator;
|
17
|
+
//# sourceMappingURL=IdentifierDecorator.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"IdentifierDecorator.js","sourceRoot":"","sources":["../../src/parsers/IdentifierDecorator.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAmB;IAI5B,YAAY,gBAAmD;;QAC3D,IAAI,CAAC,KAAK,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,mCAAI,GAAG,CAAC;QAC5C,IAAI,CAAC,GAAG,GAAG,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,mCAAI,GAAG,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,IAAY;QACjB,WAAW;QACX,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAdD,kDAcC"}
|
@@ -1,39 +1,14 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.IdentifierParser = void 0;
|
4
|
-
const
|
5
|
-
const Lexeme_1 = require("../models/Lexeme");
|
4
|
+
const FullNameParser_1 = require("./FullNameParser");
|
6
5
|
const ValueComponent_1 = require("../models/ValueComponent");
|
7
6
|
class IdentifierParser {
|
8
7
|
static parseFromLexeme(lexemes, index) {
|
9
|
-
//
|
10
|
-
|
11
|
-
const
|
12
|
-
|
13
|
-
identifiers.push(lexemes[idx].value);
|
14
|
-
idx++;
|
15
|
-
// Look for dot and identifier pattern
|
16
|
-
// support wildcard '*' as identifier (e.g. select t.* from t)
|
17
|
-
while (idx < lexemes.length &&
|
18
|
-
idx + 1 < lexemes.length &&
|
19
|
-
(lexemes[idx].type & Lexeme_1.TokenType.Dot) &&
|
20
|
-
((lexemes[idx + 1].type & Lexeme_1.TokenType.Identifier) || lexemes[idx + 1].value === "*")) {
|
21
|
-
// Skip the dot and add the next identifier
|
22
|
-
idx++;
|
23
|
-
identifiers.push(lexemes[idx].value);
|
24
|
-
idx++;
|
25
|
-
}
|
26
|
-
if (identifiers.length > 1) {
|
27
|
-
// If there are multiple identifiers, treat it as a column reference
|
28
|
-
const { namespaces, name } = (0, extractNamespacesAndName_1.extractNamespacesAndName)(identifiers);
|
29
|
-
const value = new ValueComponent_1.ColumnReference(namespaces, name);
|
30
|
-
return { value, newIndex: idx };
|
31
|
-
}
|
32
|
-
else {
|
33
|
-
// If there is a single identifier, treat it as a simple identifier
|
34
|
-
const value = new ValueComponent_1.ColumnReference(null, identifiers[0]);
|
35
|
-
return { value, newIndex: idx };
|
36
|
-
}
|
8
|
+
// Use FullNameParser to robustly parse qualified identifiers, including wildcards and escaped names.
|
9
|
+
const { namespaces, name, newIndex } = FullNameParser_1.FullNameParser.parseFromLexeme(lexemes, index);
|
10
|
+
const value = new ValueComponent_1.ColumnReference(namespaces, name);
|
11
|
+
return { value, newIndex };
|
37
12
|
}
|
38
13
|
}
|
39
14
|
exports.IdentifierParser = IdentifierParser;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"IdentifierParser.js","sourceRoot":"","sources":["../../src/parsers/IdentifierParser.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"IdentifierParser.js","sourceRoot":"","sources":["../../src/parsers/IdentifierParser.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAElD,6DAA2E;AAE3E,MAAa,gBAAgB;IAClB,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,qGAAqG;QACrG,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,+BAAc,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtF,MAAM,KAAK,GAAG,IAAI,gCAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACJ;AAPD,4CAOC"}
|
@@ -8,9 +8,9 @@ const Lexeme_1 = require("../models/Lexeme");
|
|
8
8
|
const SqlTokenizer_1 = require("./SqlTokenizer");
|
9
9
|
const SelectQueryParser_1 = require("./SelectQueryParser");
|
10
10
|
const WithClauseParser_1 = require("./WithClauseParser");
|
11
|
-
const ValueComponent_1 = require("../models/ValueComponent");
|
12
11
|
const SimpleSelectQuery_1 = require("../models/SimpleSelectQuery");
|
13
|
-
const
|
12
|
+
const SourceExpressionParser_1 = require("./SourceExpressionParser");
|
13
|
+
const Clause_1 = require("../models/Clause");
|
14
14
|
class InsertQueryParser {
|
15
15
|
/**
|
16
16
|
* Parse SQL string to InsertQuery AST.
|
@@ -42,9 +42,9 @@ class InsertQueryParser {
|
|
42
42
|
throw new Error(`Syntax error at position ${idx}: Expected 'INSERT INTO' but found '${lexemes[idx].value}'.`);
|
43
43
|
}
|
44
44
|
idx++;
|
45
|
-
//
|
46
|
-
const
|
47
|
-
idx =
|
45
|
+
// Parse table and optional alias/schema using SourceExpressionParser
|
46
|
+
const sourceResult = SourceExpressionParser_1.SourceExpressionParser.parseTableSourceFromLexemes(lexemes, idx);
|
47
|
+
idx = sourceResult.newIndex;
|
48
48
|
// Optional columns
|
49
49
|
let columns = [];
|
50
50
|
if (((_a = lexemes[idx]) === null || _a === void 0 ? void 0 : _a.type) === Lexeme_1.TokenType.OpenParen) {
|
@@ -67,7 +67,7 @@ class InsertQueryParser {
|
|
67
67
|
const selectResult = SelectQueryParser_1.SelectQueryParser.parseFromLexeme(lexemes, idx);
|
68
68
|
if (withclause) {
|
69
69
|
if (selectResult.value instanceof SimpleSelectQuery_1.SimpleSelectQuery) {
|
70
|
-
selectResult.value.
|
70
|
+
selectResult.value.withClause = withclause;
|
71
71
|
}
|
72
72
|
else {
|
73
73
|
throw new Error(`WITH clause is not supported in this context.`);
|
@@ -76,33 +76,12 @@ class InsertQueryParser {
|
|
76
76
|
idx = selectResult.newIndex;
|
77
77
|
return {
|
78
78
|
value: new InsertQuery_1.InsertQuery({
|
79
|
-
|
80
|
-
table,
|
81
|
-
columns,
|
79
|
+
insertClause: new Clause_1.InsertClause(sourceResult.value, columns),
|
82
80
|
selectQuery: selectResult.value
|
83
81
|
}),
|
84
82
|
newIndex: idx
|
85
83
|
};
|
86
84
|
}
|
87
|
-
// Get fully qualified name and split into namespaces/table
|
88
|
-
static parseFullQualifiedName(lexemes, index) {
|
89
|
-
let idx = index;
|
90
|
-
const fullname = [];
|
91
|
-
fullname.push(lexemes[index].value);
|
92
|
-
idx++;
|
93
|
-
while (idx < lexemes.length && lexemes[idx].type === Lexeme_1.TokenType.Dot) {
|
94
|
-
idx++; // Skip dot
|
95
|
-
if (idx < lexemes.length) {
|
96
|
-
fullname.push(lexemes[idx].value);
|
97
|
-
idx++;
|
98
|
-
}
|
99
|
-
else {
|
100
|
-
throw new Error(`Syntax error at position ${idx}: Expected identifier after '.' but found end of input.`);
|
101
|
-
}
|
102
|
-
}
|
103
|
-
const { namespaces, name } = (0, extractNamespacesAndName_1.extractNamespacesAndName)(fullname);
|
104
|
-
return { namespaces, table: new ValueComponent_1.IdentifierString(name), newIndex: idx };
|
105
|
-
}
|
106
85
|
}
|
107
86
|
exports.InsertQueryParser = InsertQueryParser;
|
108
87
|
//# sourceMappingURL=InsertQueryParser.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"InsertQueryParser.js","sourceRoot":"","sources":["../../src/parsers/InsertQueryParser.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,qGAAqG;AACrG,uDAAoD;AACpD,6CAAqD;AACrD,iDAA8C;AAC9C,2DAAwD;AAExD,yDAAsD;AACtD,
|
1
|
+
{"version":3,"file":"InsertQueryParser.js","sourceRoot":"","sources":["../../src/parsers/InsertQueryParser.ts"],"names":[],"mappings":"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"}
|