@@ -321,6 +321,58 @@ func TestSelectNewTypes(t *testing.T) {
321321 }
322322}
323323
324+ func TestSelectWithVarchar (t * testing.T ) {
325+ conn , logger := openWithVarcharDSN (t )
326+ defer conn .Close ()
327+ defer logger .StopLogging ()
328+
329+ t .Run ("scan into interface{}" , func (t * testing.T ) {
330+ type testStruct struct {
331+ sql string
332+ val string
333+ }
334+
335+ longstr := strings .Repeat ("x" , 10000 )
336+
337+ values := []testStruct {
338+ {"'abc'" , "abc" },
339+ {"N'abc'" , "abc" },
340+ {"cast(N'abc' as nvarchar(max))" , "abc" },
341+ {"cast('abc' as text)" , "abc" },
342+ {"cast(N'abc' as ntext)" , "abc" },
343+ {"cast('abc' as char(3))" , "abc" },
344+ {"cast('abc' as varchar(3))" , "abc" },
345+ {fmt .Sprintf ("cast(N'%s' as nvarchar(max))" , longstr ), longstr },
346+ {"cast(cast('abc' as varchar(3)) as sql_variant)" , "abc" },
347+ {"cast(cast('abc' as char(3)) as sql_variant)" , "abc" },
348+ {"cast(N'abc' as sql_variant)" , "abc" },
349+ }
350+
351+ for _ , test := range values {
352+ t .Run (test .sql , func (t * testing.T ) {
353+ stmt , err := conn .Prepare ("select " + test .sql )
354+ if err != nil {
355+ t .Error ("Prepare failed:" , test .sql , err .Error ())
356+ return
357+ }
358+ defer stmt .Close ()
359+
360+ row := stmt .QueryRow ()
361+ var retval string
362+ err = row .Scan (& retval )
363+ if err != nil {
364+ t .Error ("Scan failed:" , test .sql , err .Error ())
365+ return
366+ }
367+ if retval != test .val {
368+ t .Errorf ("Values don't match '%s' '%s' for test: %s" , retval , test .val , test .sql )
369+ return
370+ }
371+ })
372+ }
373+ })
374+ }
375+
324376func TestTrans (t * testing.T ) {
325377 conn , logger := open (t )
326378 defer conn .Close ()
0 commit comments