This is an automated email from the ASF dual-hosted git repository.
zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-go.git
The following commit(s) were added to refs/heads/main by this push:
new 27c84bfe fix(parquet/metadata): reject negative row-group indices in
Subset (#1055)
27c84bfe is described below
commit 27c84bfe7c4ddb2618f93c089892d1cc3bd5feb4
Author: Minh Vu <[email protected]>
AuthorDate: Wed Aug 5 19:35:10 2026 +0200
fix(parquet/metadata): reject negative row-group indices in Subset (#1055)
### Rationale for this change
`FileMetaData.Subset` checked only the upper bound. Negative indices
passed validation and later caused a runtime bounds panic despite the
method having an error return.
### What changes are included in this PR?
Reject indices below zero as well as indices at or above the row-group
count.
### Are these changes tested?
Yes. Regression cases cover an isolated negative index and mixed
valid/invalid input.
`go test ./parquet/metadata`
### Are there any user-facing changes?
Negative selections now return an error instead of panicking.
---
parquet/metadata/file.go | 2 +-
parquet/metadata/metadata_test.go | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/parquet/metadata/file.go b/parquet/metadata/file.go
index c3969640..f9035db2 100644
--- a/parquet/metadata/file.go
+++ b/parquet/metadata/file.go
@@ -425,7 +425,7 @@ func (f *FileMetaData) AppendRowGroups(other *FileMetaData)
error {
// row groups by index
func (f *FileMetaData) Subset(rowGroups []int) (*FileMetaData, error) {
for _, i := range rowGroups {
- if i < len(f.RowGroups) {
+ if i >= 0 && i < len(f.RowGroups) {
continue
}
return nil, fmt.Errorf("parquet: this file only has %d row
groups, but requested a subset including row group: %d", len(f.RowGroups), i)
diff --git a/parquet/metadata/metadata_test.go
b/parquet/metadata/metadata_test.go
index fccfbe4b..9c043911 100644
--- a/parquet/metadata/metadata_test.go
+++ b/parquet/metadata/metadata_test.go
@@ -236,6 +236,12 @@ func TestBuildAccess(t *testing.T) {
sub, err := faccessor.Subset([]int{2, 0})
require.NoError(t, err)
assert.True(t, faccessor1.Equals(sub))
+
+ for _, rowGroups := range [][]int{{-1}, {0, -1}} {
+ sub, err := faccessor.Subset(rowGroups)
+ require.Error(t, err)
+ assert.Nil(t, sub)
+ }
}
func TestV1VersionMetadata(t *testing.T) {