PerformCast performs a cast from the provided Datum to the specified types.T.
(ctx *EvalContext, d Datum, t *types.T)
| 3295 | // PerformCast performs a cast from the provided Datum to the specified |
| 3296 | // types.T. |
| 3297 | func PerformCast(ctx *EvalContext, d Datum, t *types.T) (Datum, error) { |
| 3298 | switch t.Family() { |
| 3299 | case types.BitFamily: |
| 3300 | switch v := d.(type) { |
| 3301 | case *DBitArray: |
| 3302 | if t.Width() == 0 || v.BitLen() == uint(t.Width()) { |
| 3303 | return d, nil |
| 3304 | } |
| 3305 | var a DBitArray |
| 3306 | switch t.Oid() { |
| 3307 | case oid.T_varbit: |
| 3308 | // VARBITs do not have padding attached. |
| 3309 | a.BitArray = v.BitArray.Clone() |
| 3310 | if uint(t.Width()) < a.BitArray.BitLen() { |
| 3311 | a.BitArray = a.BitArray.ToWidth(uint(t.Width())) |
| 3312 | } |
| 3313 | default: |
| 3314 | a.BitArray = v.BitArray.Clone().ToWidth(uint(t.Width())) |
| 3315 | } |
| 3316 | return &a, nil |
| 3317 | case *DInt: |
| 3318 | return NewDBitArrayFromInt(int64(*v), uint(t.Width())) |
| 3319 | case *DString: |
| 3320 | res, err := bitarray.Parse(string(*v)) |
| 3321 | if err != nil { |
| 3322 | return nil, err |
| 3323 | } |
| 3324 | if t.Width() > 0 { |
| 3325 | res = res.ToWidth(uint(t.Width())) |
| 3326 | } |
| 3327 | return &DBitArray{BitArray: res}, nil |
| 3328 | case *DCollatedString: |
| 3329 | res, err := bitarray.Parse(v.Contents) |
| 3330 | if err != nil { |
| 3331 | return nil, err |
| 3332 | } |
| 3333 | if t.Width() > 0 { |
| 3334 | res = res.ToWidth(uint(t.Width())) |
| 3335 | } |
| 3336 | return &DBitArray{BitArray: res}, nil |
| 3337 | } |
| 3338 | |
| 3339 | case types.BoolFamily: |
| 3340 | switch v := d.(type) { |
| 3341 | case *DBool: |
| 3342 | return d, nil |
| 3343 | case *DInt: |
| 3344 | return MakeDBool(*v != 0), nil |
| 3345 | case *DFloat: |
| 3346 | return MakeDBool(*v != 0), nil |
| 3347 | case *DDecimal: |
| 3348 | return MakeDBool(v.Sign() != 0), nil |
| 3349 | case *DString: |
| 3350 | return ParseDBool(string(*v)) |
| 3351 | case *DCollatedString: |
| 3352 | return ParseDBool(v.Contents) |
| 3353 | } |
| 3354 |
no test coverage detected
searching dependent graphs…