diff --git a/pkg/util/typeutil/schema.go b/pkg/util/typeutil/schema.go index ef65bdbc63..c036f13aa5 100644 --- a/pkg/util/typeutil/schema.go +++ b/pkg/util/typeutil/schema.go @@ -1466,7 +1466,11 @@ func ValidateSparseFloatRows(rows ...[]byte) error { return fmt.Errorf("invalid data length in sparse float vector: %d", len(row)) } for i := 0; i < SparseFloatRowElementCount(row); i++ { - if i > 0 && SparseFloatRowIndexAt(row, i) < SparseFloatRowIndexAt(row, i-1) { + idx := SparseFloatRowIndexAt(row, i) + if idx == math.MaxUint32 { + return errors.New("invalid index in sparse float vector: must be less than 2^32-1") + } + if i > 0 && idx < SparseFloatRowIndexAt(row, i-1) { return errors.New("unsorted indices in sparse float vector") } VerifyFloat(float64(SparseFloatRowValueAt(row, i))) diff --git a/pkg/util/typeutil/schema_test.go b/pkg/util/typeutil/schema_test.go index 471b2944f2..093da91d7b 100644 --- a/pkg/util/typeutil/schema_test.go +++ b/pkg/util/typeutil/schema_test.go @@ -18,6 +18,7 @@ package typeutil import ( "encoding/binary" + "math" "reflect" "testing" @@ -2060,6 +2061,14 @@ func TestValidateSparseFloatRows(t *testing.T) { assert.Error(t, err) }) + t.Run("invalid index", func(t *testing.T) { + rows := [][]byte{ + testutils.CreateSparseFloatRow([]uint32{3, 5, math.MaxUint32}, []float32{1.0, 2.0, 3.0}), + } + err := ValidateSparseFloatRows(rows...) + assert.Error(t, err) + }) + t.Run("empty indices or values", func(t *testing.T) { rows := [][]byte{ testutils.CreateSparseFloatRow([]uint32{}, []float32{}),