GH-47859: [C++] Fix creating union types without type_codes for fields.size() == 128 #47815
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Rationale for this change
There is a bug for creating union types with empty
type_codes. Iffields.size()== 128 (kMaxTypeCode+ 1) andtype_codesis empty, static_cast<int8_t> returns -128 andinternal::Iotagenerates an empty vector of type codes, but the expected vector is [0, 1, 2, ..., 127], where 127 iskMaxTypeCode.What changes are included in this PR?
internal::Iotafunction to generate vectors of size =lengthwith values fromstart.internal::Iotacall from old parameters to new for creatingdense_unionandsparse_uniontypes.Are these changes tested?
Yes, there is a new test.
Are there any user-facing changes?
No.
This PR contains a "Critical Fix".
(b) a bug that caused incorrect or invalid data to be produced
If
fields.size()== 128 (kMaxTypeCode+ 1),internal::Iotareturns an empty vector that cannot validate here:https://github.com/apache/arrow/blob/main/cpp/src/arrow/type.cc#L1232