@@ -151,7 +151,14 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
151151 var flatArgsCount int
152152 var anySlices bool
153153
154- meta := make ([]argMeta , len (args ))
154+ var stackMeta [32 ]argMeta
155+
156+ var meta []argMeta
157+ if len (args ) <= len (stackMeta ) {
158+ meta = stackMeta [:len (args )]
159+ } else {
160+ meta = make ([]argMeta , len (args ))
161+ }
155162
156163 for i , arg := range args {
157164 if a , ok := arg .(driver.Valuer ); ok {
@@ -185,7 +192,9 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
185192 }
186193
187194 newArgs := make ([]interface {}, 0 , flatArgsCount )
188- buf := make ([]byte , 0 , len (query )+ len (", ?" )* flatArgsCount )
195+
196+ var buf strings.Builder
197+ buf .Grow (len (query ) + len (", ?" )* flatArgsCount )
189198
190199 var arg , offset int
191200
@@ -211,10 +220,10 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
211220 }
212221
213222 // write everything up to and including our ? character
214- buf = append ( buf , query [:offset + i + 1 ]... )
223+ buf . WriteString ( query [:offset + i + 1 ])
215224
216225 for si := 1 ; si < argMeta .length ; si ++ {
217- buf = append ( buf , ", ?" ... )
226+ buf . WriteString ( ", ?" )
218227 }
219228
220229 newArgs = appendReflectSlice (newArgs , argMeta .v , argMeta .length )
@@ -225,13 +234,13 @@ func In(query string, args ...interface{}) (string, []interface{}, error) {
225234 offset = 0
226235 }
227236
228- buf = append ( buf , query ... )
237+ buf . WriteString ( query )
229238
230239 if arg < len (meta ) {
231240 return "" , nil , errors .New ("number of bindVars less than number arguments" )
232241 }
233242
234- return string ( buf ), newArgs , nil
243+ return buf . String ( ), newArgs , nil
235244}
236245
237246func appendReflectSlice (args []interface {}, v reflect.Value , vlen int ) []interface {} {
@@ -240,11 +249,11 @@ func appendReflectSlice(args []interface{}, v reflect.Value, vlen int) []interfa
240249 args = append (args , val ... )
241250 case []int :
242251 for i := range val {
243- args = append (args , val [i ])
252+ args = append (args , & val [i ])
244253 }
245254 case []string :
246255 for i := range val {
247- args = append (args , val [i ])
256+ args = append (args , & val [i ])
248257 }
249258 default :
250259 for si := 0 ; si < vlen ; si ++ {
0 commit comments