diff --git a/arrow/scalar/nested.go b/arrow/scalar/nested.go index b6adf7f07..5980e9ace 100644 --- a/arrow/scalar/nested.go +++ b/arrow/scalar/nested.go @@ -754,6 +754,13 @@ func (s *RunEndEncoded) Release() { func (s *RunEndEncoded) value() interface{} { return s.Value.value() } func (s *RunEndEncoded) Validate() (err error) { + if s.Value == nil { + if !s.Valid { + return nil + } + return fmt.Errorf("%w: non-null run-end-encoded scalar has no value", arrow.ErrInvalid) + } + if err = s.Value.Validate(); err != nil { return } diff --git a/arrow/scalar/scalar_test.go b/arrow/scalar/scalar_test.go index 749767c78..7437ff4bc 100644 --- a/arrow/scalar/scalar_test.go +++ b/arrow/scalar/scalar_test.go @@ -1771,4 +1771,14 @@ func TestRunEndEncodedNullScalar(t *testing.T) { assert.False(t, sc.IsValid()) assert.Truef(t, arrow.TypeEqual(dt, sc.DataType()), "expected: %s\ngot: %s", dt, sc.DataType()) assert.IsType(t, (*scalar.RunEndEncoded)(nil), sc) + assert.NoError(t, sc.Validate()) + assert.NoError(t, sc.ValidateFull()) +} + +func TestRunEndEncodedScalarValidateRejectsMissingNonNullValue(t *testing.T) { + sc := scalar.MakeNullScalar(arrow.RunEndEncodedOf(arrow.PrimitiveTypes.Int16, arrow.BinaryTypes.String)).(*scalar.RunEndEncoded) + sc.Valid = true + + assert.ErrorContains(t, sc.Validate(), "has no value") + assert.ErrorContains(t, sc.ValidateFull(), "has no value") }