From 7e65c306a5a178fcc28c3764713f328cd32323b9 Mon Sep 17 00:00:00 2001 From: Song <1667077010@qq.com> Date: Fri, 3 Jul 2026 16:43:59 +0800 Subject: [PATCH] Fix wasm sqlite streaming statement lifetime --- .../src/dialects/official-wasm.ts | 18 ++++++++++--- packages/dialect-wasm/src/dialects/sqljs.ts | 25 ++++++++----------- packages/dialect-wasm/test/index.test.ts | 2 +- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/dialect-wasm/src/dialects/official-wasm.ts b/packages/dialect-wasm/src/dialects/official-wasm.ts index 670aa30..06cb74d 100644 --- a/packages/dialect-wasm/src/dialects/official-wasm.ts +++ b/packages/dialect-wasm/src/dialects/official-wasm.ts @@ -76,7 +76,7 @@ export class OfficialWasmDialect extends GenericSqliteDialect { if (!isSelect) { throw new Error('Only support select query') } - return runWithStatement(db, sql, parameters, iterator) + return iterateWithStatement(db, sql, parameters) }, } }, config.onCreateConnection) @@ -103,10 +103,22 @@ function runWithStatement( function* iterator( statement: import('@sqlite.org/sqlite-wasm').PreparedStatement, ): IterableIterator> { + while (statement.step()) { + yield statement.get({}) + } +} + +function* iterateWithStatement( + db: import('@sqlite.org/sqlite-wasm').Database, + sql: string, + parameters: any[] | readonly any[], +): IterableIterator> { + const statement = db.prepare(sql) try { - while (statement.step()) { - yield statement.get({}) + if (parameters.length) { + statement.bind(parameters as import('@sqlite.org/sqlite-wasm').BindingSpec) } + yield* iterator(statement) } finally { statement.finalize() } diff --git a/packages/dialect-wasm/src/dialects/sqljs.ts b/packages/dialect-wasm/src/dialects/sqljs.ts index c81cad9..4bc14cd 100644 --- a/packages/dialect-wasm/src/dialects/sqljs.ts +++ b/packages/dialect-wasm/src/dialects/sqljs.ts @@ -45,36 +45,31 @@ export class SqlJsDialect extends GenericSqliteDialect { if (!isSelect) { throw new Error('Only support select query') } - return runWithStatement(db, sql, parameters, iterator) + return iterateWithStatement(db, sql, parameters) }, } }, config.onCreateConnection) } } -function runWithStatement( +function* iterator(stmt: import('sql.js').Statement): IterableIterator { + while (stmt.step()) { + yield stmt.getAsObject() as unknown as T + } +} + +function* iterateWithStatement( db: import('sql.js').Database, sql: string, parameters: any[] | readonly any[], - callback: (stmt: import('sql.js').Statement) => T, -): T { +): IterableIterator { const statement = db.prepare(sql) try { if (parameters.length) { statement.bind(parameters as any[]) } - return callback(statement) + yield* iterator(statement) } finally { statement.free() } } - -function* iterator(stmt: import('sql.js').Statement): IterableIterator { - try { - while (stmt.step()) { - yield stmt.getAsObject() as unknown as T - } - } finally { - stmt.free() - } -} diff --git a/packages/dialect-wasm/test/index.test.ts b/packages/dialect-wasm/test/index.test.ts index 4d641b9..f062052 100644 --- a/packages/dialect-wasm/test/index.test.ts +++ b/packages/dialect-wasm/test/index.test.ts @@ -13,7 +13,7 @@ describe('dialect test', () => { return new SQL.Database() }, }) - await testCase(dialect, expect, false) + await testCase(dialect, expect) }) it('node-wasm', async () => {