in go/adbc/sqldriver/driver.go [414:476]
func arrFromVal(val any) arrow.Array {
var (
buffers = make([]*memory.Buffer, 2)
dt arrow.DataType
)
switch v := val.(type) {
case bool:
dt = arrow.FixedWidthTypes.Boolean
buffers[1] = memory.NewBufferBytes((*[1]byte)(unsafe.Pointer(&v))[:])
case int8:
dt = arrow.PrimitiveTypes.Int8
buffers[1] = memory.NewBufferBytes((*[1]byte)(unsafe.Pointer(&v))[:])
case uint8:
dt = arrow.PrimitiveTypes.Uint8
buffers[1] = memory.NewBufferBytes((*[1]byte)(unsafe.Pointer(&v))[:])
case int16:
dt = arrow.PrimitiveTypes.Int16
buffers[1] = memory.NewBufferBytes((*[2]byte)(unsafe.Pointer(&v))[:])
case uint16:
dt = arrow.PrimitiveTypes.Uint16
buffers[1] = memory.NewBufferBytes((*[2]byte)(unsafe.Pointer(&v))[:])
case int32:
dt = arrow.PrimitiveTypes.Int32
buffers[1] = memory.NewBufferBytes((*[4]byte)(unsafe.Pointer(&v))[:])
case uint32:
dt = arrow.PrimitiveTypes.Uint32
buffers[1] = memory.NewBufferBytes((*[4]byte)(unsafe.Pointer(&v))[:])
case int64:
dt = arrow.PrimitiveTypes.Int64
buffers[1] = memory.NewBufferBytes((*[8]byte)(unsafe.Pointer(&v))[:])
case uint64:
dt = arrow.PrimitiveTypes.Uint64
buffers[1] = memory.NewBufferBytes((*[8]byte)(unsafe.Pointer(&v))[:])
case float32:
dt = arrow.PrimitiveTypes.Float32
buffers[1] = memory.NewBufferBytes((*[4]byte)(unsafe.Pointer(&v))[:])
case float64:
dt = arrow.PrimitiveTypes.Float64
buffers[1] = memory.NewBufferBytes((*[8]byte)(unsafe.Pointer(&v))[:])
case arrow.Date32:
dt = arrow.PrimitiveTypes.Date32
buffers[1] = memory.NewBufferBytes((*[4]byte)(unsafe.Pointer(&v))[:])
case arrow.Date64:
dt = arrow.PrimitiveTypes.Date64
buffers[1] = memory.NewBufferBytes((*[8]byte)(unsafe.Pointer(&v))[:])
case []byte:
dt = arrow.BinaryTypes.Binary
buffers[1] = memory.NewBufferBytes(arrow.Int32Traits.CastToBytes([]int32{0, int32(len(v))}))
buffers[2] = memory.NewBufferBytes(v)
case string:
dt = arrow.BinaryTypes.String
buffers[1] = memory.NewBufferBytes(arrow.Int32Traits.CastToBytes([]int32{0, int32(len(v))}))
var buf = *(*[]byte)(unsafe.Pointer(&v))
(*reflect.SliceHeader)(unsafe.Pointer(&buf)).Cap = len(v)
buffers[2] = memory.NewBufferBytes(buf)
}
for _, b := range buffers {
defer b.Release()
}
data := array.NewData(dt, 1, buffers, nil, 0, 0)
defer data.Release()
return array.MakeFromData(data)
}