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

zeroshade 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 de1ada364d ARROW-17734: [Go] Implement Take for Lists and Dense Union 
(#14130)
de1ada364d is described below

commit de1ada364dd0affd5b075e40fe5ffbb53f1301f9
Author: Matt Topol <[email protected]>
AuthorDate: Fri Sep 16 11:20:34 2022 -0400

    ARROW-17734: [Go] Implement Take for Lists and Dense Union (#14130)
    
    Authored-by: Matt Topol <[email protected]>
    Signed-off-by: Matt Topol <[email protected]>
---
 go/arrow/array/bufferbuilder.go                    |   3 +
 go/arrow/compute/executor.go                       |   5 +
 go/arrow/compute/go.mod                            |  11 +-
 go/arrow/compute/go.sum                            | 280 ++-------------------
 go/arrow/compute/internal/exec/span.go             |   2 +
 .../compute/internal/kernels/vector_selection.go   | 175 +++++++++++--
 go/arrow/compute/selection.go                      |  90 ++++++-
 go/arrow/compute/vector_selection_test.go          | 117 +++++++++
 8 files changed, 398 insertions(+), 285 deletions(-)

diff --git a/go/arrow/array/bufferbuilder.go b/go/arrow/array/bufferbuilder.go
index 6a91031c22..f8a6bed255 100644
--- a/go/arrow/array/bufferbuilder.go
+++ b/go/arrow/array/bufferbuilder.go
@@ -131,6 +131,9 @@ func (b *bufferBuilder) Finish() (buffer *memory.Buffer) {
        buffer = b.buffer
        b.buffer = nil
        b.Reset()
+       if buffer == nil {
+               buffer = memory.NewBufferBytes(nil)
+       }
        return
 }
 
diff --git a/go/arrow/compute/executor.go b/go/arrow/compute/executor.go
index 0e09e4afc0..fce290c092 100644
--- a/go/arrow/compute/executor.go
+++ b/go/arrow/compute/executor.go
@@ -20,6 +20,7 @@ import (
        "context"
        "fmt"
        "math"
+       "runtime"
        "sync"
 
        "github.com/apache/arrow/go/v10/arrow"
@@ -44,6 +45,7 @@ type ExecCtx struct {
        PreallocContiguous bool
        Registry           FunctionRegistry
        ExecChannelSize    int
+       NP                 int
 }
 
 type ctxExecKey struct{}
@@ -70,6 +72,9 @@ func init() {
        defaultExecCtx.PreallocContiguous = true
        defaultExecCtx.Registry = GetFunctionRegistry()
        defaultExecCtx.ExecChannelSize = 10
+       // default level of parallelism
+       // set to 1 to disable parallelization
+       defaultExecCtx.NP = runtime.NumCPU()
 }
 
 // SetExecCtx returns a new child context containing the passed in ExecCtx
diff --git a/go/arrow/compute/go.mod b/go/arrow/compute/go.mod
index 224d56faff..9aa0379f68 100644
--- a/go/arrow/compute/go.mod
+++ b/go/arrow/compute/go.mod
@@ -23,8 +23,9 @@ replace github.com/apache/arrow/go/v10 => ../../
 require (
        github.com/apache/arrow/go/v10 v10.0.0-00010101000000-000000000000
        github.com/stretchr/testify v1.8.0
-       golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e
-       golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664
+       golang.org/x/exp v0.0.0-20220827204233-334a2380cb91
+       golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde
+       golang.org/x/sys v0.0.0-20220829200755-d48e67d00261
        golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f
 )
 
@@ -32,16 +33,18 @@ require (
        github.com/andybalholm/brotli v1.0.4 // indirect
        github.com/apache/thrift v0.16.0 // indirect
        github.com/davecgh/go-spew v1.1.1 // indirect
-       github.com/goccy/go-json v0.9.10 // indirect
+       github.com/goccy/go-json v0.9.11 // indirect
        github.com/golang/snappy v0.0.4 // indirect
-       github.com/google/flatbuffers v2.0.6+incompatible // indirect
+       github.com/google/flatbuffers v2.0.8+incompatible // indirect
        github.com/klauspost/asmfmt v1.3.2 // indirect
        github.com/klauspost/compress v1.15.9 // indirect
        github.com/klauspost/cpuid/v2 v2.0.9 // indirect
+       github.com/kr/text v0.2.0 // indirect
        github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // 
indirect
        github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
        github.com/pierrec/lz4/v4 v4.1.15 // indirect
        github.com/pmezard/go-difflib v1.0.0 // indirect
+       github.com/rogpeppe/go-internal v1.9.0 // indirect
        github.com/zeebo/xxh3 v1.0.2 // indirect
        golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
        golang.org/x/tools v0.1.12 // indirect
diff --git a/go/arrow/compute/go.sum b/go/arrow/compute/go.sum
index b05bdd419c..cc95f335c2 100644
--- a/go/arrow/compute/go.sum
+++ b/go/arrow/compute/go.sum
@@ -1,320 +1,74 @@
-cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod 
h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod 
h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
-git.sr.ht/~sbinet/gg v0.3.1/go.mod 
h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
-github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod 
h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c 
h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
-github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod 
h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
-github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod 
h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
-github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod 
h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
-github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod 
h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
-github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod 
h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
 github.com/andybalholm/brotli v1.0.4 
h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
 github.com/andybalholm/brotli v1.0.4/go.mod 
h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
-github.com/antihax/optional v1.0.0/go.mod 
h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/apache/thrift v0.16.0 
h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY=
 github.com/apache/thrift v0.16.0/go.mod 
h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
-github.com/boombuler/barcode v1.0.0/go.mod 
h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/boombuler/barcode v1.0.1/go.mod 
h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/cespare/xxhash/v2 v2.1.1/go.mod 
h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/client9/misspell v0.3.4/go.mod 
h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod 
h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
-github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod 
h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
-github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod 
h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
-github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/creack/pty v1.1.9/go.mod 
h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 
h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod 
h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
-github.com/dustin/go-humanize v1.0.0/go.mod 
h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/envoyproxy/go-control-plane v0.9.0/go.mod 
h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane 
v0.9.1-0.20191026205805-5f8ba28d4473/go.mod 
h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
-github.com/envoyproxy/go-control-plane v0.9.4/go.mod 
h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
-github.com/envoyproxy/go-control-plane 
v0.9.9-0.20201210154907-fd9021fe5dad/go.mod 
h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
-github.com/envoyproxy/go-control-plane 
v0.10.2-0.20220325020618-49ff273808a1/go.mod 
h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
-github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod 
h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod 
h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/fogleman/gg v1.3.0/go.mod 
h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/ghodss/yaml v1.0.0/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/go-fonts/dejavu v0.1.0/go.mod 
h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
-github.com/go-fonts/latin-modern v0.2.0/go.mod 
h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
-github.com/go-fonts/liberation v0.1.1/go.mod 
h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
-github.com/go-fonts/liberation v0.2.0/go.mod 
h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
-github.com/go-fonts/stix v0.1.0/go.mod 
h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
-github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod 
h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod 
h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
-github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod 
h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk=
-github.com/go-pdf/fpdf v0.5.0/go.mod 
h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
-github.com/go-pdf/fpdf v0.6.0/go.mod 
h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
-github.com/goccy/go-json v0.9.10 
h1:hCeNmprSNLB8B8vQKWl6DpuH0t60oEs+TAk9a7CScKc=
-github.com/goccy/go-json v0.9.10/go.mod 
h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod 
h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/goccy/go-json v0.9.11 
h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
+github.com/goccy/go-json v0.9.11/go.mod 
h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/golang/mock v1.5.0/go.mod 
h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
-github.com/golang/protobuf v1.2.0/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.2/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.3/go.mod 
h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod 
h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod 
h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod 
h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod 
h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod 
h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1/go.mod 
h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
-github.com/golang/protobuf v1.4.2/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.4.3/go.mod 
h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0/go.mod 
h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.2/go.mod 
h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod 
h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/flatbuffers v2.0.6+incompatible 
h1:XHFReMv7nFFusa+CEokzWbzaYocKXI6C7hdU5Kgh9Lw=
-github.com/google/flatbuffers v2.0.6+incompatible/go.mod 
h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
-github.com/google/go-cmp v0.2.0/go.mod 
h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod 
h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.3/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7/go.mod 
h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
-github.com/google/go-cmp v0.5.8/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/uuid v1.1.2/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.3.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod 
h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/jung-kurt/gofpdf v1.0.0/go.mod 
h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod 
h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod 
h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
-github.com/kisielk/gotool v1.0.0/go.mod 
h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/google/flatbuffers v2.0.8+incompatible 
h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
+github.com/google/flatbuffers v2.0.8+incompatible/go.mod 
h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
 github.com/klauspost/asmfmt v1.3.2 
h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
 github.com/klauspost/asmfmt v1.3.2/go.mod 
h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
 github.com/klauspost/compress v1.15.9 
h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
 github.com/klauspost/compress v1.15.9/go.mod 
h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 github.com/klauspost/cpuid/v2 v2.0.9 
h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod 
h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
-github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
-github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/mattn/go-isatty v0.0.12/go.mod 
h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-isatty v0.0.14/go.mod 
h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
-github.com/mattn/go-sqlite3 v1.14.12/go.mod 
h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod 
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 
h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
 github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod 
h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
 github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 
h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
 github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod 
h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
-github.com/phpdave11/gofpdf v1.4.2/go.mod 
h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
-github.com/phpdave11/gofpdi v1.0.12/go.mod 
h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
-github.com/phpdave11/gofpdi v1.0.13/go.mod 
h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
 github.com/pierrec/lz4/v4 v4.1.15 
h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0=
 github.com/pierrec/lz4/v4 v4.1.15/go.mod 
h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
-github.com/pkg/errors v0.8.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod 
h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod 
h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/rogpeppe/fastuuid v1.2.0/go.mod 
h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod 
h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
-github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod 
h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
+github.com/rogpeppe/go-internal v1.9.0 
h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod 
h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod 
h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/testify v1.2.2/go.mod 
h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.5.1/go.mod 
h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0 
h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod 
h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.4.1/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
-github.com/zeebo/assert v1.3.0/go.mod 
h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
 github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
 github.com/zeebo/xxh3 v1.0.2/go.mod 
h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
-go.opentelemetry.io/proto/otlp v0.7.0/go.mod 
h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod 
h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
-golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e 
h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
-golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod 
h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
-golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod 
h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
-golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod 
h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
-golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod 
h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod 
h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod 
h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod 
h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod 
h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod 
h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
-golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod 
h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
-golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 
h1:tnebWN09GYg9OLPss1KXj8txwZc6X6uMr6VFdcGNbHw=
+golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod 
h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod 
h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 
h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod 
h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod 
h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod 
h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde 
h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
+golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 
h1:v1W7bwXHsnLLloWYTVEdvGvA7BHMeBYsPcF0GLDxIRs=
-golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 
h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
+golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod 
h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod 
h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod 
h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod 
h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.0/go.mod 
h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.9/go.mod 
h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
-golang.org/x/tools v0.1.10/go.mod 
h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
 golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f 
h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
 golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod 
h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
-gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod 
h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
-gonum.org/v1/gonum v0.8.2/go.mod 
h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
-gonum.org/v1/gonum v0.9.3/go.mod 
h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
 gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
 gonum.org/v1/gonum v0.11.0/go.mod 
h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA=
-gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod 
h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
-gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod 
h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
-gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
-gonum.org/v1/plot v0.10.1/go.mod 
h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo=
-google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod 
h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod 
h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod 
h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
-google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod 
h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod 
h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
-google.golang.org/grpc v1.19.0/go.mod 
h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/grpc v1.23.0/go.mod 
h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
-google.golang.org/grpc v1.25.1/go.mod 
h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
-google.golang.org/grpc v1.27.0/go.mod 
h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
-google.golang.org/grpc v1.33.1/go.mod 
h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
-google.golang.org/grpc v1.36.0/go.mod 
h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
-google.golang.org/grpc v1.48.0/go.mod 
h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod 
h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod 
h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod 
h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod 
h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod 
h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.22.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.0/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod 
h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.25.0/go.mod 
h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod 
h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.28.1/go.mod 
h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 
h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c 
h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.1.3/go.mod 
h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las=
-lukechampine.com/uint128 v1.1.1/go.mod 
h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
-lukechampine.com/uint128 v1.2.0/go.mod 
h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
-modernc.org/cc/v3 v3.36.0/go.mod 
h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
-modernc.org/cc/v3 v3.36.1/go.mod 
h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
-modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod 
h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc=
-modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod 
h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw=
-modernc.org/ccgo/v3 v3.16.4/go.mod 
h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
-modernc.org/ccgo/v3 v3.16.6/go.mod 
h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ=
-modernc.org/ccgo/v3 v3.16.8/go.mod 
h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws=
-modernc.org/ccorpus v1.11.6/go.mod 
h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ=
-modernc.org/httpfs v1.0.6/go.mod 
h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM=
-modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod 
h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
-modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A=
-modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU=
-modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
-modernc.org/libc v1.16.17/go.mod 
h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU=
-modernc.org/libc v1.16.19/go.mod 
h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA=
-modernc.org/mathutil v1.2.2/go.mod 
h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/mathutil v1.4.1/go.mod 
h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
-modernc.org/memory v1.1.1/go.mod 
h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw=
-modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
-modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
-modernc.org/sqlite v1.18.0/go.mod 
h1:B9fRWZacNxJBHoCJZQr1R54zhVn3fjfl0aszflrTSxY=
-modernc.org/strutil v1.1.1/go.mod 
h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw=
-modernc.org/strutil v1.1.2/go.mod 
h1:OYajnUAcI/MX+XD/Wx7v1bbdvcQSvxgtb0gC+u3d3eg=
-modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
-modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
-modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/go/arrow/compute/internal/exec/span.go 
b/go/arrow/compute/internal/exec/span.go
index 17a4e5378a..2e1775985f 100644
--- a/go/arrow/compute/internal/exec/span.go
+++ b/go/arrow/compute/internal/exec/span.go
@@ -160,6 +160,8 @@ func (a *ArraySpan) MakeData() arrow.ArrayData {
                defer dict.Release()
                result.SetDictionary(dict)
                return result
+       } else if dt.ID() == arrow.DENSE_UNION || dt.ID() == arrow.SPARSE_UNION 
{
+               bufs[0] = nil
        }
 
        if len(a.Children) > 0 {
diff --git a/go/arrow/compute/internal/kernels/vector_selection.go 
b/go/arrow/compute/internal/kernels/vector_selection.go
index c4bfcca8bc..e2b4e4d351 100644
--- a/go/arrow/compute/internal/kernels/vector_selection.go
+++ b/go/arrow/compute/internal/kernels/vector_selection.go
@@ -1070,20 +1070,20 @@ func takeExec(ctx *exec.KernelCtx, outputLen int64, 
values, indices *exec.ArrayS
        }
 }
 
-type outputFn func(*exec.KernelCtx, int64, *exec.ArraySpan, *exec.ArraySpan, 
*exec.ExecResult, func(int64) error, func() error) error
-type implFn func(*exec.KernelCtx, *exec.ExecSpan, int64, *exec.ExecResult, 
outputFn) error
+type selectionOutputFn func(*exec.KernelCtx, int64, *exec.ArraySpan, 
*exec.ArraySpan, *exec.ExecResult, func(int64) error, func() error) error
+type selectionImplFn func(*exec.KernelCtx, *exec.ExecSpan, int64, 
*exec.ExecResult, selectionOutputFn) error
 
-func FilterExec(impl implFn, fn outputFn) exec.ArrayKernelExec {
+func FilterExec(impl selectionImplFn) exec.ArrayKernelExec {
        return func(ctx *exec.KernelCtx, batch *exec.ExecSpan, out 
*exec.ExecResult) error {
                var (
                        selection    = &batch.Values[1].Array
                        outputLength = getFilterOutputSize(selection, 
ctx.State.(FilterState).NullSelection)
                )
-               return impl(ctx, batch, outputLength, out, fn)
+               return impl(ctx, batch, outputLength, out, filterExec)
        }
 }
 
-func TakeExec(impl implFn, fn outputFn) exec.ArrayKernelExec {
+func TakeExec(impl selectionImplFn) exec.ArrayKernelExec {
        return func(ctx *exec.KernelCtx, batch *exec.ExecSpan, out 
*exec.ExecResult) error {
                if ctx.State.(TakeState).BoundsCheck {
                        if err := checkIndexBounds(&batch.Values[1].Array, 
uint64(batch.Values[0].Array.Len)); err != nil {
@@ -1091,11 +1091,11 @@ func TakeExec(impl implFn, fn outputFn) 
exec.ArrayKernelExec {
                        }
                }
 
-               return impl(ctx, batch, batch.Values[1].Array.Len, out, fn)
+               return impl(ctx, batch, batch.Values[1].Array.Len, out, 
takeExec)
        }
 }
 
-func VarBinaryImpl[OffsetT int32 | int64](ctx *exec.KernelCtx, batch 
*exec.ExecSpan, outputLength int64, out *exec.ExecResult, fn outputFn) error {
+func VarBinaryImpl[OffsetT int32 | int64](ctx *exec.KernelCtx, batch 
*exec.ExecSpan, outputLength int64, out *exec.ExecResult, fn selectionOutputFn) 
error {
        var (
                values        = &batch.Values[0].Array
                selection     = &batch.Values[1].Array
@@ -1144,7 +1144,7 @@ func VarBinaryImpl[OffsetT int32 | int64](ctx 
*exec.KernelCtx, batch *exec.ExecS
        return nil
 }
 
-func FSBImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, outputLength int64, 
out *exec.ExecResult, fn outputFn) error {
+func FSBImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, outputLength int64, 
out *exec.ExecResult, fn selectionOutputFn) error {
        var (
                values    = &batch.Values[0].Array
                selection = &batch.Values[1].Array
@@ -1177,6 +1177,149 @@ func FSBImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, 
outputLength int64, out
        return nil
 }
 
+func ListImpl[OffsetT int32 | int64](ctx *exec.KernelCtx, batch 
*exec.ExecSpan, outputLength int64, out *exec.ExecResult, fn selectionOutputFn) 
error {
+       var (
+               values    = &batch.Values[0].Array
+               selection = &batch.Values[1].Array
+
+               rawOffsets      = exec.GetSpanOffsets[OffsetT](values, 1)
+               mem             = exec.GetAllocator(ctx.Ctx)
+               offsetBuilder   = newBufferBuilder[OffsetT](mem)
+               childIdxBuilder = newBufferBuilder[OffsetT](mem)
+       )
+
+       if values.Len > 0 {
+               dataLength := rawOffsets[values.Len] - rawOffsets[0]
+               meanListLen := float64(dataLength) / float64(values.Len)
+               childIdxBuilder.reserve(int(meanListLen))
+       }
+
+       offsetBuilder.reserve(int(outputLength) + 1)
+       var offset OffsetT
+       err := fn(ctx, outputLength, values, selection, out,
+               func(idx int64) error {
+                       offsetBuilder.unsafeAppend(offset)
+                       valueOffset := rawOffsets[idx]
+                       valueLength := rawOffsets[idx+1] - valueOffset
+                       offset += valueLength
+                       childIdxBuilder.reserve(int(valueLength))
+                       for j := valueOffset; j < valueOffset+valueLength; j++ {
+                               childIdxBuilder.unsafeAppend(j)
+                       }
+                       return nil
+               }, func() error {
+                       offsetBuilder.unsafeAppend(offset)
+                       return nil
+               })
+
+       if err != nil {
+               return err
+       }
+
+       offsetBuilder.unsafeAppend(offset)
+       out.Buffers[1].WrapBuffer(offsetBuilder.finish())
+
+       out.Children = make([]exec.ArraySpan, 1)
+       out.Children[0].Type = exec.GetDataType[OffsetT]()
+       out.Children[0].Len = int64(childIdxBuilder.len())
+       out.Children[0].Buffers[1].WrapBuffer(childIdxBuilder.finish())
+
+       return nil
+}
+
+func FSLImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, outputLength int64, 
out *exec.ExecResult, fn selectionOutputFn) error {
+       var (
+               values    = &batch.Values[0].Array
+               selection = &batch.Values[1].Array
+
+               listSize   = values.Type.(*arrow.FixedSizeListType).Len()
+               baseOffset = values.Offset
+
+               childIdxBuilder = 
array.NewInt64Builder(exec.GetAllocator(ctx.Ctx))
+       )
+
+       // we need to take listSize elements even for null elements of indices
+       childIdxBuilder.Reserve(int(outputLength) * int(listSize))
+       err := fn(ctx, outputLength, values, selection, out,
+               func(idx int64) error {
+                       offset := (baseOffset + idx) * int64(listSize)
+                       for j := offset; j < (offset + int64(listSize)); j++ {
+                               childIdxBuilder.UnsafeAppend(j)
+                       }
+                       return nil
+               }, func() error {
+                       for n := int32(0); n < listSize; n++ {
+                               childIdxBuilder.AppendNull()
+                       }
+                       return nil
+               })
+
+       if err != nil {
+               return err
+       }
+
+       arr := childIdxBuilder.NewArray()
+       defer arr.Release()
+       out.Children = make([]exec.ArraySpan, 1)
+       out.Children[0].TakeOwnership(arr.Data())
+       return nil
+}
+
+func DenseUnionImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, outputLength 
int64, out *exec.ExecResult, fn selectionOutputFn) error {
+       var (
+               values    = &batch.Values[0].Array
+               selection = &batch.Values[1].Array
+
+               mem               = exec.GetAllocator(ctx.Ctx)
+               valueOffsetBldr   = newBufferBuilder[int32](mem)
+               childIdBldr       = newBufferBuilder[int8](mem)
+               typeCodes         = values.Type.(arrow.UnionType).TypeCodes()
+               childIndicesBldrs = make([]*array.Int32Builder, len(typeCodes))
+       )
+
+       for i := range childIndicesBldrs {
+               childIndicesBldrs[i] = array.NewInt32Builder(mem)
+       }
+
+       childIdBldr.reserve(int(outputLength))
+       valueOffsetBldr.reserve(int(outputLength))
+
+       typedValues := values.MakeArray().(*array.DenseUnion)
+       defer typedValues.Release()
+
+       err := fn(ctx, outputLength, values, selection, out,
+               func(idx int64) error {
+                       childID := typedValues.ChildID(int(idx))
+                       childIdBldr.unsafeAppend(typeCodes[childID])
+                       valueOffset := typedValues.ValueOffset(int(idx))
+                       
valueOffsetBldr.unsafeAppend(int32(childIndicesBldrs[childID].Len()))
+                       childIndicesBldrs[childID].Append(valueOffset)
+                       return nil
+               }, func() error {
+                       childID := 0
+                       childIdBldr.unsafeAppend(typeCodes[childID])
+                       
valueOffsetBldr.unsafeAppend(int32(childIndicesBldrs[childID].Len()))
+                       childIndicesBldrs[childID].AppendNull()
+                       return nil
+               })
+       if err != nil {
+               return err
+       }
+
+       out.Type = typedValues.DataType()
+       out.Buffers[1].WrapBuffer(childIdBldr.finish())
+       out.Buffers[2].WrapBuffer(valueOffsetBldr.finish())
+
+       out.Children = make([]exec.ArraySpan, len(childIndicesBldrs))
+       for i, b := range childIndicesBldrs {
+               arr := b.NewArray()
+               out.Children[i].TakeOwnership(arr.Data())
+               arr.Release()
+               b.Release()
+       }
+       return nil
+}
+
 func FilterBinary(ctx *exec.KernelCtx, batch *exec.ExecSpan, out 
*exec.ExecResult) error {
        var (
                nullSelect = ctx.State.(FilterState).NullSelection
@@ -1228,9 +1371,9 @@ func GetVectorSelectionKernels() (filterkernels, 
takeKernels []SelectionKernelDa
        filterkernels = []SelectionKernelData{
                {In: exec.NewMatchedInput(exec.Primitive()), Exec: 
PrimitiveFilter},
                {In: exec.NewExactInput(arrow.Null), Exec: NullFilter},
-               {In: exec.NewIDInput(arrow.DECIMAL128), Exec: 
FilterExec(FSBImpl, filterExec)},
-               {In: exec.NewIDInput(arrow.DECIMAL256), Exec: 
FilterExec(FSBImpl, filterExec)},
-               {In: exec.NewIDInput(arrow.FIXED_SIZE_BINARY), Exec: 
FilterExec(FSBImpl, filterExec)},
+               {In: exec.NewIDInput(arrow.DECIMAL128), Exec: 
FilterExec(FSBImpl)},
+               {In: exec.NewIDInput(arrow.DECIMAL256), Exec: 
FilterExec(FSBImpl)},
+               {In: exec.NewIDInput(arrow.FIXED_SIZE_BINARY), Exec: 
FilterExec(FSBImpl)},
                {In: exec.NewMatchedInput(exec.BinaryLike()), Exec: 
FilterBinary},
                {In: exec.NewMatchedInput(exec.LargeBinaryLike()), Exec: 
FilterBinary},
        }
@@ -1238,11 +1381,11 @@ func GetVectorSelectionKernels() (filterkernels, 
takeKernels []SelectionKernelDa
        takeKernels = []SelectionKernelData{
                {In: exec.NewExactInput(arrow.Null), Exec: NullTake},
                {In: exec.NewMatchedInput(exec.Primitive()), Exec: 
PrimitiveTake},
-               {In: exec.NewIDInput(arrow.DECIMAL128), Exec: TakeExec(FSBImpl, 
takeExec)},
-               {In: exec.NewIDInput(arrow.DECIMAL256), Exec: TakeExec(FSBImpl, 
takeExec)},
-               {In: exec.NewIDInput(arrow.FIXED_SIZE_BINARY), Exec: 
TakeExec(FSBImpl, takeExec)},
-               {In: exec.NewMatchedInput(exec.BinaryLike()), Exec: 
TakeExec(VarBinaryImpl[int32], takeExec)},
-               {In: exec.NewMatchedInput(exec.LargeBinaryLike()), Exec: 
TakeExec(VarBinaryImpl[int64], takeExec)},
+               {In: exec.NewIDInput(arrow.DECIMAL128), Exec: 
TakeExec(FSBImpl)},
+               {In: exec.NewIDInput(arrow.DECIMAL256), Exec: 
TakeExec(FSBImpl)},
+               {In: exec.NewIDInput(arrow.FIXED_SIZE_BINARY), Exec: 
TakeExec(FSBImpl)},
+               {In: exec.NewMatchedInput(exec.BinaryLike()), Exec: 
TakeExec(VarBinaryImpl[int32])},
+               {In: exec.NewMatchedInput(exec.LargeBinaryLike()), Exec: 
TakeExec(VarBinaryImpl[int64])},
        }
        return
 }
diff --git a/go/arrow/compute/selection.go b/go/arrow/compute/selection.go
index c2e78fc48c..88d3daa74e 100644
--- a/go/arrow/compute/selection.go
+++ b/go/arrow/compute/selection.go
@@ -21,8 +21,10 @@ import (
        "fmt"
 
        "github.com/apache/arrow/go/v10/arrow"
+       "github.com/apache/arrow/go/v10/arrow/array"
        "github.com/apache/arrow/go/v10/arrow/compute/internal/exec"
        "github.com/apache/arrow/go/v10/arrow/compute/internal/kernels"
+       "golang.org/x/sync/errgroup"
 )
 
 var (
@@ -64,8 +66,8 @@ var (
                })
 )
 
-func Take(ctx context.Context, opts *TakeOptions, values, indices Datum) 
(Datum, error) {
-       return CallFunction(ctx, "array_take", opts, values, indices)
+func Take(ctx context.Context, opts TakeOptions, values, indices Datum) 
(Datum, error) {
+       return CallFunction(ctx, "array_take", &opts, values, indices)
 }
 
 func TakeArray(ctx context.Context, values, indices arrow.Array) (arrow.Array, 
error) {
@@ -83,6 +85,82 @@ func TakeArray(ctx context.Context, values, indices 
arrow.Array) (arrow.Array, e
        return out.(*ArrayDatum).MakeArray(), nil
 }
 
+func TakeArrayOpts(ctx context.Context, values, indices arrow.Array, opts 
TakeOptions) (arrow.Array, error) {
+       v := NewDatum(values)
+       idx := NewDatum(indices)
+       defer v.Release()
+       defer idx.Release()
+
+       out, err := CallFunction(ctx, "array_take", &opts, v, idx)
+       if err != nil {
+               return nil, err
+       }
+       defer out.Release()
+
+       return out.(*ArrayDatum).MakeArray(), nil
+}
+
+type listArr interface {
+       arrow.Array
+       ListValues() arrow.Array
+}
+
+func takeListImpl(fn exec.ArrayKernelExec) exec.ArrayKernelExec {
+       return func(ctx *exec.KernelCtx, batch *exec.ExecSpan, out 
*exec.ExecResult) error {
+               if err := fn(ctx, batch, out); err != nil {
+                       return err
+               }
+
+               // out.Children[0] contains the child indexes of values that we
+               // want to take after processing.
+               values := batch.Values[0].Array.MakeArray().(listArr)
+               defer values.Release()
+
+               childIndices := out.Children[0].MakeArray()
+               defer childIndices.Release()
+
+               takenChild, err := TakeArrayOpts(ctx.Ctx, values.ListValues(), 
childIndices, kernels.TakeOptions{BoundsCheck: false})
+               if err != nil {
+                       return err
+               }
+               defer takenChild.Release()
+
+               out.Children[0].TakeOwnership(takenChild.Data())
+               return nil
+       }
+}
+
+func denseUnionImpl(ctx *exec.KernelCtx, batch *exec.ExecSpan, out 
*exec.ExecResult) error {
+       ex := kernels.TakeExec(kernels.DenseUnionImpl)
+       if err := ex(ctx, batch, out); err != nil {
+               return err
+       }
+
+       typedValues := batch.Values[0].Array.MakeArray().(*array.DenseUnion)
+       defer typedValues.Release()
+
+       eg, cctx := errgroup.WithContext(ctx.Ctx)
+       eg.SetLimit(GetExecCtx(ctx.Ctx).NP)
+
+       for i := 0; i < typedValues.NumFields(); i++ {
+               i := i
+               eg.Go(func() error {
+                       arr := typedValues.Field(i)
+                       childIndices := out.Children[i].MakeArray()
+                       defer childIndices.Release()
+                       taken, err := TakeArrayOpts(cctx, arr, childIndices, 
kernels.TakeOptions{})
+                       if err != nil {
+                               return err
+                       }
+                       defer taken.Release()
+                       out.Children[i].TakeOwnership(taken.Data())
+                       return nil
+               })
+       }
+
+       return eg.Wait()
+}
+
 // RegisterVectorSelection registers functions that select specific
 // values from arrays such as Take and Filter
 func RegisterVectorSelection(reg FunctionRegistry) {
@@ -92,6 +170,13 @@ func RegisterVectorSelection(reg FunctionRegistry) {
        reg.AddFunction(takeMetaFunc, false)
        filterKernels, takeKernels := kernels.GetVectorSelectionKernels()
 
+       takeKernels = append(takeKernels, []kernels.SelectionKernelData{
+               {In: exec.NewIDInput(arrow.LIST), Exec: 
takeListImpl(kernels.TakeExec(kernels.ListImpl[int32]))},
+               {In: exec.NewIDInput(arrow.LARGE_LIST), Exec: 
takeListImpl(kernels.TakeExec(kernels.ListImpl[int64]))},
+               {In: exec.NewIDInput(arrow.FIXED_SIZE_LIST), Exec: 
takeListImpl(kernels.TakeExec(kernels.FSLImpl))},
+               {In: exec.NewIDInput(arrow.DENSE_UNION), Exec: denseUnionImpl},
+       }...)
+
        vfunc := NewVectorFunction("array_filter", Binary(), EmptyFuncDoc)
        vfunc.defaultOpts = &kernels.FilterOptions{}
 
@@ -118,6 +203,7 @@ func RegisterVectorSelection(reg FunctionRegistry) {
                        InputTypes: []exec.InputType{kd.In, selectionType},
                        OutType:    kernels.OutputFirstType,
                }
+
                basekernel.ExecFn = kd.Exec
                vfunc.AddKernel(basekernel)
        }
diff --git a/go/arrow/compute/vector_selection_test.go 
b/go/arrow/compute/vector_selection_test.go
index e5fdfbcb77..9e23896fe4 100644
--- a/go/arrow/compute/vector_selection_test.go
+++ b/go/arrow/compute/vector_selection_test.go
@@ -710,6 +710,121 @@ func (tk *TakeKernelTestString) TestTakeString() {
        })
 }
 
+type TakeKernelLists struct {
+       TakeKernelTestTyped
+}
+
+func (tk *TakeKernelLists) TestListInt32() {
+       tk.dt = arrow.ListOf(arrow.PrimitiveTypes.Int32)
+
+       listJSON := `[[], [1, 2], null, [3]]`
+       tk.checkTake(tk.dt, listJSON, `[]`, `[]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 2, 1]`, `[[3], null, [1,2]]`)
+       tk.checkTake(tk.dt, listJSON, `[null, 3, 0]`, `[null, [3], []]`)
+       tk.checkTake(tk.dt, listJSON, `[null, null]`, `[null, null]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 0, 0, 3]`, `[[3], [], [], [3]]`)
+       tk.checkTake(tk.dt, listJSON, `[0, 1, 2, 3]`, listJSON)
+       tk.checkTake(tk.dt, listJSON, `[0, 0, 0, 0, 0, 0, 1]`, `[[], [], [], 
[], [], [], [1, 2]]`)
+
+       tk.assertNoValidityBitmapUnknownNullCountJSON(tk.dt, `[[], [1, 2], 
[3]]`, `[0, 1, 0]`)
+}
+
+func (tk *TakeKernelLists) TestListListInt32() {
+       tk.dt = arrow.ListOf(arrow.ListOf(arrow.PrimitiveTypes.Int32))
+
+       listJSON := `[
+               [],
+               [[1], [2, null, 2], []],
+               null,
+               [[3, null], null]
+       ]`
+       tk.checkTake(tk.dt, listJSON, `[]`, `[]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 2, 1]`, `[
+               [[3, null], null],
+               null,
+               [[1], [2, null, 2], []]
+       ]`)
+       tk.checkTake(tk.dt, listJSON, `[null, 3, 0]`, `[
+               null,
+               [[3, null], null],
+               []
+       ]`)
+       tk.checkTake(tk.dt, listJSON, `[null, null]`, `[null, null]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 0, 0, 3]`, `[[[3, null], null], [], 
[], [[3, null], null]]`)
+       tk.checkTake(tk.dt, listJSON, `[0, 1, 2, 3]`, listJSON)
+       tk.checkTake(tk.dt, listJSON, `[0, 0, 0, 0, 0, 0, 1]`,
+               `[[], [], [], [], [], [], [[1], [2, null, 2], []]]`)
+
+       tk.assertNoValidityBitmapUnknownNullCountJSON(tk.dt, `[[[1], [2, null, 
2], []], [[3, null]]]`, `[0, 1, 0]`)
+}
+
+func (tk *TakeKernelLists) TestLargeListInt32() {
+       tk.dt = arrow.LargeListOf(arrow.PrimitiveTypes.Int32)
+       listJSON := `[[], [1, 2], null, [3]]`
+       tk.checkTake(tk.dt, listJSON, `[]`, `[]`)
+       tk.checkTake(tk.dt, listJSON, `[null, 1, 2, 0]`, `[null, [1, 2], null, 
[]]`)
+}
+
+func (tk *TakeKernelLists) TestFixedSizeListInt32() {
+       tk.dt = arrow.FixedSizeListOf(3, arrow.PrimitiveTypes.Int32)
+       listJSON := `[null, [1, null, 3], [4, 5, 6], [7, 8, null]]`
+       tk.checkTake(tk.dt, listJSON, `[]`, `[]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 2, 1]`, `[[7, 8, null], [4, 5, 6], 
[1, null, 3]]`)
+       tk.checkTake(tk.dt, listJSON, `[null, 2, 0]`, `[null, [4, 5, 6], null]`)
+       tk.checkTake(tk.dt, listJSON, `[null, null]`, `[null, null]`)
+       tk.checkTake(tk.dt, listJSON, `[3, 0, 0, 3]`, `[[7, 8, null], null, 
null, [7, 8, null]]`)
+       tk.checkTake(tk.dt, listJSON, `[0, 1, 2, 3]`, listJSON)
+       tk.checkTake(tk.dt, listJSON, `[2, 2, 2, 2, 2, 2, 1]`,
+               `[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 
6], [1, null, 3]]`)
+
+       tk.assertNoValidityBitmapUnknownNullCountJSON(tk.dt, `[[1, null, 3], 
[4, 5, 6], [7, 8, null]]`, `[0, 1, 0]`)
+}
+
+type TakeKernelDenseUnion struct {
+       TakeKernelTestTyped
+}
+
+func (tk *TakeKernelDenseUnion) TestTakeUnion() {
+       tk.dt = arrow.DenseUnionOf([]arrow.Field{
+               {Name: "a", Type: arrow.PrimitiveTypes.Int32, Nullable: true},
+               {Name: "b", Type: arrow.BinaryTypes.String, Nullable: true},
+       }, []arrow.UnionTypeCode{2, 5})
+
+       unionJSON := `[
+               [2, null],
+               [2, 222],
+               [5, "hello"],
+               [5, "eh"],
+               [2, null],
+               [2, 111],
+               [5, null]
+       ]`
+       tk.checkTake(tk.dt, unionJSON, `[]`, `[]`)
+       tk.checkTake(tk.dt, unionJSON, `[3, 1, 3, 1, 3]`, `[
+               [5, "eh"],
+               [2, 222],
+               [5, "eh"],
+               [2, 222],
+               [5, "eh"]
+       ]`)
+       tk.checkTake(tk.dt, unionJSON, `[4, 2, 1, 6]`, `[
+               [2, null],
+               [5, "hello"],
+               [2, 222],
+               [5, null]
+       ]`)
+       tk.checkTake(tk.dt, unionJSON, `[0, 1, 2, 3, 4, 5, 6]`, unionJSON)
+       tk.checkTake(tk.dt, unionJSON, `[0, 2, 2, 2, 2, 2, 2]`, `[
+               [2, null],
+               [5, "hello"],
+               [5, "hello"],
+               [5, "hello"],
+               [5, "hello"],
+               [5, "hello"],
+               [5, "hello"]
+       ]`)
+}
+
 func TestTakeKernels(t *testing.T) {
        suite.Run(t, new(TakeKernelTest))
        for _, dt := range numericTypes {
@@ -719,6 +834,8 @@ func TestTakeKernels(t *testing.T) {
        for _, dt := range baseBinaryTypes {
                suite.Run(t, &TakeKernelTestString{TakeKernelTestTyped: 
TakeKernelTestTyped{dt: dt}})
        }
+       suite.Run(t, new(TakeKernelLists))
+       suite.Run(t, new(TakeKernelDenseUnion))
 }
 
 func TestFilterKernels(t *testing.T) {

Reply via email to