diff options
| author | Daniel Theophanes <kardianos@gmail.com> | 2017-03-30 16:03:03 -0700 |
|---|---|---|
| committer | Daniel Theophanes <kardianos@gmail.com> | 2017-03-31 05:02:02 +0000 |
| commit | 5a45a157f2e94cb3fec38a3be8afa3bffd800067 (patch) | |
| tree | 87943651501f40c7f810f2844e45ebc9f1c49716 /src/database/sql/convert.go | |
| parent | bfd8093c969d2b7b7e1e60866031508ea6e462d6 (diff) | |
| download | go-5a45a157f2e94cb3fec38a3be8afa3bffd800067.tar.xz | |
database/sql: support scanning into user defined string types
User defined numeric types such as "type Int int64" have
been able to be scanned into without a custom scanner by
using the reflect scan code path used to convert between
various numeric types. Add in a path for string types
for symmetry and least surprise.
Fixes #18101
Change-Id: I00553bcf021ffe6d95047eca0067ee94b54ff501
Reviewed-on: https://go-review.googlesource.com/39031
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/database/sql/convert.go')
| -rw-r--r-- | src/database/sql/convert.go | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/database/sql/convert.go b/src/database/sql/convert.go index ea2f377810..630a585ab2 100644 --- a/src/database/sql/convert.go +++ b/src/database/sql/convert.go @@ -270,6 +270,11 @@ func convertAssign(dest, src interface{}) error { return nil } + // The following conversions use a string value as an intermediate representation + // to convert between various numeric types. + // + // This also allows scanning into user defined types such as "type Int int64". + // For symmetry, also check for string destination types. switch dv.Kind() { case reflect.Ptr: if src == nil { @@ -306,6 +311,15 @@ func convertAssign(dest, src interface{}) error { } dv.SetFloat(f64) return nil + case reflect.String: + switch v := src.(type) { + case string: + dv.SetString(v) + return nil + case []byte: + dv.SetString(string(v)) + return nil + } } return fmt.Errorf("unsupported Scan, storing driver.Value type %T into type %T", src, dest) |
