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

emkornfield 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 8de898d  ARROW-12138: [Go][IPC] Update flatbuffers definitions
8de898d is described below

commit 8de898d3ce5b9dd40bd03acb046a8199fed4f38b
Author: Matthew Topol <[email protected]>
AuthorDate: Tue Mar 30 21:30:23 2021 -0700

    ARROW-12138: [Go][IPC] Update flatbuffers definitions
    
    Updating the generated flatbuffer code so that newer features like 
compression in IPC can get implemented. Doing the updating of the flatbuffer 
generated code first as a separate change.
    
    @sbinet @emkornfield
    
    Closes #9836 from zeroshade/arrow-12138
    
    Authored-by: Matthew Topol <[email protected]>
    Signed-off-by: Micah Kornfield <[email protected]>
---
 go/arrow/internal/flatbuf/Block.go                 |   4 +-
 go/arrow/internal/flatbuf/BodyCompression.go       |  87 ++++++
 go/arrow/internal/flatbuf/BodyCompressionMethod.go |  52 ++++
 .../{MetadataVersion.go => CompressionType.go}     |  34 ++-
 go/arrow/internal/flatbuf/Date.go                  |   8 +-
 go/arrow/internal/flatbuf/DateUnit.go              |  22 +-
 go/arrow/internal/flatbuf/Decimal.go               |  25 +-
 go/arrow/internal/flatbuf/DictionaryBatch.go       |   6 +-
 go/arrow/internal/flatbuf/DictionaryEncoding.go    |  33 ++-
 .../flatbuf/{Endianness.go => DictionaryKind.go}   |  28 +-
 go/arrow/internal/flatbuf/Duration.go              |   8 +-
 go/arrow/internal/flatbuf/Endianness.go            |  22 +-
 go/arrow/internal/flatbuf/Feature.go               |  71 +++++
 go/arrow/internal/flatbuf/Field.go                 |  12 +-
 go/arrow/internal/flatbuf/FieldNode.go             |   2 +-
 go/arrow/internal/flatbuf/FloatingPoint.go         |   8 +-
 go/arrow/internal/flatbuf/Footer.go                |  38 ++-
 go/arrow/internal/flatbuf/Interval.go              |   8 +-
 go/arrow/internal/flatbuf/IntervalUnit.go          |  22 +-
 .../flatbuf/{Duration.go => LargeBinary.go}        |  33 +--
 .../internal/flatbuf/{Duration.go => LargeList.go} |  33 +--
 .../internal/flatbuf/{Duration.go => LargeUtf8.go} |  33 +--
 go/arrow/internal/flatbuf/Map.go                   |   3 +-
 go/arrow/internal/flatbuf/Message.go               |  20 +-
 go/arrow/internal/flatbuf/MessageHeader.go         |  42 ++-
 go/arrow/internal/flatbuf/MetadataVersion.go       |  44 +++-
 go/arrow/internal/flatbuf/Precision.go             |  25 +-
 go/arrow/internal/flatbuf/RecordBatch.go           |  20 +-
 go/arrow/internal/flatbuf/Schema.go                |  44 +++-
 ...ataVersion.go => SparseMatrixCompressedAxis.go} |  34 ++-
 go/arrow/internal/flatbuf/SparseMatrixIndexCSX.go  | 200 ++++++++++++++
 go/arrow/internal/flatbuf/SparseTensor.go          |  24 +-
 go/arrow/internal/flatbuf/SparseTensorIndex.go     |  30 ++-
 go/arrow/internal/flatbuf/SparseTensorIndexCOO.go  |  43 ++-
 go/arrow/internal/flatbuf/SparseTensorIndexCSF.go  | 291 +++++++++++++++++++++
 go/arrow/internal/flatbuf/Tensor.go                |  14 +-
 go/arrow/internal/flatbuf/Time.go                  |   8 +-
 go/arrow/internal/flatbuf/TimeUnit.go              |  30 ++-
 go/arrow/internal/flatbuf/Timestamp.go             |   8 +-
 go/arrow/internal/flatbuf/Type.go                  | 122 +++++----
 go/arrow/internal/flatbuf/Union.go                 |  10 +-
 go/arrow/internal/flatbuf/UnionMode.go             |  22 +-
 go/arrow/ipc/file_writer.go                        |   2 +-
 go/arrow/ipc/message.go                            |   4 +-
 go/arrow/ipc/metadata.go                           |   4 +-
 45 files changed, 1330 insertions(+), 303 deletions(-)

diff --git a/go/arrow/internal/flatbuf/Block.go 
b/go/arrow/internal/flatbuf/Block.go
index 9172778..57a697b 100644
--- a/go/arrow/internal/flatbuf/Block.go
+++ b/go/arrow/internal/flatbuf/Block.go
@@ -54,12 +54,12 @@ func (rcv *Block) MutateMetaDataLength(n int32) bool {
 }
 
 /// Length of the data (this is aligned so there can be a gap between this and
-/// the metatdata).
+/// the metadata).
 func (rcv *Block) BodyLength() int64 {
        return rcv._tab.GetInt64(rcv._tab.Pos + flatbuffers.UOffsetT(16))
 }
 /// Length of the data (this is aligned so there can be a gap between this and
-/// the metatdata).
+/// the metadata).
 func (rcv *Block) MutateBodyLength(n int64) bool {
        return rcv._tab.MutateInt64(rcv._tab.Pos+flatbuffers.UOffsetT(16), n)
 }
