rawsql-ts 0.1.0-beta.10 → 0.1.0-beta.12
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 +165 -174
- 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 +380 -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 +304 -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 +81 -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 +70 -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/SelectValueCollector.d.ts +2 -4
- package/dist/transformers/SelectValueCollector.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 +17 -1
package/README.md
CHANGED
@@ -2,236 +2,223 @@
|
|
2
2
|
|
3
3
|

|
4
4
|
|
5
|
-
rawsql-ts is a
|
5
|
+
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.
|
6
6
|
|
7
|
-
> **Note:** This library is currently in beta. The API may change
|
7
|
+
> **Note:** This library is currently in beta. The API may change until the v1.0 release.
|
8
8
|
|
9
|
-
|
9
|
+
---
|
10
10
|
|
11
|
-
|
12
|
-
- High-performance SQL parsing and AST analysis
|
13
|
-
- Advanced SQL transformation utilities
|
14
|
-
- Designed for PostgreSQL syntax
|
11
|
+
💡 **Key Advantages**
|
15
12
|
|
16
|
-
|
13
|
+
With rawsql-ts, raw SQL can be represented as objects, enabling flexible manipulation of SQL statements directly within your program. Objectified SQL can be partially transformed, decomposed into manageable components, and recombined as needed. This approach dramatically improves the maintainability and reusability of complex SQL, making even large-scale queries easy to manage and refactor.
|
14
|
+
|
15
|
+
---
|
16
|
+
|
17
|
+
## Features
|
18
|
+
|
19
|
+
- Zero dependencies: fully self-contained and lightweight
|
20
|
+
- High-speed SQL parsing and AST analysis
|
21
|
+
- Rich utilities for SQL structure transformation and analysis
|
22
|
+
|
23
|
+
## ✨ Browser & CDN Ready!
|
24
|
+
|
25
|
+
You can use rawsql-ts directly in modern browsers via CDN (unpkg/jsdelivr)!
|
26
|
+
No Node.js dependencies, no build tools required.
|
27
|
+
Just import it like this:
|
28
|
+
|
29
|
+
```html
|
30
|
+
<!-- Always get the latest version -->
|
31
|
+
<script type="module">
|
32
|
+
import { parse } from "https://unpkg.com/rawsql-ts/dist/esm/index.js";
|
33
|
+
</script>
|
34
|
+
```
|
35
|
+
|
36
|
+
```html
|
37
|
+
<!-- Pin a specific version for stability -->
|
38
|
+
<script type="module">
|
39
|
+
import { parse } from "https://unpkg.com/rawsql-ts@0.1.0-beta.12/dist/esm/index.js";
|
40
|
+
</script>
|
41
|
+
```
|
42
|
+
|
43
|
+
---
|
17
44
|
|
18
|
-
|
45
|
+
## Installation
|
19
46
|
|
20
47
|
```bash
|
21
48
|
npm install rawsql-ts
|
22
49
|
```
|
23
50
|
|
24
|
-
##
|
25
|
-
|
26
|
-
Basic usage example:
|
51
|
+
## Quick Start
|
27
52
|
|
28
53
|
```typescript
|
29
|
-
import { SelectQueryParser } from 'rawsql-ts';
|
30
|
-
import { Formatter } from 'rawsql-ts';
|
54
|
+
import { SelectQueryParser, Formatter } from 'rawsql-ts';
|
31
55
|
|
32
|
-
const sql = `SELECT
|
56
|
+
const sql = `SELECT user_id, name FROM users WHERE active = TRUE`;
|
33
57
|
const query = SelectQueryParser.parse(sql);
|
34
58
|
const formatter = new Formatter();
|
35
59
|
const formattedSql = formatter.format(query);
|
60
|
+
|
36
61
|
console.log(formattedSql);
|
37
|
-
// => select "
|
62
|
+
// => select "user_id", "name" from "users" where "active" = true
|
38
63
|
```
|
39
64
|
|
40
65
|
---
|
41
66
|
|
42
|
-
##
|
43
|
-
|
44
|
-
rawsql-ts provides the following main parser class for converting SQL text into an Abstract Syntax Tree (AST):
|
67
|
+
## Main Parser Features
|
45
68
|
|
46
69
|
- **SelectQueryParser**
|
47
|
-
|
48
|
-
|
49
|
-
**Key methods:**
|
70
|
+
The main class for converting SELECT and VALUES statements into AST. Fully supports CTEs (WITH), UNION/INTERSECT/EXCEPT, subqueries, and PostgreSQL-specific syntax.
|
50
71
|
- `parse(sql: string): SelectQuery`
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
|
58
|
-
This class is designed to handle all practical SQL parsing needs for SELECT/VALUES queries in PostgreSQL, including:
|
59
|
-
- CTEs (WITH), including recursive and materialized options
|
60
|
-
- UNION, INTERSECT, EXCEPT, and subqueries
|
61
|
-
- Window functions and analytic clauses
|
62
|
-
- Complex expressions, functions, and operators
|
63
|
-
- Robust error handling with detailed messages
|
64
|
-
- Accurate tokenization, including comments and special literals
|
72
|
+
Converts a SQL string to an AST. Throws an exception on error.
|
73
|
+
- Supports only PostgreSQL syntax
|
74
|
+
- Only SELECT and VALUES are supported (INSERT/UPDATE/DELETE are not yet implemented)
|
75
|
+
- SQL comments are automatically removed
|
76
|
+
- Handles CTEs (WITH), UNION/INTERSECT/EXCEPT, subqueries, window functions, complex expressions, and functions
|
77
|
+
- Provides detailed error messages
|
78
|
+
- Highly accurate tokenization
|
65
79
|
|
66
80
|
---
|
67
81
|
|
68
82
|
## Core SQL Query Classes
|
69
83
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
- `toUnion`, `toUnionAll`, `toIntersect`, `toExcept`, etc.
|
78
|
-
- Combine this query with another using UNION, INTERSECT, EXCEPT, etc., returning a BinarySelectQuery.
|
79
|
-
- `appendWhere`, `appendWhereRaw`
|
80
|
-
- Add a new condition to the WHERE clause (as AST or raw SQL string).
|
81
|
-
- `appendHaving`, `appendHavingRaw`
|
82
|
-
- Add a new condition to the HAVING clause.
|
83
|
-
- `innerJoin`, `leftJoin`, `rightJoin`, `innerJoinRaw`, etc.
|
84
|
-
- Add JOIN clauses to the query, either as AST or from raw SQL.
|
85
|
-
- `toSource`
|
86
|
-
- Wrap this query as a subquery (for use in FROM/JOIN, etc.).
|
87
|
-
- `appendWith`, `appendWithRaw`
|
88
|
-
- Add CTEs (WITH clause) to the query.
|
89
|
-
|
90
|
-
### BinarySelectQuery
|
91
|
-
|
92
|
-
Represents a binary SQL query, such as `SELECT ... UNION SELECT ...`, `INTERSECT`, or `EXCEPT`. This class holds a left and right query and the operator between them.
|
93
|
-
|
94
|
-
**Key methods:**
|
95
|
-
- `union`, `unionAll`, `intersect`, `intersectAll`, `except`, `exceptAll`
|
96
|
-
- Chain additional queries to the current binary query.
|
97
|
-
- `appendSelectQuery`
|
98
|
-
- Add a new query with a custom operator.
|
99
|
-
- `toSource`
|
100
|
-
- Wrap this binary query as a subquery (for use in FROM/JOIN, etc.).
|
101
|
-
- `unionRaw`, `intersectRaw`, etc.
|
102
|
-
- Add a new query by parsing a raw SQL string and combining it.
|
84
|
+
- **SimpleSelectQuery**
|
85
|
+
Represents a standard SELECT statement. Supports all major clauses such as WHERE, GROUP BY, JOIN, and CTE.
|
86
|
+
- `toUnion`, `toUnionAll`, ... for UNION operations
|
87
|
+
- `appendWhere`, `appendWhereRaw` to add WHERE conditions
|
88
|
+
- `innerJoin`, `leftJoin`, ... to add JOINs
|
89
|
+
- `toSource` to wrap as a subquery
|
90
|
+
- `appendWith`, `appendWithRaw` to add CTEs
|
103
91
|
|
104
|
-
|
92
|
+
- **BinarySelectQuery**
|
93
|
+
Represents binary SQL queries such as UNION, INTERSECT, and EXCEPT.
|
94
|
+
- `union`, `intersect`, ... to combine queries
|
95
|
+
- `toSource` to wrap as a subquery
|
96
|
+
- `unionRaw`, ... to combine with raw SQL
|
105
97
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
- (Primarily the constructor and tuple access)
|
110
|
-
- This class can be used as a subquery source or wrapped with QueryNormalizer to convert it into a standard SELECT query.
|
98
|
+
- **ValuesQuery**
|
99
|
+
For inline tables like `VALUES (1, 'a'), (2, 'b')`.
|
100
|
+
- Can be used as a subquery or converted to SELECT with QueryNormalizer
|
111
101
|
|
112
102
|
---
|
113
103
|
|
114
|
-
|
115
|
-
|
116
|
-
---
|
104
|
+
## AST Transformer Features
|
117
105
|
|
118
|
-
|
119
|
-
|
120
|
-
rawsql-ts provides a suite of AST (Abstract Syntax Tree) transformers for advanced SQL analysis and manipulation. These utilities are intended for engineers who require programmatic extraction, analysis, or transformation of SQL query structures.
|
106
|
+
A suite of utilities for transforming and analyzing SQL ASTs.
|
121
107
|
|
122
108
|
### Main Transformers
|
123
109
|
|
124
110
|
- **Formatter**
|
125
|
-
Converts
|
126
|
-
**Note:** Output formatting is currently limited to single-line (compact) style.
|
127
|
-
|
111
|
+
Converts ASTs to formatted SQL strings. Handles identifier escaping. Output is currently single-line (compact) style.
|
128
112
|
- **SelectValueCollector**
|
129
|
-
Extracts all columns,
|
130
|
-
|
113
|
+
Extracts all columns, aliases, and expressions from SELECT clauses. Supports wildcard expansion (e.g., `*`, `table.*`) with TableColumnResolver.
|
131
114
|
- **SelectableColumnCollector**
|
132
|
-
Collects all
|
133
|
-
|
115
|
+
Collects all columns available from root FROM/JOIN sources.
|
134
116
|
- **TableSourceCollector**
|
135
|
-
Collects all table and subquery sources from
|
136
|
-
|
117
|
+
Collects all table and subquery sources from FROM and JOIN clauses.
|
137
118
|
- **CTECollector**
|
138
|
-
Collects all
|
139
|
-
|
119
|
+
Collects all CTEs from WITH clauses, subqueries, and UNION queries.
|
140
120
|
- **UpstreamSelectQueryFinder**
|
141
|
-
|
142
|
-
|
121
|
+
Finds upstream SELECT queries that provide specific columns by traversing CTEs, subqueries, and UNION branches.
|
143
122
|
- **CTENormalizer**
|
144
|
-
Consolidates all
|
145
|
-
|
123
|
+
Consolidates all CTEs into a single root-level WITH clause. Throws an error if duplicate CTE names with different definitions are found.
|
146
124
|
- **QueryNormalizer**
|
147
|
-
Converts any SELECT
|
125
|
+
Converts any SELECT/UNION/VALUES query into a standard SimpleSelectQuery. Handles subquery wrapping and automatic column name generation.
|
126
|
+
- **TableColumnResolver**
|
127
|
+
A function type for resolving column names from a table name, mainly used for wildcard expansion (e.g., `table.*`). Used by analyzers like SelectValueCollector.
|
128
|
+
```typescript
|
129
|
+
export type TableColumnResolver = (tableName: string) => string[];
|
130
|
+
```
|
148
131
|
|
149
|
-
---
|
132
|
+
---
|
150
133
|
|
151
|
-
|
134
|
+
## Usage Example
|
152
135
|
|
153
136
|
```typescript
|
137
|
+
import { TableColumnResolver } from "./src/transformers/TableColumnResolver";
|
154
138
|
import { SelectQueryParser } from 'rawsql-ts';
|
155
139
|
import { SelectableColumnCollector } from 'rawsql-ts/transformers/SelectableColumnCollector';
|
156
140
|
import { SelectValueCollector } from 'rawsql-ts/transformers/SelectValueCollector';
|
157
141
|
import { TableSourceCollector } from 'rawsql-ts/transformers/TableSourceCollector';
|
158
142
|
|
159
|
-
|
143
|
+
// TableColumnResolver example
|
144
|
+
const resolver: TableColumnResolver = (tableName) => {
|
145
|
+
if (tableName === "users") return ["id", "name", "email"];
|
146
|
+
if (tableName === "posts") return ["id", "title", "content"];
|
147
|
+
return [];
|
148
|
+
};
|
149
|
+
|
150
|
+
const sql = `SELECT u.* FROM users u JOIN posts p ON u.id = p.user_id`;
|
160
151
|
const query = SelectQueryParser.parse(sql);
|
161
152
|
|
162
|
-
//
|
153
|
+
// Wildcard expansion example
|
154
|
+
const selectValueCollector = new SelectValueCollector(resolver);
|
155
|
+
const selectValues = selectValueCollector.collect(query);
|
156
|
+
console.log(selectValues.map(val => val.alias || val.expression.toString()));
|
157
|
+
|
158
|
+
// Collect all selectable columns from FROM/JOIN sources
|
163
159
|
const selectableColumnCollector = new SelectableColumnCollector();
|
164
160
|
const selectableColumns = selectableColumnCollector.collect(query);
|
165
|
-
// ["id", "name", "user_id", ...]
|
166
161
|
console.log(selectableColumns.map(col => col.name));
|
167
162
|
|
168
|
-
//
|
169
|
-
const selectValueCollector = new SelectValueCollector();
|
170
|
-
const selectValues = selectValueCollector.collect(query);
|
171
|
-
// ["id", "name"]
|
172
|
-
console.log(selectValues.map(val => val.alias || val.expression.toString()));
|
173
|
-
|
174
|
-
// Collects all table and subquery sources from the FROM/JOIN clauses
|
163
|
+
// Collect all table and subquery sources from FROM/JOIN clauses
|
175
164
|
const tableSourceCollector = new TableSourceCollector();
|
176
165
|
const sources = tableSourceCollector.collect(query);
|
177
|
-
|
178
|
-
console.log(sources.map(src => src.alias || src.name));
|
166
|
+
console.log(sources.map(src => src.alias || src.name));
|
179
167
|
```
|
180
168
|
|
181
169
|
---
|
182
170
|
|
183
|
-
##
|
171
|
+
## Advanced Example: Table Join
|
184
172
|
|
185
|
-
|
173
|
+
This example demonstrates how to join two tables using rawsql-ts. You do not need to understand the internal structure or manage aliases manually. By specifying the join key(s), the ON clause is generated automatically.
|
186
174
|
|
187
175
|
```typescript
|
188
|
-
import { SelectQueryParser } from 'rawsql-ts';
|
189
|
-
|
176
|
+
import { SelectQueryParser, Formatter, SimpleSelectQuery } from 'rawsql-ts';
|
177
|
+
|
178
|
+
// Parse the base query
|
179
|
+
const query = SelectQueryParser.parse('SELECT u.user_id, u.name FROM users u') as SimpleSelectQuery;
|
190
180
|
|
191
|
-
//
|
192
|
-
|
193
|
-
const postQuery = SelectQueryParser.parse('SELECT post_id, user_id, title FROM posts');
|
181
|
+
// Add LEFT JOIN using the leftJoinRaw method (join on user_id)
|
182
|
+
query.leftJoinRaw('orders', 'o', ['user_id']);
|
194
183
|
|
195
|
-
//
|
196
|
-
|
197
|
-
const joinedQuery = userQuery.innerJoin(postQuery, ['user_id']);
|
184
|
+
// Add WHERE clause
|
185
|
+
query.appendWhereRaw('o.order_id IS NULL');
|
198
186
|
|
199
|
-
// Format the joined query back to SQL
|
200
187
|
const formatter = new Formatter();
|
201
|
-
const
|
202
|
-
|
203
|
-
|
204
|
-
// select "
|
188
|
+
const formattedSql = formatter.format(query);
|
189
|
+
|
190
|
+
console.log(formattedSql);
|
191
|
+
// => select "u"."user_id", "u"."name" from "users" as "u" left join "orders" as "o" on "u"."user_id" = "o"."user_id" where "o"."order_id" is null
|
205
192
|
```
|
206
193
|
|
207
194
|
**Key Points:**
|
208
|
-
-
|
209
|
-
-
|
210
|
-
-
|
211
|
-
-
|
195
|
+
- No need to understand internal implementation or alias management
|
196
|
+
- Specify only the join key(s) (e.g., `['user_id']`); the ON clause is generated automatically
|
197
|
+
- Subqueries and aliases are handled automatically
|
198
|
+
- You can join queries without detailed knowledge of SQL structure or AST internals
|
212
199
|
|
213
200
|
---
|
214
201
|
|
215
|
-
By utilizing these transformer utilities, you can perform advanced SQL analysis and manipulation with reliability and consistency.
|
216
|
-
|
217
202
|
## Benchmarks
|
218
203
|
|
219
|
-
This project includes
|
204
|
+
This project includes a comprehensive benchmark suite to evaluate the performance of `rawsql-ts` in comparison with other popular libraries such as `node-sql-parser` and `sql-formatter`.
|
205
|
+
|
206
|
+
### How to Run
|
220
207
|
|
221
208
|
```bash
|
222
209
|
npm run benchmark
|
223
210
|
```
|
224
211
|
|
225
|
-
|
212
|
+
### Benchmark Details
|
226
213
|
|
227
|
-
The benchmark suite
|
214
|
+
The benchmark suite measures SQL parsing and formatting speed across queries of varying complexity:
|
228
215
|
|
229
|
-
- **Tokens20**: Simple
|
230
|
-
- **Tokens70**: Medium complexity query with
|
231
|
-
- **Tokens140**: Complex query with
|
232
|
-
- **Tokens230**: Highly complex query with multiple
|
216
|
+
- **Tokens20**: Simple SELECT with a basic WHERE clause (~20 tokens)
|
217
|
+
- **Tokens70**: Medium complexity query with JOINs and multiple conditions (~70 tokens)
|
218
|
+
- **Tokens140**: Complex query with CTEs and aggregations (~140 tokens)
|
219
|
+
- **Tokens230**: Highly complex query with multiple CTEs, subqueries, and window functions (~230 tokens)
|
233
220
|
|
234
|
-
|
221
|
+
### Benchmark Environment
|
235
222
|
|
236
223
|
```
|
237
224
|
benchmark.js v2.1.4
|
@@ -240,42 +227,46 @@ AMD Ryzen 7 7800X3D (8C/16T)
|
|
240
227
|
Node.js v22.14.0
|
241
228
|
```
|
242
229
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
| Method
|
247
|
-
|
248
|
-
| rawsql-ts
|
249
|
-
| node-sql-parser
|
250
|
-
| sql-formatter
|
251
|
-
|
252
|
-
|
253
|
-
| Method
|
254
|
-
|
255
|
-
| rawsql-ts
|
256
|
-
| node-sql-parser
|
257
|
-
| sql-formatter
|
258
|
-
|
259
|
-
|
260
|
-
| Method
|
261
|
-
|
262
|
-
| rawsql-ts
|
263
|
-
| node-sql-parser
|
264
|
-
| sql-formatter
|
265
|
-
|
266
|
-
|
267
|
-
| Method
|
268
|
-
|
269
|
-
| rawsql-ts
|
270
|
-
| node-sql-parser
|
271
|
-
| sql-formatter
|
272
|
-
|
273
|
-
|
230
|
+
### Results
|
231
|
+
|
232
|
+
#### Tokens20
|
233
|
+
| Method | Mean | Error | StdDev |
|
234
|
+
|------------------|----------:|----------:|----------:|
|
235
|
+
| rawsql-ts | 0.021 ms | 0.0044 ms | 0.0023 ms |
|
236
|
+
| node-sql-parser | 0.169 ms | 0.0695 ms | 0.0355 ms |
|
237
|
+
| sql-formatter | 0.208 ms | 0.0556 ms | 0.0284 ms |
|
238
|
+
|
239
|
+
#### Tokens70
|
240
|
+
| Method | Mean | Error | StdDev |
|
241
|
+
|------------------|----------:|----------:|----------:|
|
242
|
+
| rawsql-ts | 0.057 ms | 0.0143 ms | 0.0073 ms |
|
243
|
+
| node-sql-parser | 0.216 ms | 0.0780 ms | 0.0398 ms |
|
244
|
+
| sql-formatter | 0.512 ms | 0.1251 ms | 0.0638 ms |
|
245
|
+
|
246
|
+
#### Tokens140
|
247
|
+
| Method | Mean | Error | StdDev |
|
248
|
+
|------------------|----------:|----------:|----------:|
|
249
|
+
| rawsql-ts | 0.112 ms | 0.0236 ms | 0.0120 ms |
|
250
|
+
| node-sql-parser | 0.404 ms | 0.0926 ms | 0.0472 ms |
|
251
|
+
| sql-formatter | 1.004 ms | 0.3027 ms | 0.1545 ms |
|
252
|
+
|
253
|
+
#### Tokens230
|
254
|
+
| Method | Mean | Error | StdDev |
|
255
|
+
|------------------|----------:|----------:|----------:|
|
256
|
+
| rawsql-ts | 0.182 ms | 0.0371 ms | 0.0189 ms |
|
257
|
+
| node-sql-parser | 0.865 ms | 0.3325 ms | 0.1696 ms |
|
258
|
+
| sql-formatter | 1.696 ms | 0.2754 ms | 0.1405 ms |
|
259
|
+
|
260
|
+
### Performance Summary
|
274
261
|
|
275
262
|
- `rawsql-ts` consistently outperforms both `node-sql-parser` and `sql-formatter` in all tested scenarios.
|
276
263
|
- Approximately 4x faster than `node-sql-parser`.
|
277
|
-
- Approximately 9
|
278
|
-
- Maintains
|
264
|
+
- Approximately 9–10x faster than `sql-formatter`.
|
265
|
+
- Maintains high performance even with complex SQL while providing comprehensive features.
|
266
|
+
|
267
|
+
> **Note:** These benchmarks are based on a specific hardware and software environment. Actual performance may vary depending on system configuration and query complexity.
|
268
|
+
|
269
|
+
---
|
279
270
|
|
280
|
-
|
271
|
+
Feel free to try rawsql-ts! Questions, requests, and bug reports are always welcome.
|
281
272
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
// Entry point for rawsql-ts package
|
2
|
+
export * from './parsers/SelectQueryParser';
|
3
|
+
export * from './models/BinarySelectQuery';
|
4
|
+
export * from './models/SelectQuery';
|
5
|
+
export * from './models/ValueComponent';
|
6
|
+
export * from './models/ValuesQuery';
|
7
|
+
export * from './transformers/CTECollector';
|
8
|
+
export * from './transformers/CTENormalizer';
|
9
|
+
export * from './transformers/Formatter';
|
10
|
+
export * from './transformers/QueryConverter';
|
11
|
+
export * from './transformers/SelectValueCollector';
|
12
|
+
export * from './transformers/SelectableColumnCollector';
|
13
|
+
export * from './transformers/TableColumnResolver';
|
14
|
+
export * from './transformers/TableSourceCollector';
|
15
|
+
export * from './transformers/UpstreamSelectQueryFinder';
|
16
|
+
// Add more exports here if you want to expose additional public API
|
17
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +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"}
|
@@ -0,0 +1,137 @@
|
|
1
|
+
import { SourceExpression, SubQuerySource, SourceAliasExpression } from "./Clause";
|
2
|
+
import { SqlComponent } from "./SqlComponent";
|
3
|
+
import { RawString } from "./ValueComponent";
|
4
|
+
import { CTENormalizer } from "../transformers/CTENormalizer";
|
5
|
+
import { SelectQueryParser } from "../parsers/SelectQueryParser";
|
6
|
+
/**
|
7
|
+
* Represents a binary SELECT query (e.g., UNION, INTERSECT, EXCEPT).
|
8
|
+
*/
|
9
|
+
export class BinarySelectQuery extends SqlComponent {
|
10
|
+
constructor(left, operator, right) {
|
11
|
+
super();
|
12
|
+
this.left = left;
|
13
|
+
this.operator = new RawString(operator);
|
14
|
+
this.right = right;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Appends another query to this binary query using UNION as the operator.
|
18
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
19
|
+
* and the right side is the provided query.
|
20
|
+
*
|
21
|
+
* @param query The query to append with UNION
|
22
|
+
* @returns A new BinarySelectQuery representing "(this) UNION query"
|
23
|
+
*/
|
24
|
+
union(query) {
|
25
|
+
return this.appendSelectQuery('union', query);
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* Appends another query to this binary query using UNION ALL as the operator.
|
29
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
30
|
+
* and the right side is the provided query.
|
31
|
+
*
|
32
|
+
* @param query The query to append with UNION ALL
|
33
|
+
* @returns A new BinarySelectQuery representing "(this) UNION ALL query"
|
34
|
+
*/
|
35
|
+
unionAll(query) {
|
36
|
+
return this.appendSelectQuery('union all', query);
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* Appends another query to this binary query using INTERSECT as the operator.
|
40
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
41
|
+
* and the right side is the provided query.
|
42
|
+
*
|
43
|
+
* @param query The query to append with INTERSECT
|
44
|
+
* @returns A new BinarySelectQuery representing "(this) INTERSECT query"
|
45
|
+
*/
|
46
|
+
intersect(query) {
|
47
|
+
return this.appendSelectQuery('intersect', query);
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Appends another query to this binary query using INTERSECT ALL as the operator.
|
51
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
52
|
+
* and the right side is the provided query.
|
53
|
+
*
|
54
|
+
* @param query The query to append with INTERSECT ALL
|
55
|
+
* @returns A new BinarySelectQuery representing "(this) INTERSECT ALL query"
|
56
|
+
*/
|
57
|
+
intersectAll(query) {
|
58
|
+
return this.appendSelectQuery('intersect all', query);
|
59
|
+
}
|
60
|
+
/**
|
61
|
+
* Appends another query to this binary query using EXCEPT as the operator.
|
62
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
63
|
+
* and the right side is the provided query.
|
64
|
+
*
|
65
|
+
* @param query The query to append with EXCEPT
|
66
|
+
* @returns A new BinarySelectQuery representing "(this) EXCEPT query"
|
67
|
+
*/
|
68
|
+
except(query) {
|
69
|
+
return this.appendSelectQuery('except', query);
|
70
|
+
}
|
71
|
+
/**
|
72
|
+
* Appends another query to this binary query using EXCEPT ALL as the operator.
|
73
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
74
|
+
* and the right side is the provided query.
|
75
|
+
*
|
76
|
+
* @param query The query to append with EXCEPT ALL
|
77
|
+
* @returns A new BinarySelectQuery representing "(this) EXCEPT ALL query"
|
78
|
+
*/
|
79
|
+
exceptAll(query) {
|
80
|
+
return this.appendSelectQuery('except all', query);
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Appends another query to this binary query using the specified operator.
|
84
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
85
|
+
* and the right side is the provided query.
|
86
|
+
*
|
87
|
+
* @param operator SQL operator to use (e.g. 'union', 'union all', 'intersect', 'except')
|
88
|
+
* @param query The query to append with the specified operator
|
89
|
+
* @returns A new BinarySelectQuery representing "(this) [operator] query"
|
90
|
+
*/
|
91
|
+
appendSelectQuery(operator, query) {
|
92
|
+
this.left = new BinarySelectQuery(this.left, this.operator.value, this.right);
|
93
|
+
this.operator = new RawString(operator);
|
94
|
+
this.right = query;
|
95
|
+
// const normalizer = new CTENormalizer();
|
96
|
+
// normalizer.normalize(this);
|
97
|
+
CTENormalizer.normalize(this);
|
98
|
+
return this;
|
99
|
+
}
|
100
|
+
/**
|
101
|
+
* Appends another query to this binary query using UNION as the operator, accepting a raw SQL string.
|
102
|
+
* This method parses the SQL string and appends the resulting query using UNION.
|
103
|
+
* @param sql The SQL string to parse and union
|
104
|
+
* @returns A new BinarySelectQuery representing "(this) UNION (parsed query)"
|
105
|
+
*/
|
106
|
+
unionRaw(sql) {
|
107
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
108
|
+
return this.union(parsedQuery);
|
109
|
+
}
|
110
|
+
unionAllRaw(sql) {
|
111
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
112
|
+
return this.unionAll(parsedQuery);
|
113
|
+
}
|
114
|
+
intersectRaw(sql) {
|
115
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
116
|
+
return this.intersect(parsedQuery);
|
117
|
+
}
|
118
|
+
intersectAllRaw(sql) {
|
119
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
120
|
+
return this.intersectAll(parsedQuery);
|
121
|
+
}
|
122
|
+
exceptRaw(sql) {
|
123
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
124
|
+
return this.except(parsedQuery);
|
125
|
+
}
|
126
|
+
exceptAllRaw(sql) {
|
127
|
+
const parsedQuery = SelectQueryParser.parse(sql);
|
128
|
+
return this.exceptAll(parsedQuery);
|
129
|
+
}
|
130
|
+
// Returns a SourceExpression wrapping this query as a subquery source.
|
131
|
+
// Optionally takes an alias name (default: "subq")
|
132
|
+
toSource(alias = "subq") {
|
133
|
+
return new SourceExpression(new SubQuerySource(this), new SourceAliasExpression(alias, null));
|
134
|
+
}
|
135
|
+
}
|
136
|
+
BinarySelectQuery.kind = Symbol("BinarySelectQuery");
|
137
|
+
//# sourceMappingURL=BinarySelectQuery.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"BinarySelectQuery.js","sourceRoot":"","sources":["../../../src/models/BinarySelectQuery.ts"],"names":[],"mappings":"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"}
|