diff --git a/src/common/classes/init.h b/src/common/classes/init.h index 8ac2a0476d8..f673e9bbbf8 100644 --- a/src/common/classes/init.h +++ b/src/common/classes/init.h @@ -147,6 +147,14 @@ class GlobalPtr : private InstanceControl FB_NEW InstanceControl::InstanceLink(this); } + template + requires(std::invocable) + GlobalPtr(TFunc initializationFunc) + { + instance = initializationFunc(*getDefaultMemoryPool()); + FB_NEW InstanceControl::InstanceLink(this); + } + T* operator->() noexcept { return instance; @@ -160,6 +168,16 @@ class GlobalPtr : private InstanceControl return instance; } + T* get() noexcept + { + return instance; + } + + const T* get() const noexcept + { + return instance; + } + operator bool() noexcept { return instance; diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index 44760b74b11..f90d7ae732d 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -4223,7 +4223,10 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) }}, }; - ObjectsArray schemaSearchPath({SYSTEM_SCHEMA, PUBLIC_SCHEMA}); + static const GlobalPtr> schemaSearchPath([](MemoryPool& pool) + { + return FB_NEW_POOL(pool) ObjectsArray(pool, {SYSTEM_SCHEMA, PUBLIC_SCHEMA}); + }); if (const auto relSchemaFields = schemaFields.find(relation->rel_id); relSchemaFields != schemaFields.end()) { @@ -4242,7 +4245,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction) { MOV_get_metaname(tdbb, &desc, depName.object); - if (MET_qualify_existing_name(tdbb, depName, {dependency->objType}, &schemaSearchPath)) + if (MET_qualify_existing_name(tdbb, depName, {dependency->objType}, schemaSearchPath.get())) schemaName = depName.schema.c_str(); }