diff --git a/go/arrow/internal/flatbuf/BodyCompression.go 
b/go/arrow/internal/flatbuf/BodyCompression.go
new file mode 100644
index 0000000..a0efeb1
--- /dev/null
+++ b/go/arrow/internal/flatbuf/BodyCompression.go
@@ -0,0 +1,87 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package flatbuf
+
+import (
+       flatbuffers "github.com/google/flatbuffers/go"
+)
+
+/// Optional compression for the memory buffers constituting IPC message
+/// bodies. Intended for use with RecordBatch but could be used for other
+/// message types
+type BodyCompression struct {
+       _tab flatbuffers.Table
+}
+
+func GetRootAsBodyCompression(buf []byte, offset flatbuffers.UOffsetT) 
*BodyCompression {
+       n := flatbuffers.GetUOffsetT(buf[offset:])
+       x := &BodyCompression{}
+       x.Init(buf, n+offset)
+       return x
+}
+
+func (rcv *BodyCompression) Init(buf []byte, i flatbuffers.UOffsetT) {
+       rcv._tab.Bytes = buf
+       rcv._tab.Pos = i
+}
+
+func (rcv *BodyCompression) Table() flatbuffers.Table {
+       return rcv._tab
+}
+
+/// Compressor library
+func (rcv *BodyCompression) Codec() CompressionType {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
+       if o != 0 {
+               return CompressionType(rcv._tab.GetInt8(o + rcv._tab.Pos))
+       }
+       return 0
+}
+
+/// Compressor library
+func (rcv *BodyCompression) MutateCodec(n CompressionType) bool {
+       return rcv._tab.MutateInt8Slot(4, int8(n))
+}
+
+/// Indicates the way the record batch body was compressed
+func (rcv *BodyCompression) Method() BodyCompressionMethod {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
+       if o != 0 {
+               return BodyCompressionMethod(rcv._tab.GetInt8(o + rcv._tab.Pos))
+       }
+       return 0
+}
+
+/// Indicates the way the record batch body was compressed
+func (rcv *BodyCompression) MutateMethod(n BodyCompressionMethod) bool {
+       return rcv._tab.MutateInt8Slot(6, int8(n))
+}
+
+func BodyCompressionStart(builder *flatbuffers.Builder) {
+       builder.StartObject(2)
+}
+func BodyCompressionAddCodec(builder *flatbuffers.Builder, codec 
CompressionType) {
+       builder.PrependInt8Slot(0, int8(codec), 0)
+}
+func BodyCompressionAddMethod(builder *flatbuffers.Builder, method 
BodyCompressionMethod) {
+       builder.PrependInt8Slot(1, int8(method), 0)
+}
+func BodyCompressionEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+       return builder.EndObject()
+}
diff --git a/go/arrow/internal/flatbuf/BodyCompressionMethod.go 
b/go/arrow/internal/flatbuf/BodyCompressionMethod.go
new file mode 100644
index 0000000..108ab3e
--- /dev/null
+++ b/go/arrow/internal/flatbuf/BodyCompressionMethod.go
@@ -0,0 +1,52 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package flatbuf
+
+import "strconv"
+
+/// Provided for forward compatibility in case we need to support different
+/// strategies for compressing the IPC message body (like whole-body
+/// compression rather than buffer-level) in the future
+type BodyCompressionMethod int8
+
+const (
+       /// Each constituent buffer is first compressed with the indicated
+       /// compressor, and then written with the uncompressed length in the 
first 8
+       /// bytes as a 64-bit little-endian signed integer followed by the 
compressed
+       /// buffer bytes (and then padding as required by the protocol). The
+       /// uncompressed length may be set to -1 to indicate that the data that
+       /// follows is not compressed, which can be useful for cases where
+       /// compression does not yield appreciable savings.
+       BodyCompressionMethodBUFFER BodyCompressionMethod = 0
+)
+
+var EnumNamesBodyCompressionMethod = map[BodyCompressionMethod]string{
+       BodyCompressionMethodBUFFER: "BUFFER",
+}
+
+var EnumValuesBodyCompressionMethod = map[string]BodyCompressionMethod{
+       "BUFFER": BodyCompressionMethodBUFFER,
+}
+
+func (v BodyCompressionMethod) String() string {
+       if s, ok := EnumNamesBodyCompressionMethod[v]; ok {
+               return s
+       }
+       return "BodyCompressionMethod(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/MetadataVersion.go 
b/go/arrow/internal/flatbuf/CompressionType.go
similarity index 60%
copy from go/arrow/internal/flatbuf/MetadataVersion.go
copy to go/arrow/internal/flatbuf/CompressionType.go
index 0094430..96e9df0 100644
--- a/go/arrow/internal/flatbuf/MetadataVersion.go
+++ b/go/arrow/internal/flatbuf/CompressionType.go
@@ -18,22 +18,28 @@
 
 package flatbuf
 
-type MetadataVersion = int16
+import "strconv"
+
+type CompressionType int8
+
 const (
-       /// 0.1.0
-       MetadataVersionV1 MetadataVersion = 0
-       /// 0.2.0
-       MetadataVersionV2 MetadataVersion = 1
-       /// 0.3.0 -> 0.7.1
-       MetadataVersionV3 MetadataVersion = 2
-       /// >= 0.8.0
-       MetadataVersionV4 MetadataVersion = 3
+       CompressionTypeLZ4_FRAME CompressionType = 0
+       CompressionTypeZSTD      CompressionType = 1
 )
 
-var EnumNamesMetadataVersion = map[MetadataVersion]string{
-       MetadataVersionV1:"V1",
-       MetadataVersionV2:"V2",
-       MetadataVersionV3:"V3",
-       MetadataVersionV4:"V4",
+var EnumNamesCompressionType = map[CompressionType]string{
+       CompressionTypeLZ4_FRAME: "LZ4_FRAME",
+       CompressionTypeZSTD:      "ZSTD",
 }
 
+var EnumValuesCompressionType = map[string]CompressionType{
+       "LZ4_FRAME": CompressionTypeLZ4_FRAME,
+       "ZSTD":      CompressionTypeZSTD,
+}
+
+func (v CompressionType) String() string {
+       if s, ok := EnumNamesCompressionType[v]; ok {
+               return s
+       }
+       return "CompressionType(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Date.go 
b/go/arrow/internal/flatbuf/Date.go
index 476aa03..fc19132 100644
--- a/go/arrow/internal/flatbuf/Date.go
+++ b/go/arrow/internal/flatbuf/Date.go
@@ -51,20 +51,20 @@ func (rcv *Date) Table() flatbuffers.Table {
 func (rcv *Date) Unit() DateUnit {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return DateUnit(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 1
 }
 
 func (rcv *Date) MutateUnit(n DateUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func DateStart(builder *flatbuffers.Builder) {
        builder.StartObject(1)
 }
-func DateAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
+func DateAddUnit(builder *flatbuffers.Builder, unit DateUnit) {
+       builder.PrependInt16Slot(0, int16(unit), 1)
 }
 func DateEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
diff --git a/go/arrow/internal/flatbuf/DateUnit.go 
b/go/arrow/internal/flatbuf/DateUnit.go
index bb49f28..8a12eec 100644
--- a/go/arrow/internal/flatbuf/DateUnit.go
+++ b/go/arrow/internal/flatbuf/DateUnit.go
@@ -18,14 +18,28 @@
 
 package flatbuf
 
-type DateUnit = int16
+import "strconv"
+
+type DateUnit int16
+
 const (
-       DateUnitDAY DateUnit = 0
+       DateUnitDAY         DateUnit = 0
        DateUnitMILLISECOND DateUnit = 1
 )
 
 var EnumNamesDateUnit = map[DateUnit]string{
-       DateUnitDAY:"DAY",
-       DateUnitMILLISECOND:"MILLISECOND",
+       DateUnitDAY:         "DAY",
+       DateUnitMILLISECOND: "MILLISECOND",
 }
 
+var EnumValuesDateUnit = map[string]DateUnit{
+       "DAY":         DateUnitDAY,
+       "MILLISECOND": DateUnitMILLISECOND,
+}
+
+func (v DateUnit) String() string {
+       if s, ok := EnumNamesDateUnit[v]; ok {
+               return s
+       }
+       return "DateUnit(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Decimal.go 
b/go/arrow/internal/flatbuf/Decimal.go
index a0a9b50..c9de254 100644
--- a/go/arrow/internal/flatbuf/Decimal.go
+++ b/go/arrow/internal/flatbuf/Decimal.go
@@ -22,6 +22,10 @@ import (
        flatbuffers "github.com/google/flatbuffers/go"
 )
 
+/// Exact decimal value represented as an integer value in two's
+/// complement. Currently only 128-bit (16-byte) and 256-bit (32-byte) integers
+/// are used. The representation uses the endianness indicated
+/// in the Schema.
 type Decimal struct {
        _tab flatbuffers.Table
 }
@@ -70,8 +74,24 @@ func (rcv *Decimal) MutateScale(n int32) bool {
        return rcv._tab.MutateInt32Slot(6, n)
 }
 
+/// Number of bits per value. The only accepted widths are 128 and 256.
+/// We use bitWidth for consistency with Int::bitWidth.
+func (rcv *Decimal) BitWidth() int32 {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
+       if o != 0 {
+               return rcv._tab.GetInt32(o + rcv._tab.Pos)
+       }
+       return 128
+}
+
+/// Number of bits per value. The only accepted widths are 128 and 256.
+/// We use bitWidth for consistency with Int::bitWidth.
+func (rcv *Decimal) MutateBitWidth(n int32) bool {
+       return rcv._tab.MutateInt32Slot(8, n)
+}
+
 func DecimalStart(builder *flatbuffers.Builder) {
-       builder.StartObject(2)
+       builder.StartObject(3)
 }
 func DecimalAddPrecision(builder *flatbuffers.Builder, precision int32) {
        builder.PrependInt32Slot(0, precision, 0)
@@ -79,6 +99,9 @@ func DecimalAddPrecision(builder *flatbuffers.Builder, 
precision int32) {
 func DecimalAddScale(builder *flatbuffers.Builder, scale int32) {
        builder.PrependInt32Slot(1, scale, 0)
 }
+func DecimalAddBitWidth(builder *flatbuffers.Builder, bitWidth int32) {
+       builder.PrependInt32Slot(2, bitWidth, 128)
+}
 func DecimalEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/DictionaryBatch.go 
b/go/arrow/internal/flatbuf/DictionaryBatch.go
index 1cd6310..25b5384 100644
--- a/go/arrow/internal/flatbuf/DictionaryBatch.go
+++ b/go/arrow/internal/flatbuf/DictionaryBatch.go
@@ -74,7 +74,8 @@ func (rcv *DictionaryBatch) Data(obj *RecordBatch) 
*RecordBatch {
 }
 
 /// If isDelta is true the values in the dictionary are to be appended to a
-/// dictionary with the indicated id
+/// dictionary with the indicated id. If isDelta is false this dictionary
+/// should replace the existing dictionary.
 func (rcv *DictionaryBatch) IsDelta() bool {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
        if o != 0 {
@@ -84,7 +85,8 @@ func (rcv *DictionaryBatch) IsDelta() bool {
 }
 
 /// If isDelta is true the values in the dictionary are to be appended to a
-/// dictionary with the indicated id
+/// dictionary with the indicated id. If isDelta is false this dictionary
+/// should replace the existing dictionary.
 func (rcv *DictionaryBatch) MutateIsDelta(n bool) bool {
        return rcv._tab.MutateBoolSlot(8, n)
 }
diff --git a/go/arrow/internal/flatbuf/DictionaryEncoding.go 
b/go/arrow/internal/flatbuf/DictionaryEncoding.go
index 592b6fc..a9b0953 100644
--- a/go/arrow/internal/flatbuf/DictionaryEncoding.go
+++ b/go/arrow/internal/flatbuf/DictionaryEncoding.go
@@ -22,8 +22,6 @@ import (
        flatbuffers "github.com/google/flatbuffers/go"
 )
 
-/// ----------------------------------------------------------------------
-/// Dictionary encoding metadata
 type DictionaryEncoding struct {
        _tab flatbuffers.Table
 }
@@ -62,8 +60,11 @@ func (rcv *DictionaryEncoding) MutateId(n int64) bool {
        return rcv._tab.MutateInt64Slot(4, n)
 }
 
-/// The dictionary indices are constrained to be positive integers. If this
-/// field is null, the indices must be signed int32
+/// The dictionary indices are constrained to be non-negative integers. If
+/// this field is null, the indices must be signed int32. To maximize
+/// cross-language compatibility and performance, implementations are
+/// recommended to prefer signed integer types over unsigned integer types
+/// and to avoid uint64 indices unless they are required by an application.
 func (rcv *DictionaryEncoding) IndexType(obj *Int) *Int {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
        if o != 0 {
@@ -77,8 +78,11 @@ func (rcv *DictionaryEncoding) IndexType(obj *Int) *Int {
        return nil
 }
 
-/// The dictionary indices are constrained to be positive integers. If this
-/// field is null, the indices must be signed int32
+/// The dictionary indices are constrained to be non-negative integers. If
+/// this field is null, the indices must be signed int32. To maximize
+/// cross-language compatibility and performance, implementations are
+/// recommended to prefer signed integer types over unsigned integer types
+/// and to avoid uint64 indices unless they are required by an application.
 /// By default, dictionaries are not ordered, or the order does not have
 /// semantic meaning. In some statistical, applications, dictionary-encoding
 /// is used to represent ordered categorical data, and we provide a way to
@@ -99,8 +103,20 @@ func (rcv *DictionaryEncoding) MutateIsOrdered(n bool) bool 
{
        return rcv._tab.MutateBoolSlot(8, n)
 }
 
+func (rcv *DictionaryEncoding) DictionaryKind() DictionaryKind {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               return DictionaryKind(rcv._tab.GetInt16(o + rcv._tab.Pos))
+       }
+       return 0
+}
+
+func (rcv *DictionaryEncoding) MutateDictionaryKind(n DictionaryKind) bool {
+       return rcv._tab.MutateInt16Slot(10, int16(n))
+}
+
 func DictionaryEncodingStart(builder *flatbuffers.Builder) {
-       builder.StartObject(3)
+       builder.StartObject(4)
 }
 func DictionaryEncodingAddId(builder *flatbuffers.Builder, id int64) {
        builder.PrependInt64Slot(0, id, 0)
@@ -111,6 +127,9 @@ func DictionaryEncodingAddIndexType(builder 
*flatbuffers.Builder, indexType flat
 func DictionaryEncodingAddIsOrdered(builder *flatbuffers.Builder, isOrdered 
bool) {
        builder.PrependBoolSlot(2, isOrdered, false)
 }
+func DictionaryEncodingAddDictionaryKind(builder *flatbuffers.Builder, 
dictionaryKind DictionaryKind) {
+       builder.PrependInt16Slot(3, int16(dictionaryKind), 0)
+}
 func DictionaryEncodingEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Endianness.go 
b/go/arrow/internal/flatbuf/DictionaryKind.go
similarity index 59%
copy from go/arrow/internal/flatbuf/Endianness.go
copy to go/arrow/internal/flatbuf/DictionaryKind.go
index 22e349e..126ba5f 100644
--- a/go/arrow/internal/flatbuf/Endianness.go
+++ b/go/arrow/internal/flatbuf/DictionaryKind.go
@@ -18,16 +18,30 @@
 
 package flatbuf
 
+import "strconv"
+
 /// ----------------------------------------------------------------------
-/// Endianness of the platform producing the data
-type Endianness = int16
+/// Dictionary encoding metadata
+/// Maintained for forwards compatibility, in the future
+/// Dictionaries might be explicit maps between integers and values
+/// allowing for non-contiguous index values
+type DictionaryKind int16
+
 const (
-       EndiannessLittle Endianness = 0
-       EndiannessBig Endianness = 1
+       DictionaryKindDenseArray DictionaryKind = 0
 )
 
-var EnumNamesEndianness = map[Endianness]string{
-       EndiannessLittle:"Little",
-       EndiannessBig:"Big",
+var EnumNamesDictionaryKind = map[DictionaryKind]string{
+       DictionaryKindDenseArray: "DenseArray",
 }
 
+var EnumValuesDictionaryKind = map[string]DictionaryKind{
+       "DenseArray": DictionaryKindDenseArray,
+}
+
+func (v DictionaryKind) String() string {
+       if s, ok := EnumNamesDictionaryKind[v]; ok {
+               return s
+       }
+       return "DictionaryKind(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Duration.go 
b/go/arrow/internal/flatbuf/Duration.go
index 4bb44d2..57b7b2a 100644
--- a/go/arrow/internal/flatbuf/Duration.go
+++ b/go/arrow/internal/flatbuf/Duration.go
@@ -45,20 +45,20 @@ func (rcv *Duration) Table() flatbuffers.Table {
 func (rcv *Duration) Unit() TimeUnit {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return TimeUnit(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 1
 }
 
 func (rcv *Duration) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func DurationStart(builder *flatbuffers.Builder) {
        builder.StartObject(1)
 }
-func DurationAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
+func DurationAddUnit(builder *flatbuffers.Builder, unit TimeUnit) {
+       builder.PrependInt16Slot(0, int16(unit), 1)
 }
 func DurationEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
diff --git a/go/arrow/internal/flatbuf/Endianness.go 
b/go/arrow/internal/flatbuf/Endianness.go
index 22e349e..cefa2ff 100644
--- a/go/arrow/internal/flatbuf/Endianness.go
+++ b/go/arrow/internal/flatbuf/Endianness.go
@@ -18,16 +18,30 @@
 
 package flatbuf
 
+import "strconv"
+
 /// ----------------------------------------------------------------------
 /// Endianness of the platform producing the data
-type Endianness = int16
+type Endianness int16
+
 const (
        EndiannessLittle Endianness = 0
-       EndiannessBig Endianness = 1
+       EndiannessBig    Endianness = 1
 )
 
 var EnumNamesEndianness = map[Endianness]string{
-       EndiannessLittle:"Little",
-       EndiannessBig:"Big",
+       EndiannessLittle: "Little",
+       EndiannessBig:    "Big",
 }
 
+var EnumValuesEndianness = map[string]Endianness{
+       "Little": EndiannessLittle,
+       "Big":    EndiannessBig,
+}
+
+func (v Endianness) String() string {
+       if s, ok := EnumNamesEndianness[v]; ok {
+               return s
+       }
+       return "Endianness(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Feature.go 
b/go/arrow/internal/flatbuf/Feature.go
new file mode 100644
index 0000000..ae5a039
--- /dev/null
+++ b/go/arrow/internal/flatbuf/Feature.go
@@ -0,0 +1,71 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package flatbuf
+
+import "strconv"
+
+/// Represents Arrow Features that might not have full support
+/// within implementations. This is intended to be used in
+/// two scenarios:
+///  1.  A mechanism for readers of Arrow Streams
+///      and files to understand that the stream or file makes
+///      use of a feature that isn't supported or unknown to
+///      the implementation (and therefore can meet the Arrow
+///      forward compatibility guarantees).
+///  2.  A means of negotiating between a client and server
+///      what features a stream is allowed to use. The enums
+///      values here are intented to represent higher level
+///      features, additional details maybe negotiated
+///      with key-value pairs specific to the protocol.
+///
+/// Enums added to this list should be assigned power-of-two values
+/// to facilitate exchanging and comparing bitmaps for supported
+/// features.
+type Feature int64
+
+const (
+       /// Needed to make flatbuffers happy.
+       FeatureUNUSED                 Feature = 0
+       /// The stream makes use of multiple full dictionaries with the
+       /// same ID and assumes clients implement dictionary replacement
+       /// correctly.
+       FeatureDICTIONARY_REPLACEMENT Feature = 1
+       /// The stream makes use of compressed bodies as described
+       /// in Message.fbs.
+       FeatureCOMPRESSED_BODY        Feature = 2
+)
+
+var EnumNamesFeature = map[Feature]string{
+       FeatureUNUSED:                 "UNUSED",
+       FeatureDICTIONARY_REPLACEMENT: "DICTIONARY_REPLACEMENT",
+       FeatureCOMPRESSED_BODY:        "COMPRESSED_BODY",
+}
+
+var EnumValuesFeature = map[string]Feature{
+       "UNUSED":                 FeatureUNUSED,
+       "DICTIONARY_REPLACEMENT": FeatureDICTIONARY_REPLACEMENT,
+       "COMPRESSED_BODY":        FeatureCOMPRESSED_BODY,
+}
+
+func (v Feature) String() string {
+       if s, ok := EnumNamesFeature[v]; ok {
+               return s
+       }
+       return "Feature(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Field.go 
b/go/arrow/internal/flatbuf/Field.go
index d63df24..c03cf2f 100644
--- a/go/arrow/internal/flatbuf/Field.go
+++ b/go/arrow/internal/flatbuf/Field.go
@@ -69,16 +69,16 @@ func (rcv *Field) MutateNullable(n bool) bool {
        return rcv._tab.MutateBoolSlot(6, n)
 }
 
-func (rcv *Field) TypeType() byte {
+func (rcv *Field) TypeType() Type {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
        if o != 0 {
-               return rcv._tab.GetByte(o + rcv._tab.Pos)
+               return Type(rcv._tab.GetByte(o + rcv._tab.Pos))
        }
        return 0
 }
 
-func (rcv *Field) MutateTypeType(n byte) bool {
-       return rcv._tab.MutateByteSlot(8, n)
+func (rcv *Field) MutateTypeType(n Type) bool {
+       return rcv._tab.MutateByteSlot(8, byte(n))
 }
 
 /// This is the type of the decoded value if the field is dictionary encoded.
@@ -162,8 +162,8 @@ func FieldAddName(builder *flatbuffers.Builder, name 
flatbuffers.UOffsetT) {
 func FieldAddNullable(builder *flatbuffers.Builder, nullable bool) {
        builder.PrependBoolSlot(1, nullable, false)
 }
-func FieldAddTypeType(builder *flatbuffers.Builder, typeType byte) {
-       builder.PrependByteSlot(2, typeType, 0)
+func FieldAddTypeType(builder *flatbuffers.Builder, typeType Type) {
+       builder.PrependByteSlot(2, byte(typeType), 0)
 }
 func FieldAddType(builder *flatbuffers.Builder, type_ flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(type_), 0)
diff --git a/go/arrow/internal/flatbuf/FieldNode.go 
b/go/arrow/internal/flatbuf/FieldNode.go
index b8d7115..606b30b 100644
--- a/go/arrow/internal/flatbuf/FieldNode.go
+++ b/go/arrow/internal/flatbuf/FieldNode.go
@@ -28,7 +28,7 @@ import (
 /// Metadata about a field at some level of a nested type tree (but not
 /// its children).
 ///
-/// For example, a List<Int16> with values [[1, 2, 3], null, [4], [5, 6], null]
+/// For example, a List<Int16> with values `[[1, 2, 3], null, [4], [5, 6], 
null]`
 /// would have {length: 5, null_count: 2} for its List node, and {length: 6,
 /// null_count: 0} for its Int16 node, as separate FieldNode structs
 type FieldNode struct {
diff --git a/go/arrow/internal/flatbuf/FloatingPoint.go 
b/go/arrow/internal/flatbuf/FloatingPoint.go
index 975a52d..241d448 100644
--- a/go/arrow/internal/flatbuf/FloatingPoint.go
+++ b/go/arrow/internal/flatbuf/FloatingPoint.go
@@ -45,20 +45,20 @@ func (rcv *FloatingPoint) Table() flatbuffers.Table {
 func (rcv *FloatingPoint) Precision() Precision {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return Precision(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *FloatingPoint) MutatePrecision(n Precision) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func FloatingPointStart(builder *flatbuffers.Builder) {
        builder.StartObject(1)
 }
-func FloatingPointAddPrecision(builder *flatbuffers.Builder, precision int16) {
-       builder.PrependInt16Slot(0, precision, 0)
+func FloatingPointAddPrecision(builder *flatbuffers.Builder, precision 
Precision) {
+       builder.PrependInt16Slot(0, int16(precision), 0)
 }
 func FloatingPointEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
diff --git a/go/arrow/internal/flatbuf/Footer.go 
b/go/arrow/internal/flatbuf/Footer.go
index 6802e77..65b0ff0 100644
--- a/go/arrow/internal/flatbuf/Footer.go
+++ b/go/arrow/internal/flatbuf/Footer.go
@@ -48,13 +48,13 @@ func (rcv *Footer) Table() flatbuffers.Table {
 func (rcv *Footer) Version() MetadataVersion {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return MetadataVersion(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *Footer) MutateVersion(n MetadataVersion) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func (rcv *Footer) Schema(obj *Schema) *Schema {
@@ -108,11 +108,33 @@ func (rcv *Footer) RecordBatchesLength() int {
        return 0
 }
 
+/// User-defined metadata
+func (rcv *Footer) CustomMetadata(obj *KeyValue, j int) bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               x := rcv._tab.Vector(o)
+               x += flatbuffers.UOffsetT(j) * 4
+               x = rcv._tab.Indirect(x)
+               obj.Init(rcv._tab.Bytes, x)
+               return true
+       }
+       return false
+}
+
+func (rcv *Footer) CustomMetadataLength() int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               return rcv._tab.VectorLen(o)
+       }
+       return 0
+}
+
+/// User-defined metadata
 func FooterStart(builder *flatbuffers.Builder) {
-       builder.StartObject(4)
+       builder.StartObject(5)
 }
-func FooterAddVersion(builder *flatbuffers.Builder, version int16) {
-       builder.PrependInt16Slot(0, version, 0)
+func FooterAddVersion(builder *flatbuffers.Builder, version MetadataVersion) {
+       builder.PrependInt16Slot(0, int16(version), 0)
 }
 func FooterAddSchema(builder *flatbuffers.Builder, schema 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(schema), 0)
@@ -129,6 +151,12 @@ func FooterAddRecordBatches(builder *flatbuffers.Builder, 
recordBatches flatbuff
 func FooterStartRecordBatchesVector(builder *flatbuffers.Builder, numElems 
int) flatbuffers.UOffsetT {
        return builder.StartVector(24, numElems, 8)
 }
+func FooterAddCustomMetadata(builder *flatbuffers.Builder, customMetadata 
flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(customMetadata), 0)
+}
+func FooterStartCustomMetadataVector(builder *flatbuffers.Builder, numElems 
int) flatbuffers.UOffsetT {
+       return builder.StartVector(4, numElems, 4)
+}
 func FooterEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Interval.go 
b/go/arrow/internal/flatbuf/Interval.go
index 21970ef..12c56d5 100644
--- a/go/arrow/internal/flatbuf/Interval.go
+++ b/go/arrow/internal/flatbuf/Interval.go
@@ -45,20 +45,20 @@ func (rcv *Interval) Table() flatbuffers.Table {
 func (rcv *Interval) Unit() IntervalUnit {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return IntervalUnit(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *Interval) MutateUnit(n IntervalUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func IntervalStart(builder *flatbuffers.Builder) {
        builder.StartObject(1)
 }
-func IntervalAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 0)
+func IntervalAddUnit(builder *flatbuffers.Builder, unit IntervalUnit) {
+       builder.PrependInt16Slot(0, int16(unit), 0)
 }
 func IntervalEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
diff --git a/go/arrow/internal/flatbuf/IntervalUnit.go 
b/go/arrow/internal/flatbuf/IntervalUnit.go
index 62baea9..5c6aeec 100644
--- a/go/arrow/internal/flatbuf/IntervalUnit.go
+++ b/go/arrow/internal/flatbuf/IntervalUnit.go
@@ -18,14 +18,28 @@
 
 package flatbuf
 
-type IntervalUnit = int16
+import "strconv"
+
+type IntervalUnit int16
+
 const (
        IntervalUnitYEAR_MONTH IntervalUnit = 0
-       IntervalUnitDAY_TIME IntervalUnit = 1
+       IntervalUnitDAY_TIME   IntervalUnit = 1
 )
 
 var EnumNamesIntervalUnit = map[IntervalUnit]string{
-       IntervalUnitYEAR_MONTH:"YEAR_MONTH",
-       IntervalUnitDAY_TIME:"DAY_TIME",
+       IntervalUnitYEAR_MONTH: "YEAR_MONTH",
+       IntervalUnitDAY_TIME:   "DAY_TIME",
 }
 
+var EnumValuesIntervalUnit = map[string]IntervalUnit{
+       "YEAR_MONTH": IntervalUnitYEAR_MONTH,
+       "DAY_TIME":   IntervalUnitDAY_TIME,
+}
+
+func (v IntervalUnit) String() string {
+       if s, ok := EnumNamesIntervalUnit[v]; ok {
+               return s
+       }
+       return "IntervalUnit(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Duration.go 
b/go/arrow/internal/flatbuf/LargeBinary.go
similarity index 60%
copy from go/arrow/internal/flatbuf/Duration.go
copy to go/arrow/internal/flatbuf/LargeBinary.go
index 4bb44d2..2c3befc 100644
--- a/go/arrow/internal/flatbuf/Duration.go
+++ b/go/arrow/internal/flatbuf/LargeBinary.go
@@ -22,44 +22,31 @@ import (
        flatbuffers "github.com/google/flatbuffers/go"
 )
 
-type Duration struct {
+/// Same as Binary, but with 64-bit offsets, allowing to represent
+/// extremely large data values.
+type LargeBinary struct {
        _tab flatbuffers.Table
 }
 
-func GetRootAsDuration(buf []byte, offset flatbuffers.UOffsetT) *Duration {
+func GetRootAsLargeBinary(buf []byte, offset flatbuffers.UOffsetT) 
*LargeBinary {
        n := flatbuffers.GetUOffsetT(buf[offset:])
-       x := &Duration{}
+       x := &LargeBinary{}
        x.Init(buf, n+offset)
        return x
 }
 
-func (rcv *Duration) Init(buf []byte, i flatbuffers.UOffsetT) {
+func (rcv *LargeBinary) Init(buf []byte, i flatbuffers.UOffsetT) {
        rcv._tab.Bytes = buf
        rcv._tab.Pos = i
 }
 
-func (rcv *Duration) Table() flatbuffers.Table {
+func (rcv *LargeBinary) Table() flatbuffers.Table {
        return rcv._tab
 }
 
-func (rcv *Duration) Unit() TimeUnit {
-       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
-       if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
-       }
-       return 1
+func LargeBinaryStart(builder *flatbuffers.Builder) {
+       builder.StartObject(0)
 }
-
-func (rcv *Duration) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
-}
-
-func DurationStart(builder *flatbuffers.Builder) {
-       builder.StartObject(1)
-}
-func DurationAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
-}
-func DurationEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+func LargeBinaryEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Duration.go 
b/go/arrow/internal/flatbuf/LargeList.go
similarity index 60%
copy from go/arrow/internal/flatbuf/Duration.go
copy to go/arrow/internal/flatbuf/LargeList.go
index 4bb44d2..92f2284 100644
--- a/go/arrow/internal/flatbuf/Duration.go
+++ b/go/arrow/internal/flatbuf/LargeList.go
@@ -22,44 +22,31 @@ import (
        flatbuffers "github.com/google/flatbuffers/go"
 )
 
-type Duration struct {
+/// Same as List, but with 64-bit offsets, allowing to represent
+/// extremely large data values.
+type LargeList struct {
        _tab flatbuffers.Table
 }
 
-func GetRootAsDuration(buf []byte, offset flatbuffers.UOffsetT) *Duration {
+func GetRootAsLargeList(buf []byte, offset flatbuffers.UOffsetT) *LargeList {
        n := flatbuffers.GetUOffsetT(buf[offset:])
-       x := &Duration{}
+       x := &LargeList{}
        x.Init(buf, n+offset)
        return x
 }
 
-func (rcv *Duration) Init(buf []byte, i flatbuffers.UOffsetT) {
+func (rcv *LargeList) Init(buf []byte, i flatbuffers.UOffsetT) {
        rcv._tab.Bytes = buf
        rcv._tab.Pos = i
 }
 
-func (rcv *Duration) Table() flatbuffers.Table {
+func (rcv *LargeList) Table() flatbuffers.Table {
        return rcv._tab
 }
 
-func (rcv *Duration) Unit() TimeUnit {
-       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
-       if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
-       }
-       return 1
+func LargeListStart(builder *flatbuffers.Builder) {
+       builder.StartObject(0)
 }
-
-func (rcv *Duration) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
-}
-
-func DurationStart(builder *flatbuffers.Builder) {
-       builder.StartObject(1)
-}
-func DurationAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
-}
-func DurationEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+func LargeListEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Duration.go 
b/go/arrow/internal/flatbuf/LargeUtf8.go
similarity index 60%
copy from go/arrow/internal/flatbuf/Duration.go
copy to go/arrow/internal/flatbuf/LargeUtf8.go
index 4bb44d2..e78b33e 100644
--- a/go/arrow/internal/flatbuf/Duration.go
+++ b/go/arrow/internal/flatbuf/LargeUtf8.go
@@ -22,44 +22,31 @@ import (
        flatbuffers "github.com/google/flatbuffers/go"
 )
 
-type Duration struct {
+/// Same as Utf8, but with 64-bit offsets, allowing to represent
+/// extremely large data values.
+type LargeUtf8 struct {
        _tab flatbuffers.Table
 }
 
-func GetRootAsDuration(buf []byte, offset flatbuffers.UOffsetT) *Duration {
+func GetRootAsLargeUtf8(buf []byte, offset flatbuffers.UOffsetT) *LargeUtf8 {
        n := flatbuffers.GetUOffsetT(buf[offset:])
-       x := &Duration{}
+       x := &LargeUtf8{}
        x.Init(buf, n+offset)
        return x
 }
 
-func (rcv *Duration) Init(buf []byte, i flatbuffers.UOffsetT) {
+func (rcv *LargeUtf8) Init(buf []byte, i flatbuffers.UOffsetT) {
        rcv._tab.Bytes = buf
        rcv._tab.Pos = i
 }
 
-func (rcv *Duration) Table() flatbuffers.Table {
+func (rcv *LargeUtf8) Table() flatbuffers.Table {
        return rcv._tab
 }
 
-func (rcv *Duration) Unit() TimeUnit {
-       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
-       if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
-       }
-       return 1
+func LargeUtf8Start(builder *flatbuffers.Builder) {
+       builder.StartObject(0)
 }
-
-func (rcv *Duration) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
-}
-
-func DurationStart(builder *flatbuffers.Builder) {
-       builder.StartObject(1)
-}
-func DurationAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
-}
-func DurationEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
+func LargeUtf8End(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Map.go b/go/arrow/internal/flatbuf/Map.go
index d540fc7..8802aba 100644
--- a/go/arrow/internal/flatbuf/Map.go
+++ b/go/arrow/internal/flatbuf/Map.go
@@ -37,10 +37,11 @@ import (
 /// not enforced.
 ///
 /// Map
+/// ```text
 ///   - child[0] entries: Struct
 ///     - child[0] key: K
 ///     - child[1] value: V
-///
+/// ```
 /// Neither the "entries" field nor the "key" field may be nullable.
 ///
 /// The metadata is structured so that Arrow systems without special handling
diff --git a/go/arrow/internal/flatbuf/Message.go 
b/go/arrow/internal/flatbuf/Message.go
index 76fcc38..f4b4a0f 100644
--- a/go/arrow/internal/flatbuf/Message.go
+++ b/go/arrow/internal/flatbuf/Message.go
@@ -45,25 +45,25 @@ func (rcv *Message) Table() flatbuffers.Table {
 func (rcv *Message) Version() MetadataVersion {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return MetadataVersion(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *Message) MutateVersion(n MetadataVersion) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
-func (rcv *Message) HeaderType() byte {
+func (rcv *Message) HeaderType() MessageHeader {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
        if o != 0 {
-               return rcv._tab.GetByte(o + rcv._tab.Pos)
+               return MessageHeader(rcv._tab.GetByte(o + rcv._tab.Pos))
        }
        return 0
 }
 
-func (rcv *Message) MutateHeaderType(n byte) bool {
-       return rcv._tab.MutateByteSlot(6, n)
+func (rcv *Message) MutateHeaderType(n MessageHeader) bool {
+       return rcv._tab.MutateByteSlot(6, byte(n))
 }
 
 func (rcv *Message) Header(obj *flatbuffers.Table) bool {
@@ -110,11 +110,11 @@ func (rcv *Message) CustomMetadataLength() int {
 func MessageStart(builder *flatbuffers.Builder) {
        builder.StartObject(5)
 }
-func MessageAddVersion(builder *flatbuffers.Builder, version int16) {
-       builder.PrependInt16Slot(0, version, 0)
+func MessageAddVersion(builder *flatbuffers.Builder, version MetadataVersion) {
+       builder.PrependInt16Slot(0, int16(version), 0)
 }
-func MessageAddHeaderType(builder *flatbuffers.Builder, headerType byte) {
-       builder.PrependByteSlot(1, headerType, 0)
+func MessageAddHeaderType(builder *flatbuffers.Builder, headerType 
MessageHeader) {
+       builder.PrependByteSlot(1, byte(headerType), 0)
 }
 func MessageAddHeader(builder *flatbuffers.Builder, header 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(header), 0)
diff --git a/go/arrow/internal/flatbuf/MessageHeader.go 
b/go/arrow/internal/flatbuf/MessageHeader.go
index 18730be..c12fc10 100644
--- a/go/arrow/internal/flatbuf/MessageHeader.go
+++ b/go/arrow/internal/flatbuf/MessageHeader.go
@@ -18,6 +18,8 @@
 
 package flatbuf
 
+import "strconv"
+
 /// ----------------------------------------------------------------------
 /// The root Message type
 /// This union enables us to easily send different message types without
@@ -26,22 +28,38 @@ package flatbuf
 /// Arrow implementations do not need to implement all of the message types,
 /// which may include experimental metadata types. For maximum compatibility,
 /// it is best to send data using RecordBatch
-type MessageHeader = byte
+type MessageHeader byte
+
 const (
-       MessageHeaderNONE MessageHeader = 0
-       MessageHeaderSchema MessageHeader = 1
+       MessageHeaderNONE            MessageHeader = 0
+       MessageHeaderSchema          MessageHeader = 1
        MessageHeaderDictionaryBatch MessageHeader = 2
-       MessageHeaderRecordBatch MessageHeader = 3
-       MessageHeaderTensor MessageHeader = 4
-       MessageHeaderSparseTensor MessageHeader = 5
+       MessageHeaderRecordBatch     MessageHeader = 3
+       MessageHeaderTensor          MessageHeader = 4
+       MessageHeaderSparseTensor    MessageHeader = 5
 )
 
 var EnumNamesMessageHeader = map[MessageHeader]string{
-       MessageHeaderNONE:"NONE",
-       MessageHeaderSchema:"Schema",
-       MessageHeaderDictionaryBatch:"DictionaryBatch",
-       MessageHeaderRecordBatch:"RecordBatch",
-       MessageHeaderTensor:"Tensor",
-       MessageHeaderSparseTensor:"SparseTensor",
+       MessageHeaderNONE:            "NONE",
+       MessageHeaderSchema:          "Schema",
+       MessageHeaderDictionaryBatch: "DictionaryBatch",
+       MessageHeaderRecordBatch:     "RecordBatch",
+       MessageHeaderTensor:          "Tensor",
+       MessageHeaderSparseTensor:    "SparseTensor",
 }
 
+var EnumValuesMessageHeader = map[string]MessageHeader{
+       "NONE":            MessageHeaderNONE,
+       "Schema":          MessageHeaderSchema,
+       "DictionaryBatch": MessageHeaderDictionaryBatch,
+       "RecordBatch":     MessageHeaderRecordBatch,
+       "Tensor":          MessageHeaderTensor,
+       "SparseTensor":    MessageHeaderSparseTensor,
+}
+
+func (v MessageHeader) String() string {
+       if s, ok := EnumNamesMessageHeader[v]; ok {
+               return s
+       }
+       return "MessageHeader(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/MetadataVersion.go 
b/go/arrow/internal/flatbuf/MetadataVersion.go
index 0094430..21b234f 100644
--- a/go/arrow/internal/flatbuf/MetadataVersion.go
+++ b/go/arrow/internal/flatbuf/MetadataVersion.go
@@ -18,22 +18,48 @@
 
 package flatbuf
 
-type MetadataVersion = int16
+import "strconv"
+
+type MetadataVersion int16
+
 const (
-       /// 0.1.0
+       /// 0.1.0 (October 2016).
        MetadataVersionV1 MetadataVersion = 0
-       /// 0.2.0
+       /// 0.2.0 (February 2017). Non-backwards compatible with V1.
        MetadataVersionV2 MetadataVersion = 1
-       /// 0.3.0 -> 0.7.1
+       /// 0.3.0 -> 0.7.1 (May - December 2017). Non-backwards compatible with 
V2.
        MetadataVersionV3 MetadataVersion = 2
-       /// >= 0.8.0
+       /// >= 0.8.0 (December 2017). Non-backwards compatible with V3.
        MetadataVersionV4 MetadataVersion = 3
+       /// >= 1.0.0 (July 2020. Backwards compatible with V4 (V5 readers can 
read V4
+       /// metadata and IPC messages). Implementations are recommended to 
provide a
+       /// V4 compatibility mode with V5 format changes disabled.
+       ///
+       /// Incompatible changes between V4 and V5:
+       /// - Union buffer layout has changed. In V5, Unions don't have a 
validity
+       ///   bitmap buffer.
+       MetadataVersionV5 MetadataVersion = 4
 )
 
 var EnumNamesMetadataVersion = map[MetadataVersion]string{
-       MetadataVersionV1:"V1",
-       MetadataVersionV2:"V2",
-       MetadataVersionV3:"V3",
-       MetadataVersionV4:"V4",
+       MetadataVersionV1: "V1",
+       MetadataVersionV2: "V2",
+       MetadataVersionV3: "V3",
+       MetadataVersionV4: "V4",
+       MetadataVersionV5: "V5",
 }
 
+var EnumValuesMetadataVersion = map[string]MetadataVersion{
+       "V1": MetadataVersionV1,
+       "V2": MetadataVersionV2,
+       "V3": MetadataVersionV3,
+       "V4": MetadataVersionV4,
+       "V5": MetadataVersionV5,
+}
+
+func (v MetadataVersion) String() string {
+       if s, ok := EnumNamesMetadataVersion[v]; ok {
+               return s
+       }
+       return "MetadataVersion(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Precision.go 
b/go/arrow/internal/flatbuf/Precision.go
index 417d1e7..d8021cc 100644
--- a/go/arrow/internal/flatbuf/Precision.go
+++ b/go/arrow/internal/flatbuf/Precision.go
@@ -18,16 +18,31 @@
 
 package flatbuf
 
-type Precision = int16
+import "strconv"
+
+type Precision int16
+
 const (
-       PrecisionHALF Precision = 0
+       PrecisionHALF   Precision = 0
        PrecisionSINGLE Precision = 1
        PrecisionDOUBLE Precision = 2
 )
 
 var EnumNamesPrecision = map[Precision]string{
-       PrecisionHALF:"HALF",
-       PrecisionSINGLE:"SINGLE",
-       PrecisionDOUBLE:"DOUBLE",
+       PrecisionHALF:   "HALF",
+       PrecisionSINGLE: "SINGLE",
+       PrecisionDOUBLE: "DOUBLE",
 }
 
+var EnumValuesPrecision = map[string]Precision{
+       "HALF":   PrecisionHALF,
+       "SINGLE": PrecisionSINGLE,
+       "DOUBLE": PrecisionDOUBLE,
+}
+
+func (v Precision) String() string {
+       if s, ok := EnumNamesPrecision[v]; ok {
+               return s
+       }
+       return "Precision(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/RecordBatch.go 
b/go/arrow/internal/flatbuf/RecordBatch.go
index b997bdf..bb6aca9 100644
--- a/go/arrow/internal/flatbuf/RecordBatch.go
+++ b/go/arrow/internal/flatbuf/RecordBatch.go
@@ -113,8 +113,23 @@ func (rcv *RecordBatch) BuffersLength() int {
 /// example, most primitive arrays will have 2 buffers, 1 for the validity
 /// bitmap and 1 for the values. For struct arrays, there will only be a
 /// single buffer for the validity (nulls) bitmap
+/// Optional compression of the message body
+func (rcv *RecordBatch) Compression(obj *BodyCompression) *BodyCompression {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               x := rcv._tab.Indirect(o + rcv._tab.Pos)
+               if obj == nil {
+                       obj = new(BodyCompression)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// Optional compression of the message body
 func RecordBatchStart(builder *flatbuffers.Builder) {
-       builder.StartObject(3)
+       builder.StartObject(4)
 }
 func RecordBatchAddLength(builder *flatbuffers.Builder, length int64) {
        builder.PrependInt64Slot(0, length, 0)
@@ -131,6 +146,9 @@ func RecordBatchAddBuffers(builder *flatbuffers.Builder, 
buffers flatbuffers.UOf
 func RecordBatchStartBuffersVector(builder *flatbuffers.Builder, numElems int) 
flatbuffers.UOffsetT {
        return builder.StartVector(16, numElems, 8)
 }
+func RecordBatchAddCompression(builder *flatbuffers.Builder, compression 
flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(compression), 0)
+}
 func RecordBatchEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/Schema.go 
b/go/arrow/internal/flatbuf/Schema.go
index d3e2737..4ee5ecc 100644
--- a/go/arrow/internal/flatbuf/Schema.go
+++ b/go/arrow/internal/flatbuf/Schema.go
@@ -50,7 +50,7 @@ func (rcv *Schema) Table() flatbuffers.Table {
 func (rcv *Schema) Endianness() Endianness {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return Endianness(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
@@ -59,7 +59,7 @@ func (rcv *Schema) Endianness() Endianness {
 /// it is Little Endian by default
 /// if endianness doesn't match the underlying system then the vectors need to 
be converted
 func (rcv *Schema) MutateEndianness(n Endianness) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func (rcv *Schema) Fields(obj *Field, j int) bool {
@@ -102,11 +102,39 @@ func (rcv *Schema) CustomMetadataLength() int {
        return 0
 }
 
+/// Features used in the stream/file.
+func (rcv *Schema) Features(j int) Feature {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               a := rcv._tab.Vector(o)
+               return Feature(rcv._tab.GetInt64(a + flatbuffers.UOffsetT(j*8)))
+       }
+       return 0
+}
+
+func (rcv *Schema) FeaturesLength() int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               return rcv._tab.VectorLen(o)
+       }
+       return 0
+}
+
+/// Features used in the stream/file.
+func (rcv *Schema) MutateFeatures(j int, n Feature) bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               a := rcv._tab.Vector(o)
+               return rcv._tab.MutateInt64(a+flatbuffers.UOffsetT(j*8), 
int64(n))
+       }
+       return false
+}
+
 func SchemaStart(builder *flatbuffers.Builder) {
-       builder.StartObject(3)
+       builder.StartObject(4)
 }
-func SchemaAddEndianness(builder *flatbuffers.Builder, endianness int16) {
-       builder.PrependInt16Slot(0, endianness, 0)
+func SchemaAddEndianness(builder *flatbuffers.Builder, endianness Endianness) {
+       builder.PrependInt16Slot(0, int16(endianness), 0)
 }
 func SchemaAddFields(builder *flatbuffers.Builder, fields 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(fields), 0)
@@ -120,6 +148,12 @@ func SchemaAddCustomMetadata(builder *flatbuffers.Builder, 
customMetadata flatbu
 func SchemaStartCustomMetadataVector(builder *flatbuffers.Builder, numElems 
int) flatbuffers.UOffsetT {
        return builder.StartVector(4, numElems, 4)
 }
+func SchemaAddFeatures(builder *flatbuffers.Builder, features 
flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(features), 0)
+}
+func SchemaStartFeaturesVector(builder *flatbuffers.Builder, numElems int) 
flatbuffers.UOffsetT {
+       return builder.StartVector(8, numElems, 8)
+}
 func SchemaEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/MetadataVersion.go 
b/go/arrow/internal/flatbuf/SparseMatrixCompressedAxis.go
similarity index 54%
copy from go/arrow/internal/flatbuf/MetadataVersion.go
copy to go/arrow/internal/flatbuf/SparseMatrixCompressedAxis.go
index 0094430..2d86fde 100644
--- a/go/arrow/internal/flatbuf/MetadataVersion.go
+++ b/go/arrow/internal/flatbuf/SparseMatrixCompressedAxis.go
@@ -18,22 +18,28 @@
 
 package flatbuf
 
-type MetadataVersion = int16
+import "strconv"
+
+type SparseMatrixCompressedAxis int16
+
 const (
-       /// 0.1.0
-       MetadataVersionV1 MetadataVersion = 0
-       /// 0.2.0
-       MetadataVersionV2 MetadataVersion = 1
-       /// 0.3.0 -> 0.7.1
-       MetadataVersionV3 MetadataVersion = 2
-       /// >= 0.8.0
-       MetadataVersionV4 MetadataVersion = 3
+       SparseMatrixCompressedAxisRow    SparseMatrixCompressedAxis = 0
+       SparseMatrixCompressedAxisColumn SparseMatrixCompressedAxis = 1
 )
 
-var EnumNamesMetadataVersion = map[MetadataVersion]string{
-       MetadataVersionV1:"V1",
-       MetadataVersionV2:"V2",
-       MetadataVersionV3:"V3",
-       MetadataVersionV4:"V4",
+var EnumNamesSparseMatrixCompressedAxis = 
map[SparseMatrixCompressedAxis]string{
+       SparseMatrixCompressedAxisRow:    "Row",
+       SparseMatrixCompressedAxisColumn: "Column",
 }
 
+var EnumValuesSparseMatrixCompressedAxis = 
map[string]SparseMatrixCompressedAxis{
+       "Row":    SparseMatrixCompressedAxisRow,
+       "Column": SparseMatrixCompressedAxisColumn,
+}
+
+func (v SparseMatrixCompressedAxis) String() string {
+       if s, ok := EnumNamesSparseMatrixCompressedAxis[v]; ok {
+               return s
+       }
+       return "SparseMatrixCompressedAxis(" + strconv.FormatInt(int64(v), 10) 
+ ")"
+}
diff --git a/go/arrow/internal/flatbuf/SparseMatrixIndexCSX.go 
b/go/arrow/internal/flatbuf/SparseMatrixIndexCSX.go
new file mode 100644
index 0000000..c28cc5d
--- /dev/null
+++ b/go/arrow/internal/flatbuf/SparseMatrixIndexCSX.go
@@ -0,0 +1,200 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package flatbuf
+
+import (
+       flatbuffers "github.com/google/flatbuffers/go"
+)
+
+/// Compressed Sparse format, that is matrix-specific.
+type SparseMatrixIndexCSX struct {
+       _tab flatbuffers.Table
+}
+
+func GetRootAsSparseMatrixIndexCSX(buf []byte, offset flatbuffers.UOffsetT) 
*SparseMatrixIndexCSX {
+       n := flatbuffers.GetUOffsetT(buf[offset:])
+       x := &SparseMatrixIndexCSX{}
+       x.Init(buf, n+offset)
+       return x
+}
+
+func (rcv *SparseMatrixIndexCSX) Init(buf []byte, i flatbuffers.UOffsetT) {
+       rcv._tab.Bytes = buf
+       rcv._tab.Pos = i
+}
+
+func (rcv *SparseMatrixIndexCSX) Table() flatbuffers.Table {
+       return rcv._tab
+}
+
+/// Which axis, row or column, is compressed
+func (rcv *SparseMatrixIndexCSX) CompressedAxis() SparseMatrixCompressedAxis {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
+       if o != 0 {
+               return SparseMatrixCompressedAxis(rcv._tab.GetInt16(o + 
rcv._tab.Pos))
+       }
+       return 0
+}
+
+/// Which axis, row or column, is compressed
+func (rcv *SparseMatrixIndexCSX) MutateCompressedAxis(n 
SparseMatrixCompressedAxis) bool {
+       return rcv._tab.MutateInt16Slot(4, int16(n))
+}
+
+/// The type of values in indptrBuffer
+func (rcv *SparseMatrixIndexCSX) IndptrType(obj *Int) *Int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
+       if o != 0 {
+               x := rcv._tab.Indirect(o + rcv._tab.Pos)
+               if obj == nil {
+                       obj = new(Int)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// The type of values in indptrBuffer
+/// indptrBuffer stores the location and size of indptr array that
+/// represents the range of the rows.
+/// The i-th row spans from `indptr[i]` to `indptr[i+1]` in the data.
+/// The length of this array is 1 + (the number of rows), and the type
+/// of index value is long.
+///
+/// For example, let X be the following 6x4 matrix:
+/// ```text
+///   X := [[0, 1, 2, 0],
+///         [0, 0, 3, 0],
+///         [0, 4, 0, 5],
+///         [0, 0, 0, 0],
+///         [6, 0, 7, 8],
+///         [0, 9, 0, 0]].
+/// ```
+/// The array of non-zero values in X is:
+/// ```text
+///   values(X) = [1, 2, 3, 4, 5, 6, 7, 8, 9].
+/// ```
+/// And the indptr of X is:
+/// ```text
+///   indptr(X) = [0, 2, 3, 5, 5, 8, 10].
+/// ```
+func (rcv *SparseMatrixIndexCSX) IndptrBuffer(obj *Buffer) *Buffer {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
+       if o != 0 {
+               x := o + rcv._tab.Pos
+               if obj == nil {
+                       obj = new(Buffer)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// indptrBuffer stores the location and size of indptr array that
+/// represents the range of the rows.
+/// The i-th row spans from `indptr[i]` to `indptr[i+1]` in the data.
+/// The length of this array is 1 + (the number of rows), and the type
+/// of index value is long.
+///
+/// For example, let X be the following 6x4 matrix:
+/// ```text
+///   X := [[0, 1, 2, 0],
+///         [0, 0, 3, 0],
+///         [0, 4, 0, 5],
+///         [0, 0, 0, 0],
+///         [6, 0, 7, 8],
+///         [0, 9, 0, 0]].
+/// ```
+/// The array of non-zero values in X is:
+/// ```text
+///   values(X) = [1, 2, 3, 4, 5, 6, 7, 8, 9].
+/// ```
+/// And the indptr of X is:
+/// ```text
+///   indptr(X) = [0, 2, 3, 5, 5, 8, 10].
+/// ```
+/// The type of values in indicesBuffer
+func (rcv *SparseMatrixIndexCSX) IndicesType(obj *Int) *Int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               x := rcv._tab.Indirect(o + rcv._tab.Pos)
+               if obj == nil {
+                       obj = new(Int)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// The type of values in indicesBuffer
+/// indicesBuffer stores the location and size of the array that
+/// contains the column indices of the corresponding non-zero values.
+/// The type of index value is long.
+///
+/// For example, the indices of the above X is:
+/// ```text
+///   indices(X) = [1, 2, 2, 1, 3, 0, 2, 3, 1].
+/// ```
+/// Note that the indices are sorted in lexicographical order for each row.
+func (rcv *SparseMatrixIndexCSX) IndicesBuffer(obj *Buffer) *Buffer {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               x := o + rcv._tab.Pos
+               if obj == nil {
+                       obj = new(Buffer)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// indicesBuffer stores the location and size of the array that
+/// contains the column indices of the corresponding non-zero values.
+/// The type of index value is long.
+///
+/// For example, the indices of the above X is:
+/// ```text
+///   indices(X) = [1, 2, 2, 1, 3, 0, 2, 3, 1].
+/// ```
+/// Note that the indices are sorted in lexicographical order for each row.
+func SparseMatrixIndexCSXStart(builder *flatbuffers.Builder) {
+       builder.StartObject(5)
+}
+func SparseMatrixIndexCSXAddCompressedAxis(builder *flatbuffers.Builder, 
compressedAxis SparseMatrixCompressedAxis) {
+       builder.PrependInt16Slot(0, int16(compressedAxis), 0)
+}
+func SparseMatrixIndexCSXAddIndptrType(builder *flatbuffers.Builder, 
indptrType flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(indptrType), 0)
+}
+func SparseMatrixIndexCSXAddIndptrBuffer(builder *flatbuffers.Builder, 
indptrBuffer flatbuffers.UOffsetT) {
+       builder.PrependStructSlot(2, flatbuffers.UOffsetT(indptrBuffer), 0)
+}
+func SparseMatrixIndexCSXAddIndicesType(builder *flatbuffers.Builder, 
indicesType flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(indicesType), 0)
+}
+func SparseMatrixIndexCSXAddIndicesBuffer(builder *flatbuffers.Builder, 
indicesBuffer flatbuffers.UOffsetT) {
+       builder.PrependStructSlot(4, flatbuffers.UOffsetT(indicesBuffer), 0)
+}
+func SparseMatrixIndexCSXEnd(builder *flatbuffers.Builder) 
flatbuffers.UOffsetT {
+       return builder.EndObject()
+}
diff --git a/go/arrow/internal/flatbuf/SparseTensor.go 
b/go/arrow/internal/flatbuf/SparseTensor.go
index 389832b..6f3f557 100644
--- a/go/arrow/internal/flatbuf/SparseTensor.go
+++ b/go/arrow/internal/flatbuf/SparseTensor.go
@@ -42,16 +42,16 @@ func (rcv *SparseTensor) Table() flatbuffers.Table {
        return rcv._tab
 }
 
-func (rcv *SparseTensor) TypeType() byte {
+func (rcv *SparseTensor) TypeType() Type {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetByte(o + rcv._tab.Pos)
+               return Type(rcv._tab.GetByte(o + rcv._tab.Pos))
        }
        return 0
 }
 
-func (rcv *SparseTensor) MutateTypeType(n byte) bool {
-       return rcv._tab.MutateByteSlot(4, n)
+func (rcv *SparseTensor) MutateTypeType(n Type) bool {
+       return rcv._tab.MutateByteSlot(4, byte(n))
 }
 
 /// The type of data contained in a value cell.
@@ -105,16 +105,16 @@ func (rcv *SparseTensor) MutateNonZeroLength(n int64) 
bool {
        return rcv._tab.MutateInt64Slot(10, n)
 }
 
-func (rcv *SparseTensor) SparseIndexType() byte {
+func (rcv *SparseTensor) SparseIndexType() SparseTensorIndex {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
        if o != 0 {
-               return rcv._tab.GetByte(o + rcv._tab.Pos)
+               return SparseTensorIndex(rcv._tab.GetByte(o + rcv._tab.Pos))
        }
        return 0
 }
 
-func (rcv *SparseTensor) MutateSparseIndexType(n byte) bool {
-       return rcv._tab.MutateByteSlot(12, n)
+func (rcv *SparseTensor) MutateSparseIndexType(n SparseTensorIndex) bool {
+       return rcv._tab.MutateByteSlot(12, byte(n))
 }
 
 /// Sparse tensor index
@@ -146,8 +146,8 @@ func (rcv *SparseTensor) Data(obj *Buffer) *Buffer {
 func SparseTensorStart(builder *flatbuffers.Builder) {
        builder.StartObject(7)
 }
-func SparseTensorAddTypeType(builder *flatbuffers.Builder, typeType byte) {
-       builder.PrependByteSlot(0, typeType, 0)
+func SparseTensorAddTypeType(builder *flatbuffers.Builder, typeType Type) {
+       builder.PrependByteSlot(0, byte(typeType), 0)
 }
 func SparseTensorAddType(builder *flatbuffers.Builder, type_ 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(type_), 0)
@@ -161,8 +161,8 @@ func SparseTensorStartShapeVector(builder 
*flatbuffers.Builder, numElems int) fl
 func SparseTensorAddNonZeroLength(builder *flatbuffers.Builder, nonZeroLength 
int64) {
        builder.PrependInt64Slot(3, nonZeroLength, 0)
 }
-func SparseTensorAddSparseIndexType(builder *flatbuffers.Builder, 
sparseIndexType byte) {
-       builder.PrependByteSlot(4, sparseIndexType, 0)
+func SparseTensorAddSparseIndexType(builder *flatbuffers.Builder, 
sparseIndexType SparseTensorIndex) {
+       builder.PrependByteSlot(4, byte(sparseIndexType), 0)
 }
 func SparseTensorAddSparseIndex(builder *flatbuffers.Builder, sparseIndex 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(5, flatbuffers.UOffsetT(sparseIndex), 0)
diff --git a/go/arrow/internal/flatbuf/SparseTensorIndex.go 
b/go/arrow/internal/flatbuf/SparseTensorIndex.go
index 4b82de7..42aa818 100644
--- a/go/arrow/internal/flatbuf/SparseTensorIndex.go
+++ b/go/arrow/internal/flatbuf/SparseTensorIndex.go
@@ -18,16 +18,34 @@
 
 package flatbuf
 
-type SparseTensorIndex = byte
+import "strconv"
+
+type SparseTensorIndex byte
+
 const (
-       SparseTensorIndexNONE SparseTensorIndex = 0
+       SparseTensorIndexNONE                 SparseTensorIndex = 0
        SparseTensorIndexSparseTensorIndexCOO SparseTensorIndex = 1
-       SparseTensorIndexSparseMatrixIndexCSR SparseTensorIndex = 2
+       SparseTensorIndexSparseMatrixIndexCSX SparseTensorIndex = 2
+       SparseTensorIndexSparseTensorIndexCSF SparseTensorIndex = 3
 )
 
 var EnumNamesSparseTensorIndex = map[SparseTensorIndex]string{
-       SparseTensorIndexNONE:"NONE",
-       SparseTensorIndexSparseTensorIndexCOO:"SparseTensorIndexCOO",
-       SparseTensorIndexSparseMatrixIndexCSR:"SparseMatrixIndexCSR",
+       SparseTensorIndexNONE:                 "NONE",
+       SparseTensorIndexSparseTensorIndexCOO: "SparseTensorIndexCOO",
+       SparseTensorIndexSparseMatrixIndexCSX: "SparseMatrixIndexCSX",
+       SparseTensorIndexSparseTensorIndexCSF: "SparseTensorIndexCSF",
 }
 
+var EnumValuesSparseTensorIndex = map[string]SparseTensorIndex{
+       "NONE":                 SparseTensorIndexNONE,
+       "SparseTensorIndexCOO": SparseTensorIndexSparseTensorIndexCOO,
+       "SparseMatrixIndexCSX": SparseTensorIndexSparseMatrixIndexCSX,
+       "SparseTensorIndexCSF": SparseTensorIndexSparseTensorIndexCSF,
+}
+
+func (v SparseTensorIndex) String() string {
+       if s, ok := EnumNamesSparseTensorIndex[v]; ok {
+               return s
+       }
+       return "SparseTensorIndex(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/SparseTensorIndexCOO.go 
b/go/arrow/internal/flatbuf/SparseTensorIndexCOO.go
index 77c8dee..f8eee99 100644
--- a/go/arrow/internal/flatbuf/SparseTensorIndexCOO.go
+++ b/go/arrow/internal/flatbuf/SparseTensorIndexCOO.go
@@ -24,7 +24,7 @@ import (
 
 /// ----------------------------------------------------------------------
 /// EXPERIMENTAL: Data structures for sparse tensors
-/// Coodinate (COO) format of sparse tensor index.
+/// Coordinate (COO) format of sparse tensor index.
 ///
 /// COO's index list are represented as a NxM matrix,
 /// where N is the number of non-zero values,
@@ -36,22 +36,24 @@ import (
 ///
 /// For example, let X be a 2x3x4x5 tensor, and it has the following
 /// 6 non-zero values:
-///
+/// ```text
 ///   X[0, 1, 2, 0] := 1
 ///   X[1, 1, 2, 3] := 2
 ///   X[0, 2, 1, 0] := 3
 ///   X[0, 1, 3, 0] := 4
 ///   X[0, 1, 2, 1] := 5
 ///   X[1, 2, 0, 4] := 6
-///
+/// ```
 /// In COO format, the index matrix of X is the following 4x6 matrix:
-///
+/// ```text
 ///   [[0, 0, 0, 0, 1, 1],
 ///    [1, 1, 1, 2, 1, 2],
 ///    [2, 2, 3, 1, 2, 0],
 ///    [0, 1, 0, 0, 3, 4]]
-///
-/// Note that the indices are sorted in lexicographical order.
+/// ```
+/// When isCanonical is true, the indices is sorted in lexicographical order
+/// (row-major order), and it does not have duplicated entries.  Otherwise,
+/// the indices may not be sorted, or may have duplicated entries.
 type SparseTensorIndexCOO struct {
        _tab flatbuffers.Table
 }
@@ -88,6 +90,7 @@ func (rcv *SparseTensorIndexCOO) IndicesType(obj *Int) *Int {
 
 /// The type of values in indicesBuffer
 /// Non-negative byte offsets to advance one value cell along each dimension
+/// If omitted, default to row-major order (C-like).
 func (rcv *SparseTensorIndexCOO) IndicesStrides(j int) int64 {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
        if o != 0 {
@@ -106,6 +109,7 @@ func (rcv *SparseTensorIndexCOO) IndicesStridesLength() int 
{
 }
 
 /// Non-negative byte offsets to advance one value cell along each dimension
+/// If omitted, default to row-major order (C-like).
 func (rcv *SparseTensorIndexCOO) MutateIndicesStrides(j int, n int64) bool {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
        if o != 0 {
@@ -130,8 +134,30 @@ func (rcv *SparseTensorIndexCOO) IndicesBuffer(obj 
*Buffer) *Buffer {
 }
 
 /// The location and size of the indices matrix's data
+/// This flag is true if and only if the indices matrix is sorted in
+/// row-major order, and does not have duplicated entries.
+/// This sort order is the same as of Tensorflow's SparseTensor,
+/// but it is inverse order of SciPy's canonical coo_matrix
+/// (SciPy employs column-major order for its coo_matrix).
+func (rcv *SparseTensorIndexCOO) IsCanonical() bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               return rcv._tab.GetBool(o + rcv._tab.Pos)
+       }
+       return false
+}
+
+/// This flag is true if and only if the indices matrix is sorted in
+/// row-major order, and does not have duplicated entries.
+/// This sort order is the same as of Tensorflow's SparseTensor,
+/// but it is inverse order of SciPy's canonical coo_matrix
+/// (SciPy employs column-major order for its coo_matrix).
+func (rcv *SparseTensorIndexCOO) MutateIsCanonical(n bool) bool {
+       return rcv._tab.MutateBoolSlot(10, n)
+}
+
 func SparseTensorIndexCOOStart(builder *flatbuffers.Builder) {
-       builder.StartObject(3)
+       builder.StartObject(4)
 }
 func SparseTensorIndexCOOAddIndicesType(builder *flatbuffers.Builder, 
indicesType flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(indicesType), 0)
@@ -145,6 +171,9 @@ func SparseTensorIndexCOOStartIndicesStridesVector(builder 
*flatbuffers.Builder,
 func SparseTensorIndexCOOAddIndicesBuffer(builder *flatbuffers.Builder, 
indicesBuffer flatbuffers.UOffsetT) {
        builder.PrependStructSlot(2, flatbuffers.UOffsetT(indicesBuffer), 0)
 }
+func SparseTensorIndexCOOAddIsCanonical(builder *flatbuffers.Builder, 
isCanonical bool) {
+       builder.PrependBoolSlot(3, isCanonical, false)
+}
 func SparseTensorIndexCOOEnd(builder *flatbuffers.Builder) 
flatbuffers.UOffsetT {
        return builder.EndObject()
 }
diff --git a/go/arrow/internal/flatbuf/SparseTensorIndexCSF.go 
b/go/arrow/internal/flatbuf/SparseTensorIndexCSF.go
new file mode 100644
index 0000000..a824c84
--- /dev/null
+++ b/go/arrow/internal/flatbuf/SparseTensorIndexCSF.go
@@ -0,0 +1,291 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Code generated by the FlatBuffers compiler. DO NOT EDIT.
+
+package flatbuf
+
+import (
+       flatbuffers "github.com/google/flatbuffers/go"
+)
+
+/// Compressed Sparse Fiber (CSF) sparse tensor index.
+type SparseTensorIndexCSF struct {
+       _tab flatbuffers.Table
+}
+
+func GetRootAsSparseTensorIndexCSF(buf []byte, offset flatbuffers.UOffsetT) 
*SparseTensorIndexCSF {
+       n := flatbuffers.GetUOffsetT(buf[offset:])
+       x := &SparseTensorIndexCSF{}
+       x.Init(buf, n+offset)
+       return x
+}
+
+func (rcv *SparseTensorIndexCSF) Init(buf []byte, i flatbuffers.UOffsetT) {
+       rcv._tab.Bytes = buf
+       rcv._tab.Pos = i
+}
+
+func (rcv *SparseTensorIndexCSF) Table() flatbuffers.Table {
+       return rcv._tab
+}
+
+/// CSF is a generalization of compressed sparse row (CSR) index.
+/// See [smith2017knl](http://shaden.io/pub-files/smith2017knl.pdf)
+///
+/// CSF index recursively compresses each dimension of a tensor into a set
+/// of prefix trees. Each path from a root to leaf forms one tensor
+/// non-zero index. CSF is implemented with two arrays of buffers and one
+/// arrays of integers.
+///
+/// For example, let X be a 2x3x4x5 tensor and let it have the following
+/// 8 non-zero values:
+/// ```text
+///   X[0, 0, 0, 1] := 1
+///   X[0, 0, 0, 2] := 2
+///   X[0, 1, 0, 0] := 3
+///   X[0, 1, 0, 2] := 4
+///   X[0, 1, 1, 0] := 5
+///   X[1, 1, 1, 0] := 6
+///   X[1, 1, 1, 1] := 7
+///   X[1, 1, 1, 2] := 8
+/// ```
+/// As a prefix tree this would be represented as:
+/// ```text
+///         0          1
+///        / \         |
+///       0   1        1
+///      /   / \       |
+///     0   0   1      1
+///    /|  /|   |    /| |
+///   1 2 0 2   0   0 1 2
+/// ```
+/// The type of values in indptrBuffers
+func (rcv *SparseTensorIndexCSF) IndptrType(obj *Int) *Int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
+       if o != 0 {
+               x := rcv._tab.Indirect(o + rcv._tab.Pos)
+               if obj == nil {
+                       obj = new(Int)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// CSF is a generalization of compressed sparse row (CSR) index.
+/// See [smith2017knl](http://shaden.io/pub-files/smith2017knl.pdf)
+///
+/// CSF index recursively compresses each dimension of a tensor into a set
+/// of prefix trees. Each path from a root to leaf forms one tensor
+/// non-zero index. CSF is implemented with two arrays of buffers and one
+/// arrays of integers.
+///
+/// For example, let X be a 2x3x4x5 tensor and let it have the following
+/// 8 non-zero values:
+/// ```text
+///   X[0, 0, 0, 1] := 1
+///   X[0, 0, 0, 2] := 2
+///   X[0, 1, 0, 0] := 3
+///   X[0, 1, 0, 2] := 4
+///   X[0, 1, 1, 0] := 5
+///   X[1, 1, 1, 0] := 6
+///   X[1, 1, 1, 1] := 7
+///   X[1, 1, 1, 2] := 8
+/// ```
+/// As a prefix tree this would be represented as:
+/// ```text
+///         0          1
+///        / \         |
+///       0   1        1
+///      /   / \       |
+///     0   0   1      1
+///    /|  /|   |    /| |
+///   1 2 0 2   0   0 1 2
+/// ```
+/// The type of values in indptrBuffers
+/// indptrBuffers stores the sparsity structure.
+/// Each two consecutive dimensions in a tensor correspond to a buffer in
+/// indptrBuffers. A pair of consecutive values at `indptrBuffers[dim][i]`
+/// and `indptrBuffers[dim][i + 1]` signify a range of nodes in
+/// `indicesBuffers[dim + 1]` who are children of `indicesBuffers[dim][i]` 
node.
+///
+/// For example, the indptrBuffers for the above X is:
+/// ```text
+///   indptrBuffer(X) = [
+///                       [0, 2, 3],
+///                       [0, 1, 3, 4],
+///                       [0, 2, 4, 5, 8]
+///                     ].
+/// ```
+func (rcv *SparseTensorIndexCSF) IndptrBuffers(obj *Buffer, j int) bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
+       if o != 0 {
+               x := rcv._tab.Vector(o)
+               x += flatbuffers.UOffsetT(j) * 16
+               obj.Init(rcv._tab.Bytes, x)
+               return true
+       }
+       return false
+}
+
+func (rcv *SparseTensorIndexCSF) IndptrBuffersLength() int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(6))
+       if o != 0 {
+               return rcv._tab.VectorLen(o)
+       }
+       return 0
+}
+
+/// indptrBuffers stores the sparsity structure.
+/// Each two consecutive dimensions in a tensor correspond to a buffer in
+/// indptrBuffers. A pair of consecutive values at `indptrBuffers[dim][i]`
+/// and `indptrBuffers[dim][i + 1]` signify a range of nodes in
+/// `indicesBuffers[dim + 1]` who are children of `indicesBuffers[dim][i]` 
node.
+///
+/// For example, the indptrBuffers for the above X is:
+/// ```text
+///   indptrBuffer(X) = [
+///                       [0, 2, 3],
+///                       [0, 1, 3, 4],
+///                       [0, 2, 4, 5, 8]
+///                     ].
+/// ```
+/// The type of values in indicesBuffers
+func (rcv *SparseTensorIndexCSF) IndicesType(obj *Int) *Int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(8))
+       if o != 0 {
+               x := rcv._tab.Indirect(o + rcv._tab.Pos)
+               if obj == nil {
+                       obj = new(Int)
+               }
+               obj.Init(rcv._tab.Bytes, x)
+               return obj
+       }
+       return nil
+}
+
+/// The type of values in indicesBuffers
+/// indicesBuffers stores values of nodes.
+/// Each tensor dimension corresponds to a buffer in indicesBuffers.
+/// For example, the indicesBuffers for the above X is:
+/// ```text
+///   indicesBuffer(X) = [
+///                        [0, 1],
+///                        [0, 1, 1],
+///                        [0, 0, 1, 1],
+///                        [1, 2, 0, 2, 0, 0, 1, 2]
+///                      ].
+/// ```
+func (rcv *SparseTensorIndexCSF) IndicesBuffers(obj *Buffer, j int) bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               x := rcv._tab.Vector(o)
+               x += flatbuffers.UOffsetT(j) * 16
+               obj.Init(rcv._tab.Bytes, x)
+               return true
+       }
+       return false
+}
+
+func (rcv *SparseTensorIndexCSF) IndicesBuffersLength() int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
+       if o != 0 {
+               return rcv._tab.VectorLen(o)
+       }
+       return 0
+}
+
+/// indicesBuffers stores values of nodes.
+/// Each tensor dimension corresponds to a buffer in indicesBuffers.
+/// For example, the indicesBuffers for the above X is:
+/// ```text
+///   indicesBuffer(X) = [
+///                        [0, 1],
+///                        [0, 1, 1],
+///                        [0, 0, 1, 1],
+///                        [1, 2, 0, 2, 0, 0, 1, 2]
+///                      ].
+/// ```
+/// axisOrder stores the sequence in which dimensions were traversed to
+/// produce the prefix tree.
+/// For example, the axisOrder for the above X is:
+/// ```text
+///   axisOrder(X) = [0, 1, 2, 3].
+/// ```
+func (rcv *SparseTensorIndexCSF) AxisOrder(j int) int32 {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               a := rcv._tab.Vector(o)
+               return rcv._tab.GetInt32(a + flatbuffers.UOffsetT(j*4))
+       }
+       return 0
+}
+
+func (rcv *SparseTensorIndexCSF) AxisOrderLength() int {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               return rcv._tab.VectorLen(o)
+       }
+       return 0
+}
+
+/// axisOrder stores the sequence in which dimensions were traversed to
+/// produce the prefix tree.
+/// For example, the axisOrder for the above X is:
+/// ```text
+///   axisOrder(X) = [0, 1, 2, 3].
+/// ```
+func (rcv *SparseTensorIndexCSF) MutateAxisOrder(j int, n int32) bool {
+       o := flatbuffers.UOffsetT(rcv._tab.Offset(12))
+       if o != 0 {
+               a := rcv._tab.Vector(o)
+               return rcv._tab.MutateInt32(a+flatbuffers.UOffsetT(j*4), n)
+       }
+       return false
+}
+
+func SparseTensorIndexCSFStart(builder *flatbuffers.Builder) {
+       builder.StartObject(5)
+}
+func SparseTensorIndexCSFAddIndptrType(builder *flatbuffers.Builder, 
indptrType flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(indptrType), 0)
+}
+func SparseTensorIndexCSFAddIndptrBuffers(builder *flatbuffers.Builder, 
indptrBuffers flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(indptrBuffers), 0)
+}
+func SparseTensorIndexCSFStartIndptrBuffersVector(builder 
*flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
+       return builder.StartVector(16, numElems, 8)
+}
+func SparseTensorIndexCSFAddIndicesType(builder *flatbuffers.Builder, 
indicesType flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(indicesType), 0)
+}
+func SparseTensorIndexCSFAddIndicesBuffers(builder *flatbuffers.Builder, 
indicesBuffers flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(indicesBuffers), 0)
+}
+func SparseTensorIndexCSFStartIndicesBuffersVector(builder 
*flatbuffers.Builder, numElems int) flatbuffers.UOffsetT {
+       return builder.StartVector(16, numElems, 8)
+}
+func SparseTensorIndexCSFAddAxisOrder(builder *flatbuffers.Builder, axisOrder 
flatbuffers.UOffsetT) {
+       builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(axisOrder), 0)
+}
+func SparseTensorIndexCSFStartAxisOrderVector(builder *flatbuffers.Builder, 
numElems int) flatbuffers.UOffsetT {
+       return builder.StartVector(4, numElems, 4)
+}
+func SparseTensorIndexCSFEnd(builder *flatbuffers.Builder) 
flatbuffers.UOffsetT {
+       return builder.EndObject()
+}
diff --git a/go/arrow/internal/flatbuf/Tensor.go 
b/go/arrow/internal/flatbuf/Tensor.go
index f8341e0..39d70e3 100644
--- a/go/arrow/internal/flatbuf/Tensor.go
+++ b/go/arrow/internal/flatbuf/Tensor.go
@@ -42,16 +42,16 @@ func (rcv *Tensor) Table() flatbuffers.Table {
        return rcv._tab
 }
 
-func (rcv *Tensor) TypeType() byte {
+func (rcv *Tensor) TypeType() Type {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetByte(o + rcv._tab.Pos)
+               return Type(rcv._tab.GetByte(o + rcv._tab.Pos))
        }
        return 0
 }
 
-func (rcv *Tensor) MutateTypeType(n byte) bool {
-       return rcv._tab.MutateByteSlot(4, n)
+func (rcv *Tensor) MutateTypeType(n Type) bool {
+       return rcv._tab.MutateByteSlot(4, byte(n))
 }
 
 /// The type of data contained in a value cell. Currently only fixed-width
@@ -90,6 +90,7 @@ func (rcv *Tensor) ShapeLength() int {
 
 /// The dimensions of the tensor, optionally named
 /// Non-negative byte offsets to advance one value cell along each dimension
+/// If omitted, default to row-major order (C-like).
 func (rcv *Tensor) Strides(j int) int64 {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
        if o != 0 {
@@ -108,6 +109,7 @@ func (rcv *Tensor) StridesLength() int {
 }
 
 /// Non-negative byte offsets to advance one value cell along each dimension
+/// If omitted, default to row-major order (C-like).
 func (rcv *Tensor) MutateStrides(j int, n int64) bool {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(10))
        if o != 0 {
@@ -135,8 +137,8 @@ func (rcv *Tensor) Data(obj *Buffer) *Buffer {
 func TensorStart(builder *flatbuffers.Builder) {
        builder.StartObject(5)
 }
-func TensorAddTypeType(builder *flatbuffers.Builder, typeType byte) {
-       builder.PrependByteSlot(0, typeType, 0)
+func TensorAddTypeType(builder *flatbuffers.Builder, typeType Type) {
+       builder.PrependByteSlot(0, byte(typeType), 0)
 }
 func TensorAddType(builder *flatbuffers.Builder, type_ flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(type_), 0)
diff --git a/go/arrow/internal/flatbuf/Time.go 
b/go/arrow/internal/flatbuf/Time.go
index f3fa99f..07b80ee 100644
--- a/go/arrow/internal/flatbuf/Time.go
+++ b/go/arrow/internal/flatbuf/Time.go
@@ -48,13 +48,13 @@ func (rcv *Time) Table() flatbuffers.Table {
 func (rcv *Time) Unit() TimeUnit {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return TimeUnit(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 1
 }
 
 func (rcv *Time) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func (rcv *Time) BitWidth() int32 {
@@ -72,8 +72,8 @@ func (rcv *Time) MutateBitWidth(n int32) bool {
 func TimeStart(builder *flatbuffers.Builder) {
        builder.StartObject(2)
 }
-func TimeAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 1)
+func TimeAddUnit(builder *flatbuffers.Builder, unit TimeUnit) {
+       builder.PrependInt16Slot(0, int16(unit), 1)
 }
 func TimeAddBitWidth(builder *flatbuffers.Builder, bitWidth int32) {
        builder.PrependInt32Slot(1, bitWidth, 32)
diff --git a/go/arrow/internal/flatbuf/TimeUnit.go 
b/go/arrow/internal/flatbuf/TimeUnit.go
index cb0c742..df14ece 100644
--- a/go/arrow/internal/flatbuf/TimeUnit.go
+++ b/go/arrow/internal/flatbuf/TimeUnit.go
@@ -18,18 +18,34 @@
 
 package flatbuf
 
-type TimeUnit = int16
+import "strconv"
+
+type TimeUnit int16
+
 const (
-       TimeUnitSECOND TimeUnit = 0
+       TimeUnitSECOND      TimeUnit = 0
        TimeUnitMILLISECOND TimeUnit = 1
        TimeUnitMICROSECOND TimeUnit = 2
-       TimeUnitNANOSECOND TimeUnit = 3
+       TimeUnitNANOSECOND  TimeUnit = 3
 )
 
 var EnumNamesTimeUnit = map[TimeUnit]string{
-       TimeUnitSECOND:"SECOND",
-       TimeUnitMILLISECOND:"MILLISECOND",
-       TimeUnitMICROSECOND:"MICROSECOND",
-       TimeUnitNANOSECOND:"NANOSECOND",
+       TimeUnitSECOND:      "SECOND",
+       TimeUnitMILLISECOND: "MILLISECOND",
+       TimeUnitMICROSECOND: "MICROSECOND",
+       TimeUnitNANOSECOND:  "NANOSECOND",
 }
 
+var EnumValuesTimeUnit = map[string]TimeUnit{
+       "SECOND":      TimeUnitSECOND,
+       "MILLISECOND": TimeUnitMILLISECOND,
+       "MICROSECOND": TimeUnitMICROSECOND,
+       "NANOSECOND":  TimeUnitNANOSECOND,
+}
+
+func (v TimeUnit) String() string {
+       if s, ok := EnumNamesTimeUnit[v]; ok {
+               return s
+       }
+       return "TimeUnit(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Timestamp.go 
b/go/arrow/internal/flatbuf/Timestamp.go
index dd98c82..44f9440 100644
--- a/go/arrow/internal/flatbuf/Timestamp.go
+++ b/go/arrow/internal/flatbuf/Timestamp.go
@@ -51,13 +51,13 @@ func (rcv *Timestamp) Table() flatbuffers.Table {
 func (rcv *Timestamp) Unit() TimeUnit {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return TimeUnit(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *Timestamp) MutateUnit(n TimeUnit) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 /// The time zone is a string indicating the name of a time zone, one of:
@@ -111,8 +111,8 @@ func (rcv *Timestamp) Timezone() []byte {
 func TimestampStart(builder *flatbuffers.Builder) {
        builder.StartObject(2)
 }
-func TimestampAddUnit(builder *flatbuffers.Builder, unit int16) {
-       builder.PrependInt16Slot(0, unit, 0)
+func TimestampAddUnit(builder *flatbuffers.Builder, unit TimeUnit) {
+       builder.PrependInt16Slot(0, int16(unit), 0)
 }
 func TimestampAddTimezone(builder *flatbuffers.Builder, timezone 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(timezone), 0)
diff --git a/go/arrow/internal/flatbuf/Type.go 
b/go/arrow/internal/flatbuf/Type.go
index e3fbe2b..319c6c6 100644
--- a/go/arrow/internal/flatbuf/Type.go
+++ b/go/arrow/internal/flatbuf/Type.go
@@ -18,57 +18,91 @@
 
 package flatbuf
 
+import "strconv"
+
 /// ----------------------------------------------------------------------
 /// Top-level Type value, enabling extensible type-specific metadata. We can
 /// add new logical types to Type without breaking backwards compatibility
-type Type = byte
+type Type byte
+
 const (
-       TypeNONE Type = 0
-       TypeNull Type = 1
-       TypeInt Type = 2
-       TypeFloatingPoint Type = 3
-       TypeBinary Type = 4
-       TypeUtf8 Type = 5
-       TypeBool Type = 6
-       TypeDecimal Type = 7
-       TypeDate Type = 8
-       TypeTime Type = 9
-       TypeTimestamp Type = 10
-       TypeInterval Type = 11
-       TypeList Type = 12
-       TypeStruct_ Type = 13
-       TypeUnion Type = 14
+       TypeNONE            Type = 0
+       TypeNull            Type = 1
+       TypeInt             Type = 2
+       TypeFloatingPoint   Type = 3
+       TypeBinary          Type = 4
+       TypeUtf8            Type = 5
+       TypeBool            Type = 6
+       TypeDecimal         Type = 7
+       TypeDate            Type = 8
+       TypeTime            Type = 9
+       TypeTimestamp       Type = 10
+       TypeInterval        Type = 11
+       TypeList            Type = 12
+       TypeStruct_         Type = 13
+       TypeUnion           Type = 14
        TypeFixedSizeBinary Type = 15
-       TypeFixedSizeList Type = 16
-       TypeMap Type = 17
-       TypeDuration Type = 18
-       TypeLargeBinary Type = 19
-       TypeLargeUtf8 Type = 20
-       TypeLargeList Type = 21
+       TypeFixedSizeList   Type = 16
+       TypeMap             Type = 17
+       TypeDuration        Type = 18
+       TypeLargeBinary     Type = 19
+       TypeLargeUtf8       Type = 20
+       TypeLargeList       Type = 21
 )
 
 var EnumNamesType = map[Type]string{
-       TypeNONE:"NONE",
-       TypeNull:"Null",
-       TypeInt:"Int",
-       TypeFloatingPoint:"FloatingPoint",
-       TypeBinary:"Binary",
-       TypeUtf8:"Utf8",
-       TypeBool:"Bool",
-       TypeDecimal:"Decimal",
-       TypeDate:"Date",
-       TypeTime:"Time",
-       TypeTimestamp:"Timestamp",
-       TypeInterval:"Interval",
-       TypeList:"List",
-       TypeStruct_:"Struct_",
-       TypeUnion:"Union",
-       TypeFixedSizeBinary:"FixedSizeBinary",
-       TypeFixedSizeList:"FixedSizeList",
-       TypeMap:"Map",
-       TypeDuration:"Duration",
-       TypeLargeBinary:"LargeBinary",
-       TypeLargeUtf8:"LargeUtf8",
-       TypeLargeList:"LargeList",
+       TypeNONE:            "NONE",
+       TypeNull:            "Null",
+       TypeInt:             "Int",
+       TypeFloatingPoint:   "FloatingPoint",
+       TypeBinary:          "Binary",
+       TypeUtf8:            "Utf8",
+       TypeBool:            "Bool",
+       TypeDecimal:         "Decimal",
+       TypeDate:            "Date",
+       TypeTime:            "Time",
+       TypeTimestamp:       "Timestamp",
+       TypeInterval:        "Interval",
+       TypeList:            "List",
+       TypeStruct_:         "Struct_",
+       TypeUnion:           "Union",
+       TypeFixedSizeBinary: "FixedSizeBinary",
+       TypeFixedSizeList:   "FixedSizeList",
+       TypeMap:             "Map",
+       TypeDuration:        "Duration",
+       TypeLargeBinary:     "LargeBinary",
+       TypeLargeUtf8:       "LargeUtf8",
+       TypeLargeList:       "LargeList",
 }
 
+var EnumValuesType = map[string]Type{
+       "NONE":            TypeNONE,
+       "Null":            TypeNull,
+       "Int":             TypeInt,
+       "FloatingPoint":   TypeFloatingPoint,
+       "Binary":          TypeBinary,
+       "Utf8":            TypeUtf8,
+       "Bool":            TypeBool,
+       "Decimal":         TypeDecimal,
+       "Date":            TypeDate,
+       "Time":            TypeTime,
+       "Timestamp":       TypeTimestamp,
+       "Interval":        TypeInterval,
+       "List":            TypeList,
+       "Struct_":         TypeStruct_,
+       "Union":           TypeUnion,
+       "FixedSizeBinary": TypeFixedSizeBinary,
+       "FixedSizeList":   TypeFixedSizeList,
+       "Map":             TypeMap,
+       "Duration":        TypeDuration,
+       "LargeBinary":     TypeLargeBinary,
+       "LargeUtf8":       TypeLargeUtf8,
+       "LargeList":       TypeLargeList,
+}
+
+func (v Type) String() string {
+       if s, ok := EnumNamesType[v]; ok {
+               return s
+       }
+       return "Type(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/internal/flatbuf/Union.go 
b/go/arrow/internal/flatbuf/Union.go
index 1eae176..e34121d 100644
--- a/go/arrow/internal/flatbuf/Union.go
+++ b/go/arrow/internal/flatbuf/Union.go
@@ -25,7 +25,7 @@ import (
 /// A union is a complex type with children in Field
 /// By default ids in the type vector refer to the offsets in the children
 /// optionally typeIds provides an indirection between the child offset and 
the type id
-/// for each child typeIds[offset] is the id used in the type vector
+/// for each child `typeIds[offset]` is the id used in the type vector
 type Union struct {
        _tab flatbuffers.Table
 }
@@ -49,13 +49,13 @@ func (rcv *Union) Table() flatbuffers.Table {
 func (rcv *Union) Mode() UnionMode {
        o := flatbuffers.UOffsetT(rcv._tab.Offset(4))
        if o != 0 {
-               return rcv._tab.GetInt16(o + rcv._tab.Pos)
+               return UnionMode(rcv._tab.GetInt16(o + rcv._tab.Pos))
        }
        return 0
 }
 
 func (rcv *Union) MutateMode(n UnionMode) bool {
-       return rcv._tab.MutateInt16Slot(4, n)
+       return rcv._tab.MutateInt16Slot(4, int16(n))
 }
 
 func (rcv *Union) TypeIds(j int) int32 {
@@ -87,8 +87,8 @@ func (rcv *Union) MutateTypeIds(j int, n int32) bool {
 func UnionStart(builder *flatbuffers.Builder) {
        builder.StartObject(2)
 }
-func UnionAddMode(builder *flatbuffers.Builder, mode int16) {
-       builder.PrependInt16Slot(0, mode, 0)
+func UnionAddMode(builder *flatbuffers.Builder, mode UnionMode) {
+       builder.PrependInt16Slot(0, int16(mode), 0)
 }
 func UnionAddTypeIds(builder *flatbuffers.Builder, typeIds 
flatbuffers.UOffsetT) {
        builder.PrependUOffsetTSlot(1, flatbuffers.UOffsetT(typeIds), 0)
diff --git a/go/arrow/internal/flatbuf/UnionMode.go 
b/go/arrow/internal/flatbuf/UnionMode.go
index 4357682..357c1f3 100644
--- a/go/arrow/internal/flatbuf/UnionMode.go
+++ b/go/arrow/internal/flatbuf/UnionMode.go
@@ -18,14 +18,28 @@
 
 package flatbuf
 
-type UnionMode = int16
+import "strconv"
+
+type UnionMode int16
+
 const (
        UnionModeSparse UnionMode = 0
-       UnionModeDense UnionMode = 1
+       UnionModeDense  UnionMode = 1
 )
 
 var EnumNamesUnionMode = map[UnionMode]string{
-       UnionModeSparse:"Sparse",
-       UnionModeDense:"Dense",
+       UnionModeSparse: "Sparse",
+       UnionModeDense:  "Dense",
 }
 
+var EnumValuesUnionMode = map[string]UnionMode{
+       "Sparse": UnionModeSparse,
+       "Dense":  UnionModeDense,
+}
+
+func (v UnionMode) String() string {
+       if s, ok := EnumNamesUnionMode[v]; ok {
+               return s
+       }
+       return "UnionMode(" + strconv.FormatInt(int64(v), 10) + ")"
+}
diff --git a/go/arrow/ipc/file_writer.go b/go/arrow/ipc/file_writer.go
index a2570c3..1124270 100644
--- a/go/arrow/ipc/file_writer.go
+++ b/go/arrow/ipc/file_writer.go
@@ -82,7 +82,7 @@ func (w *pwriter) WritePayload(p Payload) error {
                return xerrors.Errorf("arrow/ipc: could not update position 
while in write-payload: %w", err)
        }
 
-       switch byte(p.msg) {
+       switch flatbuf.MessageHeader(p.msg) {
        case flatbuf.MessageHeaderDictionaryBatch:
                w.dicts = append(w.dicts, blk)
        case flatbuf.MessageHeaderRecordBatch:
diff --git a/go/arrow/ipc/message.go b/go/arrow/ipc/message.go
index 468003c..76f81e4 100644
--- a/go/arrow/ipc/message.go
+++ b/go/arrow/ipc/message.go
@@ -39,7 +39,7 @@ const (
 )
 
 func (m MetadataVersion) String() string {
-       if v, ok := flatbuf.EnumNamesMetadataVersion[int16(m)]; ok {
+       if v, ok := 
flatbuf.EnumNamesMetadataVersion[flatbuf.MetadataVersion(m)]; ok {
                return v
        }
        return fmt.Sprintf("MetadataVersion(%d)", int16(m))
@@ -58,7 +58,7 @@ const (
 )
 
 func (m MessageType) String() string {
-       if v, ok := flatbuf.EnumNamesMessageHeader[byte(m)]; ok {
+       if v, ok := flatbuf.EnumNamesMessageHeader[flatbuf.MessageHeader(m)]; 
ok {
                return v
        }
        return fmt.Sprintf("MessageType(%d)", int(m))
diff --git a/go/arrow/ipc/metadata.go b/go/arrow/ipc/metadata.go
index 687cbe0..ef9a9bb 100644
--- a/go/arrow/ipc/metadata.go
+++ b/go/arrow/ipc/metadata.go
@@ -927,7 +927,7 @@ func writeFBBuilder(b *flatbuffers.Builder, mem 
memory.Allocator) *memory.Buffer
 func writeMessageFB(b *flatbuffers.Builder, mem memory.Allocator, hdrType 
flatbuf.MessageHeader, hdr flatbuffers.UOffsetT, bodyLen int64) *memory.Buffer {
 
        flatbuf.MessageStart(b)
-       flatbuf.MessageAddVersion(b, int16(currentMetadataVersion))
+       flatbuf.MessageAddVersion(b, 
flatbuf.MetadataVersion(currentMetadataVersion))
        flatbuf.MessageAddHeaderType(b, hdrType)
        flatbuf.MessageAddHeader(b, hdr)
        flatbuf.MessageAddBodyLength(b, bodyLen)
@@ -954,7 +954,7 @@ func writeFileFooter(schema *arrow.Schema, dicts, recs 
[]fileBlock, w io.Writer)
        recsFB := fileBlocksToFB(b, recs, 
flatbuf.FooterStartRecordBatchesVector)
 
        flatbuf.FooterStart(b)
-       flatbuf.FooterAddVersion(b, int16(currentMetadataVersion))
+       flatbuf.FooterAddVersion(b, 
flatbuf.MetadataVersion(currentMetadataVersion))
        flatbuf.FooterAddSchema(b, schemaFB)
        flatbuf.FooterAddDictionaries(b, dictsFB)
        flatbuf.FooterAddRecordBatches(b, recsFB)

Reply via email to