fix(ext/node): Fix Database#exec should return undefined (#29368)

This commit is contained in:
Divy Srivastava 2025-05-19 19:20:49 -07:00 committed by GitHub
parent 5a8c0a23db
commit ff2354be0b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 87 additions and 10 deletions

12
Cargo.lock generated
View file

@ -1754,9 +1754,9 @@ dependencies = [
[[package]]
name = "deno_core"
version = "0.347.0"
version = "0.348.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75ae5562f6ad750bc2007e7b1032ae37115a83fe58b6fbc77331c47744956cc"
checksum = "7902cd1dde9e8ffc953428933f37f9b943dc123265709220cded6277946cadf7"
dependencies = [
"anyhow",
"az",
@ -2440,9 +2440,9 @@ dependencies = [
[[package]]
name = "deno_ops"
version = "0.223.0"
version = "0.224.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c5adc7f0795c7547f1b560a07aaea484e8f9cd035318348c6bfd084e0c42dce8"
checksum = "55db7994eccbdad457ca5091c545af712234c8f6e4389cadb2a24d2ecbbe7e89"
dependencies = [
"indexmap 2.8.0",
"proc-macro-rules",
@ -7472,9 +7472,9 @@ dependencies = [
[[package]]
name = "serde_v8"
version = "0.256.0"
version = "0.257.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69d69b4e574a9ec6bd0222463e50cf8531986d9c657543888e029d54d909b283"
checksum = "7c57c63e9203f1d1383df0943e080955999e984e96ecc9557c3bae48e483edfa"
dependencies = [
"deno_error",
"num-bigint",

View file

@ -55,7 +55,7 @@ repository = "https://github.com/denoland/deno"
[workspace.dependencies]
deno_ast = { version = "=0.47.0", features = ["transpiling"] }
deno_core = { version = "0.347.0" }
deno_core = { version = "0.348.0" }
deno_cache_dir = "=0.20.1"
deno_config = { version = "=0.54.2", features = ["workspace"] }

View file

@ -271,6 +271,7 @@ impl DatabaseSync {
//
// This method is a wrapper around sqlite3_exec().
#[fast]
#[undefined]
fn exec(&self, #[string] sql: &str) -> Result<(), SqliteError> {
let db = self.conn.borrow();
let db = db.as_ref().ok_or(SqliteError::InUse)?;

View file

@ -979,6 +979,7 @@
"test-socket-write-after-fin-error.js",
"test-source-map-enable.js",
"test-spawn-cmd-named-pipe.js",
"test-sqlite-transactions.js",
"test-stdin-from-file-spawn.js",
"test-stdin-hang.js",
"test-stdin-pipe-large.js",

View file

@ -1,7 +1,7 @@
<!-- deno-fmt-ignore-file -->
# Remaining Node Tests
1173 tests out of 3993 have been ported from Node 23.9.0 (29.38% ported, 71.15% remaining).
1174 tests out of 3993 have been ported from Node 23.9.0 (29.40% ported, 71.12% remaining).
NOTE: This file should not be manually edited. Please edit `tests/node_compat/config.json` and run `deno task setup` in `tests/node_compat/runner` dir instead.
@ -2056,7 +2056,6 @@ NOTE: This file should not be manually edited. Please edit `tests/node_compat/co
- [parallel/test-sqlite-named-parameters.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite-named-parameters.js)
- [parallel/test-sqlite-session.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite-session.js)
- [parallel/test-sqlite-statement-sync.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite-statement-sync.js)
- [parallel/test-sqlite-transactions.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite-transactions.js)
- [parallel/test-sqlite-typed-array-and-data-view.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite-typed-array-and-data-view.js)
- [parallel/test-sqlite.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-sqlite.js)
- [parallel/test-stack-size-limit.js](https://github.com/nodejs/node/tree/v23.9.0/test/parallel/test-stack-size-limit.js)

View file

@ -0,0 +1,73 @@
// deno-fmt-ignore-file
// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
// Taken from Node 23.9.0
// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
'use strict';
require('../common');
const tmpdir = require('../common/tmpdir');
const { join } = require('node:path');
const { DatabaseSync } = require('node:sqlite');
const { suite, test } = require('node:test');
let cnt = 0;
tmpdir.refresh();
function nextDb() {
return join(tmpdir.path, `database-${cnt++}.db`);
}
suite('manual transactions', () => {
test('a transaction is committed', (t) => {
const db = new DatabaseSync(nextDb());
t.after(() => { db.close(); });
const setup = db.exec(`
CREATE TABLE data(
key INTEGER PRIMARY KEY
) STRICT;
`);
t.assert.strictEqual(setup, undefined);
t.assert.deepStrictEqual(
db.prepare('BEGIN').run(),
{ changes: 0, lastInsertRowid: 0 },
);
t.assert.deepStrictEqual(
db.prepare('INSERT INTO data (key) VALUES (100)').run(),
{ changes: 1, lastInsertRowid: 100 },
);
t.assert.deepStrictEqual(
db.prepare('COMMIT').run(),
{ changes: 1, lastInsertRowid: 100 },
);
t.assert.deepStrictEqual(
db.prepare('SELECT * FROM data').all(),
[{ __proto__: null, key: 100 }],
);
});
test('a transaction is rolled back', (t) => {
const db = new DatabaseSync(nextDb());
t.after(() => { db.close(); });
const setup = db.exec(`
CREATE TABLE data(
key INTEGER PRIMARY KEY
) STRICT;
`);
t.assert.strictEqual(setup, undefined);
t.assert.deepStrictEqual(
db.prepare('BEGIN').run(),
{ changes: 0, lastInsertRowid: 0 },
);
t.assert.deepStrictEqual(
db.prepare('INSERT INTO data (key) VALUES (100)').run(),
{ changes: 1, lastInsertRowid: 100 },
);
t.assert.deepStrictEqual(
db.prepare('ROLLBACK').run(),
{ changes: 1, lastInsertRowid: 100 },
);
t.assert.deepStrictEqual(db.prepare('SELECT * FROM data').all(), []);
});
});

View file

@ -7,7 +7,10 @@ const tempDir = Deno.makeTempDirSync();
Deno.test("[node/sqlite] in-memory databases", () => {
const db1 = new DatabaseSync(":memory:");
const db2 = new DatabaseSync(":memory:");
db1.exec("CREATE TABLE data(key INTEGER PRIMARY KEY);");
assertEquals(
db1.exec("CREATE TABLE data(key INTEGER PRIMARY KEY);"),
undefined,
);
db1.exec("INSERT INTO data (key) VALUES (1);");
db2.exec("CREATE TABLE data(key INTEGER PRIMARY KEY);");