in go/adbc/driver/snowflake/connection.go [592:675]
func descToField(name, typ, isnull, primary string, comment sql.NullString) (field arrow.Field, err error) {
field.Name = strings.ToLower(name)
if isnull == "Y" {
field.Nullable = true
}
md := make(map[string]string)
md["DATA_TYPE"] = typ
md["PRIMARY_KEY"] = primary
if comment.Valid {
md["COMMENT"] = comment.String
}
field.Metadata = arrow.MetadataFrom(md)
paren := strings.Index(typ, "(")
if paren == -1 {
// types without params
switch typ {
case "FLOAT":
fallthrough
case "DOUBLE":
field.Type = arrow.PrimitiveTypes.Float64
case "DATE":
field.Type = arrow.FixedWidthTypes.Date32
// array, object and variant are all represented as strings by
// snowflake's return
case "ARRAY":
fallthrough
case "OBJECT":
fallthrough
case "VARIANT":
field.Type = arrow.BinaryTypes.String
case "GEOGRAPHY":
fallthrough
case "GEOMETRY":
field.Type = arrow.BinaryTypes.String
case "BOOLEAN":
field.Type = arrow.FixedWidthTypes.Boolean
default:
err = adbc.Error{
Msg: fmt.Sprintf("Snowflake Data Type %s not implemented", typ),
Code: adbc.StatusNotImplemented,
}
}
return
}
prefix := typ[:paren]
switch prefix {
case "VARCHAR", "TEXT":
field.Type = arrow.BinaryTypes.String
case "BINARY", "VARBINARY":
field.Type = arrow.BinaryTypes.Binary
case "NUMBER":
comma := strings.Index(typ, ",")
scale, err := strconv.ParseInt(typ[comma+1:len(typ)-1], 10, 32)
if err != nil {
return field, adbc.Error{
Msg: "could not parse Scale from type '" + typ + "'",
Code: adbc.StatusInvalidData,
}
}
if scale == 0 {
field.Type = arrow.PrimitiveTypes.Int64
} else {
field.Type = arrow.PrimitiveTypes.Float64
}
case "TIME":
field.Type = arrow.FixedWidthTypes.Time64ns
case "DATETIME":
fallthrough
case "TIMESTAMP", "TIMESTAMP_NTZ":
field.Type = &arrow.TimestampType{Unit: arrow.Nanosecond}
case "TIMESTAMP_LTZ":
field.Type = &arrow.TimestampType{Unit: arrow.Nanosecond, TimeZone: loc.String()}
case "TIMESTAMP_TZ":
field.Type = arrow.FixedWidthTypes.Timestamp_ns
default:
err = adbc.Error{
Msg: fmt.Sprintf("Snowflake Data Type %s not implemented", typ),
Code: adbc.StatusNotImplemented,
}
}
return
}