From d57a36db90679eb19867c76b234dc595d2f1ef5a Mon Sep 17 00:00:00 2001 From: Gaurav Sharma Date: Wed, 1 Oct 2025 17:37:32 +0530 Subject: [PATCH] FIX: Static UUID import pytest crash --- mssql_python/pybind/ddbc_bindings.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mssql_python/pybind/ddbc_bindings.cpp b/mssql_python/pybind/ddbc_bindings.cpp index 13367b4c..41478797 100644 --- a/mssql_python/pybind/ddbc_bindings.cpp +++ b/mssql_python/pybind/ddbc_bindings.cpp @@ -2069,8 +2069,10 @@ SQLRETURN BindParameterArray(SQLHANDLE hStmt, SQLGUID* guidArray = AllocateParamBufferArray(tempBuffers, paramSetSize); strLenOrIndArray = AllocateParamBufferArray(tempBuffers, paramSetSize); - static py::module_ uuid_mod = py::module_::import("uuid"); - static py::object uuid_class = uuid_mod.attr("UUID"); + // Get cached UUID class from module-level helper + // This avoids static object destruction issues during Python finalization + py::object uuid_class = py::module_::import("mssql_python.ddbc_bindings").attr("_get_uuid_class")(); + for (size_t i = 0; i < paramSetSize; ++i) { const py::handle& element = columnValues[i]; std::array uuid_bytes; @@ -3903,6 +3905,14 @@ PYBIND11_MODULE(ddbc_bindings, m) { }); + // Module-level UUID class cache + // This caches the uuid.UUID class at module initialization time and keeps it alive + // for the entire module lifetime, avoiding static destructor issues during Python finalization + m.def("_get_uuid_class", []() -> py::object { + static py::object uuid_class = py::module_::import("uuid").attr("UUID"); + return uuid_class; + }, "Internal helper to get cached UUID class"); + // Add a version attribute m.attr("__version__") = "1.0.0";