diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 0b111ce1fb1d59..e075a1e2a92908 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -832,7 +832,7 @@ void DatabaseSync::CreateTagStore(const FunctionCallbackInfo& args) { } BaseObjectPtr session = - SQLTagStore::Create(env, BaseObjectWeakPtr(db), capacity); + SQLTagStore::Create(env, BaseObjectPtr(db), capacity); if (!session) { // Handle error if creation failed THROW_ERR_SQLITE_ERROR(env->isolate(), "Failed to create SQLTagStore"); @@ -2660,7 +2660,7 @@ void IllegalConstructor(const FunctionCallbackInfo& args) { SQLTagStore::SQLTagStore(Environment* env, Local object, - BaseObjectWeakPtr database, + BaseObjectPtr database, int capacity) : BaseObject(env, object), database_(std::move(database)), @@ -2709,7 +2709,7 @@ Local SQLTagStore::GetConstructorTemplate(Environment* env) { } BaseObjectPtr SQLTagStore::Create( - Environment* env, BaseObjectWeakPtr database, int capacity) { + Environment* env, BaseObjectPtr database, int capacity) { Local obj; if (!GetConstructorTemplate(env) ->InstanceTemplate() diff --git a/src/node_sqlite.h b/src/node_sqlite.h index 8f0f9f15d621d5..667e45b03562c7 100644 --- a/src/node_sqlite.h +++ b/src/node_sqlite.h @@ -306,11 +306,12 @@ class SQLTagStore : public BaseObject { public: SQLTagStore(Environment* env, v8::Local object, - BaseObjectWeakPtr database, + BaseObjectPtr database, int capacity); ~SQLTagStore() override; - static BaseObjectPtr Create( - Environment* env, BaseObjectWeakPtr database, int capacity); + static BaseObjectPtr Create(Environment* env, + BaseObjectPtr database, + int capacity); static v8::Local GetConstructorTemplate( Environment* env); static void All(const v8::FunctionCallbackInfo& info); @@ -329,7 +330,7 @@ class SQLTagStore : public BaseObject { private: static BaseObjectPtr PrepareStatement( const v8::FunctionCallbackInfo& args); - BaseObjectWeakPtr database_; + BaseObjectPtr database_; LRUCache> sql_tags_; int capacity_; friend class StatementExecutionHelper; diff --git a/test/parallel/test-sqlite-template-tag.js b/test/parallel/test-sqlite-template-tag.js index 8628200cf8930f..0ba7ffe4a136a4 100644 --- a/test/parallel/test-sqlite-template-tag.js +++ b/test/parallel/test-sqlite-template-tag.js @@ -1,4 +1,6 @@ 'use strict'; +// Flags: --expose-gc + require('../common'); const assert = require('assert'); const { DatabaseSync } = require('node:sqlite'); @@ -100,3 +102,14 @@ test('TagStore capacity, size, and clear', () => { test('sql.db returns the associated DatabaseSync instance', () => { assert.strictEqual(sql.db, db); }); + +test('a tag store keeps the database alive by itself', () => { + const sql = new DatabaseSync(':memory:').createTagStore(); + + sql.db.exec('CREATE TABLE test (data INTEGER)'); + + global.gc(); + + // eslint-disable-next-line no-unused-expressions + sql.run`INSERT INTO test (data) VALUES (1)`; +});