You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ze...@apache.org on 2026/08/05 17:55:21 UTC

(arrow-go) branch main updated: fix(arrow): return an owned slice from Schema.FieldsByName (#1069)

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 6615fd0d fix(arrow): return an owned slice from Schema.FieldsByName (#1069)
6615fd0d is described below

commit 6615fd0d820d966126dcd193ecb63357d93e19af
Author: Minh Vu <vu...@gmail.com>
AuthorDate: Wed Aug 5 19:55:16 2026 +0200

    fix(arrow): return an owned slice from Schema.FieldsByName (#1069)
    
    ## Problem
    
    For a unique name match, `Schema.FieldsByName` returned a one-element
    slice backed by the schema’s internal field storage. Mutating the
    returned element could therefore mutate the schema. The duplicate-name
    path and `Schema.Fields` already returned owned slices.
    
    ## Change
    
    Return a new one-element slice for the unique-match path, making
    ownership consistent across all successful `FieldsByName` results.
    
    ## Coverage
    
    The regression test mutates the returned field and verifies that the
    original schema remains unchanged.
    
    ## Validation
    
    `go test ./arrow`
---
 arrow/schema.go      |  2 +-
 arrow/schema_test.go | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/arrow/schema.go b/arrow/schema.go
index 806bd0d0..cb99adb5 100644
--- a/arrow/schema.go
+++ b/arrow/schema.go
@@ -220,7 +220,7 @@ func (sc *Schema) FieldsByName(n string) ([]Field, bool) {
 		return nil, ok
 	}
 	if len(indices) == 1 {
-		return sc.fields[indices[0] : indices[0]+1], ok
+		return []Field{sc.fields[indices[0]]}, ok
 	} else if len(indices) > 1 {
 		fields := make([]Field, 0, len(indices))
 		for _, v := range indices {
diff --git a/arrow/schema_test.go b/arrow/schema_test.go
index 3cc7b374..0069e69d 100644
--- a/arrow/schema_test.go
+++ b/arrow/schema_test.go
@@ -336,6 +336,19 @@ func TestSchema(t *testing.T) {
 	}
 }
 
+func TestSchemaFieldsByNameReturnsCopy(t *testing.T) {
+	schema := NewSchema([]Field{{Name: "id", Type: PrimitiveTypes.Int64}}, nil)
+	fields, ok := schema.FieldsByName("id")
+	if !ok {
+		t.Fatal("field not found")
+	}
+	fields[0].Name = "changed"
+
+	if got, want := schema.Field(0).Name, "id"; got != want {
+		t.Fatalf("schema field mutated through returned slice: got %q, want %q", got, want)
+	}
+}
+
 func TestSchemaAddField(t *testing.T) {
 	s := NewSchema([]Field{
 		{Name: "f1", Type: PrimitiveTypes.Int32},