From 320810c462c793f033cf3d688796da77b029634d Mon Sep 17 00:00:00 2001 From: Lazizbek Ergashev Date: Sun, 9 Aug 2026 05:23:58 +0500 Subject: [PATCH 1/2] sqlite: reject statement-less SQLTagStore queries Signed-off-by: Lazizbek Ergashev --- src/node_sqlite.cc | 5 +++++ test/parallel/test-sqlite-template-tag.js | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index e3604d97bc53..90349f636945 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -3445,6 +3445,11 @@ bool SQLTagStore::ResetAndBindStatement( Environment* env, StatementSync* stmt, const FunctionCallbackInfo& args) { + if (stmt->IsFinalized()) { + THROW_ERR_INVALID_STATE(env, "statement has been finalized"); + return false; + } + Isolate* isolate = env->isolate(); int r = stmt->ResetStatement(); CHECK_ERROR_OR_THROW(isolate, stmt->db_.get(), r, SQLITE_OK, false); diff --git a/test/parallel/test-sqlite-template-tag.js b/test/parallel/test-sqlite-template-tag.js index 445231bef0bd..8e164e4e49bb 100644 --- a/test/parallel/test-sqlite-template-tag.js +++ b/test/parallel/test-sqlite-template-tag.js @@ -127,6 +127,20 @@ test('rejects parameters outside of template expressions', () => { ldb.close(); }); +test('rejects queries that contain no statement', () => { + const expectedError = { + code: 'ERR_INVALID_STATE', + message: /statement has been finalized/, + }; + + for (const method of ['run', 'get', 'all', 'iterate']) { + assert.throws(() => { + // eslint-disable-next-line no-unused-expressions + sql[method]`-- comment`; + }, expectedError); + } +}); + test('TagStore capacity, size, and clear', () => { assert.strictEqual(sql.capacity, 10); assert.strictEqual(sql.size, 0); From 3ff24e184b7f5b64f7171c9d852ed86091a2e6fa Mon Sep 17 00:00:00 2001 From: Lazizbek Ergashev Date: Sun, 9 Aug 2026 12:46:27 +0500 Subject: [PATCH 2/2] sqlite: clarify statement-less query error message Signed-off-by: Lazizbek Ergashev --- src/node_sqlite.cc | 2 +- test/parallel/test-sqlite-template-tag.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 90349f636945..0ca9f0d0efa0 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -3446,7 +3446,7 @@ bool SQLTagStore::ResetAndBindStatement( StatementSync* stmt, const FunctionCallbackInfo& args) { if (stmt->IsFinalized()) { - THROW_ERR_INVALID_STATE(env, "statement has been finalized"); + THROW_ERR_INVALID_STATE(env, "query contains no statement"); return false; } diff --git a/test/parallel/test-sqlite-template-tag.js b/test/parallel/test-sqlite-template-tag.js index 8e164e4e49bb..3dc1901f5176 100644 --- a/test/parallel/test-sqlite-template-tag.js +++ b/test/parallel/test-sqlite-template-tag.js @@ -130,7 +130,7 @@ test('rejects parameters outside of template expressions', () => { test('rejects queries that contain no statement', () => { const expectedError = { code: 'ERR_INVALID_STATE', - message: /statement has been finalized/, + message: /query contains no statement/, }; for (const method of ['run', 'get', 'all', 'iterate']) {