This is an automated email from the ASF dual-hosted git repository.

sbinet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 699878d  ARROW-4081: [Go] Sum methods panic when the array is empty
699878d is described below

commit 699878dfcac4a14811537135cf94adff962b1e52
Author: alexandreyc <[email protected]>
AuthorDate: Mon Mar 18 08:23:54 2019 +0100

    ARROW-4081: [Go] Sum methods panic when the array is empty
    
    Nothing fundamental but more idiomatic and coherent.
    
    Author: alexandreyc <[email protected]>
    
    Closes #3906 from alexandreyc/master and squashes the following commits:
    
    e9142353 <alexandreyc> Fix memory releasing
    0b2c110c <alexandreyc> Fix ARROW-4081
    3e3136a5 <alexandreyc> Merge remote-tracking branch 'upstream/master'
    71ce16e9 <alexandreyc> Update ifs to switch for Schema.equal
    22c75f9d <alexandreyc> Fix receiver name for Metadata.clone()
---
 go/arrow/math/float64.go        |  3 +++
 go/arrow/math/float64_test.go   | 25 +++++++++++++++++++++----
 go/arrow/math/int64.go          |  3 +++
 go/arrow/math/int64_test.go     | 25 +++++++++++++++++++++----
 go/arrow/math/type.go.tmpl      |  3 +++
 go/arrow/math/type_test.go.tmpl | 25 +++++++++++++++++++++----
 go/arrow/math/uint64.go         |  3 +++
 go/arrow/math/uint64_test.go    | 25 +++++++++++++++++++++----
 go/arrow/schema.go              | 21 ++++++++++-----------
 9 files changed, 106 insertions(+), 27 deletions(-)

