in go/adbc/driver/snowflake/connection.go [353:411]
func toField(name string, isnullable bool, dataType string, numPrec, numPrecRadix, numScale sql.NullInt16, isIdent bool, identGen, identInc, comment sql.NullString, ordinalPos int) (ret arrow.Field) {
ret.Name, ret.Nullable = name, isnullable
switch dataType {
case "NUMBER":
if !numScale.Valid || numScale.Int16 == 0 {
ret.Type = arrow.PrimitiveTypes.Int64
} else {
ret.Type = arrow.PrimitiveTypes.Float64
}
case "FLOAT":
fallthrough
case "DOUBLE":
ret.Type = arrow.PrimitiveTypes.Float64
case "TEXT":
ret.Type = arrow.BinaryTypes.String
case "BINARY":
ret.Type = arrow.BinaryTypes.Binary
case "BOOLEAN":
ret.Type = arrow.FixedWidthTypes.Boolean
case "ARRAY":
fallthrough
case "VARIANT":
fallthrough
case "OBJECT":
// snowflake will return each value as a string
ret.Type = arrow.BinaryTypes.String
case "DATE":
ret.Type = arrow.FixedWidthTypes.Date32
case "TIME":
ret.Type = arrow.FixedWidthTypes.Time64ns
case "DATETIME":
fallthrough
case "TIMESTAMP", "TIMESTAMP_NTZ":
ret.Type = &arrow.TimestampType{Unit: arrow.Nanosecond}
case "TIMESTAMP_LTZ":
ret.Type = &arrow.TimestampType{Unit: arrow.Nanosecond, TimeZone: loc.String()}
case "TIMESTAMP_TZ":
ret.Type = arrow.FixedWidthTypes.Timestamp_ns
case "GEOGRAPHY":
fallthrough
case "GEOMETRY":
ret.Type = arrow.BinaryTypes.String
}
md := make(map[string]string)
md["TYPE_NAME"] = dataType
if isIdent {
md["IS_IDENTITY"] = "YES"
md["IDENTITY_GENERATION"] = identGen.String
md["IDENTITY_INCREMENT"] = identInc.String
}
if comment.Valid {
md["COMMENT"] = comment.String
}
md["ORDINAL_POSITION"] = strconv.Itoa(ordinalPos)
ret.Metadata = arrow.MetadataFrom(md)
return
}