-
Notifications
You must be signed in to change notification settings - Fork 25
RELEASE: 0.13.0 #269
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RELEASE: 0.13.0 #269
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR updates the mssql-python package to version 0.13.0, incorporating significant enhancements to batch operations, streaming capabilities, and stability improvements. The release focuses on better handling of complex data types and large objects while addressing critical memory management issues.
Key changes:
- Version bump from 0.12.0 to 0.13.0
- Updated release notes to highlight new streaming capabilities for large values
- Enhanced batch operation support for complex data types with automatic type inference
Reviewed Changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
File | Description |
---|---|
setup.py | Updates package version from 0.12.0 to 0.13.0 |
PyPI_Description.md | Revises release notes to document v0.13.0 features including streaming support, enhanced batch operations, and stability fixes |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
📊 Code Coverage Report
Diff CoverageDiff: main...HEAD, staged and unstaged changes
Summary
📋 Files Needing Attention📉 Files with overall lowest coverage (click to expand)mssql_python.pybind.connection.connection.cpp: 67.6%
mssql_python.ddbc_bindings.py: 68.5%
mssql_python.pybind.ddbc_bindings.cpp: 69.3%
mssql_python.cursor.py: 79.6%
mssql_python.connection.py: 81.7%
mssql_python.helpers.py: 84.7%
mssql_python.auth.py: 85.3%
mssql_python.type.py: 86.8%
mssql_python.pooling.py: 88.8%
mssql_python.exceptions.py: 90.4% 🔗 Quick Links
|
8c727fd
### Work Item / Issue Reference <!-- IMPORTANT: Please follow the PR template guidelines below. For mssql-python maintainers: Insert your ADO Work Item ID below (e.g. AB#37452) For external contributors: Insert Github Issue number below (e.g. #149) Only one reference is required - either GitHub issue OR ADO Work Item. --> <!-- mssql-python maintainers: ADO Work Item --> > [AB#39063](https://sqlclientdrivers.visualstudio.com/c6d89619-62de-46a0-8b46-70b92a84d85e/_workitems/edit/39063) ------------------------------------------------------------------- ### Summary <!-- Insert your summary of changes below. Minimum 10 characters required. --> ## Problem Pytest test suite (335+ tests) was crashing on exit with: ``` Fatal Python error: _Py_GetConfig: the function must be called with the GIL held, after Python initialization and before Python finalization, but the GIL is released ``` The crash occurred **after all tests passed**, during Python shutdown on Windows x64 and macOS. ## Root Cause Static `pybind11::module_` and `pybind11::object` instances in `BindParameterArray()` function (lines 2072-2073) were being destroyed during C++ static destruction phase, which happens **after** Python has released the GIL and begun finalization. When the destructors called `Py_XDECREF`, Python's `_Py_GetConfig()` was invoked without the GIL, causing the fatal error. ```cpp // OLD CODE - Problematic static objects static py::module_ uuid_mod = py::module_::import("uuid"); static py::object uuid_class = uuid_mod.attr("UUID"); ``` ## Solution Moved UUID class caching to module initialization level using a helper function. This ensures the Python object lifecycle is managed within pybind11's module context, avoiding destructor calls during finalization. ```cpp // NEW CODE - Module-level cached helper py::object uuid_class = py::module_::import("mssql_python.ddbc_bindings").attr("_get_uuid_class")(); ``` The `_get_uuid_class()` helper is defined at module initialization and maintains a static cache that lives for the module's lifetime, properly integrated with pybind11's lifecycle management. ## Testing - ✅ Full test suite (335+ tests) now completes without crash on macOS - ✅ Exit code 0 after pytest completion - ✅ No functionality changes - UUID parameter binding works identically ## Impact - **Platforms affected**: Windows x64, macOS (all platforms with the issue) - **Risk**: Low - surgical fix, no behavioral changes - **Files changed**: 1 file, ~15 lines added/modified
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Work Item / Issue Reference
Summary
This pull request updates the package to version 0.13.0 and revises the release notes to highlight new features and critical stability improvements. The most important changes are grouped below:
Version update:
0.12.0
to0.13.0
insetup.py
to reflect the latest release.Release notes and feature enhancements (in
PyPI_Description.md
):executemany()
with automatic Data-At-Execution detection and fallback, enabling efficient handling of massive datasets.executemany()
, including automatic type inference for bulk inserts of UUIDs and timezone-aware datetimes.cursor.rowcount
accuracy for all fetch operations, including proper handling of empty result sets and consistent behavior for SELECT, INSERT, and UPDATE.