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 abf9187b fix(arrow/scalar): handle nil child values in run-end scalars 
(#1001)
abf9187b is described below

commit abf9187bb9d2bbbb6806782bcc7f07c877148fea
Author: Minh Vu <[email protected]>
AuthorDate: Mon Jul 27 19:07:18 2026 +0200

    fix(arrow/scalar): handle nil child values in run-end scalars (#1001)
    
    `MakeNullScalar` creates a null run-end encoded scalar without a child
    value. `RunEndEncoded.Validate` dereferenced that value before checking
    nullness, so validation could panic.
    
    This handles the missing child explicitly: null scalars are accepted,
    malformed non-null scalars still fail, and both paths are covered by
    tests.
    
    Tests: `go test ./arrow/scalar`
---
 arrow/scalar/nested.go      |  7 +++++++
 arrow/scalar/scalar_test.go | 10 ++++++++++
 2 files changed, 17 insertions(+)

diff --git a/arrow/scalar/nested.go b/arrow/scalar/nested.go
index b6adf7f0..5980e9ac 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 49ef342f..1d321d47 100644
--- a/arrow/scalar/scalar_test.go
+++ b/arrow/scalar/scalar_test.go
@@ -1789,4 +1789,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")
 }

Reply via email to