sqlparser-rs 0.60.2 → 0.60.3-rc2
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 +65 -32
- package/dist/index.cjs +526 -0
- package/dist/index.d.cts +1438 -0
- package/dist/index.d.mts +1438 -0
- package/dist/index.mjs +502 -0
- package/package.json +11 -11
- package/wasm/README.md +65 -32
- package/wasm/package.json +1 -1
- package/wasm/sqlparser_rs_wasm_bg.wasm +0 -0
- package/wasm/sqlparser_rs_wasm_web.js +628 -0
- package/wasm/sqlparser_rs_wasm_web_bg.wasm +0 -0
- package/dist/cjs/dialects.js +0 -202
- package/dist/cjs/dialects.js.map +0 -1
- package/dist/cjs/index.js +0 -81
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/parser.js +0 -191
- package/dist/cjs/parser.js.map +0 -1
- package/dist/cjs/types/ast.js +0 -10
- package/dist/cjs/types/ast.js.map +0 -1
- package/dist/cjs/types/errors.js +0 -49
- package/dist/cjs/types/errors.js.map +0 -1
- package/dist/cjs/types/index.js +0 -19
- package/dist/cjs/types/index.js.map +0 -1
- package/dist/esm/dialects.js +0 -184
- package/dist/esm/dialects.js.map +0 -1
- package/dist/esm/index.js +0 -47
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/package.json +0 -1
- package/dist/esm/parser.js +0 -187
- package/dist/esm/parser.js.map +0 -1
- package/dist/esm/types/ast.js +0 -9
- package/dist/esm/types/ast.js.map +0 -1
- package/dist/esm/types/errors.js +0 -44
- package/dist/esm/types/errors.js.map +0 -1
- package/dist/esm/types/index.js +0 -3
- package/dist/esm/types/index.js.map +0 -1
- package/dist/types/dialects.d.ts +0 -118
- package/dist/types/dialects.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -46
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/parser.d.ts +0 -116
- package/dist/types/parser.d.ts.map +0 -1
- package/dist/types/types/ast.d.ts +0 -1097
- package/dist/types/types/ast.d.ts.map +0 -1
- package/dist/types/types/errors.d.ts +0 -25
- package/dist/types/types/errors.d.ts.map +0 -1
- package/dist/types/types/index.d.ts +0 -3
- package/dist/types/types/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -26,25 +26,22 @@ npm install sqlparser-rs
|
|
|
26
26
|
## Quick Start
|
|
27
27
|
|
|
28
28
|
```typescript
|
|
29
|
-
import {
|
|
29
|
+
import { parse, format, validate } from 'sqlparser-rs';
|
|
30
30
|
|
|
31
|
-
// Simple parsing
|
|
32
|
-
const statements =
|
|
31
|
+
// Simple parsing (uses generic dialect by default)
|
|
32
|
+
const statements = parse('SELECT * FROM users');
|
|
33
33
|
console.log(statements);
|
|
34
34
|
|
|
35
|
-
// With specific dialect
|
|
36
|
-
const pgStatements =
|
|
37
|
-
'SELECT * FROM users WHERE id = $1',
|
|
38
|
-
new PostgreSqlDialect()
|
|
39
|
-
);
|
|
35
|
+
// With specific dialect (string name)
|
|
36
|
+
const pgStatements = parse('SELECT * FROM users WHERE id = $1', 'postgresql');
|
|
40
37
|
|
|
41
38
|
// Format SQL
|
|
42
|
-
const formatted =
|
|
39
|
+
const formatted = format('select * from users');
|
|
43
40
|
console.log(formatted); // "SELECT * FROM users"
|
|
44
41
|
|
|
45
42
|
// Validate SQL
|
|
46
43
|
try {
|
|
47
|
-
|
|
44
|
+
validate('SELEC * FROM users');
|
|
48
45
|
} catch (error) {
|
|
49
46
|
console.log('Invalid SQL:', error.message);
|
|
50
47
|
}
|
|
@@ -52,46 +49,82 @@ try {
|
|
|
52
49
|
|
|
53
50
|
## API
|
|
54
51
|
|
|
55
|
-
###
|
|
52
|
+
### Top-Level Functions
|
|
56
53
|
|
|
57
|
-
The
|
|
58
|
-
|
|
59
|
-
#### Static Methods
|
|
54
|
+
The simplest way to use the parser:
|
|
60
55
|
|
|
61
56
|
```typescript
|
|
62
|
-
|
|
63
|
-
const statements = Parser.parse(sql: string, dialect: Dialect): Statement[];
|
|
64
|
-
|
|
65
|
-
// Parse and return JSON string
|
|
66
|
-
const json = Parser.parseToJson(sql: string, dialect: Dialect): string;
|
|
57
|
+
import { parse, format, validate } from 'sqlparser-rs';
|
|
67
58
|
|
|
68
|
-
// Parse
|
|
69
|
-
|
|
59
|
+
// Parse SQL - dialect defaults to 'generic'
|
|
60
|
+
parse('SELECT * FROM users');
|
|
61
|
+
parse('SELECT * FROM users', 'postgresql');
|
|
62
|
+
parse('SELECT * FROM users', 'mysql');
|
|
70
63
|
|
|
71
64
|
// Format SQL (round-trip through parser)
|
|
72
|
-
|
|
65
|
+
format('select * from users'); // "SELECT * FROM users"
|
|
66
|
+
|
|
67
|
+
// Validate SQL syntax (throws ParserError if invalid)
|
|
68
|
+
validate('SELECT * FROM users'); // true
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Dialect Options
|
|
73
72
|
|
|
74
|
-
|
|
75
|
-
const isValid = Parser.validate(sql: string, dialect: Dialect): boolean;
|
|
73
|
+
Dialects can be specified as strings or class instances:
|
|
76
74
|
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
```typescript
|
|
76
|
+
import { parse, PostgreSqlDialect } from 'sqlparser-rs';
|
|
77
|
+
|
|
78
|
+
// String dialect names (recommended)
|
|
79
|
+
parse('SELECT $1', 'postgresql');
|
|
80
|
+
parse('SELECT `col` FROM t', 'mysql');
|
|
81
|
+
|
|
82
|
+
// Or dialect instances
|
|
83
|
+
parse('SELECT $1', new PostgreSqlDialect());
|
|
79
84
|
```
|
|
80
85
|
|
|
81
|
-
|
|
86
|
+
Supported dialect strings: `'generic'`, `'ansi'`, `'mysql'`, `'postgresql'`, `'sqlite'`, `'snowflake'`, `'redshift'`, `'mssql'`, `'clickhouse'`, `'bigquery'`, `'duckdb'`, `'databricks'`, `'hive'`, `'oracle'`
|
|
87
|
+
|
|
88
|
+
### Parser Class
|
|
89
|
+
|
|
90
|
+
For advanced use cases with options:
|
|
82
91
|
|
|
83
92
|
```typescript
|
|
84
93
|
import { Parser, PostgreSqlDialect } from 'sqlparser-rs';
|
|
85
94
|
|
|
95
|
+
// Static methods (same as top-level functions)
|
|
96
|
+
Parser.parse('SELECT 1');
|
|
97
|
+
Parser.parse('SELECT 1', 'postgresql');
|
|
98
|
+
Parser.format('select 1');
|
|
99
|
+
Parser.validate('SELECT 1');
|
|
100
|
+
Parser.parseToJson('SELECT 1'); // Returns JSON string
|
|
101
|
+
Parser.parseToString('SELECT 1'); // Returns formatted string
|
|
102
|
+
Parser.getSupportedDialects(); // Returns dialect names
|
|
103
|
+
|
|
104
|
+
// Builder pattern for custom options
|
|
86
105
|
const parser = new Parser(new PostgreSqlDialect())
|
|
87
|
-
.withRecursionLimit(50)
|
|
88
|
-
.withOptions({
|
|
89
|
-
trailingCommas: true
|
|
90
|
-
});
|
|
106
|
+
.withRecursionLimit(50)
|
|
107
|
+
.withOptions({ trailingCommas: true });
|
|
91
108
|
|
|
92
109
|
const statements = parser.parse('SELECT * FROM users');
|
|
93
110
|
```
|
|
94
111
|
|
|
112
|
+
### WASM Initialization
|
|
113
|
+
|
|
114
|
+
The WASM module auto-initializes on import. For most use cases, no action is needed.
|
|
115
|
+
|
|
116
|
+
If you need to ensure WASM is ready before calling sync APIs (e.g., in tests):
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import { ready, parse } from 'sqlparser-rs';
|
|
120
|
+
|
|
121
|
+
// Wait for WASM to be ready
|
|
122
|
+
await ready();
|
|
123
|
+
|
|
124
|
+
// Now sync APIs are guaranteed to work
|
|
125
|
+
const ast = parse('SELECT 1');
|
|
126
|
+
```
|
|
127
|
+
|
|
95
128
|
### Dialects
|
|
96
129
|
|
|
97
130
|
All dialects from the upstream Rust crate are supported:
|
|
@@ -191,7 +224,7 @@ npm test
|
|
|
191
224
|
This package follows the upstream [sqlparser-rs](https://github.com/apache/datafusion-sqlparser-rs) version:
|
|
192
225
|
|
|
193
226
|
- **Major.Minor** matches the upstream Rust crate version
|
|
194
|
-
- **Patch** is for TypeScript binding fixes (e.g., `0.60.
|
|
227
|
+
- **Patch** is for TypeScript binding fixes (e.g., `0.60.3-rc2` = upstream `0.60.0` + binding fix)
|
|
195
228
|
|
|
196
229
|
| This package | sqlparser-rs |
|
|
197
230
|
|--------------|--------------|
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/dialects.ts
|
|
3
|
+
/**
|
|
4
|
+
* Generic SQL dialect - accepts most SQL syntax
|
|
5
|
+
*/
|
|
6
|
+
var GenericDialect = class {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.name = "generic";
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* ANSI SQL standard dialect
|
|
13
|
+
*/
|
|
14
|
+
var AnsiDialect = class {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.name = "ansi";
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* MySQL dialect
|
|
21
|
+
*/
|
|
22
|
+
var MySqlDialect = class {
|
|
23
|
+
constructor() {
|
|
24
|
+
this.name = "mysql";
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* PostgreSQL dialect
|
|
29
|
+
*/
|
|
30
|
+
var PostgreSqlDialect = class {
|
|
31
|
+
constructor() {
|
|
32
|
+
this.name = "postgresql";
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* SQLite dialect
|
|
37
|
+
*/
|
|
38
|
+
var SQLiteDialect = class {
|
|
39
|
+
constructor() {
|
|
40
|
+
this.name = "sqlite";
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Snowflake dialect
|
|
45
|
+
*/
|
|
46
|
+
var SnowflakeDialect = class {
|
|
47
|
+
constructor() {
|
|
48
|
+
this.name = "snowflake";
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Amazon Redshift dialect
|
|
53
|
+
*/
|
|
54
|
+
var RedshiftDialect = class {
|
|
55
|
+
constructor() {
|
|
56
|
+
this.name = "redshift";
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Microsoft SQL Server dialect
|
|
61
|
+
*/
|
|
62
|
+
var MsSqlDialect = class {
|
|
63
|
+
constructor() {
|
|
64
|
+
this.name = "mssql";
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* ClickHouse dialect
|
|
69
|
+
*/
|
|
70
|
+
var ClickHouseDialect = class {
|
|
71
|
+
constructor() {
|
|
72
|
+
this.name = "clickhouse";
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Google BigQuery dialect
|
|
77
|
+
*/
|
|
78
|
+
var BigQueryDialect = class {
|
|
79
|
+
constructor() {
|
|
80
|
+
this.name = "bigquery";
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* DuckDB dialect
|
|
85
|
+
*/
|
|
86
|
+
var DuckDbDialect = class {
|
|
87
|
+
constructor() {
|
|
88
|
+
this.name = "duckdb";
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Databricks dialect
|
|
93
|
+
*/
|
|
94
|
+
var DatabricksDialect = class {
|
|
95
|
+
constructor() {
|
|
96
|
+
this.name = "databricks";
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Apache Hive dialect
|
|
101
|
+
*/
|
|
102
|
+
var HiveDialect = class {
|
|
103
|
+
constructor() {
|
|
104
|
+
this.name = "hive";
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Oracle dialect
|
|
109
|
+
*/
|
|
110
|
+
var OracleDialect = class {
|
|
111
|
+
constructor() {
|
|
112
|
+
this.name = "oracle";
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* All supported dialect names
|
|
117
|
+
*/
|
|
118
|
+
const SUPPORTED_DIALECTS = [
|
|
119
|
+
"generic",
|
|
120
|
+
"ansi",
|
|
121
|
+
"mysql",
|
|
122
|
+
"postgresql",
|
|
123
|
+
"sqlite",
|
|
124
|
+
"snowflake",
|
|
125
|
+
"redshift",
|
|
126
|
+
"mssql",
|
|
127
|
+
"clickhouse",
|
|
128
|
+
"bigquery",
|
|
129
|
+
"duckdb",
|
|
130
|
+
"databricks",
|
|
131
|
+
"hive",
|
|
132
|
+
"oracle"
|
|
133
|
+
];
|
|
134
|
+
/**
|
|
135
|
+
* Map of dialect names to dialect classes
|
|
136
|
+
*/
|
|
137
|
+
const DIALECT_MAP = {
|
|
138
|
+
generic: GenericDialect,
|
|
139
|
+
ansi: AnsiDialect,
|
|
140
|
+
mysql: MySqlDialect,
|
|
141
|
+
postgresql: PostgreSqlDialect,
|
|
142
|
+
sqlite: SQLiteDialect,
|
|
143
|
+
snowflake: SnowflakeDialect,
|
|
144
|
+
redshift: RedshiftDialect,
|
|
145
|
+
mssql: MsSqlDialect,
|
|
146
|
+
clickhouse: ClickHouseDialect,
|
|
147
|
+
bigquery: BigQueryDialect,
|
|
148
|
+
duckdb: DuckDbDialect,
|
|
149
|
+
databricks: DatabricksDialect,
|
|
150
|
+
hive: HiveDialect,
|
|
151
|
+
oracle: OracleDialect
|
|
152
|
+
};
|
|
153
|
+
/**
|
|
154
|
+
* Create a dialect instance from a string name
|
|
155
|
+
*
|
|
156
|
+
* @param name - The name of the dialect (case-insensitive)
|
|
157
|
+
* @returns A dialect instance, or undefined if the dialect is not recognized
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* const dialect = dialectFromString('postgresql');
|
|
162
|
+
* if (dialect) {
|
|
163
|
+
* const ast = Parser.parse('SELECT 1', dialect);
|
|
164
|
+
* }
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
function dialectFromString(name) {
|
|
168
|
+
const normalized = name.toLowerCase();
|
|
169
|
+
const DialectClass = DIALECT_MAP[{
|
|
170
|
+
postgres: "postgresql",
|
|
171
|
+
pg: "postgresql",
|
|
172
|
+
sqlserver: "mssql",
|
|
173
|
+
duck: "duckdb"
|
|
174
|
+
}[normalized] ?? normalized];
|
|
175
|
+
return DialectClass ? new DialectClass() : void 0;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/types/errors.ts
|
|
180
|
+
/**
|
|
181
|
+
* Error thrown when SQL parsing fails
|
|
182
|
+
*/
|
|
183
|
+
var ParserError = class ParserError extends Error {
|
|
184
|
+
constructor(message, location) {
|
|
185
|
+
super(message);
|
|
186
|
+
this.name = "ParserError";
|
|
187
|
+
this.location = location;
|
|
188
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, ParserError);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Create a ParserError from a WASM error object
|
|
192
|
+
*/
|
|
193
|
+
static fromWasmError(error) {
|
|
194
|
+
if (typeof error === "string") return new ParserError(error);
|
|
195
|
+
if (error && typeof error === "object") {
|
|
196
|
+
const err = error;
|
|
197
|
+
return new ParserError(typeof err.message === "string" ? err.message : String(error), typeof err.line === "number" && typeof err.column === "number" ? {
|
|
198
|
+
line: err.line,
|
|
199
|
+
column: err.column
|
|
200
|
+
} : void 0);
|
|
201
|
+
}
|
|
202
|
+
return new ParserError(String(error));
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Error thrown when WASM module fails to initialize
|
|
207
|
+
*/
|
|
208
|
+
var WasmInitError = class WasmInitError extends Error {
|
|
209
|
+
constructor(message) {
|
|
210
|
+
super(message);
|
|
211
|
+
this.name = "WasmInitError";
|
|
212
|
+
if (Error.captureStackTrace) Error.captureStackTrace(this, WasmInitError);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
//#endregion
|
|
217
|
+
//#region src/parser.ts
|
|
218
|
+
function resolveDialect(dialect = "generic") {
|
|
219
|
+
if (typeof dialect === "string") {
|
|
220
|
+
const resolved = dialectFromString(dialect);
|
|
221
|
+
if (!resolved) throw new Error(`Unknown dialect: ${dialect}`);
|
|
222
|
+
return resolved;
|
|
223
|
+
}
|
|
224
|
+
return dialect;
|
|
225
|
+
}
|
|
226
|
+
let wasmModule = null;
|
|
227
|
+
let initPromise = null;
|
|
228
|
+
let initStarted = false;
|
|
229
|
+
const isBrowser = typeof window !== "undefined" && typeof process === "undefined";
|
|
230
|
+
function startInit() {
|
|
231
|
+
if (initStarted) return;
|
|
232
|
+
initStarted = true;
|
|
233
|
+
initPromise = initWasm().catch(() => {});
|
|
234
|
+
}
|
|
235
|
+
startInit();
|
|
236
|
+
function getWasmModule() {
|
|
237
|
+
if (wasmModule) return wasmModule;
|
|
238
|
+
throw new WasmInitError("WASM module not yet initialized. Use the async import or wait for module to load: import(\"sqlparser-rs\").then(({ parse }) => parse(sql))");
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Wait for WASM to be ready (useful for ensuring sync APIs work)
|
|
242
|
+
*/
|
|
243
|
+
async function ready() {
|
|
244
|
+
startInit();
|
|
245
|
+
await initPromise;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Initialize the WASM module.
|
|
249
|
+
* This must be called before using the Parser in browsers and Node.js ESM.
|
|
250
|
+
* In Node.js CommonJS, the module is loaded automatically.
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* import { initWasm, Parser, GenericDialect } from 'sqlparser-rs';
|
|
255
|
+
*
|
|
256
|
+
* // Initialize first
|
|
257
|
+
* await initWasm();
|
|
258
|
+
*
|
|
259
|
+
* // Then use the parser
|
|
260
|
+
* const ast = Parser.parse('SELECT 1', new GenericDialect());
|
|
261
|
+
* ```
|
|
262
|
+
*/
|
|
263
|
+
async function initWasm() {
|
|
264
|
+
if (wasmModule) return;
|
|
265
|
+
if (isBrowser) {
|
|
266
|
+
try {
|
|
267
|
+
const wasmJsUrl = new URL("../wasm/sqlparser_rs_wasm_web.js", require("url").pathToFileURL(__filename).href);
|
|
268
|
+
const wasmBinaryUrl = new URL("../wasm/sqlparser_rs_wasm_web_bg.wasm", require("url").pathToFileURL(__filename).href);
|
|
269
|
+
const wasm = await import(
|
|
270
|
+
/* @vite-ignore */
|
|
271
|
+
wasmJsUrl.href
|
|
272
|
+
);
|
|
273
|
+
if (typeof wasm.default === "function") await wasm.default(wasmBinaryUrl);
|
|
274
|
+
wasmModule = wasm;
|
|
275
|
+
} catch (error) {
|
|
276
|
+
throw new WasmInitError(`Failed to load WASM module in browser: ${error instanceof Error ? error.message : String(error)}`);
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
wasmModule = await import(
|
|
282
|
+
/* @vite-ignore */
|
|
283
|
+
new URL("../wasm/sqlparser_rs_wasm.js", require("url").pathToFileURL(__filename).href).href
|
|
284
|
+
);
|
|
285
|
+
} catch (error) {
|
|
286
|
+
throw new WasmInitError(`Failed to load WASM module: ${error instanceof Error ? error.message : String(error)}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* SQL Parser
|
|
291
|
+
*
|
|
292
|
+
* Parses SQL statements into an Abstract Syntax Tree (AST).
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```typescript
|
|
296
|
+
* import { Parser, PostgreSqlDialect } from 'sqlparser-rs';
|
|
297
|
+
*
|
|
298
|
+
* // Simple parsing
|
|
299
|
+
* const statements = Parser.parse('SELECT * FROM users', new PostgreSqlDialect());
|
|
300
|
+
*
|
|
301
|
+
* // With builder pattern
|
|
302
|
+
* const parser = new Parser(new PostgreSqlDialect())
|
|
303
|
+
* .withRecursionLimit(50)
|
|
304
|
+
* .withOptions({ trailingCommas: true });
|
|
305
|
+
*
|
|
306
|
+
* const ast = parser.parse('SELECT * FROM users');
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
var Parser = class Parser {
|
|
310
|
+
/**
|
|
311
|
+
* Create a new parser instance
|
|
312
|
+
*
|
|
313
|
+
* @param dialect - The SQL dialect to use (defaults to GenericDialect)
|
|
314
|
+
*/
|
|
315
|
+
constructor(dialect = new GenericDialect()) {
|
|
316
|
+
this.dialect = dialect;
|
|
317
|
+
this.options = {};
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Set the recursion limit for parsing nested expressions
|
|
321
|
+
*
|
|
322
|
+
* @param limit - Maximum recursion depth
|
|
323
|
+
* @returns This parser instance for chaining
|
|
324
|
+
*/
|
|
325
|
+
withRecursionLimit(limit) {
|
|
326
|
+
this.options.recursionLimit = limit;
|
|
327
|
+
return this;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Set parser options
|
|
331
|
+
*
|
|
332
|
+
* @param options - Parser options
|
|
333
|
+
* @returns This parser instance for chaining
|
|
334
|
+
*/
|
|
335
|
+
withOptions(options) {
|
|
336
|
+
this.options = {
|
|
337
|
+
...this.options,
|
|
338
|
+
...options
|
|
339
|
+
};
|
|
340
|
+
return this;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Parse SQL statements
|
|
344
|
+
*
|
|
345
|
+
* @param sql - SQL string to parse
|
|
346
|
+
* @returns Array of parsed statements
|
|
347
|
+
*/
|
|
348
|
+
parse(sql) {
|
|
349
|
+
const wasm = getWasmModule();
|
|
350
|
+
try {
|
|
351
|
+
if (Object.keys(this.options).length > 0) return wasm.parse_sql_with_options(this.dialect.name, sql, this.options);
|
|
352
|
+
else return wasm.parse_sql(this.dialect.name, sql);
|
|
353
|
+
} catch (error) {
|
|
354
|
+
throw ParserError.fromWasmError(error);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Parse SQL statements
|
|
359
|
+
*
|
|
360
|
+
* @param sql - SQL string to parse
|
|
361
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
362
|
+
* @returns Array of parsed statements
|
|
363
|
+
*
|
|
364
|
+
* @example
|
|
365
|
+
* ```typescript
|
|
366
|
+
* // Using default dialect
|
|
367
|
+
* const statements = Parser.parse('SELECT 1');
|
|
368
|
+
*
|
|
369
|
+
* // Using string dialect name
|
|
370
|
+
* const pgStatements = Parser.parse('SELECT $1', 'postgresql');
|
|
371
|
+
*
|
|
372
|
+
* // Using dialect instance
|
|
373
|
+
* const mysqlStatements = Parser.parse('SELECT 1', new MySqlDialect());
|
|
374
|
+
* ```
|
|
375
|
+
*/
|
|
376
|
+
static parse(sql, dialect = "generic") {
|
|
377
|
+
return new Parser(resolveDialect(dialect)).parse(sql);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Parse SQL and return the AST as a JSON string
|
|
381
|
+
*
|
|
382
|
+
* @param sql - SQL string to parse
|
|
383
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
384
|
+
* @returns JSON string representation of the AST
|
|
385
|
+
*/
|
|
386
|
+
static parseToJson(sql, dialect = "generic") {
|
|
387
|
+
const wasm = getWasmModule();
|
|
388
|
+
try {
|
|
389
|
+
return wasm.parse_sql_to_json_string(resolveDialect(dialect).name, sql);
|
|
390
|
+
} catch (error) {
|
|
391
|
+
throw ParserError.fromWasmError(error);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Parse SQL and return a formatted string representation
|
|
396
|
+
*
|
|
397
|
+
* @param sql - SQL string to parse
|
|
398
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
399
|
+
* @returns String representation of the parsed SQL
|
|
400
|
+
*/
|
|
401
|
+
static parseToString(sql, dialect = "generic") {
|
|
402
|
+
const wasm = getWasmModule();
|
|
403
|
+
try {
|
|
404
|
+
return wasm.parse_sql_to_string(resolveDialect(dialect).name, sql);
|
|
405
|
+
} catch (error) {
|
|
406
|
+
throw ParserError.fromWasmError(error);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Format SQL by parsing and regenerating it (round-trip)
|
|
411
|
+
*
|
|
412
|
+
* @param sql - SQL string to format
|
|
413
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
414
|
+
* @returns Formatted SQL string
|
|
415
|
+
*/
|
|
416
|
+
static format(sql, dialect = "generic") {
|
|
417
|
+
const wasm = getWasmModule();
|
|
418
|
+
try {
|
|
419
|
+
return wasm.format_sql(resolveDialect(dialect).name, sql);
|
|
420
|
+
} catch (error) {
|
|
421
|
+
throw ParserError.fromWasmError(error);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Validate SQL syntax without returning the full AST
|
|
426
|
+
*
|
|
427
|
+
* @param sql - SQL string to validate
|
|
428
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
429
|
+
* @returns true if valid, throws ParserError if invalid
|
|
430
|
+
*/
|
|
431
|
+
static validate(sql, dialect = "generic") {
|
|
432
|
+
const wasm = getWasmModule();
|
|
433
|
+
try {
|
|
434
|
+
return wasm.validate_sql(resolveDialect(dialect).name, sql);
|
|
435
|
+
} catch (error) {
|
|
436
|
+
throw ParserError.fromWasmError(error);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Get the list of supported dialect names
|
|
441
|
+
*/
|
|
442
|
+
static getSupportedDialects() {
|
|
443
|
+
return getWasmModule().get_supported_dialects();
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
/**
|
|
447
|
+
* Parse SQL statements (convenience function)
|
|
448
|
+
*
|
|
449
|
+
* @param sql - SQL string to parse
|
|
450
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
451
|
+
* @returns Array of parsed statements
|
|
452
|
+
*
|
|
453
|
+
* @example
|
|
454
|
+
* ```typescript
|
|
455
|
+
* import { parse } from 'sqlparser-rs';
|
|
456
|
+
*
|
|
457
|
+
* const statements = parse('SELECT * FROM users');
|
|
458
|
+
* const pgStatements = parse('SELECT $1', 'postgresql');
|
|
459
|
+
* ```
|
|
460
|
+
*/
|
|
461
|
+
function parse(sql, dialect = "generic") {
|
|
462
|
+
return Parser.parse(sql, dialect);
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Validate SQL syntax (convenience function)
|
|
466
|
+
*
|
|
467
|
+
* @param sql - SQL string to validate
|
|
468
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
469
|
+
* @returns true if valid, throws ParserError if invalid
|
|
470
|
+
*
|
|
471
|
+
* @example
|
|
472
|
+
* ```typescript
|
|
473
|
+
* import { validate } from 'sqlparser-rs';
|
|
474
|
+
*
|
|
475
|
+
* if (validate('SELECT * FROM users')) {
|
|
476
|
+
* console.log('Valid SQL!');
|
|
477
|
+
* }
|
|
478
|
+
* ```
|
|
479
|
+
*/
|
|
480
|
+
function validate(sql, dialect = "generic") {
|
|
481
|
+
return Parser.validate(sql, dialect);
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Format SQL by parsing and regenerating it (convenience function)
|
|
485
|
+
*
|
|
486
|
+
* @param sql - SQL string to format
|
|
487
|
+
* @param dialect - SQL dialect to use (string name or Dialect instance, defaults to 'generic')
|
|
488
|
+
* @returns Formatted SQL string
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* ```typescript
|
|
492
|
+
* import { format } from 'sqlparser-rs';
|
|
493
|
+
*
|
|
494
|
+
* const formatted = format('select * from users');
|
|
495
|
+
* // Returns: "SELECT * FROM users"
|
|
496
|
+
* ```
|
|
497
|
+
*/
|
|
498
|
+
function format(sql, dialect = "generic") {
|
|
499
|
+
return Parser.format(sql, dialect);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
//#endregion
|
|
503
|
+
exports.AnsiDialect = AnsiDialect;
|
|
504
|
+
exports.BigQueryDialect = BigQueryDialect;
|
|
505
|
+
exports.ClickHouseDialect = ClickHouseDialect;
|
|
506
|
+
exports.DatabricksDialect = DatabricksDialect;
|
|
507
|
+
exports.DuckDbDialect = DuckDbDialect;
|
|
508
|
+
exports.GenericDialect = GenericDialect;
|
|
509
|
+
exports.HiveDialect = HiveDialect;
|
|
510
|
+
exports.MsSqlDialect = MsSqlDialect;
|
|
511
|
+
exports.MySqlDialect = MySqlDialect;
|
|
512
|
+
exports.OracleDialect = OracleDialect;
|
|
513
|
+
exports.Parser = Parser;
|
|
514
|
+
exports.ParserError = ParserError;
|
|
515
|
+
exports.PostgreSqlDialect = PostgreSqlDialect;
|
|
516
|
+
exports.RedshiftDialect = RedshiftDialect;
|
|
517
|
+
exports.SQLiteDialect = SQLiteDialect;
|
|
518
|
+
exports.SUPPORTED_DIALECTS = SUPPORTED_DIALECTS;
|
|
519
|
+
exports.SnowflakeDialect = SnowflakeDialect;
|
|
520
|
+
exports.WasmInitError = WasmInitError;
|
|
521
|
+
exports.dialectFromString = dialectFromString;
|
|
522
|
+
exports.format = format;
|
|
523
|
+
exports.initWasm = initWasm;
|
|
524
|
+
exports.parse = parse;
|
|
525
|
+
exports.ready = ready;
|
|
526
|
+
exports.validate = validate;
|