From 4dfcf1d2e9f0afcb9e24b0bb960cc750a18cb077 Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Tue, 6 Oct 2026 23:41:31 -0700 Subject: [PATCH] sqlite: persist enableDefensive() across reopen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `enableDefensive()` updated only the live connection, so after `close()` and `open()` the defensive flag went back to the value passed to the constructor. Store the new value in the open configuration so that `open()` applies it again. Signed-off-by: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Assisted-by: claude:opus-5.5 PR-URL: https://github.com/nodejs/node/pull/66404 Fixes: https://github.com/nodejs/node/issues/66403 Reviewed-By: Guilherme Araújo --- src/node_sqlite.cc | 1 + test/parallel/test-sqlite-config.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 8f9e2018d3b..6aae7e60cfc 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -3550,6 +3550,7 @@ void Database::EnableDefensive(const FunctionCallbackInfo& args) { enable, &defensive_enabled); CHECK_ERROR_OR_THROW(isolate, db, defensive_ret, SQLITE_OK, void()); + db->open_config_.set_enable_defensive(enable); } void Database::LoadExtension(const FunctionCallbackInfo& args) { diff --git a/test/parallel/test-sqlite-config.js b/test/parallel/test-sqlite-config.js index 0988bdb14a3..16457accdb5 100644 --- a/test/parallel/test-sqlite-config.js +++ b/test/parallel/test-sqlite-config.js @@ -53,6 +53,26 @@ test('defensive mode off after calling db.enableDefensive(false)', (t) => { t.assert.strictEqual(checkDefensiveMode(db), false); }); +test('db.enableDefensive(true) persists across close() and open()', (t) => { + const db = new Database(':memory:', { + defensive: false + }); + db.enableDefensive(true); + db.close(); + db.open(); + t.assert.strictEqual(checkDefensiveMode(db), true); +}); + +test('db.enableDefensive(false) persists across close() and open()', (t) => { + const db = new Database(':memory:', { + defensive: true + }); + db.enableDefensive(false); + db.close(); + db.open(); + t.assert.strictEqual(checkDefensiveMode(db), false); +}); + test('throws if options.defensive is provided but is not a boolean', (t) => { t.assert.throws(() => { new Database(':memory:', { defensive: 42 });