rawsql-ts 0.1.0-beta.9 → 0.1.1-beta.2
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 +214 -176
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/models/BinarySelectQuery.js +137 -0
- package/dist/esm/models/BinarySelectQuery.js.map +1 -0
- package/dist/esm/models/Clause.js +289 -0
- package/dist/esm/models/Clause.js.map +1 -0
- package/dist/esm/models/KeywordTrie.js +48 -0
- package/dist/esm/models/KeywordTrie.js.map +1 -0
- package/dist/esm/models/Lexeme.js +18 -0
- package/dist/esm/models/Lexeme.js.map +1 -0
- package/dist/esm/models/SelectQuery.js +5 -0
- package/dist/esm/models/SelectQuery.js.map +1 -0
- package/dist/esm/models/SimpleSelectQuery.js +288 -0
- package/dist/esm/models/SimpleSelectQuery.js.map +1 -0
- package/dist/esm/models/SqlComponent.js +22 -0
- package/dist/esm/models/SqlComponent.js.map +1 -0
- package/dist/esm/models/ValueComponent.js +223 -0
- package/dist/esm/models/ValueComponent.js.map +1 -0
- package/dist/esm/models/ValuesQuery.js +12 -0
- package/dist/esm/models/ValuesQuery.js.map +1 -0
- package/dist/esm/parsers/CommandExpressionParser.js +120 -0
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -0
- package/dist/esm/parsers/CommonTableParser.js +58 -0
- package/dist/esm/parsers/CommonTableParser.js.map +1 -0
- package/dist/esm/parsers/ForClauseParser.js +54 -0
- package/dist/esm/parsers/ForClauseParser.js.map +1 -0
- package/dist/esm/parsers/FromClauseParser.js +43 -0
- package/dist/esm/parsers/FromClauseParser.js.map +1 -0
- package/dist/esm/parsers/FunctionExpressionParser.js +174 -0
- package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -0
- package/dist/esm/parsers/GroupByParser.js +54 -0
- package/dist/esm/parsers/GroupByParser.js.map +1 -0
- package/dist/esm/parsers/HavingParser.js +32 -0
- package/dist/esm/parsers/HavingParser.js.map +1 -0
- package/dist/esm/parsers/IdentifierParser.js +35 -0
- package/dist/esm/parsers/IdentifierParser.js.map +1 -0
- package/dist/esm/parsers/JoinClauseParser.js +101 -0
- package/dist/esm/parsers/JoinClauseParser.js.map +1 -0
- package/dist/esm/parsers/KeywordParser.js +87 -0
- package/dist/esm/parsers/KeywordParser.js.map +1 -0
- package/dist/esm/parsers/LimitClauseParser.js +46 -0
- package/dist/esm/parsers/LimitClauseParser.js.map +1 -0
- package/dist/esm/parsers/LiteralParser.js +34 -0
- package/dist/esm/parsers/LiteralParser.js.map +1 -0
- package/dist/esm/parsers/OrderByClauseParser.js +73 -0
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -0
- package/dist/esm/parsers/OverExpressionParser.js +40 -0
- package/dist/esm/parsers/OverExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ParameterExpressionParser.js +11 -0
- package/dist/esm/parsers/ParameterExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ParenExpressionParser.js +29 -0
- package/dist/esm/parsers/ParenExpressionParser.js.map +1 -0
- package/dist/esm/parsers/PartitionByParser.js +49 -0
- package/dist/esm/parsers/PartitionByParser.js.map +1 -0
- package/dist/esm/parsers/SelectClauseParser.js +80 -0
- package/dist/esm/parsers/SelectClauseParser.js.map +1 -0
- package/dist/esm/parsers/SelectQueryParser.js +149 -0
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -0
- package/dist/esm/parsers/SourceAliasExpressionParser.js +45 -0
- package/dist/esm/parsers/SourceAliasExpressionParser.js.map +1 -0
- package/dist/esm/parsers/SourceExpressionParser.js +31 -0
- package/dist/esm/parsers/SourceExpressionParser.js.map +1 -0
- package/dist/esm/parsers/SourceParser.js +115 -0
- package/dist/esm/parsers/SourceParser.js.map +1 -0
- package/dist/esm/parsers/SqlTokenizer.js +170 -0
- package/dist/esm/parsers/SqlTokenizer.js.map +1 -0
- package/dist/esm/parsers/StringSpecifierExpressionParser.js +18 -0
- package/dist/esm/parsers/StringSpecifierExpressionParser.js.map +1 -0
- package/dist/esm/parsers/UnaryExpressionParser.js +26 -0
- package/dist/esm/parsers/UnaryExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ValueParser.js +132 -0
- package/dist/esm/parsers/ValueParser.js.map +1 -0
- package/dist/esm/parsers/ValuesQueryParser.js +82 -0
- package/dist/esm/parsers/ValuesQueryParser.js.map +1 -0
- package/dist/esm/parsers/WhereClauseParser.js +32 -0
- package/dist/esm/parsers/WhereClauseParser.js.map +1 -0
- package/dist/esm/parsers/WindowClauseParser.js +41 -0
- package/dist/esm/parsers/WindowClauseParser.js.map +1 -0
- package/dist/esm/parsers/WindowExpressionParser.js +159 -0
- package/dist/esm/parsers/WindowExpressionParser.js.map +1 -0
- package/dist/esm/parsers/WithClauseParser.js +53 -0
- package/dist/esm/parsers/WithClauseParser.js.map +1 -0
- package/dist/esm/tokenReaders/BaseTokenReader.js +78 -0
- package/dist/esm/tokenReaders/BaseTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js +141 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/FunctionTokenReader.js +41 -0
- package/dist/esm/tokenReaders/FunctionTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/IdentifierTokenReader.js +66 -0
- package/dist/esm/tokenReaders/IdentifierTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/LiteralTokenReader.js +185 -0
- package/dist/esm/tokenReaders/LiteralTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/OperatorTokenReader.js +94 -0
- package/dist/esm/tokenReaders/OperatorTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/ParameterTokenReader.js +40 -0
- package/dist/esm/tokenReaders/ParameterTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +27 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/SymbolTokenReader.js +31 -0
- package/dist/esm/tokenReaders/SymbolTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/TokenReaderManager.js +106 -0
- package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -0
- package/dist/esm/tokenReaders/TypeTokenReader.js +55 -0
- package/dist/esm/tokenReaders/TypeTokenReader.js.map +1 -0
- package/dist/esm/transformers/CTEBuilder.js +184 -0
- package/dist/esm/transformers/CTEBuilder.js.map +1 -0
- package/dist/esm/transformers/CTECollector.js +384 -0
- package/dist/esm/transformers/CTECollector.js.map +1 -0
- package/dist/esm/transformers/CTEDisabler.js +321 -0
- package/dist/esm/transformers/CTEDisabler.js.map +1 -0
- package/dist/esm/transformers/CTEInjector.js +79 -0
- package/dist/esm/transformers/CTEInjector.js.map +1 -0
- package/dist/esm/transformers/CTENormalizer.js +42 -0
- package/dist/esm/transformers/CTENormalizer.js.map +1 -0
- package/dist/esm/transformers/Formatter.js +463 -0
- package/dist/esm/transformers/Formatter.js.map +1 -0
- package/dist/esm/transformers/QueryConverter.js +115 -0
- package/dist/esm/transformers/QueryConverter.js.map +1 -0
- package/dist/esm/transformers/SelectValueCollector.js +245 -0
- package/dist/esm/transformers/SelectValueCollector.js.map +1 -0
- package/dist/esm/transformers/SelectableColumnCollector.js +318 -0
- package/dist/esm/transformers/SelectableColumnCollector.js.map +1 -0
- package/dist/esm/transformers/TableColumnResolver.js +2 -0
- package/dist/esm/transformers/TableColumnResolver.js.map +1 -0
- package/dist/esm/transformers/TableSourceCollector.js +380 -0
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +125 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -0
- package/dist/esm/types/index.d.ts +14 -0
- package/dist/esm/types/models/BinarySelectQuery.d.ts +91 -0
- package/dist/esm/types/models/Clause.d.ts +189 -0
- package/dist/esm/types/models/KeywordTrie.d.ts +11 -0
- package/dist/esm/types/models/Lexeme.d.ts +25 -0
- package/dist/esm/types/models/SelectQuery.d.ts +5 -0
- package/dist/esm/types/models/SimpleSelectQuery.d.ts +167 -0
- package/dist/esm/types/models/SqlComponent.d.ts +18 -0
- package/dist/esm/types/models/ValueComponent.d.ts +158 -0
- package/dist/esm/types/models/ValuesQuery.d.ts +10 -0
- package/dist/esm/types/parsers/CommandExpressionParser.d.ts +15 -0
- package/dist/esm/types/parsers/CommonTableParser.d.ts +9 -0
- package/dist/esm/types/parsers/ForClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/FromClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/FunctionExpressionParser.d.ts +22 -0
- package/dist/esm/types/parsers/GroupByParser.d.ts +10 -0
- package/dist/esm/types/parsers/HavingParser.d.ts +9 -0
- package/dist/esm/types/parsers/IdentifierParser.d.ts +8 -0
- package/dist/esm/types/parsers/JoinClauseParser.d.ts +14 -0
- package/dist/esm/types/parsers/KeywordParser.d.ts +17 -0
- package/dist/esm/types/parsers/LimitClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/LiteralParser.d.ts +8 -0
- package/dist/esm/types/parsers/OrderByClauseParser.d.ts +10 -0
- package/dist/esm/types/parsers/OverExpressionParser.d.ts +9 -0
- package/dist/esm/types/parsers/ParameterExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/ParenExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/PartitionByParser.d.ts +9 -0
- package/dist/esm/types/parsers/SelectClauseParser.d.ts +10 -0
- package/dist/esm/types/parsers/SelectQueryParser.d.ts +13 -0
- package/dist/esm/types/parsers/SourceAliasExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/SourceExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/SourceParser.d.ts +13 -0
- package/dist/esm/types/parsers/SqlTokenizer.d.ts +64 -0
- package/dist/esm/types/parsers/StringSpecifierExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/UnaryExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/ValueParser.d.ts +14 -0
- package/dist/esm/types/parsers/ValuesQueryParser.d.ts +10 -0
- package/dist/esm/types/parsers/WhereClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/WindowClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/WindowExpressionParser.d.ts +12 -0
- package/dist/esm/types/parsers/WithClauseParser.d.ts +9 -0
- package/dist/esm/types/tokenReaders/BaseTokenReader.d.ts +43 -0
- package/dist/esm/types/tokenReaders/CommandTokenReader.d.ts +7 -0
- package/dist/esm/types/tokenReaders/FunctionTokenReader.d.ts +11 -0
- package/dist/esm/types/tokenReaders/IdentifierTokenReader.d.ts +15 -0
- package/dist/esm/types/tokenReaders/LiteralTokenReader.d.ts +23 -0
- package/dist/esm/types/tokenReaders/OperatorTokenReader.d.ts +5 -0
- package/dist/esm/types/tokenReaders/ParameterTokenReader.d.ts +11 -0
- package/dist/esm/types/tokenReaders/StringSpecifierTokenReader.d.ts +8 -0
- package/dist/esm/types/tokenReaders/SymbolTokenReader.d.ts +12 -0
- package/dist/esm/types/tokenReaders/TokenReaderManager.d.ts +53 -0
- package/dist/esm/types/tokenReaders/TypeTokenReader.d.ts +11 -0
- package/dist/esm/types/transformers/CTEBuilder.d.ts +52 -0
- package/dist/esm/types/transformers/CTECollector.d.ts +82 -0
- package/dist/esm/types/transformers/CTEDisabler.d.ts +77 -0
- package/dist/esm/types/transformers/CTEInjector.d.ts +40 -0
- package/dist/esm/types/transformers/CTENormalizer.d.ts +25 -0
- package/dist/esm/types/transformers/Formatter.d.ts +82 -0
- package/dist/esm/types/transformers/QueryConverter.d.ts +41 -0
- package/dist/esm/types/transformers/SelectValueCollector.d.ts +60 -0
- package/dist/esm/types/transformers/SelectableColumnCollector.d.ts +72 -0
- package/dist/esm/types/transformers/TableColumnResolver.d.ts +10 -0
- package/dist/esm/types/transformers/TableSourceCollector.d.ts +92 -0
- package/dist/esm/types/transformers/UpstreamSelectQueryFinder.d.ts +27 -0
- package/dist/esm/types/utils/charLookupTable.d.ts +11 -0
- package/dist/esm/types/utils/stringUtils.d.ts +43 -0
- package/dist/esm/utils/charLookupTable.js +69 -0
- package/dist/esm/utils/charLookupTable.js.map +1 -0
- package/dist/esm/utils/stringUtils.js +164 -0
- package/dist/esm/utils/stringUtils.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transformers/CTECollector.d.ts +2 -1
- package/dist/transformers/CTECollector.js +5 -1
- package/dist/transformers/CTECollector.js.map +1 -1
- package/dist/transformers/CTEDisabler.js +1 -1
- package/dist/transformers/CTEDisabler.js.map +1 -1
- package/dist/transformers/Formatter.js +1 -1
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/SelectValueCollector.d.ts +2 -4
- package/dist/transformers/SelectValueCollector.js.map +1 -1
- package/dist/transformers/SelectableColumnCollector.d.ts +2 -0
- package/dist/transformers/SelectableColumnCollector.js +17 -3
- package/dist/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/transformers/TableColumnResolver.d.ts +10 -0
- package/dist/transformers/TableColumnResolver.js +3 -0
- package/dist/transformers/TableColumnResolver.js.map +1 -0
- package/package.json +15 -2
@@ -0,0 +1,141 @@
|
|
1
|
+
import { BaseTokenReader } from "./BaseTokenReader";
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { KeywordTrie } from "../models/KeywordTrie";
|
4
|
+
import { KeywordParser } from "../parsers/KeywordParser";
|
5
|
+
// Commands are those that require a dedicated parser.
|
6
|
+
// Keywords composed of multiple words are also considered commands.
|
7
|
+
// The exception is "type". Since types can be user-defined and cannot be accurately identified, they are treated as Identifiers.
|
8
|
+
const joinTrie = new KeywordTrie([
|
9
|
+
["join"],
|
10
|
+
["inner", "join"],
|
11
|
+
["cross", "join"],
|
12
|
+
["left", "join"],
|
13
|
+
["left", "outer", "join"],
|
14
|
+
["right", "join"],
|
15
|
+
["right", "outer", "join"],
|
16
|
+
["full", "join"],
|
17
|
+
["full", "outer", "join"],
|
18
|
+
["natural", "join"],
|
19
|
+
["natural", "inner", "join"],
|
20
|
+
["natural", "left", "join"],
|
21
|
+
["natural", "left", "outer", "join"],
|
22
|
+
["natural", "right", "join"],
|
23
|
+
["natural", "right", "outer", "join"],
|
24
|
+
["natural", "full", "join"],
|
25
|
+
["natural", "full", "outer", "join"],
|
26
|
+
]);
|
27
|
+
const keywordTrie = new KeywordTrie([
|
28
|
+
["with"],
|
29
|
+
["recursive"],
|
30
|
+
["materialized"],
|
31
|
+
["not", "materialized"],
|
32
|
+
["select"],
|
33
|
+
["from"],
|
34
|
+
["distinct"],
|
35
|
+
["distinct", "on"],
|
36
|
+
["where"],
|
37
|
+
["group", "by"],
|
38
|
+
["having"],
|
39
|
+
["order", "by"],
|
40
|
+
["limit"],
|
41
|
+
["offset"],
|
42
|
+
// for
|
43
|
+
["for"],
|
44
|
+
["update"],
|
45
|
+
["share"],
|
46
|
+
["key", "share"],
|
47
|
+
["no", "key", "update"],
|
48
|
+
// set operations
|
49
|
+
["union"],
|
50
|
+
["union", "all"],
|
51
|
+
["intersect"],
|
52
|
+
["intersect", "all"],
|
53
|
+
["except"],
|
54
|
+
["except", "all"],
|
55
|
+
// between and
|
56
|
+
["beteen"],
|
57
|
+
// window functions
|
58
|
+
["window"],
|
59
|
+
["over"],
|
60
|
+
["partition", "by"],
|
61
|
+
["range"],
|
62
|
+
["range"],
|
63
|
+
["rows"],
|
64
|
+
["groups"],
|
65
|
+
["groups"],
|
66
|
+
// window frame
|
67
|
+
["current", "row"],
|
68
|
+
["unbounded", "preceding"],
|
69
|
+
["unbounded", "following"],
|
70
|
+
["preceding"],
|
71
|
+
["following"],
|
72
|
+
// table join commands
|
73
|
+
["on"],
|
74
|
+
["using"],
|
75
|
+
["lateral"],
|
76
|
+
// case
|
77
|
+
["case"],
|
78
|
+
["case", "when"],
|
79
|
+
["when"],
|
80
|
+
["then"],
|
81
|
+
["else"],
|
82
|
+
["end"],
|
83
|
+
// others
|
84
|
+
["insert", "into"],
|
85
|
+
["update"],
|
86
|
+
["delete", "from"],
|
87
|
+
["merge", "into"],
|
88
|
+
["matched"],
|
89
|
+
["not", "matched"],
|
90
|
+
["update", "set"],
|
91
|
+
["do", "nothing"],
|
92
|
+
["values"],
|
93
|
+
["set"],
|
94
|
+
["returning"],
|
95
|
+
["create", "table"],
|
96
|
+
["create", "temporary", "table"],
|
97
|
+
["tablesample"],
|
98
|
+
["array"],
|
99
|
+
// cast
|
100
|
+
["as"],
|
101
|
+
// odrder
|
102
|
+
["asc"],
|
103
|
+
["desc"],
|
104
|
+
["nulls", "first"],
|
105
|
+
["nulls", "last"],
|
106
|
+
]);
|
107
|
+
const keywordParser = new KeywordParser(keywordTrie);
|
108
|
+
export const joinkeywordParser = new KeywordParser(joinTrie);
|
109
|
+
export class CommandTokenReader extends BaseTokenReader {
|
110
|
+
tryRead(previous) {
|
111
|
+
if (this.isEndOfInput()) {
|
112
|
+
return null;
|
113
|
+
}
|
114
|
+
const keywordJoin = joinkeywordParser.parse(this.input, this.position);
|
115
|
+
if (keywordJoin !== null) {
|
116
|
+
this.position = keywordJoin.newPosition;
|
117
|
+
return this.createLexeme(TokenType.Command, keywordJoin.keyword);
|
118
|
+
}
|
119
|
+
// Check for keyword identifiers
|
120
|
+
const keyword = keywordParser.parse(this.input, this.position);
|
121
|
+
if (keyword !== null) {
|
122
|
+
this.position = keyword.newPosition;
|
123
|
+
return this.createLexeme(TokenType.Command, keyword.keyword);
|
124
|
+
}
|
125
|
+
// check hint clause
|
126
|
+
if (this.canRead(2) && this.input[this.position] === '/' && this.input[this.position + 1] === '*' && this.input[this.position + 2] === '+') {
|
127
|
+
this.position += 3;
|
128
|
+
const start = this.position;
|
129
|
+
while (this.position + 1 < this.input.length) {
|
130
|
+
if (this.input[this.position] === '*' && this.input[this.position + 1] === '/') {
|
131
|
+
this.position += 2;
|
132
|
+
return this.createLexeme(TokenType.Command, '/*+ ' + this.input.slice(start, this.position - 2).trim() + ' */');
|
133
|
+
}
|
134
|
+
this.position++;
|
135
|
+
}
|
136
|
+
throw new Error(`Block comment is not closed. position: ${this.position}`);
|
137
|
+
}
|
138
|
+
return null;
|
139
|
+
}
|
140
|
+
}
|
141
|
+
//# sourceMappingURL=CommandTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CommandTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/CommandTokenReader.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { StringUtils } from '../utils/stringUtils';
|
4
|
+
import { KeywordTrie } from '../models/KeywordTrie';
|
5
|
+
import { KeywordParser } from '../parsers/KeywordParser';
|
6
|
+
const trie = new KeywordTrie([
|
7
|
+
["grouping", "sets"],
|
8
|
+
]);
|
9
|
+
const keywordParser = new KeywordParser(trie);
|
10
|
+
/**
|
11
|
+
* Reads SQL identifier tokens
|
12
|
+
*/
|
13
|
+
export class FunctionTokenReader extends BaseTokenReader {
|
14
|
+
/**
|
15
|
+
* Try to read an identifier token
|
16
|
+
*/
|
17
|
+
tryRead(previous) {
|
18
|
+
if (this.isEndOfInput()) {
|
19
|
+
return null;
|
20
|
+
}
|
21
|
+
// Check for keyword identifiers
|
22
|
+
const keyword = keywordParser.parse(this.input, this.position);
|
23
|
+
if (keyword !== null) {
|
24
|
+
this.position = keyword.newPosition;
|
25
|
+
return this.createLexeme(TokenType.Function, keyword.keyword);
|
26
|
+
}
|
27
|
+
// Regular identifier
|
28
|
+
const result = StringUtils.tryReadRegularIdentifier(this.input, this.position);
|
29
|
+
if (!result) {
|
30
|
+
return null;
|
31
|
+
}
|
32
|
+
this.position = result.newPosition;
|
33
|
+
// peek next token
|
34
|
+
var shift = StringUtils.readWhiteSpaceAndComment(this.input, this.position).position - this.position;
|
35
|
+
if (this.canRead(shift) && this.input[this.position + shift] === '(') {
|
36
|
+
return this.createLexeme(TokenType.Function, result.identifier);
|
37
|
+
}
|
38
|
+
return null;
|
39
|
+
}
|
40
|
+
}
|
41
|
+
//# sourceMappingURL=FunctionTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"FunctionTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/FunctionTokenReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;IACzB,CAAC,UAAU,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AACH,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IACpD;;OAEG;IACI,OAAO,CAAC,QAAuB;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,gCAAgC;QAChC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;YACpC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;QAEnC,mBAAmB;QACnB,IAAI,KAAK,GAAG,WAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAErG,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { StringUtils } from '../utils/stringUtils';
|
4
|
+
/**
|
5
|
+
* Reads SQL identifier tokens
|
6
|
+
*/
|
7
|
+
export class IdentifierTokenReader extends BaseTokenReader {
|
8
|
+
/**
|
9
|
+
* Try to read an identifier token
|
10
|
+
*/
|
11
|
+
tryRead(previous) {
|
12
|
+
if (this.isEndOfInput()) {
|
13
|
+
return null;
|
14
|
+
}
|
15
|
+
const char = this.input[this.position];
|
16
|
+
// wildcard identifier
|
17
|
+
if (char === '*') {
|
18
|
+
// Assume that the OperatorTokenReader is executed before the IdentifierTokenReader.
|
19
|
+
// Since we have determined that the OperatorTokenReader is not an Operator,
|
20
|
+
// we treat '*' here as a wildcard identifier.
|
21
|
+
this.position++;
|
22
|
+
return this.createLexeme(TokenType.Identifier, char);
|
23
|
+
}
|
24
|
+
// MySQL escaped identifier (escape character is backtick)
|
25
|
+
if (char === '`') {
|
26
|
+
const identifier = this.readEscapedIdentifier('`');
|
27
|
+
return this.createLexeme(TokenType.Identifier, identifier);
|
28
|
+
}
|
29
|
+
// Postgres escaped identifier (escape character is double quote)
|
30
|
+
if (char === '"') {
|
31
|
+
const identifier = this.readEscapedIdentifier('"');
|
32
|
+
return this.createLexeme(TokenType.Identifier, identifier);
|
33
|
+
}
|
34
|
+
// SQLServer escaped identifier (escape character is square bracket)
|
35
|
+
if (char === '[' && (previous === null || previous.value !== "array")) {
|
36
|
+
const identifier = this.readEscapedIdentifier(']');
|
37
|
+
return this.createLexeme(TokenType.Identifier, identifier);
|
38
|
+
}
|
39
|
+
// Regular identifier
|
40
|
+
const result = StringUtils.readRegularIdentifier(this.input, this.position);
|
41
|
+
this.position = result.newPosition;
|
42
|
+
return this.createLexeme(TokenType.Identifier, result.identifier);
|
43
|
+
}
|
44
|
+
/**
|
45
|
+
* Read an escaped identifier (surrounded by delimiters)
|
46
|
+
*/
|
47
|
+
readEscapedIdentifier(delimiter) {
|
48
|
+
const start = this.position;
|
49
|
+
// Skip the opening delimiter
|
50
|
+
this.position++;
|
51
|
+
while (this.canRead()) {
|
52
|
+
if (this.input[this.position] === delimiter) {
|
53
|
+
break;
|
54
|
+
}
|
55
|
+
this.position++;
|
56
|
+
}
|
57
|
+
if (start === this.position) {
|
58
|
+
throw new Error(`Closing delimiter is not found. position: ${start}, delimiter: ${delimiter}\n${this.getDebugPositionInfo(start)}}`);
|
59
|
+
}
|
60
|
+
// Skip the closing delimiter
|
61
|
+
this.position++;
|
62
|
+
// exclude the delimiter
|
63
|
+
return this.input.slice(start + 1, this.position - 1);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
//# sourceMappingURL=IdentifierTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"IdentifierTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/IdentifierTokenReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,eAAe;IACtD;;OAEG;IACI,OAAO,CAAC,QAAuB;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvC,sBAAsB;QACtB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,oFAAoF;YACpF,4EAA4E;YAC5E,8CAA8C;YAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;QAED,iEAAiE;QACjE,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;QAED,oEAAoE;QACpE,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;YACpE,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,SAAiB;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE5B,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC1C,MAAM;YACV,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC;QAED,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,KAAK,gBAAgB,SAAS,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzI,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEhB,wBAAwB;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;CACJ"}
|
@@ -0,0 +1,185 @@
|
|
1
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { CharLookupTable } from '../utils/charLookupTable';
|
4
|
+
import { KeywordParser } from '../parsers/KeywordParser';
|
5
|
+
import { KeywordTrie } from '../models/KeywordTrie';
|
6
|
+
/**
|
7
|
+
* Reads SQL literal tokens (numbers, strings)
|
8
|
+
*/
|
9
|
+
const keywords = [
|
10
|
+
["null"],
|
11
|
+
["true"],
|
12
|
+
["false"],
|
13
|
+
["current_date"],
|
14
|
+
["current_time"],
|
15
|
+
["current_timestamp"],
|
16
|
+
["localtime"],
|
17
|
+
["localtimestamp"],
|
18
|
+
["unbounded"],
|
19
|
+
["normalized"],
|
20
|
+
["nfc", "normalized"],
|
21
|
+
["nfd", "normalized"],
|
22
|
+
["nfkc", "normalized"],
|
23
|
+
["nfkd", "normalized"],
|
24
|
+
["nfc"],
|
25
|
+
["nfd"],
|
26
|
+
["nfkc"],
|
27
|
+
["nfkd"],
|
28
|
+
];
|
29
|
+
const trie = new KeywordTrie(keywords);
|
30
|
+
export const literalKeywordParser = new KeywordParser(trie);
|
31
|
+
export class LiteralTokenReader extends BaseTokenReader {
|
32
|
+
/**
|
33
|
+
* Try to read a literal token
|
34
|
+
*/
|
35
|
+
tryRead(previous) {
|
36
|
+
if (this.isEndOfInput()) {
|
37
|
+
return null;
|
38
|
+
}
|
39
|
+
const char = this.input[this.position];
|
40
|
+
// Check for keyword literals
|
41
|
+
const keyword = this.tryReadKeyword();
|
42
|
+
if (keyword) {
|
43
|
+
return keyword;
|
44
|
+
}
|
45
|
+
// Decimal token starting with a dot
|
46
|
+
if (char === '.' && this.canRead(1) && CharLookupTable.isDigit(this.input[this.position + 1])) {
|
47
|
+
return this.createLexeme(TokenType.Literal, this.readDigit());
|
48
|
+
}
|
49
|
+
// String literal
|
50
|
+
if (char === '\'') {
|
51
|
+
const value = this.readSingleQuotedString(false);
|
52
|
+
return this.createLexeme(TokenType.Literal, value);
|
53
|
+
}
|
54
|
+
// Digit tokens
|
55
|
+
if (CharLookupTable.isDigit(char)) {
|
56
|
+
return this.createLexeme(TokenType.Literal, this.readDigit());
|
57
|
+
}
|
58
|
+
// Signed number
|
59
|
+
if ((char === '+' || char === '-') && this.isValidNumericPrefix(previous)) {
|
60
|
+
const sign = char;
|
61
|
+
this.position++;
|
62
|
+
// Skip whitespace after sign
|
63
|
+
const pos = this.position;
|
64
|
+
while (this.canRead() && CharLookupTable.isWhitespace(this.input[this.position])) {
|
65
|
+
this.position++;
|
66
|
+
}
|
67
|
+
if (this.canRead() && (CharLookupTable.isDigit(this.input[this.position]) ||
|
68
|
+
(this.input[this.position] === '.' &&
|
69
|
+
this.canRead(1) &&
|
70
|
+
CharLookupTable.isDigit(this.input[this.position + 1])))) {
|
71
|
+
return this.createLexeme(TokenType.Literal, sign === '-' ? sign + this.readDigit() : this.readDigit());
|
72
|
+
}
|
73
|
+
// Not a number, restore position
|
74
|
+
this.position = pos - 1; // Adjust for the increment at the beginning
|
75
|
+
}
|
76
|
+
return null;
|
77
|
+
}
|
78
|
+
tryReadKeyword() {
|
79
|
+
// Check for keyword literals
|
80
|
+
const result = literalKeywordParser.parse(this.input, this.position);
|
81
|
+
if (result) {
|
82
|
+
this.position = result.newPosition;
|
83
|
+
return this.createLexeme(TokenType.Literal, result.keyword);
|
84
|
+
}
|
85
|
+
return null;
|
86
|
+
}
|
87
|
+
/**
|
88
|
+
* Check if the current context allows for a signed number
|
89
|
+
*/
|
90
|
+
isValidNumericPrefix(previous) {
|
91
|
+
return previous === null ||
|
92
|
+
(previous.type !== TokenType.Literal &&
|
93
|
+
previous.type !== TokenType.Identifier);
|
94
|
+
}
|
95
|
+
/**
|
96
|
+
* Read a numeric value
|
97
|
+
*/
|
98
|
+
readDigit() {
|
99
|
+
const start = this.position;
|
100
|
+
let hasDot = false;
|
101
|
+
let hasExponent = false;
|
102
|
+
// Consider 0x, 0b, 0o
|
103
|
+
if (this.canRead(1) &&
|
104
|
+
this.input[this.position] === '0' &&
|
105
|
+
"xbo".includes(this.input[this.position + 1].toLowerCase())) {
|
106
|
+
const prefixType = this.input[this.position + 1].toLowerCase();
|
107
|
+
this.position += 2;
|
108
|
+
// Continue to get numeric and hexadecimal notation strings
|
109
|
+
const isHex = prefixType === 'x';
|
110
|
+
while (this.canRead()) {
|
111
|
+
const c = this.input[this.position];
|
112
|
+
if (CharLookupTable.isDigit(c) || (isHex && CharLookupTable.isHexChar(c))) {
|
113
|
+
this.position++;
|
114
|
+
}
|
115
|
+
else {
|
116
|
+
break;
|
117
|
+
}
|
118
|
+
}
|
119
|
+
return this.input.slice(start, this.position);
|
120
|
+
}
|
121
|
+
// If starting with dot, note it
|
122
|
+
if (this.input[start] === '.') {
|
123
|
+
hasDot = true;
|
124
|
+
this.position++;
|
125
|
+
}
|
126
|
+
// Consider decimal point and exponential notation
|
127
|
+
while (this.canRead()) {
|
128
|
+
const char = this.input[this.position];
|
129
|
+
if (char === '.' && !hasDot) {
|
130
|
+
hasDot = true;
|
131
|
+
}
|
132
|
+
else if ((char === 'e' || char === 'E') && !hasExponent) {
|
133
|
+
hasExponent = true;
|
134
|
+
if (this.canRead(1) && (this.input[this.position + 1] === '+' || this.input[this.position + 1] === '-')) {
|
135
|
+
this.position++;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
else if (!CharLookupTable.isDigit(char)) {
|
139
|
+
break;
|
140
|
+
}
|
141
|
+
this.position++;
|
142
|
+
}
|
143
|
+
if (start === this.position) {
|
144
|
+
throw new Error(`Unexpected character. position: ${start}\n${this.getDebugPositionInfo(start)}`);
|
145
|
+
}
|
146
|
+
if (this.input[start] === '.') {
|
147
|
+
// If the number starts with a dot, add 0 to the front
|
148
|
+
return '0' + this.input.slice(start, this.position);
|
149
|
+
}
|
150
|
+
return this.input.slice(start, this.position);
|
151
|
+
}
|
152
|
+
/**
|
153
|
+
* Read a string literal
|
154
|
+
*/
|
155
|
+
readSingleQuotedString(includeSingleQuote) {
|
156
|
+
const start = this.position;
|
157
|
+
let closed = false;
|
158
|
+
this.read("'");
|
159
|
+
while (this.canRead()) {
|
160
|
+
const char = this.input[this.position];
|
161
|
+
this.position++;
|
162
|
+
// escape character check
|
163
|
+
if (char === "\\" && this.canRead(1)) {
|
164
|
+
this.position++;
|
165
|
+
continue;
|
166
|
+
}
|
167
|
+
else if (char === '\'') {
|
168
|
+
closed = true;
|
169
|
+
break;
|
170
|
+
}
|
171
|
+
}
|
172
|
+
if (closed === false) {
|
173
|
+
throw new Error(`Single quote is not closed. position: ${start}\n${this.getDebugPositionInfo(start)}`);
|
174
|
+
}
|
175
|
+
if (includeSingleQuote) {
|
176
|
+
const value = this.input.slice(start, this.position);
|
177
|
+
return value;
|
178
|
+
}
|
179
|
+
else {
|
180
|
+
const value = this.input.slice(start + 1, this.position - 1);
|
181
|
+
return value;
|
182
|
+
}
|
183
|
+
}
|
184
|
+
}
|
185
|
+
//# sourceMappingURL=LiteralTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LiteralTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/LiteralTokenReader.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { CharLookupTable } from '../utils/charLookupTable';
|
4
|
+
import { KeywordParser } from '../parsers/KeywordParser';
|
5
|
+
import { KeywordTrie } from '../models/KeywordTrie';
|
6
|
+
const trie = new KeywordTrie([
|
7
|
+
// binary
|
8
|
+
["and"],
|
9
|
+
["or"],
|
10
|
+
["is"],
|
11
|
+
["is", "not"],
|
12
|
+
["is", "distinct", "from"],
|
13
|
+
["is", "not", "distinct", "from"],
|
14
|
+
["like"],
|
15
|
+
["in"],
|
16
|
+
["exists"],
|
17
|
+
["between"],
|
18
|
+
["not", "like"],
|
19
|
+
["not", "in"],
|
20
|
+
["not", "exists"],
|
21
|
+
["not", "between"],
|
22
|
+
["escape"], // e.g. '10% OFF on all items' like '10\%%' escape '\'
|
23
|
+
["uescape"], // e.g. U&'d!0061t!+000061' uescape '!'
|
24
|
+
["similar"], // e.g. substring('abcdef' similar '%#"cd#"%' escape '#')
|
25
|
+
["placing"], // e.g. overlay('abcdef' placing 'cd' from 3 for 2)
|
26
|
+
// unary
|
27
|
+
["not"],
|
28
|
+
// unary - trim
|
29
|
+
["both"],
|
30
|
+
["leading"],
|
31
|
+
["trailing"],
|
32
|
+
["both", "from"], // Postgres
|
33
|
+
["leading", "from"], // Postgres
|
34
|
+
["trailing", "from"], // Postgres
|
35
|
+
// unary - extract
|
36
|
+
["year", "from"],
|
37
|
+
["month", "from"],
|
38
|
+
["day", "from"],
|
39
|
+
["hour", "from"],
|
40
|
+
["minute", "from"],
|
41
|
+
["second", "from"],
|
42
|
+
["dow", "from"],
|
43
|
+
["doy", "from"],
|
44
|
+
["isodow", "from"],
|
45
|
+
["quarter", "from"],
|
46
|
+
["week", "from"],
|
47
|
+
["epoch", "from"],
|
48
|
+
["at", "time", "zone"],
|
49
|
+
["interval"],
|
50
|
+
// The following are not considered operators.
|
51
|
+
// ["from"], can be used as an operator only within the substring function, but it cannot be distinguished from the Form Clause. This will be resolved with a dedicated substring parser.
|
52
|
+
// ["for"], can be used as an operator only within the substring function, but it cannot be distinguished from the For Clause. This will be resolved with a dedicated substring parser.
|
53
|
+
]);
|
54
|
+
const keywordParser = new KeywordParser(trie);
|
55
|
+
export class OperatorTokenReader extends BaseTokenReader {
|
56
|
+
tryRead(previous) {
|
57
|
+
if (this.isEndOfInput()) {
|
58
|
+
return null;
|
59
|
+
}
|
60
|
+
/*
|
61
|
+
NOTE:
|
62
|
+
Asterisks could potentially be wildcard identifiers,
|
63
|
+
but since they're indistinguishable at this stage, they're treated as Operators at the token level.
|
64
|
+
The Parser needs to determine whether they are appropriate Operators or Identifiers.
|
65
|
+
*/
|
66
|
+
const char = this.input[this.position];
|
67
|
+
if (CharLookupTable.isOperatorSymbol(char)) {
|
68
|
+
const start = this.position;
|
69
|
+
while (this.canRead() && CharLookupTable.isOperatorSymbol(this.input[this.position])) {
|
70
|
+
// check for `--` and `/*` comments
|
71
|
+
if (this.canRead(1)) {
|
72
|
+
const current = this.input[this.position];
|
73
|
+
if (current === '-' && this.input[this.position + 1] === '-') {
|
74
|
+
break;
|
75
|
+
}
|
76
|
+
else if (current === '/' && this.input[this.position + 1] === '*') {
|
77
|
+
break; // end of operator
|
78
|
+
}
|
79
|
+
}
|
80
|
+
this.position++;
|
81
|
+
}
|
82
|
+
const resut = this.input.slice(start, this.position);
|
83
|
+
return this.createLexeme(TokenType.Operator, resut);
|
84
|
+
}
|
85
|
+
// Logical operators
|
86
|
+
const result = keywordParser.parse(this.input, this.position);
|
87
|
+
if (result !== null) {
|
88
|
+
this.position = result.newPosition;
|
89
|
+
return this.createLexeme(TokenType.Operator, result.keyword);
|
90
|
+
}
|
91
|
+
return null;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
//# sourceMappingURL=OperatorTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"OperatorTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/OperatorTokenReader.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
2
|
+
import { TokenType } from '../models/Lexeme';
|
3
|
+
import { CharLookupTable } from '../utils/charLookupTable';
|
4
|
+
/**
|
5
|
+
* Reads SQL parameter tokens (@param, :param, $param, ?)
|
6
|
+
*/
|
7
|
+
export class ParameterTokenReader extends BaseTokenReader {
|
8
|
+
/**
|
9
|
+
* Try to read a parameter token
|
10
|
+
*/
|
11
|
+
tryRead(previous) {
|
12
|
+
if (this.isEndOfInput()) {
|
13
|
+
return null;
|
14
|
+
}
|
15
|
+
const char = this.input[this.position];
|
16
|
+
// named parameter (@param, :param, $param)
|
17
|
+
if (CharLookupTable.isNamedParameterPrefix(char)) {
|
18
|
+
// However, do not recognize as a parameter if the next character is an operator symbol
|
19
|
+
// To avoid postgres `::`
|
20
|
+
if (this.canRead(1) && CharLookupTable.isOperatorSymbol(this.input[this.position + 1])) {
|
21
|
+
return null;
|
22
|
+
}
|
23
|
+
this.position++;
|
24
|
+
// Read the identifier part after the prefix
|
25
|
+
const start = this.position;
|
26
|
+
while (this.canRead() && !CharLookupTable.isDelimiter(this.input[this.position])) {
|
27
|
+
this.position++;
|
28
|
+
}
|
29
|
+
const identifier = this.input.slice(start, this.position);
|
30
|
+
return this.createLexeme(TokenType.Parameter, char + identifier);
|
31
|
+
}
|
32
|
+
// nameless parameter (?)
|
33
|
+
if (char === '?') {
|
34
|
+
this.position++;
|
35
|
+
return this.createLexeme(TokenType.Parameter, char);
|
36
|
+
}
|
37
|
+
return null;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
//# sourceMappingURL=ParameterTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"ParameterTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/ParameterTokenReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE3D;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,eAAe;IACrD;;OAEG;IACI,OAAO,CAAC,QAAuB;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEvC,2CAA2C;QAC3C,IAAI,eAAe,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAE/C,uFAAuF;YACvF,yBAAyB;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YAEhB,4CAA4C;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,GAAG,UAAU,CAAC,CAAC;QACrE,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { TokenType } from '../models/Lexeme';
|
2
|
+
import { BaseTokenReader } from './BaseTokenReader';
|
3
|
+
// Prefix sets for quick checks
|
4
|
+
const STRING_SPECIFIERS = new Set(['e\'', 'E\'', 'x\'', 'X\'', 'b\'', 'B\'']);
|
5
|
+
const UNICODE_STRING_SPECIFIERS = new Set(['u&\'', 'U&\'']);
|
6
|
+
export class StringSpecifierTokenReader extends BaseTokenReader {
|
7
|
+
/**
|
8
|
+
* Try to read an escaped literal like e'...', x'...', etc.
|
9
|
+
*/
|
10
|
+
tryRead(previous) {
|
11
|
+
const start = this.position;
|
12
|
+
// Check for prefixed literals: e', x', b'
|
13
|
+
if (this.canRead(1) && STRING_SPECIFIERS.has(this.input.slice(start, start + 2))) {
|
14
|
+
this.position += 1;
|
15
|
+
const result = this.createLexeme(TokenType.StringSpecifier, this.input.slice(start, this.position));
|
16
|
+
return result;
|
17
|
+
}
|
18
|
+
// Check for unicode literal: u&'
|
19
|
+
if (this.canRead(2) && UNICODE_STRING_SPECIFIERS.has(this.input.slice(start, start + 3))) {
|
20
|
+
this.position += 2;
|
21
|
+
const result = this.createLexeme(TokenType.StringSpecifier, this.input.slice(start, this.position));
|
22
|
+
return result;
|
23
|
+
}
|
24
|
+
return null;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
//# sourceMappingURL=StringSpecifierTokenReader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"StringSpecifierTokenReader.js","sourceRoot":"","sources":["../../../src/tokenReaders/StringSpecifierTokenReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+BAA+B;AAC/B,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9E,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5D,MAAM,OAAO,0BAA2B,SAAQ,eAAe;IAE3D;;OAEG;IACI,OAAO,CAAC,QAAuB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE5B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpG,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,iCAAiC;QACjC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YACnB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpG,OAAO,MAAM,CAAC;QAClB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
|