Skip to content

Conversation

@jahnvi480
Copy link
Contributor

@jahnvi480 jahnvi480 commented Aug 22, 2025

Work Item / Issue Reference

AB#34929
AB#34930


Summary

This pull request adds support for retrieving special columns from a database table using the ODBC SQLSpecialColumns function. The main changes include new methods in the Python cursor for accessing row identifier and version columns, as well as the necessary C++ and Python bindings to expose this ODBC functionality. Additionally, relevant constants have been added to support these features.

New Python cursor methods:

  • Added rowIdColumns and rowVerColumns methods to the Cursor class in mssql_python/cursor.py, allowing users to retrieve columns that uniquely identify a row (SQL_BEST_ROWID) and columns that are automatically updated when any value in the row is updated (SQL_ROWVER). These methods handle ODBC parameter preparation, call the new binding, and return results as row objects.

ODBC and pybind11 binding support:

  • Defined the SQLSpecialColumnsFunc function pointer type and added the corresponding global pointer in mssql_python/pybind/ddbc_bindings.h and mssql_python/pybind/ddbc_bindings.cpp.
  • Loaded the SQLSpecialColumnsW symbol from the ODBC driver in the driver loader, and included it in the function pointer validation check.
  • Implemented the SQLSpecialColumns_wrap function to call the ODBC API, handling both Unix and Windows string conversions, and exposed it to Python as DDBCSQLSpecialColumns in the module definition.

Constants:

  • Added new constants for SQL_SCOPE_CURROW, SQL_BEST_ROWID, SQL_ROWVER, SQL_NO_NULLS, and SQL_NULLABLE_UNKNOWN to the ConstantsDDBC enum in mssql_python/constants.py to support the new functionality.

@github-actions github-actions bot added the pr-size: large Substantial code update label Aug 22, 2025
Copy link
Contributor

@sumitmsft sumitmsft left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a few comments

@github-actions github-actions bot added pr-size: large Substantial code update and removed pr-size: large Substantial code update labels Sep 12, 2025
### 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#34928](https://sqlclientdrivers.visualstudio.com/c6d89619-62de-46a0-8b46-70b92a84d85e/_workitems/edit/34928)

-------------------------------------------------------------------
### Summary   
This pull request adds support for retrieving table and index statistics
via the ODBC `SQLStatistics` API in the `mssql_python` package. The main
changes include implementing the `statistics` method on the Python
cursor, exposing the required C++ bindings, defining new constants, and
introducing comprehensive tests to ensure the new functionality works as
expected.

**New statistics feature:**

* Added the `statistics` method to the `Cursor` class in
`mssql_python/cursor.py`, allowing users to retrieve index and table
statistics for a given table, with options to filter by uniqueness,
catalog, schema, and quickness of statistics retrieval.
* Defined new constants (`SQL_INDEX_UNIQUE`, `SQL_INDEX_ALL`,
`SQL_QUICK`, `SQL_ENSURE`) in `mssql_python/constants.py` to support the
statistics method options.

**C++ binding and integration:**

* Added the `SQLStatisticsFunc` type and related function pointer to
`mssql_python/pybind/ddbc_bindings.h` and initialized it in
`mssql_python/pybind/ddbc_bindings.cpp`.
* Implemented the `SQLStatistics_wrap` function and exposed it to Python
via the `DDBCSQLStatistics` binding in the pybind module.

**Testing:**

* Added a comprehensive suite of tests in `tests/test_004_cursor.py` for
the new `statistics` method, including tests for setup, basic
functionality, unique index filtering, empty tables, non-existent
tables, result structure, catalog filtering, the `quick` parameter, and
cleanup.

---------

Co-authored-by: Jahnvi Thakkar <[email protected]>
@github-actions github-actions bot added pr-size: large Substantial code update and removed pr-size: large Substantial code update labels Sep 15, 2025
@jahnvi480 jahnvi480 merged commit 1da60fd into jahnvi/cursor_primarykey Sep 15, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-size: large Substantial code update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants