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 a40d377  ARROW-14128: [Go] Implement MakeArrayFromScalar for nested 
types
a40d377 is described below

commit a40d377e7437541c0261c0392ef37f5544eb7ae6
Author: Matthew Topol <[email protected]>
AuthorDate: Mon Oct 4 10:41:51 2021 -0400

    ARROW-14128: [Go] Implement MakeArrayFromScalar for nested types
    
    Also increases some test coverage on the existing scalars
    
    Closes #11252 from zeroshade/arrow-14128
    
    Lead-authored-by: Matthew Topol <[email protected]>
    Co-authored-by: Matt Topol <[email protected]>
    Signed-off-by: Matthew Topol <[email protected]>
---
 go/arrow/go.sum                |  52 +++++++++++++++++++
 go/arrow/scalar/nested.go      |  18 ++++---
 go/arrow/scalar/scalar.go      | 106 ++++++++++++++++++++++++++++++++++++--
 go/arrow/scalar/scalar_test.go | 112 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 276 insertions(+), 12 deletions(-)

diff --git a/go/arrow/go.sum b/go/arrow/go.sum
index 49f3a31..9a1bcef 100644
--- a/go/arrow/go.sum
+++ b/go/arrow/go.sum
@@ -1,16 +1,28 @@
 cloud.google.com/go v0.26.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=
 cloud.google.com/go v0.34.0/go.mod 
h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 
h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod 
h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+gioui.org v0.0.0-20210308172011-57750fc8a0a6 
h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho=
 gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod 
h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
+github.com/BurntSushi/toml v0.3.1 
h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 github.com/BurntSushi/toml v0.3.1/go.mod 
h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 
h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod 
h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af 
h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ=
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod 
h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
+github.com/antihax/optional v1.0.0 
h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg=
 github.com/antihax/optional v1.0.0/go.mod 
h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/boombuler/barcode v1.0.0 
h1:s1TvRnXwL2xJRaccrdcBQMZxq6X7DvsMogtmJeHDdrc=
 github.com/boombuler/barcode v1.0.0/go.mod 
h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/census-instrumentation/opencensus-proto v0.2.1 
h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod 
h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4 
h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
 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 
h1:cqQfy1jclcSy/FwLjemeg3SR1yaINm74aQyupQ0Bl8M=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod 
h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed 
h1:OZmjad4L3H8ncOIR8rnb5MREYqG8ixi5+WbeUsquF0c=
 github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod 
h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 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=
@@ -20,19 +32,32 @@ github.com/envoyproxy/go-control-plane 
v0.9.1-0.20191026205805-5f8ba28d4473/go.m
 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.9.9-0.20210217033140-668b12f5399d/go.mod 
h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0 
h1:dulLQAYQFYtG5MTplgNGHWuV2D+OBD+Z8lmDBmbLg+s=
 github.com/envoyproxy/go-control-plane 
v0.9.9-0.20210512163311-63b5d3c536b0/go.mod 
h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/protoc-gen-validate v0.1.0 
h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
 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 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
 github.com/fogleman/gg v1.3.0/go.mod 
h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
 github.com/ghodss/yaml v1.0.0/go.mod 
h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-fonts/dejavu v0.1.0 
h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ=
 github.com/go-fonts/dejavu v0.1.0/go.mod 
h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
+github.com/go-fonts/latin-modern v0.2.0 
h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk=
 github.com/go-fonts/latin-modern v0.2.0/go.mod 
h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
+github.com/go-fonts/liberation v0.1.1 
h1:wBrPaMkrXFBW3qXpXAjiKljdVUMxn9bX2ia3XjPHoik=
 github.com/go-fonts/liberation v0.1.1/go.mod 
h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
+github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg=
 github.com/go-fonts/stix v0.1.0/go.mod 
h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 
h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0=
 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 
h1:OTlfMvwR1rLyf9goVmXfuS5AJn80+Vmj4rTf4n46SOs=
 github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod 
h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 
h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod 
h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b 
h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod 
h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
 github.com/golang/mock v1.1.1/go.mod 
h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 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=
@@ -60,32 +85,46 @@ github.com/google/go-cmp v0.5.0/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.5/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
 github.com/google/go-cmp v0.5.6/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 github.com/google/uuid v1.1.2/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0 
h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
 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 
h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0=
 github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod 
h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 github.com/klauspost/compress v1.13.1 
h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ=
 github.com/klauspost/compress v1.13.1/go.mod 
h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/phpdave11/gofpdf v1.4.2 
h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ=
 github.com/phpdave11/gofpdf v1.4.2/go.mod 
h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
+github.com/phpdave11/gofpdi v1.0.12 
h1:RZb9NG62cw/RW0rHAduVRo+98R8o/G1krcg2ns7DakQ=
 github.com/phpdave11/gofpdi v1.0.12/go.mod 
h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
 github.com/pierrec/lz4/v4 v4.1.8 
h1:ieHkV+i2BRzngO4Wd/3HGowuZStgq6QkPsD1eolNAO4=
 github.com/pierrec/lz4/v4 v4.1.8/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 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 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 
h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod 
h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/fastuuid v1.2.0 
h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod 
h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58 
h1:nlG4Wa5+minh3S9LVFtNoY+GVRiudA2e3EVfcCi3RCA=
+github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod 
h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
+github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4=
 github.com/stretchr/objx v0.1.0/go.mod 
h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 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 
h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod 
h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs=
 github.com/yuin/goldmark v1.3.5/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.opentelemetry.io/proto/otlp v0.7.0 
h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
 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 
h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 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=
@@ -102,14 +141,18 @@ golang.org/x/image 
v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+o
 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 
h1:lP9pYkih3DUSC641giIXa2XqfTIbbbRr0w2EOTA7wHA=
 golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 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/lint v0.0.0-20210508222113-6edffad5e616 
h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod 
h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 
h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs=
 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/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod 
h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 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=
@@ -123,11 +166,13 @@ golang.org/x/net 
v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e 
h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q=
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d 
h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
 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-20210220032951-036812b2e83c 
h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -141,6 +186,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod 
h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c 
h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 
h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 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=
@@ -157,6 +203,7 @@ golang.org/x/tools 
v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn
 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-20200130002326-2f3ba24bd6e7/go.mod 
h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.1.4 h1:cVngSRcfgyZCzys3KYOpCFa+4dqX/Oub9tAq00ttGVs=
 golang.org/x/tools v0.1.4/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 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=
@@ -170,8 +217,10 @@ gonum.org/v1/gonum v0.9.3/go.mod 
h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
 gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 
h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
 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 h1:3sEo36Uopv1/SA/dMFFaxXoL5XyikJ9Sf2Vll/k6+2E=
 gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY=
 google.golang.org/appengine v1.1.0/go.mod 
h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0 
h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
 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=
@@ -204,9 +253,12 @@ google.golang.org/protobuf v1.27.1/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 
h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI=
 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c 
