From bfe18aa441e0f5535ac2ce13fd0b500a914ad798 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sat, 25 Jul 2026 01:28:21 +0200 Subject: [PATCH 1/2] fix(arrow/scalar): validate null run-end encoded scalars --- arrow/scalar/nested.go | 7 +++++++ arrow/scalar/scalar_test.go | 2 ++ 2 files changed, 9 insertions(+) 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..28c184af0 100644 --- a/arrow/scalar/scalar_test.go +++ b/arrow/scalar/scalar_test.go @@ -1771,4 +1771,6 @@ 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()) } From c26ca93467bdc42607b62e60feedf2e075d69218 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sat, 25 Jul 2026 16:59:19 +0200 Subject: [PATCH 2/2] test(arrow/scalar): cover missing run-end values --- arrow/scalar/scalar_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arrow/scalar/scalar_test.go b/arrow/scalar/scalar_test.go index 28c184af0..7437ff4bc 100644 --- a/arrow/scalar/scalar_test.go +++ b/arrow/scalar/scalar_test.go @@ -1774,3 +1774,11 @@ func TestRunEndEncodedNullScalar(t *testing.T) { 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") +}