@@ -17,6 +17,13 @@ import (
17
17
18
18
var errNilPtr = errors .New ("destination pointer is nil" ) // embedded in descriptive error
19
19
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
+
20
27
// driverArgs converts arguments from callers of Stmt.Exec and
21
28
// Stmt.Query into driver Values.
22
29
//
@@ -33,37 +40,39 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.NamedValue, error)
33
40
if ! ok {
34
41
for n , arg := range args {
35
42
var err error
36
- nvargs [n ].Ordinal = n + 1
43
+ nv := & nvargs [n ]
44
+ nv .Ordinal = n + 1
37
45
if np , ok := arg .(NamedParam ); ok {
38
46
arg = np .Value
39
47
nvargs [n ].Name = np .Name
40
48
}
41
- nvargs [ n ] .Value , err = driver .DefaultParameterConverter .ConvertValue (arg )
49
+ nv .Value , err = driver .DefaultParameterConverter .ConvertValue (arg )
42
50
43
51
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 )
45
53
}
46
54
}
47
55
return nvargs , nil
48
56
}
49
57
50
58
// Let the Stmt convert its own arguments.
51
59
for n , arg := range args {
52
- nvargs [n ].Ordinal = n + 1
60
+ nv := & nvargs [n ]
61
+ nv .Ordinal = n + 1
53
62
if np , ok := arg .(NamedParam ); ok {
54
63
arg = np .Value
55
- nvargs [ n ] .Name = np .Name
64
+ nv .Name = np .Name
56
65
}
57
66
// First, see if the value itself knows how to convert
58
67
// itself to a driver type. For example, a NullString
59
68
// struct changing into a string or nil.
60
69
if vr , ok := arg .(driver.Valuer ); ok {
61
70
sv , err := callValuerValue (vr )
62
71
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 )
64
73
}
65
74
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 )
67
76
}
68
77
arg = sv
69
78
}
@@ -77,14 +86,14 @@ func driverArgs(ds *driverStmt, args []interface{}) ([]driver.NamedValue, error)
77
86
// same error.
78
87
var err error
79
88
ds .Lock ()
80
- nvargs [ n ] .Value , err = cc .ColumnConverter (n ).ConvertValue (arg )
89
+ nv .Value , err = cc .ColumnConverter (n ).ConvertValue (arg )
81
90
ds .Unlock ()
82
91
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 )
84
93
}
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 )
88
97
}
89
98
}
90
99
0 commit comments