Skip to content

Conversation

@bkline
Copy link
Contributor

@bkline bkline commented Dec 15, 2025

The GetParamType() function calls SQLDescribeParam() and caches the type information it gets from the driver in a dynamically allocated array with one slot for each top-level parameter. This should not be done for nested table column "parameters" because:

  • that corrupts the heap when a TVP has more columns than slots;
  • it overwrites top-level parameter types with the wrong values;
  • SQLDescribeParam() fails for nested column "parameters" anyway.

So for NULL TVP columns we fall back on SQL_VARCHAR.

With the fix contained in this commit, the new test never fails (for my testing, at least). Without the fix, that test sometimes passes and sometimes crashes the Python interpreter (and always crashed Python when the tests/__pycache__ directory was not present in my testing--not sure why 🤷‍♂️).

Closes #1450

The `GetParamType()` function calls `SQLDescribeParam()` and caches
the type information it gets from the driver in a dynamically
allocated array with one slot for each top-level parameter. This
should not be done for nested table column "parameters" because:

- that corrupts the heap when a TVP has more columns than slots;
- it overwrites top-level parameter types with the wrong values;
- `SQLDescribeParam()` fails for nested column "parameters" anyway.

So for NULL TVP columns we fall back on SQL_VARCHAR.

With the fix contained in this commit, the new test never fails
(for my testing, at least). Without the fix, that test sometimes
passes and sometimes crashes the Python interpreter (and *always*
crashed Python when the `tests/__pycache__` directory was not
present in my testing--not sure why 🤷‍♂️).

Closes mkleehammer#1450
@keitherskine
Copy link
Collaborator

@v-chojas I believe you created the original code to support TVPs, so if you have time to look at this PR, that would be much appreciated.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Executing stored procedures using TVP hard crashes python GC in python 3.11

2 participants