Skip to content

Commit 325c2aa

Browse files
kardianosbradfitz
authored andcommitted
database/sql: update the conversion errors to be clearer
There was some ambiguity over which argument was referred to when a conversion error was returned. Now refer to the argument by either explicit ordinal position or name if present. Fixes #15676 Change-Id: Id933196b7e648baa664f4121fa3fb1b07b3c4880 Reviewed-on: https://go-review.googlesource.com/31262 Reviewed-by: Brad Fitzpatrick <[email protected]> Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 930ab0a commit 325c2aa

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

src/database/sql/convert.go

+21-12
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ import (
1717

1818
var errNilPtr = errors.New("destination pointer is nil") // embedded in descriptive error
1919

20+
func describeNamedValue(nv *driver.NamedValue) string {
21+
if len(nv.Name) == 0 {
22+
return fmt.Sprintf("$%d", nv.Ordinal)
23+
}
24+
return fmt.Sprintf("with name %q", nv.Name)
25+
}
26+
2027
// driverArgs converts arguments from callers of Stmt.Exec and
2128
// Stmt.Query into driver Values.
2229
//
@@ -33,37 +40,39 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.NamedValue, error)
3340
if !ok {
3441
for n, arg := range args {
3542
var err error
36-
nvargs[n].Ordinal = n + 1
43+
nv := &nvargs[n]
44+
nv.Ordinal = n + 1
3745
if np, ok := arg.(NamedParam); ok {
3846
arg = np.Value
3947
nvargs[n].Name = np.Name
4048
}
41-
nvargs[n].Value, err = driver.DefaultParameterConverter.ConvertValue(arg)
49+
nv.Value, err = driver.DefaultParameterConverter.ConvertValue(arg)
4250

4351
if err != nil {
44-
return nil, fmt.Errorf("sql: converting Exec argument #%d's type: %v", n, err)
52+
return nil, fmt.Errorf("sql: converting Exec argument %s type: %v", describeNamedValue(nv), err)
4553
}
4654
}
4755
return nvargs, nil
4856
}
4957

5058
// Let the Stmt convert its own arguments.
5159
for n, arg := range args {
52-
nvargs[n].Ordinal = n + 1
60+
nv := &nvargs[n]
61+
nv.Ordinal = n + 1
5362
if np, ok := arg.(NamedParam); ok {
5463
arg = np.Value
55-
nvargs[n].Name = np.Name
64+
nv.Name = np.Name
5665
}
5766
// First, see if the value itself knows how to convert
5867
// itself to a driver type. For example, a NullString
5968
// struct changing into a string or nil.
6069
if vr, ok := arg.(driver.Valuer); ok {
6170
sv, err := callValuerValue(vr)
6271
if err != nil {
63-
return nil, fmt.Errorf("sql: argument index %d from Value: %v", n, err)
72+
return nil, fmt.Errorf("sql: argument %s from Value: %v", describeNamedValue(nv), err)
6473
}
6574
if !driver.IsValue(sv) {
66-
return nil, fmt.Errorf("sql: argument index %d: non-subset type %T returned from Value", n, sv)
75+
return nil, fmt.Errorf("sql: argument %s: non-subset type %T returned from Value", describeNamedValue(nv), sv)
6776
}
6877
arg = sv
6978
}
@@ -77,14 +86,14 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.NamedValue, error)
7786
// same error.
7887
var err error
7988
ds.Lock()
80-
nvargs[n].Value, err = cc.ColumnConverter(n).ConvertValue(arg)
89+
nv.Value, err = cc.ColumnConverter(n).ConvertValue(arg)
8190
ds.Unlock()
8291
if err != nil {
83-
return nil, fmt.Errorf("sql: converting argument #%d's type: %v", n, err)
92+
return nil, fmt.Errorf("sql: converting argument %s type: %v", describeNamedValue(nv), err)
8493
}
85-
if !driver.IsValue(nvargs[n].Value) {
86-
return nil, fmt.Errorf("sql: driver ColumnConverter error converted %T to unsupported type %T",
87-
arg, nvargs[n].Value)
94+
if !driver.IsValue(nv.Value) {
95+
return nil, fmt.Errorf("sql: for argument %s, driver ColumnConverter error converted %T to unsupported type %T",
96+
describeNamedValue(nv), arg, nv.Value)
8897
}
8998
}
9099

src/database/sql/sql_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -745,8 +745,8 @@ func TestExec(t *testing.T) {
745745
{[]interface{}{7, 9}, ""},
746746

747747
// Invalid conversions:
748-
{[]interface{}{"Brad", int64(0xFFFFFFFF)}, "sql: converting argument #1's type: sql/driver: value 4294967295 overflows int32"},
749-
{[]interface{}{"Brad", "strconv fail"}, "sql: converting argument #1's type: sql/driver: value \"strconv fail\" can't be converted to int32"},
748+
{[]interface{}{"Brad", int64(0xFFFFFFFF)}, "sql: converting argument $2 type: sql/driver: value 4294967295 overflows int32"},
749+
{[]interface{}{"Brad", "strconv fail"}, `sql: converting argument $2 type: sql/driver: value "strconv fail" can't be converted to int32`},
750750

751751
// Wrong number of args:
752752
{[]interface{}{}, "sql: expected 2 arguments, got 0"},

0 commit comments

Comments
 (0)