diff --git a/go/arrow/math/float64.go b/go/arrow/math/float64.go
index a9c5466..ccd2d85 100644
--- a/go/arrow/math/float64.go
+++ b/go/arrow/math/float64.go
@@ -32,6 +32,9 @@ var (
 
 // Sum returns the summation of all elements in a.
 func (f Float64Funcs) Sum(a *array.Float64) float64 {
+       if a.Len() == 0 {
+               return float64(0)
+       }
        return f.sum(a)
 }
 
diff --git a/go/arrow/math/float64_test.go b/go/arrow/math/float64_test.go
index ad33e0f..9d450ef 100644
--- a/go/arrow/math/float64_test.go
+++ b/go/arrow/math/float64_test.go
@@ -28,13 +28,28 @@ import (
 )
 
 func TestFloat64Funcs_Sum(t *testing.T) {
-       vec := makeArrayFloat64(10000)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       vec := makeArrayFloat64(10000, mem)
+       defer vec.Release()
        res := math.Float64.Sum(vec)
        assert.Equal(t, res, float64(49995000))
 }
 
-func makeArrayFloat64(l int) *array.Float64 {
-       fb := array.NewFloat64Builder(memory.NewGoAllocator())
+func TestFloat64Funcs_SumEmpty(t *testing.T) {
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       b := array.NewFloat64Builder(mem)
+       defer b.Release()
+       vec := b.NewFloat64Array()
+       defer vec.Release()
+       res := math.Float64.Sum(vec)
+       assert.Equal(t, res, float64(0))
+}
+
+func makeArrayFloat64(l int, mem memory.Allocator) *array.Float64 {
+       fb := array.NewFloat64Builder(mem)
+       defer fb.Release()
        fb.Reserve(l)
        for i := 0; i < l; i++ {
                fb.Append(float64(i))
@@ -43,7 +58,9 @@ func makeArrayFloat64(l int) *array.Float64 {
 }
 
 func benchmarkFloat64Funcs_Sum(b *testing.B, n int) {
-       vec := makeArrayFloat64(n)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(b, 0)
+       vec := makeArrayFloat64(n, mem)
        b.SetBytes(int64(vec.Len() * 8))
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
diff --git a/go/arrow/math/int64.go b/go/arrow/math/int64.go
index 4f70d2e..a618319 100644
--- a/go/arrow/math/int64.go
+++ b/go/arrow/math/int64.go
@@ -32,6 +32,9 @@ var (
 
 // Sum returns the summation of all elements in a.
 func (f Int64Funcs) Sum(a *array.Int64) int64 {
+       if a.Len() == 0 {
+               return int64(0)
+       }
        return f.sum(a)
 }
 
diff --git a/go/arrow/math/int64_test.go b/go/arrow/math/int64_test.go
index 1972282..56d3e55 100644
--- a/go/arrow/math/int64_test.go
+++ b/go/arrow/math/int64_test.go
@@ -28,13 +28,28 @@ import (
 )
 
 func TestInt64Funcs_Sum(t *testing.T) {
-       vec := makeArrayInt64(10000)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       vec := makeArrayInt64(10000, mem)
+       defer vec.Release()
        res := math.Int64.Sum(vec)
        assert.Equal(t, res, int64(49995000))
 }
 
-func makeArrayInt64(l int) *array.Int64 {
-       fb := array.NewInt64Builder(memory.NewGoAllocator())
+func TestInt64Funcs_SumEmpty(t *testing.T) {
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       b := array.NewInt64Builder(mem)
+       defer b.Release()
+       vec := b.NewInt64Array()
+       defer vec.Release()
+       res := math.Int64.Sum(vec)
+       assert.Equal(t, res, int64(0))
+}
+
+func makeArrayInt64(l int, mem memory.Allocator) *array.Int64 {
+       fb := array.NewInt64Builder(mem)
+       defer fb.Release()
        fb.Reserve(l)
        for i := 0; i < l; i++ {
                fb.Append(int64(i))
@@ -43,7 +58,9 @@ func makeArrayInt64(l int) *array.Int64 {
 }
 
 func benchmarkInt64Funcs_Sum(b *testing.B, n int) {
-       vec := makeArrayInt64(n)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(b, 0)
+       vec := makeArrayInt64(n, mem)
        b.SetBytes(int64(vec.Len() * 8))
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
diff --git a/go/arrow/math/type.go.tmpl b/go/arrow/math/type.go.tmpl
index 1b2dd69..71a11cb 100644
--- a/go/arrow/math/type.go.tmpl
+++ b/go/arrow/math/type.go.tmpl
@@ -32,6 +32,9 @@ var (
 
 // Sum returns the summation of all elements in a.
 func (f {{.Name}}Funcs) Sum(a *array.{{.Name}}) {{.Type}} {
+       if a.Len() == 0 {
+               return {{.Type}}(0)
+       }
        return f.sum(a)
 }
 
diff --git a/go/arrow/math/type_test.go.tmpl b/go/arrow/math/type_test.go.tmpl
index f1b744c..4c6a49f 100644
--- a/go/arrow/math/type_test.go.tmpl
+++ b/go/arrow/math/type_test.go.tmpl
@@ -28,13 +28,28 @@ import (
 {{$name := printf "%s_%s" .In.Type .D.arch}}
 {{with .In}}
 func Test{{.Name}}Funcs_Sum(t *testing.T) {
-       vec := makeArray{{.Name}}(10000)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       vec := makeArray{{.Name}}(10000, mem)
+       defer vec.Release()
        res := math.{{.Name}}.Sum(vec)
        assert.Equal(t, res, {{.Type}}(49995000))
 }
 
-func makeArray{{.Name}}(l int) *array.{{.Name}} {
-       fb := array.New{{.Name}}Builder(memory.NewGoAllocator())
+func Test{{.Name}}Funcs_SumEmpty(t *testing.T) {
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       b := array.New{{.Name}}Builder(mem)
+       defer b.Release()
+       vec := b.New{{.Name}}Array()
+       defer vec.Release()
+       res := math.{{.Name}}.Sum(vec)
+       assert.Equal(t, res, {{.Type}}(0))
+}
+
+func makeArray{{.Name}}(l int, mem memory.Allocator) *array.{{.Name}} {
+       fb := array.New{{.Name}}Builder(mem)
+       defer fb.Release()
        fb.Reserve(l)
        for i := 0; i < l; i++ {
                fb.Append({{.Type}}(i))
@@ -43,7 +58,9 @@ func makeArray{{.Name}}(l int) *array.{{.Name}} {
 }
 
 func benchmark{{.Name}}Funcs_Sum(b *testing.B, n int) {
-       vec := makeArray{{.Name}}(n)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(b, 0)
+       vec := makeArray{{.Name}}(n, mem)
        b.SetBytes(int64(vec.Len() * 8))
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
diff --git a/go/arrow/math/uint64.go b/go/arrow/math/uint64.go
index 875e821..6918707 100644
--- a/go/arrow/math/uint64.go
+++ b/go/arrow/math/uint64.go
@@ -32,6 +32,9 @@ var (
 
 // Sum returns the summation of all elements in a.
 func (f Uint64Funcs) Sum(a *array.Uint64) uint64 {
+       if a.Len() == 0 {
+               return uint64(0)
+       }
        return f.sum(a)
 }
 
diff --git a/go/arrow/math/uint64_test.go b/go/arrow/math/uint64_test.go
index 7b8a165..fb242a0 100644
--- a/go/arrow/math/uint64_test.go
+++ b/go/arrow/math/uint64_test.go
@@ -28,13 +28,28 @@ import (
 )
 
 func TestUint64Funcs_Sum(t *testing.T) {
-       vec := makeArrayUint64(10000)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       vec := makeArrayUint64(10000, mem)
+       defer vec.Release()
        res := math.Uint64.Sum(vec)
        assert.Equal(t, res, uint64(49995000))
 }
 
-func makeArrayUint64(l int) *array.Uint64 {
-       fb := array.NewUint64Builder(memory.NewGoAllocator())
+func TestUint64Funcs_SumEmpty(t *testing.T) {
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+       b := array.NewUint64Builder(mem)
+       defer b.Release()
+       vec := b.NewUint64Array()
+       defer vec.Release()
+       res := math.Uint64.Sum(vec)
+       assert.Equal(t, res, uint64(0))
+}
+
+func makeArrayUint64(l int, mem memory.Allocator) *array.Uint64 {
+       fb := array.NewUint64Builder(mem)
+       defer fb.Release()
        fb.Reserve(l)
        for i := 0; i < l; i++ {
                fb.Append(uint64(i))
@@ -43,7 +58,9 @@ func makeArrayUint64(l int) *array.Uint64 {
 }
 
 func benchmarkUint64Funcs_Sum(b *testing.B, n int) {
-       vec := makeArrayUint64(n)
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(b, 0)
+       vec := makeArrayUint64(n, mem)
        b.SetBytes(int64(vec.Len() * 8))
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
diff --git a/go/arrow/schema.go b/go/arrow/schema.go
index 8ae5fc1..a0cccc2 100644
--- a/go/arrow/schema.go
+++ b/go/arrow/schema.go
@@ -64,17 +64,17 @@ func (md Metadata) Len() int         { return len(md.keys) }
 func (md Metadata) Keys() []string   { return md.keys }
 func (md Metadata) Values() []string { return md.values }
 
-func (kv Metadata) clone() Metadata {
-       if len(kv.keys) == 0 {
+func (md Metadata) clone() Metadata {
+       if len(md.keys) == 0 {
                return Metadata{}
        }
 
        o := Metadata{
-               keys:   make([]string, len(kv.keys)),
-               values: make([]string, len(kv.values)),
+               keys:   make([]string, len(md.keys)),
+               values: make([]string, len(md.values)),
        }
-       copy(o.keys, kv.keys)
-       copy(o.values, kv.values)
+       copy(o.keys, md.keys)
+       copy(o.values, md.values)
 
        return o
 }
@@ -142,13 +142,12 @@ func (sc *Schema) HasMetadata() bool { return 
len(sc.meta.keys) > 0 }
 // Equal returns whether two schema are equal.
 // Equal does not compare the metadata.
 func (sc *Schema) Equal(o *Schema) bool {
-       if sc == o {
+       switch {
+       case sc == o:
                return true
-       }
-       if sc == nil || o == nil {
+       case sc == nil || o == nil:
                return false
-       }
-       if len(sc.fields) != len(o.fields) {
+       case len(sc.fields) != len(o.fields):
                return false
        }
 

Reply via email to