Skip to content

Conversation

@subrata-ms
Copy link
Contributor

@subrata-ms subrata-ms commented Nov 17, 2025

AB#39794

GitHub Issue: #273


Summary

This pull request adds support for binding arrays of NULL parameters in SQL statements and introduces a corresponding test to ensure correct behavior when executing multiple inserts with only NULL values. The main focus is on handling the SQL_C_DEFAULT type for parameter arrays, ensuring all values are NULL, and verifying this functionality through unit testing.

Parameter binding improvements:

  • Added logic to BindParameterArray in ddbc_bindings.cpp to handle the SQL_C_DEFAULT type, ensuring that arrays of NULL values are properly bound and validated. If any non-NULL value is detected, an exception is thrown.

Testing enhancements:

  • Added a new test test_executemany_NONE_parameter_list in test_004_cursor.py to verify that executemany correctly inserts rows with all NULL values and that the count matches the expected number of inserts.

Copilot AI review requested due to automatic review settings November 17, 2025 14:44
@github-actions github-actions bot added the pr-size: small Minimal code update label Nov 17, 2025
Copilot finished reviewing on behalf of subrata-ms November 17, 2025 14:47
Copy link
Contributor

Copilot AI left a 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 pull request fixes an issue with the data type mapping for NULL parameters in the _map_sql_type function. The change updates the C type for NULL parameters from SQL_C_DEFAULT (99) to SQL_C_CHAR (-8), which aligns with the SQL type SQL_VARCHAR that's also returned for NULL parameters.

Key changes:

  • Updated the C type for NULL parameters in _map_sql_type from SQL_C_DEFAULT to SQL_C_CHAR to match the SQL_VARCHAR SQL type being used

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@github-actions
Copy link

github-actions bot commented Nov 17, 2025

📊 Code Coverage Report

🔥 Diff Coverage

78%


🎯 Overall Coverage

77%


📈 Total Lines Covered: 5081 out of 6555
📁 Project: mssql-python


Diff Coverage

Diff: main...HEAD, staged and unstaged changes

  • mssql_python/pybind/ddbc_bindings.cpp (78.9%): Missing lines 2193-2195,2212

Summary

  • Total: 19 lines
  • Missing: 4 lines
  • Coverage: 78%

mssql_python/pybind/ddbc_bindings.cpp

Lines 2189-2199

  2189                     
  2190                     // Verify all values are indeed NULL
  2191                     for (size_t i = 0; i < paramSetSize; ++i) {
  2192                         if (!columnValues[i].is_none()) {
! 2193                             LOG("BindParameterArray: SQL_C_DEFAULT non-NULL value detected - param_index=%d, row=%zu", paramIndex, i);
! 2194                             ThrowStdException("SQL_C_DEFAULT (99) should only be used for NULL parameters at index " + std::to_string(paramIndex));
! 2195                         }
  2196                     }
  2197                     
  2198                     // For NULL parameters, we need to allocate a minimal buffer and set all indicators to SQL_NULL_DATA
  2199                     // Use SQL_C_CHAR as a safe default C type for NULL values

Lines 2208-2216

  2208                     dataPtr = nullBuffer;
  2209                     bufferLength = 1;
  2210                     LOG("BindParameterArray: SQL_C_DEFAULT bound - param_index=%d, all_null=true", paramIndex);
  2211                     break;
! 2212                 }
  2213                 default: {
  2214                     LOG("BindParameterArray: Unsupported C type - param_index=%d, C_type=%d", paramIndex, info.paramCType);
  2215                     ThrowStdException("BindParameterArray: Unsupported C type: " + std::to_string(info.paramCType));
  2216                 }


📋 Files Needing Attention

📉 Files with overall lowest coverage (click to expand)
mssql_python.pybind.logger_bridge.cpp: 59.2%
mssql_python.helpers.py: 66.6%
mssql_python.row.py: 67.4%
mssql_python.pybind.ddbc_bindings.cpp: 70.4%
mssql_python.pybind.connection.connection.cpp: 76.3%
mssql_python.ddbc_bindings.py: 79.6%
mssql_python.pybind.connection.connection_pool.cpp: 79.6%
mssql_python.pybind.ddbc_bindings.h: 79.7%
mssql_python.connection.py: 82.5%
mssql_python.cursor.py: 83.7%

🔗 Quick Links

⚙️ Build Summary 📋 Coverage Details

View Azure DevOps Build

Browse Full Coverage Report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-size: small Minimal code update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants