Skip to content

Conversation

divang
Copy link
Contributor

@divang divang commented Aug 21, 2025

Fix getParameterMetaData() crash with table-valued parameters (#2744)

Problem:
• PreparedStatement.getParameterMetaData() was crashing with SQLServerException when table-valued parameters (TVP) were used
• Error: "A metadata error for the parameter {0} occurred" when calling getParameterMetaData() on statements with TVP

Root Cause:
• The parseQueryMeta() method in SQLServerParameterMetaData assumed all user-defined types (when suggested_system_type_name is null) were assembly types
• For table-valued parameters, suggested_system_type_name is null but suggested_user_type_name contains the table type name
• The code incorrectly queried sys.assembly_types for TVP types, which are actually table types with system_type_id = 243

Solution:
• Added STRUCTURED_TYPE constant (243) to identify SQL Server structured/table types
• Enhanced parseQueryMeta() to check suggested_system_type_id before determining type handling
• For TVP (system_type_id = 243):

  • Set parameterType to microsoft.sql.Types.STRUCTURED
  • Set parameterClassName to Object.class.getName()
  • Extract metadata directly from sp_describe_undeclared_parameters result
  • Skip SSType processing since TVP metadata is handled directly
    • Maintained backward compatibility with existing assembly type handling

Testing:
• Added comprehensive test cases in ParameterMetaDataTest for TVP scenarios
• Validates getParameterMetaData() works correctly with table-valued parameters
• Ensures parameterCount, parameterTypeName, parameterType, and parameterClassName return correct values
• Covers the specific scenario reported in issue #2744
• Maintains compatibility with existing parameter metadata functionality

Fixes #2744

)

- Add support for table-valued parameters in SQLServerParameterMetaData
- Check system type ID 243 (structured type) to identify TVPs
- Set appropriate metadata for TVP parameters (STRUCTURED type, Object class)
- Add comprehensive tests for TVP parameter metadata functionality
- Maintain backward compatibility with existing assembly type handling

Resolves: #2744
@divang divang added this to the 13.2.1 milestone Aug 21, 2025
Copy link

codecov bot commented Aug 21, 2025

Codecov Report

❌ Patch coverage is 52.63158% with 9 lines in your changes missing coverage. Please review.
⚠️ Please upload report for BASE (main@1ed161f). Learn more about missing BASE report.
⚠️ Report is 6 commits behind head on main.

Files with missing lines Patch % Lines
...oft/sqlserver/jdbc/SQLServerParameterMetaData.java 52.63% 8 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main    #2746   +/-   ##
=======================================
  Coverage        ?   51.54%           
  Complexity      ?     4082           
=======================================
  Files           ?      149           
  Lines           ?    34280           
  Branches        ?     5726           
=======================================
  Hits            ?    17668           
  Misses          ?    14123           
  Partials        ?     2489           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@machavan machavan modified the milestones: 13.2.1, 13.3.0 Aug 26, 2025
@divang divang requested review from David-Engel and machavan August 27, 2025 04:25
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.

getParameterMetaData crashes with table-valued parameters
2 participants