in arrow/scalar/parse.go [37:92]
func MakeScalarParam(val interface{}, dt arrow.DataType) (Scalar, error) {
switch v := val.(type) {
case []byte:
buf := memory.NewBufferBytes(v)
defer buf.Release()
switch dt.ID() {
case arrow.BINARY:
return NewBinaryScalar(buf, dt), nil
case arrow.STRING:
return NewStringScalarFromBuffer(buf), nil
case arrow.FIXED_SIZE_BINARY:
if buf.Len() == dt.(*arrow.FixedSizeBinaryType).ByteWidth {
return NewFixedSizeBinaryScalar(buf, dt), nil
}
return nil, xerrors.Errorf("invalid scalar value of len %d for type %s", v, dt)
}
case *memory.Buffer:
switch dt.ID() {
case arrow.BINARY:
return NewBinaryScalar(v, dt), nil
case arrow.STRING:
return NewStringScalarFromBuffer(v), nil
case arrow.FIXED_SIZE_BINARY:
if v.Len() == dt.(*arrow.FixedSizeBinaryType).ByteWidth {
return NewFixedSizeBinaryScalar(v, dt), nil
}
return nil, xerrors.Errorf("invalid scalar value of len %d for type %s", v.Len(), dt)
}
case arrow.Time32:
return NewTime32Scalar(v, dt), nil
case arrow.Time64:
return NewTime64Scalar(v, dt), nil
case arrow.Timestamp:
return NewTimestampScalar(v, dt), nil
case array.Interface:
switch dt.ID() {
case arrow.LIST:
if !arrow.TypeEqual(v.DataType(), dt.(*arrow.ListType).Elem()) {
return nil, xerrors.Errorf("inconsistent type for list scalar array and data type")
}
return NewListScalar(v), nil
case arrow.FIXED_SIZE_LIST:
if !arrow.TypeEqual(v.DataType(), dt.(*arrow.FixedSizeListType).Elem()) {
return nil, xerrors.Errorf("inconsistent type for list scalar array and data type")
}
return NewFixedSizeListScalarWithType(v, dt), nil
case arrow.MAP:
if !arrow.TypeEqual(dt.(*arrow.MapType).ValueType(), v.DataType()) {
return nil, xerrors.Errorf("inconsistent type for map scalar type")
}
return NewMapScalar(v), nil
}
}
return MakeScalar(val), nil
}