github.com/geraldss/go/src@v0.0.0-20210511222824-ac7d0ebfc235/database/sql/convert.go (about) 1 // Copyright 2011 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Type conversions for Scan. 6 7 package sql 8 9 import ( 10 "database/sql/driver" 11 "errors" 12 "fmt" 13 "reflect" 14 "strconv" 15 "time" 16 "unicode" 17 "unicode/utf8" 18 ) 19 20 var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error 21 22 func describeNamedValue(nv *driver.NamedValue) string { 23 if len(nv.Name) == 0 { 24 return fmt.Sprintf("$%d", nv.Ordinal) 25 } 26 return fmt.Sprintf("with name %q", nv.Name) 27 } 28 29 func validateNamedValueName(name string) error { 30 if len(name) == 0 { 31 return nil 32 } 33 r, _ := utf8.DecodeRuneInString(name) 34 if unicode.IsLetter(r) { 35 return nil 36 } 37 return fmt.Errorf("name %q does not begin with a letter", name) 38 } 39 40 // ccChecker wraps the driver.ColumnConverter and allows it to be used 41 // as if it were a NamedValueChecker. If the driver ColumnConverter 42 // is not present then the NamedValueChecker will return driver.ErrSkip. 43 type ccChecker struct { 44 cci driver.ColumnConverter 45 want int 46 } 47 48 func (c ccChecker) CheckNamedValue(nv *driver.NamedValue) error { 49 if c.cci == nil { 50 return driver.ErrSkip 51 } 52 // The column converter shouldn't be called on any index 53 // it isn't expecting. The final error will be thrown 54 // in the argument converter loop. 55 index := nv.Ordinal - 1 56 if c.want <= index { 57 return nil 58 } 59 60 // First, see if the value itself knows how to convert 61 // itself to a driver type. For example, a NullString 62 // struct changing into a string or nil. 63 if vr, ok := nv.Value.(driver.Valuer); ok { 64 sv, err := callValuerValue(vr) 65 if err != nil { 66 return err 67 } 68 if !driver.IsValue(sv) { 69 return fmt.Errorf("non-subset type %T returned from Value", sv) 70 } 71 nv.Value = sv 72 } 73 74 // Second, ask the column to sanity check itself. For 75 // example, drivers might use this to make sure that 76 // an int64 values being inserted into a 16-bit 77 // integer field is in range (before getting 78 // truncated), or that a nil can't go into a NOT NULL 79 // column before going across the network to get the 80 // same error. 81 var err error 82 arg := nv.Value 83 nv.Value, err = c.cci.ColumnConverter(index).ConvertValue(arg) 84 if err != nil { 85 return err 86 } 87 if !driver.IsValue(nv.Value) { 88 return fmt.Errorf("driver ColumnConverter error converted %T to unsupported type %T", arg, nv.Value) 89 } 90 return nil 91 } 92 93 // defaultCheckNamedValue wraps the default ColumnConverter to have the same 94 // function signature as the CheckNamedValue in the driver.NamedValueChecker 95 // interface. 96 func defaultCheckNamedValue(nv *driver.NamedValue) (err error) { 97 nv.Value, err = driver.DefaultParameterConverter.ConvertValue(nv.Value) 98 return err 99 } 100 101 // driverArgsConnLocked converts arguments from callers of Stmt.Exec and 102 // Stmt.Query into driver Values. 103 // 104 // The statement ds may be nil, if no statement is available. 105 // 106 // ci must be locked. 107 func driverArgsConnLocked(ci driver.Conn, ds *driverStmt, args []interface{}) ([]driver.NamedValue, error) { 108 nvargs := make([]driver.NamedValue, len(args)) 109 110 // -1 means the driver doesn't know how to count the number of 111 // placeholders, so we won't sanity check input here and instead let the 112 // driver deal with errors. 113 want := -1 114 115 var si driver.Stmt 116 var cc ccChecker 117 if ds != nil { 118 si = ds.si 119 want = ds.si.NumInput() 120 cc.want = want 121 } 122 123 // Check all types of interfaces from the start. 124 // Drivers may opt to use the NamedValueChecker for special 125 // argument types, then return driver.ErrSkip to pass it along 126 // to the column converter. 127 nvc, ok := si.(driver.NamedValueChecker) 128 if !ok { 129 nvc, ok = ci.(driver.NamedValueChecker) 130 } 131 cci, ok := si.(driver.ColumnConverter) 132 if ok { 133 cc.cci = cci 134 } 135 136 // Loop through all the arguments, checking each one. 137 // If no error is returned simply increment the index 138 // and continue. However if driver.ErrRemoveArgument 139 // is returned the argument is not included in the query 140 // argument list. 141 var err error 142 var n int 143 for _, arg := range args { 144 nv := &nvargs[n] 145 if np, ok := arg.(NamedArg); ok { 146 if err = validateNamedValueName(np.Name); err != nil { 147 return nil, err 148 } 149 arg = np.Value 150 nv.Name = np.Name 151 } 152 nv.Ordinal = n + 1 153 nv.Value = arg 154 155 // Checking sequence has four routes: 156 // A: 1. Default 157 // B: 1. NamedValueChecker 2. Column Converter 3. Default 158 // C: 1. NamedValueChecker 3. Default 159 // D: 1. Column Converter 2. Default 160 // 161 // The only time a Column Converter is called is first 162 // or after NamedValueConverter. If first it is handled before 163 // the nextCheck label. Thus for repeats tries only when the 164 // NamedValueConverter is selected should the Column Converter 165 // be used in the retry. 166 checker := defaultCheckNamedValue 167 nextCC := false 168 switch { 169 case nvc != nil: 170 nextCC = cci != nil 171 checker = nvc.CheckNamedValue 172 case cci != nil: 173 checker = cc.CheckNamedValue 174 } 175 176 nextCheck: 177 err = checker(nv) 178 switch err { 179 case nil: 180 n++ 181 continue 182 case driver.ErrRemoveArgument: 183 nvargs = nvargs[:len(nvargs)-1] 184 continue 185 case driver.ErrSkip: 186 if nextCC { 187 nextCC = false 188 checker = cc.CheckNamedValue 189 } else { 190 checker = defaultCheckNamedValue 191 } 192 goto nextCheck 193 default: 194 return nil, fmt.Errorf("sql: converting argument %s type: %v", describeNamedValue(nv), err) 195 } 196 } 197 198 // Check the length of arguments after conversion to allow for omitted 199 // arguments. 200 if want != -1 && len(nvargs) != want { 201 return nil, fmt.Errorf("sql: expected %d arguments, got %d", want, len(nvargs)) 202 } 203 204 return nvargs, nil 205 206 } 207 208 // convertAssign is the same as convertAssignRows, but without the optional 209 // rows argument. 210 func convertAssign(dest, src interface{}) error { 211 return convertAssignRows(dest, src, nil) 212 } 213 214 // convertAssignRows copies to dest the value in src, converting it if possible. 215 // An error is returned if the copy would result in loss of information. 216 // dest should be a pointer type. If rows is passed in, the rows will 217 // be used as the parent for any cursor values converted from a 218 // driver.Rows to a *Rows. 219 func convertAssignRows(dest, src interface{}, rows *Rows) error { 220 // Common cases, without reflect. 221 switch s := src.(type) { 222 case string: 223 switch d := dest.(type) { 224 case *string: 225 if d == nil { 226 return errNilPtr 227 } 228 *d = s 229 return nil 230 case *[]byte: 231 if d == nil { 232 return errNilPtr 233 } 234 *d = []byte(s) 235 return nil 236 case *RawBytes: 237 if d == nil { 238 return errNilPtr 239 } 240 *d = append((*d)[:0], s...) 241 return nil 242 } 243 case []byte: 244 switch d := dest.(type) { 245 case *string: 246 if d == nil { 247 return errNilPtr 248 } 249 *d = string(s) 250 return nil 251 case *interface{}: 252 if d == nil { 253 return errNilPtr 254 } 255 *d = cloneBytes(s) 256 return nil 257 case *[]byte: 258 if d == nil { 259 return errNilPtr 260 } 261 *d = cloneBytes(s) 262 return nil 263 case *RawBytes: 264 if d == nil { 265 return errNilPtr 266 } 267 *d = s 268 return nil 269 } 270 case time.Time: 271 switch d := dest.(type) { 272 case *time.Time: 273 *d = s 274 return nil 275 case *string: 276 *d = s.Format(time.RFC3339Nano) 277 return nil 278 case *[]byte: 279 if d == nil { 280 return errNilPtr 281 } 282 *d = []byte(s.Format(time.RFC3339Nano)) 283 return nil 284 case *RawBytes: 285 if d == nil { 286 return errNilPtr 287 } 288 *d = s.AppendFormat((*d)[:0], time.RFC3339Nano) 289 return nil 290 } 291 case decimalDecompose: 292 switch d := dest.(type) { 293 case decimalCompose: 294 return d.Compose(s.Decompose(nil)) 295 } 296 case nil: 297 switch d := dest.(type) { 298 case *interface{}: 299 if d == nil { 300 return errNilPtr 301 } 302 *d = nil 303 return nil 304 case *[]byte: 305 if d == nil { 306 return errNilPtr 307 } 308 *d = nil 309 return nil 310 case *RawBytes: 311 if d == nil { 312 return errNilPtr 313 } 314 *d = nil 315 return nil 316 } 317 // The driver is returning a cursor the client may iterate over. 318 case driver.Rows: 319 switch d := dest.(type) { 320 case *Rows: 321 if d == nil { 322 return errNilPtr 323 } 324 if rows == nil { 325 return errors.New("invalid context to convert cursor rows, missing parent *Rows") 326 } 327 rows.closemu.Lock() 328 *d = Rows{ 329 dc: rows.dc, 330 releaseConn: func(error) {}, 331 rowsi: s, 332 } 333 // Chain the cancel function. 334 parentCancel := rows.cancel 335 rows.cancel = func() { 336 // When Rows.cancel is called, the closemu will be locked as well. 337 // So we can access rs.lasterr. 338 d.close(rows.lasterr) 339 if parentCancel != nil { 340 parentCancel() 341 } 342 } 343 rows.closemu.Unlock() 344 return nil 345 } 346 } 347 348 var sv reflect.Value 349 350 switch d := dest.(type) { 351 case *string: 352 sv = reflect.ValueOf(src) 353 switch sv.Kind() { 354 case reflect.Bool, 355 reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, 356 reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, 357 reflect.Float32, reflect.Float64: 358 *d = asString(src) 359 return nil 360 } 361 case *[]byte: 362 sv = reflect.ValueOf(src) 363 if b, ok := asBytes(nil, sv); ok { 364 *d = b 365 return nil 366 } 367 case *RawBytes: 368 sv = reflect.ValueOf(src) 369 if b, ok := asBytes([]byte(*d)[:0], sv); ok { 370 *d = RawBytes(b) 371 return nil 372 } 373 case *bool: 374 bv, err := driver.Bool.ConvertValue(src) 375 if err == nil { 376 *d = bv.(bool) 377 } 378 return err 379 case *interface{}: 380 *d = src 381 return nil 382 } 383 384 if scanner, ok := dest.(Scanner); ok { 385 return scanner.Scan(src) 386 } 387 388 dpv := reflect.ValueOf(dest) 389 if dpv.Kind() != reflect.Ptr { 390 return errors.New("destination not a pointer") 391 } 392 if dpv.IsNil() { 393 return errNilPtr 394 } 395 396 if !sv.IsValid() { 397 sv = reflect.ValueOf(src) 398 } 399 400 dv := reflect.Indirect(dpv) 401 if sv.IsValid() && sv.Type().AssignableTo(dv.Type()) { 402 switch b := src.(type) { 403 case []byte: 404 dv.Set(reflect.ValueOf(cloneBytes(b))) 405 default: 406 dv.Set(sv) 407 } 408 return nil 409 } 410 411 if dv.Kind() == sv.Kind() && sv.Type().ConvertibleTo(dv.Type()) { 412 dv.Set(sv.Convert(dv.Type())) 413 return nil 414 } 415 416 // The following conversions use a string value as an intermediate representation 417 // to convert between various numeric types. 418 // 419 // This also allows scanning into user defined types such as "type Int int64". 420 // For symmetry, also check for string destination types. 421 switch dv.Kind() { 422 case reflect.Ptr: 423 if src == nil { 424 dv.Set(reflect.Zero(dv.Type())) 425 return nil 426 } 427 dv.Set(reflect.New(dv.Type().Elem())) 428 return convertAssignRows(dv.Interface(), src, rows) 429 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 430 if src == nil { 431 return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) 432 } 433 s := asString(src) 434 i64, err := strconv.ParseInt(s, 10, dv.Type().Bits()) 435 if err != nil { 436 err = strconvErr(err) 437 return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) 438 } 439 dv.SetInt(i64) 440 return nil 441 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 442 if src == nil { 443 return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) 444 } 445 s := asString(src) 446 u64, err := strconv.ParseUint(s, 10, dv.Type().Bits()) 447 if err != nil { 448 err = strconvErr(err) 449 return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) 450 } 451 dv.SetUint(u64) 452 return nil 453 case reflect.Float32, reflect.Float64: 454 if src == nil { 455 return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) 456 } 457 s := asString(src) 458 f64, err := strconv.ParseFloat(s, dv.Type().Bits()) 459 if err != nil { 460 err = strconvErr(err) 461 return fmt.Errorf("converting driver.Value type %T (%q) to a %s: %v", src, s, dv.Kind(), err) 462 } 463 dv.SetFloat(f64) 464 return nil 465 case reflect.String: 466 if src == nil { 467 return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) 468 } 469 switch v := src.(type) { 470 case string: 471 dv.SetString(v) 472 return nil 473 case []byte: 474 dv.SetString(string(v)) 475 return nil 476 } 477 } 478 479 return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest) 480 } 481 482 func strconvErr(err error) error { 483 if ne, ok := err.(*strconv.NumError); ok { 484 return ne.Err 485 } 486 return err 487 } 488 489 func cloneBytes(b []byte) []byte { 490 if b == nil { 491 return nil 492 } 493 c := make([]byte, len(b)) 494 copy(c, b) 495 return c 496 } 497 498 func asString(src interface{}) string { 499 switch v := src.(type) { 500 case string: 501 return v 502 case []byte: 503 return string(v) 504 } 505 rv := reflect.ValueOf(src) 506 switch rv.Kind() { 507 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 508 return strconv.FormatInt(rv.Int(), 10) 509 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 510 return strconv.FormatUint(rv.Uint(), 10) 511 case reflect.Float64: 512 return strconv.FormatFloat(rv.Float(), 'g', -1, 64) 513 case reflect.Float32: 514 return strconv.FormatFloat(rv.Float(), 'g', -1, 32) 515 case reflect.Bool: 516 return strconv.FormatBool(rv.Bool()) 517 } 518 return fmt.Sprintf("%v", src) 519 } 520 521 func asBytes(buf []byte, rv reflect.Value) (b []byte, ok bool) { 522 switch rv.Kind() { 523 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 524 return strconv.AppendInt(buf, rv.Int(), 10), true 525 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 526 return strconv.AppendUint(buf, rv.Uint(), 10), true 527 case reflect.Float32: 528 return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 32), true 529 case reflect.Float64: 530 return strconv.AppendFloat(buf, rv.Float(), 'g', -1, 64), true 531 case reflect.Bool: 532 return strconv.AppendBool(buf, rv.Bool()), true 533 case reflect.String: 534 s := rv.String() 535 return append(buf, s...), true 536 } 537 return 538 } 539 540 var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() 541 542 // callValuerValue returns vr.Value(), with one exception: 543 // If vr.Value is an auto-generated method on a pointer type and the 544 // pointer is nil, it would panic at runtime in the panicwrap 545 // method. Treat it like nil instead. 546 // Issue 8415. 547 // 548 // This is so people can implement driver.Value on value types and 549 // still use nil pointers to those types to mean nil/NULL, just like 550 // string/*string. 551 // 552 // This function is mirrored in the database/sql/driver package. 553 func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { 554 if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && 555 rv.IsNil() && 556 rv.Type().Elem().Implements(valuerReflectType) { 557 return nil, nil 558 } 559 return vr.Value() 560 } 561 562 // decimal composes or decomposes a decimal value to and from individual parts. 563 // There are four parts: a boolean negative flag, a form byte with three possible states 564 // (finite=0, infinite=1, NaN=2), a base-2 big-endian integer 565 // coefficient (also known as a significand) as a []byte, and an int32 exponent. 566 // These are composed into a final value as "decimal = (neg) (form=finite) coefficient * 10 ^ exponent". 567 // A zero length coefficient is a zero value. 568 // The big-endian integer coefficient stores the most significant byte first (at coefficient[0]). 569 // If the form is not finite the coefficient and exponent should be ignored. 570 // The negative parameter may be set to true for any form, although implementations are not required 571 // to respect the negative parameter in the non-finite form. 572 // 573 // Implementations may choose to set the negative parameter to true on a zero or NaN value, 574 // but implementations that do not differentiate between negative and positive 575 // zero or NaN values should ignore the negative parameter without error. 576 // If an implementation does not support Infinity it may be converted into a NaN without error. 577 // If a value is set that is larger than what is supported by an implementation, 578 // an error must be returned. 579 // Implementations must return an error if a NaN or Infinity is attempted to be set while neither 580 // are supported. 581 // 582 // NOTE(kardianos): This is an experimental interface. See https://golang.org/issue/30870 583 type decimal interface { 584 decimalDecompose 585 decimalCompose 586 } 587 588 type decimalDecompose interface { 589 // Decompose returns the internal decimal state in parts. 590 // If the provided buf has sufficient capacity, buf may be returned as the coefficient with 591 // the value set and length set as appropriate. 592 Decompose(buf []byte) (form byte, negative bool, coefficient []byte, exponent int32) 593 } 594 595 type decimalCompose interface { 596 // Compose sets the internal decimal value from parts. If the value cannot be 597 // represented then an error should be returned. 598 Compose(form byte, negative bool, coefficient []byte, exponent int32) error 599 }