h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/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 
h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod 
h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/go/arrow/scalar/nested.go b/go/arrow/scalar/nested.go
index 4caa0b4..2347592 100644
--- a/go/arrow/scalar/nested.go
+++ b/go/arrow/scalar/nested.go
@@ -29,7 +29,9 @@ import (
 
 type ListScalar interface {
        Scalar
-       List() array.Interface
+       GetList() array.Interface
+       Release()
+       Retain()
 }
 
 type List struct {
@@ -37,10 +39,12 @@ type List struct {
        Value array.Interface
 }
 
-func (l *List) value() interface{}    { return l.Value }
-func (l *List) List() array.Interface { return l.Value }
+func (l *List) Release()                 { l.Value.Release() }
+func (l *List) Retain()                  { l.Value.Retain() }
+func (l *List) value() interface{}       { return l.Value }
+func (l *List) GetList() array.Interface { return l.Value }
 func (l *List) equals(rhs Scalar) bool {
-       return array.ArrayEqual(l.Value, rhs.(ListScalar).List())
+       return array.ArrayEqual(l.Value, rhs.(ListScalar).GetList())
 }
 func (l *List) Validate() (err error) {
        if err = l.scalar.Validate(); err != nil {
@@ -108,7 +112,7 @@ func (l *List) String() string {
 }
 
 func NewListScalar(val array.Interface) *List {
-       return &List{scalar{arrow.ListOf(val.DataType()), true}, val}
+       return &List{scalar{arrow.ListOf(val.DataType()), true}, 
array.MakeFromData(val.Data())}
 }
 
 func makeMapType(typ *arrow.StructType) *arrow.MapType {
@@ -121,7 +125,7 @@ type Map struct {
 }
 
 func NewMapScalar(val array.Interface) *Map {
-       return 
&Map{&List{scalar{makeMapType(val.DataType().(*arrow.StructType)), true}, val}}
+       return 
&Map{&List{scalar{makeMapType(val.DataType().(*arrow.StructType)), true}, 
array.MakeFromData(val.Data())}}
 }
 
 type FixedSizeList struct {
@@ -151,7 +155,7 @@ func NewFixedSizeListScalar(val array.Interface) 
*FixedSizeList {
 
 func NewFixedSizeListScalarWithType(val array.Interface, typ arrow.DataType) 
*FixedSizeList {
        debug.Assert(val.Len() == int(typ.(*arrow.FixedSizeListType).Len()), 
"length of value for fixed size list scalar must match type")
-       return &FixedSizeList{&List{scalar{typ, true}, val}}
+       return &FixedSizeList{&List{scalar{typ, true}, 
array.MakeFromData(val.Data())}}
 }
 
 type Vector []Scalar
diff --git a/go/arrow/scalar/scalar.go b/go/arrow/scalar/scalar.go
index 49b386d..03a7d03 100644
--- a/go/arrow/scalar/scalar.go
+++ b/go/arrow/scalar/scalar.go
@@ -60,6 +60,11 @@ type Scalar interface {
        //TODO(zeroshade): approxEquals
 }
 
+type Releasable interface {
+       Release()
+       Retain()
+}
+
 func validateOptional(s *scalar, value interface{}, valueDesc string) error {
        if s.Valid && value == nil {
                return xerrors.Errorf("%s scalar is marked valid but doesn't 
have a %s", s.Type, valueDesc)
@@ -477,7 +482,9 @@ func GetScalar(arr array.Interface, idx int) (Scalar, 
error) {
                return NewFixedSizeBinaryScalar(buf, arr.DataType()), nil
        case *array.FixedSizeList:
                size := int(arr.DataType().(*arrow.FixedSizeListType).Len())
-               return 
NewFixedSizeListScalarWithType(array.NewSlice(arr.ListValues(), 
int64(idx*size), int64((idx+1)*size)), arr.DataType()), nil
+               slice := array.NewSlice(arr.ListValues(), int64(idx*size), 
int64((idx+1)*size))
+               defer slice.Release()
+               return NewFixedSizeListScalarWithType(slice, arr.DataType()), 
nil
        case *array.Float16:
                return NewFloat16Scalar(arr.Value(idx)), nil
        case *array.Float32:
@@ -502,10 +509,14 @@ func GetScalar(arr array.Interface, idx int) (Scalar, 
error) {
                return NewUint64Scalar(arr.Value(idx)), nil
        case *array.List:
                offsets := arr.Offsets()
-               return NewListScalar(array.NewSlice(arr.ListValues(), 
int64(offsets[idx]), int64(offsets[idx+1]))), nil
+               slice := array.NewSlice(arr.ListValues(), int64(offsets[idx]), 
int64(offsets[idx+1]))
+               defer slice.Release()
+               return NewListScalar(slice), nil
        case *array.Map:
                offsets := arr.Offsets()
-               return NewMapScalar(array.NewSlice(arr.ListValues(), 
int64(offsets[idx]), int64(offsets[idx+1]))), nil
+               slice := array.NewSlice(arr.ListValues(), int64(offsets[idx]), 
int64(offsets[idx+1]))
+               defer slice.Release()
+               return NewMapScalar(slice), nil
        case *array.MonthInterval:
                return NewMonthIntervalScalar(arr.Value(idx)), nil
        case *array.Null:
@@ -577,18 +588,21 @@ func MakeArrayFromScalar(sc Scalar, length int, mem 
memory.Allocator) (array.Int
 
        finishFixedWidth := func(data []byte) *array.Data {
                buffer := createBuffer(data)
+               defer buffer.Release()
                return array.NewData(sc.DataType(), length, 
[]*memory.Buffer{nil, buffer}, nil, 0, 0)
        }
 
        switch s := sc.(type) {
        case *Boolean:
                data := memory.NewResizableBuffer(mem)
+               defer data.Release()
                data.Resize(int(bitutil.BytesForBits(int64(length))))
                c := byte(0x00)
                if s.Value {
                        c = 0xFF
                }
                memory.Set(data.Bytes(), c)
+               defer data.Release()
                return array.NewBoolean(length, data, nil, 0), nil
        case BinaryScalar:
                if s.DataType().ID() == arrow.FIXED_SIZE_BINARY {
@@ -600,12 +614,96 @@ func MakeArrayFromScalar(sc Scalar, length int, mem 
memory.Allocator) (array.Int
                valuesBuf := createBuffer(s.Data())
                offsetsBuf := createOffsets(int32(len(s.Data())))
                data := array.NewData(sc.DataType(), length, 
[]*memory.Buffer{nil, offsetsBuf, valuesBuf}, nil, 0, 0)
-               defer data.Release()
+               defer func() {
+                       valuesBuf.Release()
+                       offsetsBuf.Release()
+                       data.Release()
+               }()
                return array.MakeFromData(data), nil
        case PrimitiveScalar:
                data := finishFixedWidth(s.Data())
                defer data.Release()
                return array.MakeFromData(data), nil
+       case *Decimal128:
+               data := 
finishFixedWidth(arrow.Decimal128Traits.CastToBytes([]decimal128.Num{s.Value}))
+               defer data.Release()
+               return array.MakeFromData(data), nil
+       case *List:
+               values := make([]array.Interface, length)
+               for i := range values {
+                       values[i] = s.Value
+               }
+
+               valueArray, err := array.Concatenate(values, mem)
+               if err != nil {
+                       return nil, err
+               }
+               defer valueArray.Release()
+
+               offsetsBuf := createOffsets(int32(s.Value.Len()))
+               defer offsetsBuf.Release()
+               data := array.NewData(s.DataType(), length, 
[]*memory.Buffer{nil, offsetsBuf}, []*array.Data{valueArray.Data()}, 0, 0)
+               defer data.Release()
+               return array.MakeFromData(data), nil
+       case *FixedSizeList:
+               values := make([]array.Interface, length)
+               for i := range values {
+                       values[i] = s.Value
+               }
+
+               valueArray, err := array.Concatenate(values, mem)
+               if err != nil {
+                       return nil, err
+               }
+               defer valueArray.Release()
+
+               data := array.NewData(s.DataType(), length, 
[]*memory.Buffer{nil}, []*array.Data{valueArray.Data()}, 0, 0)
+               defer data.Release()
+               return array.MakeFromData(data), nil
+       case *Struct:
+               fields := make([]*array.Data, 0)
+               for _, v := range s.Value {
+                       arr, err := MakeArrayFromScalar(v, length, mem)
+                       if err != nil {
+                               return nil, err
+                       }
+                       defer arr.Release()
+                       fields = append(fields, arr.Data())
+               }
+
+               data := array.NewData(s.DataType(), length, 
[]*memory.Buffer{nil}, fields, 0, 0)
+               defer data.Release()
+               return array.NewStructData(data), nil
+       case *Map:
+               structArr := s.GetList().(*array.Struct)
+               keys := make([]array.Interface, length)
+               values := make([]array.Interface, length)
+               for i := 0; i < length; i++ {
+                       keys[i] = structArr.Field(0)
+                       values[i] = structArr.Field(1)
+               }
+
+               keyArr, err := array.Concatenate(keys, mem)
+               if err != nil {
+                       return nil, err
+               }
+               defer keyArr.Release()
+
+               valueArr, err := array.Concatenate(values, mem)
+               if err != nil {
+                       return nil, err
+               }
+               defer valueArr.Release()
+
+               offsetsBuf := createOffsets(int32(structArr.Len()))
+               outStructArr := array.NewData(structArr.DataType(), 
keyArr.Len(), []*memory.Buffer{nil}, []*array.Data{keyArr.Data(), 
valueArr.Data()}, 0, 0)
+               data := array.NewData(s.DataType(), length, 
[]*memory.Buffer{nil, offsetsBuf}, []*array.Data{outStructArr}, 0, 0)
+               defer func() {
+                       offsetsBuf.Release()
+                       outStructArr.Release()
+                       data.Release()
+               }()
+               return array.MakeFromData(data), nil
        default:
                return nil, xerrors.Errorf("array from scalar not yet 
implemented for type %s", sc.DataType())
        }
diff --git a/go/arrow/scalar/scalar_test.go b/go/arrow/scalar/scalar_test.go
index f2b1c57..49c5c59 100644
--- a/go/arrow/scalar/scalar_test.go
+++ b/go/arrow/scalar/scalar_test.go
@@ -515,12 +515,31 @@ func TestNumericScalarCasts(t *testing.T) {
                arrow.FixedWidthTypes.MonthInterval,
        }
 
+       falseScalar := scalar.NewBooleanScalar(false)
+       trueScalar := scalar.NewBooleanScalar(true)
+       nullBool := scalar.MakeNullScalar(arrow.FixedWidthTypes.Boolean)
+
        for _, tt := range tests {
+               t.Run(tt.ID().String()+"from bool", func(t *testing.T) {
+                       zero, _ := scalar.ParseScalar(tt, "0")
+                       zeroFromBool, err := falseScalar.CastTo(tt)
+                       assert.NoError(t, err)
+                       assert.True(t, scalar.Equals(zero, zeroFromBool))
+
+                       one, _ := scalar.ParseScalar(tt, "1")
+                       oneFromBool, err := trueScalar.CastTo(tt)
+                       assert.NoError(t, err)
+                       assert.True(t, scalar.Equals(one, oneFromBool))
+               })
                t.Run(tt.ID().String(), func(t *testing.T) {
                        for _, repr := range []string{"0", "1", "3"} {
                                nullTest := scalar.MakeNullScalar(tt)
                                assert.Equal(t, "null", nullTest.String())
 
+                               castedNull, err := nullBool.CastTo(tt)
+                               assert.NoError(t, err)
+                               assert.True(t, scalar.Equals(castedNull, 
nullTest))
+
                                s, err := scalar.ParseScalar(tt, repr)
                                assert.NoError(t, err)
 
@@ -686,7 +705,7 @@ func TestMapScalarBasics(t *testing.T) {
 
        expectedScalarType := arrow.MapOf(arrow.BinaryTypes.String, 
arrow.PrimitiveTypes.Int8)
        assert.True(t, arrow.TypeEqual(s.DataType(), expectedScalarType))
-       assert.True(t, array.ArrayEqual(value, s.Value))
+       assert.True(t, array.ArrayEqual(value, s.GetList()))
 
        checkMakeNullScalar(t, expectedScalarType)
 }
@@ -767,3 +786,94 @@ func TestStructScalarValidateErrors(t *testing.T) {
        assert.NoError(t, sc.Validate())
        assert.Error(t, sc.ValidateFull())
 }
+
+func getScalars(mem memory.Allocator) []scalar.Scalar {
+       hello := memory.NewBufferBytes([]byte("hello"))
+       daytime := arrow.DayTimeInterval{Days: 1, Milliseconds: 100}
+
+       int8Bldr := array.NewInt8Builder(mem)
+       defer int8Bldr.Release()
+
+       int8Bldr.AppendValues([]int8{1, 2, 3, 4}, nil)
+       int8Arr := int8Bldr.NewInt8Array()
+       defer int8Arr.Release()
+
+       mapBldr := array.NewMapBuilder(mem, arrow.PrimitiveTypes.Int8, 
arrow.BinaryTypes.String, false)
+       defer mapBldr.Release()
+
+       kb := mapBldr.KeyBuilder().(*array.Int8Builder)
+       ib := mapBldr.ItemBuilder().(*array.StringBuilder)
+
+       mapBldr.Append(true)
+       kb.AppendValues([]int8{1, 2, 3}, nil)
+       ib.AppendValues([]string{"foo", "bar", "baz"}, nil)
+
+       mapArr := mapBldr.NewMapArray()
+       defer mapArr.Release()
+
+       return []scalar.Scalar{
+               scalar.NewBooleanScalar(false),
+               scalar.NewInt8Scalar(3),
+               scalar.NewUint16Scalar(3),
+               scalar.NewInt32Scalar(3),
+               scalar.NewUint64Scalar(3),
+               scalar.NewFloat64Scalar(3.0),
+               scalar.NewDate32Scalar(10),
+               scalar.NewDate64Scalar(11),
+               scalar.NewTime32Scalar(1000, arrow.FixedWidthTypes.Time32s),
+               scalar.NewTime64Scalar(1111, arrow.FixedWidthTypes.Time64us),
+               scalar.NewTimestampScalar(111, 
arrow.FixedWidthTypes.Timestamp_ms),
+               scalar.NewMonthIntervalScalar(1),
+               scalar.NewDayTimeIntervalScalar(daytime),
+               scalar.NewDurationScalar(60, arrow.FixedWidthTypes.Duration_s),
+               scalar.NewBinaryScalar(hello, arrow.BinaryTypes.Binary),
+               scalar.NewFixedSizeBinaryScalar(hello, 
&arrow.FixedSizeBinaryType{ByteWidth: hello.Len()}),
+               scalar.NewDecimal128Scalar(decimal128.FromI64(10), 
&arrow.Decimal128Type{Precision: 16, Scale: 4}),
+               scalar.NewStringScalarFromBuffer(hello),
+               scalar.NewListScalar(int8Arr),
+               scalar.NewMapScalar(mapArr.List.ListValues()),
+               scalar.NewFixedSizeListScalar(int8Arr),
+               
scalar.NewStructScalar([]scalar.Scalar{scalar.NewInt32Scalar(2), 
scalar.NewInt32Scalar(6)},
+                       arrow.StructOf([]arrow.Field{{Name: "min", Type: 
arrow.PrimitiveTypes.Int32}, {Name: "max", Type: 
arrow.PrimitiveTypes.Int32}}...)),
+       }
+}
+
+func TestMakeArrayFromScalar(t *testing.T) {
+       mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
+       defer mem.AssertSize(t, 0)
+
+       nullArray, err := scalar.MakeArrayFromScalar(scalar.ScalarNull, 5, mem)
+       assert.NoError(t, err)
+       defer nullArray.Release()
+
+       assert.Equal(t, 5, nullArray.Len())
+       assert.Equal(t, 5, nullArray.NullN())
+
+       scalars := getScalars(mem)
+
+       for _, length := range []int{16} {
+               for _, s := range scalars {
+                       t.Run(s.DataType().Name(), func(t *testing.T) {
+                               if ls, ok := s.(scalar.Releasable); ok {
+                                       defer ls.Release()
+                               }
+
+                               arr, err := scalar.MakeArrayFromScalar(s, 
length, mem)
+                               assert.NoError(t, err)
+                               defer arr.Release()
+
+                               assert.Equal(t, length, arr.Len())
+                               assert.Zero(t, arr.NullN())
+
+                               for _, i := range []int{0, length / 2, length - 
1} {
+                                       scalarCompare, err := 
scalar.GetScalar(arr, i)
+                                       assert.NoError(t, err)
+                                       assert.True(t, scalar.Equals(s, 
scalarCompare))
+                                       if ls, ok := 
scalarCompare.(scalar.Releasable); ok {
+                                               ls.Release()
+                                       }
+                               }
+                       })
+               }
+       }
+}

Reply via email to