in literals.go [830:942]
func (s StringLiteral) To(typ Type) (Literal, error) {
switch t := typ.(type) {
case StringType:
return s, nil
case Int32Type:
n, err := strconv.ParseInt(string(s), 10, 64)
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s",
errors.Join(ErrBadCast, err), s, typ)
}
if math.MaxInt32 < n {
return Int32AboveMaxLiteral(), nil
} else if math.MinInt32 > n {
return Int32BelowMinLiteral(), nil
}
return Int32Literal(n), nil
case Int64Type:
n, err := strconv.ParseInt(string(s), 10, 64)
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s",
errors.Join(ErrBadCast, err), s, typ)
}
return Int64Literal(n), nil
case Float32Type:
n, err := strconv.ParseFloat(string(s), 32)
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s",
errors.Join(ErrBadCast, err), s, typ)
}
return Float32Literal(n), nil
case Float64Type:
n, err := strconv.ParseFloat(string(s), 64)
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s",
errors.Join(ErrBadCast, err), s, typ)
}
return Float64Literal(n), nil
case DateType:
tm, err := time.Parse("2006-01-02", string(s))
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s - %s",
ErrBadCast, s, typ, err.Error())
}
return DateLiteral(tm.Truncate(24*time.Hour).Unix() / int64((time.Hour * 24).Seconds())), nil
case TimeType:
val, err := arrow.Time64FromString(string(s), arrow.Microsecond)
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s - %s",
ErrBadCast, s, typ, err.Error())
}
return TimeLiteral(val), nil
case TimestampType:
// requires RFC3339 with no time zone
tm, err := time.Parse("2006-01-02T15:04:05", string(s))
if err != nil {
return nil, fmt.Errorf("%w: invalid Timestamp format for casting from string '%s': %s",
ErrBadCast, s, err.Error())
}
return TimestampLiteral(Timestamp(tm.UTC().UnixMicro())), nil
case TimestampTzType:
// requires RFC3339 format WITH time zone
tm, err := time.Parse(time.RFC3339, string(s))
if err != nil {
return nil, fmt.Errorf("%w: invalid TimestampTz format for casting from string '%s': %s",
ErrBadCast, s, err.Error())
}
return TimestampLiteral(Timestamp(tm.UTC().UnixMicro())), nil
case UUIDType:
val, err := uuid.Parse(string(s))
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s - %s",
ErrBadCast, s, typ, err.Error())
}
return UUIDLiteral(val), nil
case DecimalType:
n, err := decimal128.FromString(string(s), int32(t.precision), int32(t.scale))
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s - %s",
ErrBadCast, s, typ, err.Error())
}
return DecimalLiteral{Val: n, Scale: t.scale}, nil
case BooleanType:
val, err := strconv.ParseBool(string(s))
if err != nil {
return nil, fmt.Errorf("%w: casting '%s' to %s - %s",
ErrBadCast, s, typ, err.Error())
}
return BoolLiteral(val), nil
case BinaryType:
return BinaryLiteral(s), nil
case FixedType:
if len(s) != t.len {
return nil, fmt.Errorf("%w: cast '%s' to %s - wrong length",
ErrBadCast, s, t)
}
return FixedLiteral(s), nil
}
return nil, fmt.Errorf("%w: StringLiteral to %s", ErrBadCast, typ)
}