diff options
| author | Daniel Theophanes <kardianos@gmail.com> | 2019-04-26 11:09:51 -0700 |
|---|---|---|
| committer | Daniel Theophanes <kardianos@gmail.com> | 2019-04-26 19:59:11 +0000 |
| commit | 1805f425ada8184b53175fd166b5fec7c02850a4 (patch) | |
| tree | c8ec701a0289cf681afd706e6de3985bba68be3c /src/database/sql/convert.go | |
| parent | 2ae5e7f9bf0267dbc9c6f3f88ae0f6197bfe70ef (diff) | |
| download | go-1805f425ada8184b53175fd166b5fec7c02850a4.tar.xz | |
database/sql: check if src is nil before converting to string
A nil src (NULL database value) will result in a "nil" string,
which will never parse correctly in a ParseInt or similar
numeric conversion. The resulting error is confusing. Check
for a nil src prior to converting the value to string
if the resulting string will be parsed after that.
Closes #31274
Change-Id: I90f12cceff00fbbfdd3e343b04fa7e2596390e6d
Reviewed-on: https://go-review.googlesource.com/c/go/+/174177
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/database/sql/convert.go')
| -rw-r--r-- | src/database/sql/convert.go | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/database/sql/convert.go b/src/database/sql/convert.go index c450d987a4..2149a8e700 100644 --- a/src/database/sql/convert.go +++ b/src/database/sql/convert.go @@ -420,6 +420,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error { dv.Set(reflect.New(dv.Type().Elem())) return convertAssignRows(dv.Interface(), src, rows) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } s := asString(src) i64, err := strconv.ParseInt(s, 10, dv.Type().Bits()) if err != nil { @@ -429,6 +432,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error { dv.SetInt(i64) return nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } s := asString(src) u64, err := strconv.ParseUint(s, 10, dv.Type().Bits()) if err != nil { @@ -438,6 +444,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error { dv.SetUint(u64) return nil case reflect.Float32, reflect.Float64: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } s := asString(src) f64, err := strconv.ParseFloat(s, dv.Type().Bits()) if err != nil { @@ -447,6 +456,9 @@ func convertAssignRows(dest, src interface{}, rows *Rows) error { dv.SetFloat(f64) return nil case reflect.String: + if src == nil { + return fmt.Errorf("converting NULL to %s is unsupported", dv.Kind()) + } switch v := src.(type) { case string: dv.SetString(v) |
