rawsql-ts 0.1.3-beta → 0.3.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 +251 -8
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/models/Clause.js +2 -2
- package/dist/esm/models/Clause.js.map +1 -1
- package/dist/esm/models/CreateTableQuery.js +62 -0
- package/dist/esm/models/CreateTableQuery.js.map +1 -0
- package/dist/esm/models/InsertQuery.js +24 -0
- package/dist/esm/models/InsertQuery.js.map +1 -0
- package/dist/esm/models/Lexeme.js +15 -14
- package/dist/esm/models/Lexeme.js.map +1 -1
- package/dist/esm/models/SelectQuery.js +2 -1
- package/dist/esm/models/SelectQuery.js.map +1 -1
- package/dist/esm/models/SimpleSelectQuery.js +82 -16
- package/dist/esm/models/SimpleSelectQuery.js.map +1 -1
- package/dist/esm/parsers/CommandExpressionParser.js +4 -4
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/esm/parsers/FunctionExpressionParser.js +10 -10
- package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/esm/parsers/GroupByParser.js +1 -1
- package/dist/esm/parsers/GroupByParser.js.map +1 -1
- package/dist/esm/parsers/IdentifierParser.js +5 -4
- package/dist/esm/parsers/IdentifierParser.js.map +1 -1
- package/dist/esm/parsers/InsertQueryParser.js +104 -0
- package/dist/esm/parsers/InsertQueryParser.js.map +1 -0
- package/dist/esm/parsers/JoinClauseParser.js +1 -1
- package/dist/esm/parsers/JoinClauseParser.js.map +1 -1
- package/dist/esm/parsers/OrderByClauseParser.js +1 -1
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/esm/parsers/OverExpressionParser.js +2 -2
- package/dist/esm/parsers/OverExpressionParser.js.map +1 -1
- package/dist/esm/parsers/ParameterExpressionParser.js +11 -2
- package/dist/esm/parsers/ParameterExpressionParser.js.map +1 -1
- package/dist/esm/parsers/ParenExpressionParser.js +1 -1
- package/dist/esm/parsers/ParenExpressionParser.js.map +1 -1
- package/dist/esm/parsers/PartitionByParser.js +1 -1
- package/dist/esm/parsers/PartitionByParser.js.map +1 -1
- package/dist/esm/parsers/SelectClauseParser.js +11 -5
- package/dist/esm/parsers/SelectClauseParser.js.map +1 -1
- package/dist/esm/parsers/SelectQueryParser.js +22 -1
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
- package/dist/esm/parsers/SourceAliasExpressionParser.js +5 -5
- package/dist/esm/parsers/SourceAliasExpressionParser.js.map +1 -1
- package/dist/esm/parsers/SourceExpressionParser.js +1 -1
- package/dist/esm/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/esm/parsers/SourceParser.js +10 -28
- package/dist/esm/parsers/SourceParser.js.map +1 -1
- package/dist/esm/parsers/SqlTokenizer.js +1 -1
- package/dist/esm/parsers/SqlTokenizer.js.map +1 -1
- package/dist/esm/parsers/UnaryExpressionParser.js +1 -1
- package/dist/esm/parsers/UnaryExpressionParser.js.map +1 -1
- package/dist/esm/parsers/ValueParser.js +42 -13
- package/dist/esm/parsers/ValueParser.js.map +1 -1
- package/dist/esm/parsers/ValuesQueryParser.js +3 -3
- package/dist/esm/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/esm/parsers/WindowExpressionParser.js +3 -3
- package/dist/esm/parsers/WindowExpressionParser.js.map +1 -1
- package/dist/esm/parsers/WithClauseParser.js +1 -1
- package/dist/esm/parsers/WithClauseParser.js.map +1 -1
- package/dist/esm/tokenReaders/BaseTokenReader.js +1 -3
- package/dist/esm/tokenReaders/BaseTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/OperatorTokenReader.js +36 -9
- package/dist/esm/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/ParameterTokenReader.js +21 -1
- package/dist/esm/tokenReaders/ParameterTokenReader.js.map +1 -1
- package/dist/esm/tokenReaders/TypeTokenReader.js +3 -3
- package/dist/esm/tokenReaders/TypeTokenReader.js.map +1 -1
- package/dist/esm/transformers/CTEDisabler.js +2 -1
- package/dist/esm/transformers/CTEDisabler.js.map +1 -1
- package/dist/esm/transformers/Formatter.js +79 -8
- package/dist/esm/transformers/Formatter.js.map +1 -1
- package/dist/esm/transformers/QueryConverter.js +67 -12
- package/dist/esm/transformers/QueryConverter.js.map +1 -1
- package/dist/esm/transformers/SelectValueCollector.js +11 -16
- package/dist/esm/transformers/SelectValueCollector.js.map +1 -1
- package/dist/esm/transformers/SelectableColumnCollector.js +7 -10
- package/dist/esm/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/esm/types/index.d.ts +1 -0
- package/dist/esm/types/models/Clause.d.ts +4 -5
- package/dist/esm/types/models/CreateTableQuery.d.ts +27 -0
- package/dist/esm/types/models/InsertQuery.d.ts +21 -0
- package/dist/esm/types/models/Lexeme.d.ts +16 -16
- package/dist/esm/types/models/SelectQuery.d.ts +3 -2
- package/dist/esm/types/models/SimpleSelectQuery.d.ts +31 -6
- package/dist/esm/types/parsers/InsertQueryParser.d.ts +17 -0
- package/dist/esm/types/parsers/SelectQueryParser.d.ts +7 -0
- package/dist/esm/types/tokenReaders/BaseTokenReader.d.ts +1 -1
- package/dist/esm/types/tokenReaders/ParameterTokenReader.d.ts +2 -1
- package/dist/esm/types/transformers/Formatter.d.ts +20 -3
- package/dist/esm/types/transformers/QueryConverter.d.ts +22 -2
- package/dist/esm/types/transformers/SelectValueCollector.d.ts +2 -4
- package/dist/esm/types/transformers/SelectableColumnCollector.d.ts +3 -3
- package/dist/esm/types/transformers/UpstreamSelectQueryFinder.d.ts +2 -2
- package/dist/esm/types/utils/extractNamespacesAndName.d.ts +5 -0
- package/dist/esm/types/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +9 -0
- package/dist/esm/utils/extractNamespacesAndName.js +16 -0
- package/dist/esm/utils/extractNamespacesAndName.js.map +1 -0
- package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.js +39 -0
- package/dist/esm/utils/parseEscapedOrDotSeparatedIdentifiers.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/models/Clause.d.ts +4 -5
- package/dist/models/Clause.js +2 -2
- package/dist/models/Clause.js.map +1 -1
- package/dist/models/CreateTableQuery.d.ts +27 -0
- package/dist/models/CreateTableQuery.js +66 -0
- package/dist/models/CreateTableQuery.js.map +1 -0
- package/dist/models/InsertQuery.d.ts +21 -0
- package/dist/models/InsertQuery.js +28 -0
- package/dist/models/InsertQuery.js.map +1 -0
- package/dist/models/Lexeme.d.ts +16 -16
- package/dist/models/Lexeme.js +15 -14
- package/dist/models/Lexeme.js.map +1 -1
- package/dist/models/SelectQuery.d.ts +3 -2
- package/dist/models/SelectQuery.js +3 -1
- package/dist/models/SelectQuery.js.map +1 -1
- package/dist/models/SimpleSelectQuery.d.ts +31 -6
- package/dist/models/SimpleSelectQuery.js +82 -16
- package/dist/models/SimpleSelectQuery.js.map +1 -1
- package/dist/parsers/CommandExpressionParser.js +4 -4
- package/dist/parsers/CommandExpressionParser.js.map +1 -1
- package/dist/parsers/FunctionExpressionParser.js +10 -10
- package/dist/parsers/FunctionExpressionParser.js.map +1 -1
- package/dist/parsers/GroupByParser.js +1 -1
- package/dist/parsers/GroupByParser.js.map +1 -1
- package/dist/parsers/IdentifierParser.js +5 -4
- package/dist/parsers/IdentifierParser.js.map +1 -1
- package/dist/parsers/InsertQueryParser.d.ts +17 -0
- package/dist/parsers/InsertQueryParser.js +108 -0
- package/dist/parsers/InsertQueryParser.js.map +1 -0
- package/dist/parsers/JoinClauseParser.js +1 -1
- package/dist/parsers/JoinClauseParser.js.map +1 -1
- package/dist/parsers/OrderByClauseParser.js +1 -1
- package/dist/parsers/OrderByClauseParser.js.map +1 -1
- package/dist/parsers/OverExpressionParser.js +2 -2
- package/dist/parsers/OverExpressionParser.js.map +1 -1
- package/dist/parsers/ParameterExpressionParser.js +11 -2
- package/dist/parsers/ParameterExpressionParser.js.map +1 -1
- package/dist/parsers/ParenExpressionParser.js +1 -1
- package/dist/parsers/ParenExpressionParser.js.map +1 -1
- package/dist/parsers/PartitionByParser.js +1 -1
- package/dist/parsers/PartitionByParser.js.map +1 -1
- package/dist/parsers/SelectClauseParser.js +11 -5
- package/dist/parsers/SelectClauseParser.js.map +1 -1
- package/dist/parsers/SelectQueryParser.d.ts +7 -0
- package/dist/parsers/SelectQueryParser.js +22 -1
- package/dist/parsers/SelectQueryParser.js.map +1 -1
- package/dist/parsers/SourceAliasExpressionParser.js +5 -5
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -1
- package/dist/parsers/SourceExpressionParser.js +1 -1
- package/dist/parsers/SourceExpressionParser.js.map +1 -1
- package/dist/parsers/SourceParser.js +10 -28
- package/dist/parsers/SourceParser.js.map +1 -1
- package/dist/parsers/SqlTokenizer.js +1 -1
- package/dist/parsers/SqlTokenizer.js.map +1 -1
- package/dist/parsers/UnaryExpressionParser.js +1 -1
- package/dist/parsers/UnaryExpressionParser.js.map +1 -1
- package/dist/parsers/ValueParser.js +41 -12
- package/dist/parsers/ValueParser.js.map +1 -1
- package/dist/parsers/ValuesQueryParser.js +3 -3
- package/dist/parsers/ValuesQueryParser.js.map +1 -1
- package/dist/parsers/WindowExpressionParser.js +3 -3
- package/dist/parsers/WindowExpressionParser.js.map +1 -1
- package/dist/parsers/WithClauseParser.js +1 -1
- package/dist/parsers/WithClauseParser.js.map +1 -1
- package/dist/tokenReaders/BaseTokenReader.d.ts +1 -1
- package/dist/tokenReaders/BaseTokenReader.js +1 -3
- package/dist/tokenReaders/BaseTokenReader.js.map +1 -1
- package/dist/tokenReaders/OperatorTokenReader.js +36 -9
- package/dist/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/tokenReaders/ParameterTokenReader.d.ts +2 -1
- package/dist/tokenReaders/ParameterTokenReader.js +21 -1
- package/dist/tokenReaders/ParameterTokenReader.js.map +1 -1
- package/dist/tokenReaders/TypeTokenReader.js +3 -3
- package/dist/tokenReaders/TypeTokenReader.js.map +1 -1
- package/dist/transformers/CTEDisabler.js +2 -1
- package/dist/transformers/CTEDisabler.js.map +1 -1
- package/dist/transformers/Formatter.d.ts +20 -3
- package/dist/transformers/Formatter.js +79 -8
- package/dist/transformers/Formatter.js.map +1 -1
- package/dist/transformers/QueryConverter.d.ts +22 -2
- package/dist/transformers/QueryConverter.js +67 -12
- package/dist/transformers/QueryConverter.js.map +1 -1
- package/dist/transformers/SelectValueCollector.d.ts +2 -4
- package/dist/transformers/SelectValueCollector.js +10 -15
- package/dist/transformers/SelectValueCollector.js.map +1 -1
- package/dist/transformers/SelectableColumnCollector.d.ts +3 -3
- package/dist/transformers/SelectableColumnCollector.js +6 -9
- package/dist/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/transformers/UpstreamSelectQueryFinder.d.ts +2 -2
- package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/utils/extractNamespacesAndName.d.ts +5 -0
- package/dist/utils/extractNamespacesAndName.js +18 -0
- package/dist/utils/extractNamespacesAndName.js.map +1 -0
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.d.ts +9 -0
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js +42 -0
- package/dist/utils/parseEscapedOrDotSeparatedIdentifiers.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
@@ -10,7 +10,8 @@
|
|
10
10
|
|
11
11
|
rawsql-ts is a high-performance SQL parser and AST transformer library written in TypeScript. It is designed for extensibility and advanced SQL analysis, with initial focus on PostgreSQL syntax but not limited to it. The library enables easy SQL parsing, transformation, and analysis for a wide range of SQL dialects.
|
12
12
|
|
13
|
-
>
|
13
|
+
> [!Note]
|
14
|
+
> This library is currently in beta. The API may change until the v1.0 release.
|
14
15
|
|
15
16
|
---
|
16
17
|
|
@@ -70,18 +71,113 @@ console.log(formattedSql);
|
|
70
71
|
|
71
72
|
---
|
72
73
|
|
74
|
+
## Formatter Functionality
|
75
|
+
|
76
|
+
The `Formatter` class in rawsql-ts converts a parsed query object (AST) back into a formatted SQL string. This is useful for programmatically manipulating SQL and then generating a string for execution or display.
|
77
|
+
|
78
|
+
### Preset Configurations (Formatter.PRESETS)
|
79
|
+
|
80
|
+
The `Formatter` class provides preset configurations for common SQL dialects. Use these presets to quickly format queries for MySQL, PostgreSQL, SQL Server, or SQLite without manually specifying options each time.
|
81
|
+
|
82
|
+
```typescript
|
83
|
+
const mysqlSql = formatter.format(query, Formatter.PRESETS.mysql);
|
84
|
+
const pgSql = formatter.format(query, Formatter.PRESETS.postgres);
|
85
|
+
const mssqlSql = formatter.format(query, Formatter.PRESETS.sqlserver);
|
86
|
+
const sqliteSql = formatter.format(query, Formatter.PRESETS.sqlite);
|
87
|
+
```
|
88
|
+
|
89
|
+
**Preset Details:**
|
90
|
+
- `Formatter.PRESETS.mysql`: Backtick identifier, `?` parameter, no named parameters
|
91
|
+
- `Formatter.PRESETS.postgres`: Double quote identifier, `:` parameter, named parameters supported
|
92
|
+
- `Formatter.PRESETS.sqlserver`: Square bracket identifier, `@` parameter, named parameters supported
|
93
|
+
- `Formatter.PRESETS.sqlite`: Double quote identifier, `:` parameter, named parameters supported
|
94
|
+
|
95
|
+
### How to Customize Presets
|
96
|
+
|
97
|
+
You can override any preset option as needed. For example, to use variable-style parameters (`${name}`):
|
98
|
+
|
99
|
+
```typescript
|
100
|
+
const variableSql = formatter.format(query, {
|
101
|
+
...Formatter.PRESETS.postgres,
|
102
|
+
parameterSymbol: { start: '${', end: '}' },
|
103
|
+
});
|
104
|
+
// => select "user_id", "name" from "users" where "active" = ${active}
|
105
|
+
```
|
106
|
+
|
107
|
+
Or to change only the identifier escape style:
|
108
|
+
|
109
|
+
```typescript
|
110
|
+
const customSql = formatter.format(query, {
|
111
|
+
...Formatter.PRESETS.mysql,
|
112
|
+
identifierEscape: { start: '"', end: '"' }
|
113
|
+
});
|
114
|
+
```
|
115
|
+
|
116
|
+
### Configurable Options
|
117
|
+
|
118
|
+
Formatting options are provided as the second argument to the `format()` method. You can customize:
|
119
|
+
- `identifierEscape`: How identifiers are escaped (e.g., `"`, `[`, `` ` ``)
|
120
|
+
- `parameterSymbol`: The symbol or pattern for parameters (e.g., `:`, `@`, `?`, or `{ start: '${', end: '}' }`)
|
121
|
+
- `supportNamedParameter`: If false, parameter names are omitted (for MySQL-style `?` only)
|
122
|
+
|
123
|
+
### Usage Example
|
124
|
+
|
125
|
+
#### Using a Preset
|
126
|
+
|
127
|
+
```typescript
|
128
|
+
import { SelectQueryParser, Formatter } from 'rawsql-ts';
|
129
|
+
|
130
|
+
const sql = `SELECT user_id, name FROM users WHERE active = TRUE`;
|
131
|
+
const query = SelectQueryParser.parse(sql);
|
132
|
+
const formatter = new Formatter();
|
133
|
+
const formattedSql = formatter.format(query, Formatter.PRESETS.postgres);
|
134
|
+
console.log(formattedSql);
|
135
|
+
// => select "user_id", "name" from "users" where "active" = true
|
136
|
+
```
|
137
|
+
|
138
|
+
#### Using Manual Configuration
|
139
|
+
|
140
|
+
```typescript
|
141
|
+
import { SelectQueryParser, Formatter } from 'rawsql-ts';
|
142
|
+
|
143
|
+
const sql = `SELECT user_id, name FROM users WHERE active = TRUE`;
|
144
|
+
const query = SelectQueryParser.parse(sql);
|
145
|
+
const formatter = new Formatter();
|
146
|
+
const formattedSql = formatter.format(query, {
|
147
|
+
identifierEscape: { start: '`', end: '`' },
|
148
|
+
parameterSymbol: '?',
|
149
|
+
supportNamedParameter: false,
|
150
|
+
});
|
151
|
+
console.log(formattedSql);
|
152
|
+
// => select `user_id`, `name` from `users` where `active` = ?
|
153
|
+
```
|
154
|
+
|
155
|
+
rawsql-ts is designed to be flexible and support various SQL dialects. The `Formatter` class can be customized to handle different dialects by adjusting the identifier escape characters, parameter symbols, and named parameter support. This makes it easy to work with SQL queries for different database systems using a consistent API.
|
156
|
+
|
157
|
+
---
|
158
|
+
|
73
159
|
## Main Parser Features
|
74
160
|
|
161
|
+
- All parsers automatically remove SQL comments before parsing.
|
162
|
+
- Detailed error messages are provided for all parsing errors.
|
163
|
+
- Highly accurate and advanced tokenization is used for robust SQL analysis.
|
164
|
+
|
165
|
+
> [!Note]
|
166
|
+
> All parsers in rawsql-ts have been tested with PostgreSQL syntax, but they are capable of parsing any generic SQL statement that does not use a DBMS-specific dialect.
|
167
|
+
|
75
168
|
- **SelectQueryParser**
|
76
|
-
The main class for converting SELECT and VALUES statements into AST. Fully supports CTEs (WITH), UNION/INTERSECT/EXCEPT, subqueries, and PostgreSQL-
|
169
|
+
The main class for converting SELECT and VALUES statements into AST. Fully supports CTEs (WITH), UNION/INTERSECT/EXCEPT, subqueries, and PostgreSQL-style syntax.
|
77
170
|
- `parse(sql: string): SelectQuery`
|
78
171
|
Converts a SQL string to an AST. Throws an exception on error.
|
79
|
-
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
172
|
+
- In this library, a "select query" is represented as one of the following types:
|
173
|
+
- `SimpleSelectQuery`: A standard SELECT statement with all major clauses (WHERE, GROUP BY, JOIN, etc.)
|
174
|
+
- `BinarySelectQuery`: A set operation query such as UNION, INTERSECT, or EXCEPT
|
175
|
+
- `ValuesQuery`: An inline VALUES table (e.g., `VALUES (1, 'a'), (2, 'b')`)
|
176
|
+
|
177
|
+
- **InsertQueryParser**
|
178
|
+
The main class for parsing `INSERT INTO` statements and converting them into AST. Supports PostgreSQL-style INSERT with or without column lists, as well as `INSERT ... SELECT` and `INSERT ... VALUES` forms.
|
179
|
+
- `parse(sql: string): InsertQuery`
|
180
|
+
Converts an INSERT SQL string to an AST. Throws an exception on error.
|
85
181
|
|
86
182
|
---
|
87
183
|
|
@@ -91,6 +187,8 @@ console.log(formattedSql);
|
|
91
187
|
Represents a standard SELECT statement. Supports all major clauses such as WHERE, GROUP BY, JOIN, and CTE.
|
92
188
|
- `toUnion`, `toUnionAll`, ... for UNION operations
|
93
189
|
- `appendWhere`, `appendWhereRaw` to add WHERE conditions
|
190
|
+
- `appendWhereExpr` to add a WHERE condition using the column's SQL expression (see below)
|
191
|
+
- `overrideSelectItemExpr` to override a SELECT item using its SQL expression (see below)
|
94
192
|
- `innerJoin`, `leftJoin`, ... to add JOINs
|
95
193
|
- `toSource` to wrap as a subquery
|
96
194
|
- `appendWith`, `appendWithRaw` to add CTEs
|
@@ -104,6 +202,126 @@ console.log(formattedSql);
|
|
104
202
|
- **ValuesQuery**
|
105
203
|
For inline tables like `VALUES (1, 'a'), (2, 'b')`.
|
106
204
|
- Can be used as a subquery or converted to SELECT with QueryNormalizer
|
205
|
+
---
|
206
|
+
|
207
|
+
## Advanced Expression-based Methods
|
208
|
+
|
209
|
+
### appendWhereExpr
|
210
|
+
`appendWhereExpr` is a highly important feature that enables you to add WHERE conditions using the SQL expression of a column, regardless of whether it is a direct column, an alias, a table alias, or even a calculated expression.
|
211
|
+
|
212
|
+
- **Basic Column**
|
213
|
+
- SQL: `select amount from sales`
|
214
|
+
- API: `query.appendWhereExpr('amount', expr => `${expr} > 100`)`
|
215
|
+
- Result: `where amount > 100`
|
216
|
+
|
217
|
+
- **Alias**
|
218
|
+
- SQL: `select fee as amount from sales`
|
219
|
+
- API: `query.appendWhereExpr('amount', expr => `${expr} > 100`)`
|
220
|
+
- Result: `where fee > 100`
|
221
|
+
|
222
|
+
- **Table Alias**
|
223
|
+
- SQL: `select s.fee as amount from sales as s`
|
224
|
+
- API: `query.appendWhereExpr('amount', expr => `${expr} > 100`)`
|
225
|
+
- Result: `where s.fee > 100`
|
226
|
+
|
227
|
+
- **Expression**
|
228
|
+
- SQL: `select quantity * pack_size as amount from sales`
|
229
|
+
- API: `query.appendWhereExpr('amount', expr => `${expr} > 100`)`
|
230
|
+
- Result: `where quantity * pack_size > 100`
|
231
|
+
|
232
|
+
As long as the column is named (or aliased) as `amount`, `appendWhereExpr` will detect and use the correct SQL expression for the WHERE clause—even if it is a complex calculation or uses table aliases.
|
233
|
+
|
234
|
+
```typescript
|
235
|
+
// Works for any alias, table alias, or expression!
|
236
|
+
query.appendWhereExpr('amount', expr => `${expr} > 100`);
|
237
|
+
```
|
238
|
+
|
239
|
+
#### Upstream Query Support
|
240
|
+
|
241
|
+
`Upstream Query Support` is a powerful extension of `appendWhereExpr` that allows you to add WHERE conditions to all relevant upstream queries that provide a specific column, regardless of the query structure. This means you can target columns defined in subqueries, CTEs (WITH clauses), or even branches of UNION/INTERSECT/EXCEPT, and the condition will be automatically inserted at the correct place in the SQL tree.
|
242
|
+
|
243
|
+
**What does this mean in practice?**
|
244
|
+
- If the column is defined in a subquery, the WHERE condition is added inside that subquery.
|
245
|
+
- If the column is defined in a CTE (WITH clause), the WHERE condition is added inside the CTE.
|
246
|
+
- If the column is provided by multiple upstream queries (e.g., UNION branches), the condition is added to all relevant branches.
|
247
|
+
- You do not need to know or traverse the query structure yourself—just specify the column name, and `appendWhereExpr` with `{ upstream: true }` will do the rest.
|
248
|
+
|
249
|
+
##### Example: Filtering a CTE
|
250
|
+
|
251
|
+
```typescript
|
252
|
+
const query = SelectQueryParser.parse(`
|
253
|
+
WITH temp_sales AS (
|
254
|
+
SELECT id, amount, date FROM sales WHERE date >= '2024-01-01'
|
255
|
+
)
|
256
|
+
SELECT * FROM temp_sales
|
257
|
+
`) as SimpleSelectQuery;
|
258
|
+
|
259
|
+
// Add a filter to the CTE using upstream support
|
260
|
+
query.appendWhereExpr('amount', expr => `${expr} > 100`, { upstream: true });
|
261
|
+
|
262
|
+
const sql = new Formatter().format(query);
|
263
|
+
console.log(sql);
|
264
|
+
// => with "temp_sales" as (select "id", "amount", "date" from "sales" where "date" >= '2024-01-01' and "amount" > 100) select * from "temp_sales"
|
265
|
+
```
|
266
|
+
|
267
|
+
##### Example: Filtering All Branches of a UNION
|
268
|
+
|
269
|
+
```typescript
|
270
|
+
const query = SelectQueryParser.parse(`
|
271
|
+
WITH sales_transactions AS (
|
272
|
+
SELECT transaction_id, customer_id, amount, transaction_date FROM sales_schema.transactions WHERE transaction_date >= CURRENT_DATE - INTERVAL '90 days'
|
273
|
+
),
|
274
|
+
support_transactions AS (
|
275
|
+
SELECT support_id AS transaction_id, user_id AS customer_id, fee AS amount, support_date AS transaction_date FROM support_schema.support_fees WHERE support_date >= CURRENT_DATE - INTERVAL '90 days'
|
276
|
+
)
|
277
|
+
SELECT * FROM (
|
278
|
+
SELECT * FROM sales_transactions
|
279
|
+
UNION ALL
|
280
|
+
SELECT * FROM support_transactions
|
281
|
+
) d
|
282
|
+
ORDER BY transaction_date DESC
|
283
|
+
`) as SimpleSelectQuery;
|
284
|
+
|
285
|
+
// Add a filter to all upstream queries that provide 'amount'
|
286
|
+
query.appendWhereExpr('amount', expr => `${expr} > 100`, { upstream: true });
|
287
|
+
|
288
|
+
const sql = new Formatter().format(query);
|
289
|
+
console.log(sql);
|
290
|
+
// => with "sales_transactions" as (select ... where ... and "amount" > 100),
|
291
|
+
// "support_transactions" as (select ... where ... and "fee" > 100)
|
292
|
+
// select * from (... union all ...) as "d" order by "transaction_date" desc
|
293
|
+
```
|
294
|
+
|
295
|
+
### appendWhereExpr Use Cases
|
296
|
+
|
297
|
+
`appendWhereExpr` is especially useful in the following scenarios:
|
298
|
+
|
299
|
+
- **Dynamic Search Conditions for Complex Reports**
|
300
|
+
Easily inject arbitrary search filters into deeply nested or highly complex queries, such as those used in reporting or analytics dashboards. This enables flexible, user-driven filtering without manual SQL string manipulation.
|
301
|
+
|
302
|
+
- **Performance-Critical Query Construction**
|
303
|
+
Build high-performance queries by programmatically adding WHERE conditions only when needed, ensuring that unnecessary filters are not included and that the generated SQL remains as efficient as possible.
|
304
|
+
|
305
|
+
- **Generic Access Control and Security Filters**
|
306
|
+
Apply reusable access control or security-related WHERE clauses (e.g., tenant isolation, user-based restrictions) across all relevant queries, regardless of their internal structure. This helps enforce consistent data access policies throughout your application.
|
307
|
+
|
308
|
+
> [!TIP]
|
309
|
+
> Upstream Query Support is especially useful for large, complex SQL with multiple layers of subqueries, CTEs, or set operations. You can add filters or conditions without worrying about the internal structure—just specify the column name!
|
310
|
+
>
|
311
|
+
> You can focus on developing and maintaining RawSQL itself, without being bothered by troublesome variable search conditions.
|
312
|
+
|
313
|
+
---
|
314
|
+
|
315
|
+
### overrideSelectItemExpr
|
316
|
+
Overrides a SELECT item using its SQL expression. The callback receives the original SQL expression as a string and returns a new SQL string.
|
317
|
+
|
318
|
+
```typescript
|
319
|
+
// Override the SELECT item 'journal_date' to use greatest(journal_date, DATE '2025-01-01')
|
320
|
+
query.overrideSelectItemExpr('journal_date', expr => `greatest(${expr}, DATE '2025-01-01')`);
|
321
|
+
```
|
322
|
+
---
|
323
|
+
|
324
|
+
|
107
325
|
|
108
326
|
---
|
109
327
|
|
@@ -129,6 +347,11 @@ A suite of utilities for transforming and analyzing SQL ASTs.
|
|
129
347
|
Consolidates all CTEs into a single root-level WITH clause. Throws an error if duplicate CTE names with different definitions are found.
|
130
348
|
- **QueryNormalizer**
|
131
349
|
Converts any SELECT/UNION/VALUES query into a standard SimpleSelectQuery. Handles subquery wrapping and automatic column name generation.
|
350
|
+
- **QueryConverter**
|
351
|
+
Converts any SELECT/UNION/VALUES query into a standard SimpleSelectQuery. Handles subquery wrapping and automatic column name generation.
|
352
|
+
Supports CREATE TABLE ... AS SELECT ... conversion:
|
353
|
+
- `QueryConverter.toCreateTableQuery(query, tableName, isTemporary?)` creates a `CreateTableQuery` from any SELECT query.
|
354
|
+
|
132
355
|
- **TableColumnResolver**
|
133
356
|
A function type for resolving column names from a table name, mainly used for wildcard expansion (e.g., `table.*`). Used by analyzers like SelectValueCollector.
|
134
357
|
```typescript
|
@@ -169,7 +392,9 @@ Select values:
|
|
169
392
|
name: user_name, value: "u"."user_name"
|
170
393
|
name: email, value: "u"."email"
|
171
394
|
*/
|
395
|
+
```
|
172
396
|
|
397
|
+
```typescript
|
173
398
|
// Collects selectable columns from the FROM/JOIN clauses.
|
174
399
|
// You can get accurate information by specifying a TableColumnResolver.
|
175
400
|
// If omitted, the information will be inferred from the query content.
|
@@ -190,7 +415,25 @@ Selectable columns:
|
|
190
415
|
name: title, value: "p"."title"
|
191
416
|
name: content, value: "p"."content"
|
192
417
|
*/
|
418
|
+
```
|
419
|
+
|
420
|
+
```typescript
|
421
|
+
// Create Table from SELECT Example
|
422
|
+
import { QueryConverter, SelectQueryParser, Formatter } from 'rawsql-ts';
|
423
|
+
|
424
|
+
const select = SelectQueryParser.parse('SELECT id, name FROM users');
|
425
|
+
const create = QueryConverter.toCreateTableQuery(select, 'my_table');
|
426
|
+
const sqlCreate = new Formatter().format(create);
|
427
|
+
console.log(sqlCreate);
|
428
|
+
// => create table "my_table" as select "id", "name" from "users"
|
429
|
+
|
430
|
+
const createTemp = QueryConverter.toCreateTableQuery(select, 'tmp_table', true);
|
431
|
+
const sqlTemp = new Formatter().format(createTemp);
|
432
|
+
console.log(sqlTemp);
|
433
|
+
// => create temporary table "tmp_table" as select "id", "name" from "users"
|
434
|
+
```
|
193
435
|
|
436
|
+
```typescript
|
194
437
|
// Retrieves physical table sources.
|
195
438
|
const tableSourceCollector = new TableSourceCollector();
|
196
439
|
const sources = tableSourceCollector.collect(query);
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,oEAAoE"}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,oEAAoE"}
|
@@ -1,10 +1,10 @@
|
|
1
1
|
import { SqlComponent } from "./SqlComponent";
|
2
2
|
import { IdentifierString, RawString } from "./ValueComponent";
|
3
3
|
export class SelectItem extends SqlComponent {
|
4
|
-
constructor(value, name) {
|
4
|
+
constructor(value, name = null) {
|
5
5
|
super();
|
6
6
|
this.value = value;
|
7
|
-
this.identifier = new IdentifierString(name);
|
7
|
+
this.identifier = name ? new IdentifierString(name) : null;
|
8
8
|
}
|
9
9
|
}
|
10
10
|
SelectItem.kind = Symbol("SelectItem");
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Clause.js","sourceRoot":"","sources":["../../../src/models/Clause.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAA0D,MAAM,kBAAkB,CAAC;
|
1
|
+
{"version":3,"file":"Clause.js","sourceRoot":"","sources":["../../../src/models/Clause.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
import { SqlComponent } from "./SqlComponent";
|
2
|
+
import { ColumnReference, FunctionCall, IdentifierString, RawString } from "./ValueComponent";
|
3
|
+
import { SimpleSelectQuery } from "./SimpleSelectQuery";
|
4
|
+
import { SelectClause, SelectItem, FromClause, TableSource, SourceExpression } from "./Clause";
|
5
|
+
import { SelectValueCollector } from "../transformers/SelectValueCollector";
|
6
|
+
// Represents a CREATE TABLE query model
|
7
|
+
// Supports temporary tables and AS SELECT ...
|
8
|
+
export class CreateTableQuery extends SqlComponent {
|
9
|
+
constructor(params) {
|
10
|
+
var _a;
|
11
|
+
super();
|
12
|
+
this.tableName = new IdentifierString(params.tableName);
|
13
|
+
this.isTemporary = (_a = params.isTemporary) !== null && _a !== void 0 ? _a : false;
|
14
|
+
this.asSelectQuery = params.asSelectQuery;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Returns a SelectQuery that selects all columns from this table.
|
18
|
+
*/
|
19
|
+
getSelectQuery() {
|
20
|
+
let selectItems;
|
21
|
+
if (this.asSelectQuery) {
|
22
|
+
// Use SelectValueCollector to get columns from asSelectQuery
|
23
|
+
const collector = new SelectValueCollector();
|
24
|
+
const values = collector.collect(this.asSelectQuery);
|
25
|
+
selectItems = values.map(val => new SelectItem(val.value, val.name));
|
26
|
+
}
|
27
|
+
else {
|
28
|
+
// fallback: wildcard
|
29
|
+
selectItems = [new SelectItem(new RawString("*"))];
|
30
|
+
}
|
31
|
+
return new SimpleSelectQuery(null, // withClause
|
32
|
+
new SelectClause(selectItems), new FromClause(new SourceExpression(new TableSource(null, this.tableName.name), null), null // joins
|
33
|
+
), null, // whereClause
|
34
|
+
null, // groupByClause
|
35
|
+
null, // havingClause
|
36
|
+
null, // orderByClause
|
37
|
+
null, // windowFrameClause
|
38
|
+
null, // rowLimitClause
|
39
|
+
null // forClause
|
40
|
+
);
|
41
|
+
}
|
42
|
+
/**
|
43
|
+
* Returns a SelectQuery that counts all rows in this table.
|
44
|
+
*/
|
45
|
+
getCountQuery() {
|
46
|
+
return new SimpleSelectQuery(null, // withClause
|
47
|
+
new SelectClause([
|
48
|
+
new SelectItem(new FunctionCall("count", new ColumnReference(null, "*"), null))
|
49
|
+
]), new FromClause(new SourceExpression(new TableSource(null, this.tableName.name), null), null // joins
|
50
|
+
), null, // whereClause
|
51
|
+
null, // groupByClause
|
52
|
+
null, // havingClause
|
53
|
+
null, // orderByClause
|
54
|
+
null, // windowFrameClause
|
55
|
+
null, // rowLimitClause
|
56
|
+
null // forClause
|
57
|
+
);
|
58
|
+
}
|
59
|
+
}
|
60
|
+
/** SqlComponent kind symbol for visitor pattern */
|
61
|
+
CreateTableQuery.kind = Symbol("CreateTableQuery");
|
62
|
+
//# sourceMappingURL=CreateTableQuery.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CreateTableQuery.js","sourceRoot":"","sources":["../../../src/models/CreateTableQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,wCAAwC;AACxC,8CAA8C;AAC9C,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAU9C,YAAY,MAIX;;QACG,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,KAAK,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,WAAyB,CAAC;QAC9B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,6DAA6D;YAC7D,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrD,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACJ,qBAAqB;YACrB,WAAW,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,iBAAiB,CACxB,IAAI,EAAE,aAAa;QACnB,IAAI,YAAY,CAAC,WAAW,CAAC,EAC7B,IAAI,UAAU,CACV,IAAI,gBAAgB,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAC1C,IAAI,CACP,EACD,IAAI,CAAC,QAAQ;SAChB,EACD,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,IAAI,CAAE,YAAY;SACrB,CAAC;IACN,CAAC;IAED;;OAEG;IACH,aAAa;QACT,OAAO,IAAI,iBAAiB,CACxB,IAAI,EAAE,aAAa;QACnB,IAAI,YAAY,CAAC;YACb,IAAI,UAAU,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;SAClF,CAAC,EACF,IAAI,UAAU,CACV,IAAI,gBAAgB,CAChB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAC1C,IAAI,CACP,EACD,IAAI,CAAC,QAAQ;SAChB,EACD,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,iBAAiB;QACvB,IAAI,CAAE,YAAY;SACrB,CAAC;IACN,CAAC;;AA9ED,mDAAmD;AAC5C,qBAAI,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
// filepath: src/models/InsertQuery.ts
|
2
|
+
// Represents an INSERT query in SQL.
|
3
|
+
// Supports single/multi-row VALUES and INSERT ... SELECT.
|
4
|
+
import { SqlComponent } from "./SqlComponent";
|
5
|
+
import { IdentifierString } from "./ValueComponent";
|
6
|
+
export class InsertQuery extends SqlComponent {
|
7
|
+
/**
|
8
|
+
* @param params.table Table name (string or IdentifierString)
|
9
|
+
* @param params.columns Array of column names (string[] or IdentifierString[])
|
10
|
+
* @param params.selectQuery SELECT/VALUES query (required)
|
11
|
+
*/
|
12
|
+
constructor(params) {
|
13
|
+
var _a;
|
14
|
+
super();
|
15
|
+
this.namespaces = params.namespaces
|
16
|
+
? params.namespaces.map(ns => typeof ns === "string" ? new IdentifierString(ns) : ns)
|
17
|
+
: null;
|
18
|
+
this.table = typeof params.table === "string" ? new IdentifierString(params.table) : params.table;
|
19
|
+
this.columns = params.columns.map(c => typeof c === "string" ? new IdentifierString(c) : c);
|
20
|
+
this.selectQuery = (_a = params.selectQuery) !== null && _a !== void 0 ? _a : null;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
InsertQuery.kind = Symbol("InsertQuery");
|
24
|
+
//# sourceMappingURL=InsertQuery.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"InsertQuery.js","sourceRoot":"","sources":["../../../src/models/InsertQuery.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,qCAAqC;AACrC,0DAA0D;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAkB,MAAM,kBAAkB,CAAC;AAGpE,MAAM,OAAO,WAAY,SAAQ,YAAY;IAOzC;;;;OAIG;IACH,YAAY,MAKX;;QACG,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU;YAC/B,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,CAAC,CAAC,IAAI,CAAC;QACX,IAAI,CAAC,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAClG,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,CAAC,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,IAAI,CAAC;IAClD,CAAC;;AAxBM,gBAAI,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC"}
|
@@ -1,18 +1,19 @@
|
|
1
1
|
export var TokenType;
|
2
2
|
(function (TokenType) {
|
3
|
-
TokenType[TokenType["
|
4
|
-
TokenType[TokenType["
|
5
|
-
TokenType[TokenType["
|
6
|
-
TokenType[TokenType["
|
7
|
-
TokenType[TokenType["
|
8
|
-
TokenType[TokenType["
|
9
|
-
TokenType[TokenType["
|
10
|
-
TokenType[TokenType["
|
11
|
-
TokenType[TokenType["
|
12
|
-
TokenType[TokenType["
|
13
|
-
TokenType[TokenType["
|
14
|
-
TokenType[TokenType["
|
15
|
-
TokenType[TokenType["
|
16
|
-
TokenType[TokenType["
|
3
|
+
TokenType[TokenType["None"] = 0] = "None";
|
4
|
+
TokenType[TokenType["Literal"] = 1] = "Literal";
|
5
|
+
TokenType[TokenType["Operator"] = 2] = "Operator";
|
6
|
+
TokenType[TokenType["OpenParen"] = 4] = "OpenParen";
|
7
|
+
TokenType[TokenType["CloseParen"] = 8] = "CloseParen";
|
8
|
+
TokenType[TokenType["Comma"] = 16] = "Comma";
|
9
|
+
TokenType[TokenType["Dot"] = 32] = "Dot";
|
10
|
+
TokenType[TokenType["Identifier"] = 64] = "Identifier";
|
11
|
+
TokenType[TokenType["Command"] = 128] = "Command";
|
12
|
+
TokenType[TokenType["Parameter"] = 256] = "Parameter";
|
13
|
+
TokenType[TokenType["OpenBracket"] = 512] = "OpenBracket";
|
14
|
+
TokenType[TokenType["CloseBracket"] = 1024] = "CloseBracket";
|
15
|
+
TokenType[TokenType["Function"] = 2048] = "Function";
|
16
|
+
TokenType[TokenType["StringSpecifier"] = 4096] = "StringSpecifier";
|
17
|
+
TokenType[TokenType["Type"] = 8192] = "Type";
|
17
18
|
})(TokenType || (TokenType = {}));
|
18
19
|
//# sourceMappingURL=Lexeme.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Lexeme.js","sourceRoot":"","sources":["../../../src/models/Lexeme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,
|
1
|
+
{"version":3,"file":"Lexeme.js","sourceRoot":"","sources":["../../../src/models/Lexeme.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAgBX;AAhBD,WAAY,SAAS;IACjB,yCAAQ,CAAA;IACR,+CAAgB,CAAA;IAChB,iDAAiB,CAAA;IACjB,mDAAkB,CAAA;IAClB,qDAAmB,CAAA;IACnB,4CAAc,CAAA;IACd,wCAAY,CAAA;IACZ,sDAAmB,CAAA;IACnB,iDAAgB,CAAA;IAChB,qDAAkB,CAAA;IAClB,yDAAoB,CAAA;IACpB,4DAAsB,CAAA;IACtB,oDAAkB,CAAA;IAClB,kEAAyB,CAAA;IACzB,4CAAc,CAAA;AAClB,CAAC,EAhBW,SAAS,KAAT,SAAS,QAgBpB"}
|
@@ -1,5 +1,6 @@
|
|
1
|
+
import { InsertQuery } from "./InsertQuery";
|
1
2
|
import { SimpleSelectQuery } from "./SimpleSelectQuery";
|
2
3
|
import { BinarySelectQuery } from "./BinarySelectQuery";
|
3
4
|
import { ValuesQuery } from "./ValuesQuery";
|
4
|
-
export { SimpleSelectQuery, BinarySelectQuery, ValuesQuery };
|
5
|
+
export { SimpleSelectQuery, BinarySelectQuery, ValuesQuery, InsertQuery };
|
5
6
|
//# sourceMappingURL=SelectQuery.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SelectQuery.js","sourceRoot":"","sources":["../../../src/models/SelectQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
|
1
|
+
{"version":3,"file":"SelectQuery.js","sourceRoot":"","sources":["../../../src/models/SelectQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
|