@@ -2778,13 +2778,18 @@ func TestRowsColumnTypes(t *testing.T) {
27782778 nd1 := sql.NullTime {Time : time .Date (2006 , 01 , 02 , 0 , 0 , 0 , 0 , time .UTC ), Valid : true }
27792779 nd2 := sql.NullTime {Time : time .Date (2006 , 03 , 04 , 0 , 0 , 0 , 0 , time .UTC ), Valid : true }
27802780 ndNULL := sql.NullTime {Time : time.Time {}, Valid : false }
2781- rbNULL := sql .RawBytes (nil )
2782- rb0 := sql .RawBytes ("0" )
2783- rb42 := sql .RawBytes ("42" )
2784- rbTest := sql .RawBytes ("Test" )
2785- rb0pad4 := sql .RawBytes ("0\x00 \x00 \x00 " ) // BINARY right-pads values with 0x00
2786- rbx0 := sql .RawBytes ("\x00 " )
2787- rbx42 := sql .RawBytes ("\x42 " )
2781+ bNULL := []byte (nil )
2782+ nsNULL := sql.NullString {String : "" , Valid : false }
2783+ // Helper function to build NullString from string literal.
2784+ ns := func (s string ) sql.NullString { return sql.NullString {String : s , Valid : true } }
2785+ ns0 := ns ("0" )
2786+ b0 := []byte ("0" )
2787+ b42 := []byte ("42" )
2788+ nsTest := ns ("Test" )
2789+ bTest := []byte ("Test" )
2790+ b0pad4 := []byte ("0\x00 \x00 \x00 " ) // BINARY right-pads values with 0x00
2791+ bx0 := []byte ("\x00 " )
2792+ bx42 := []byte ("\x42 " )
27882793
27892794 var columns = []struct {
27902795 name string
@@ -2797,7 +2802,7 @@ func TestRowsColumnTypes(t *testing.T) {
27972802 valuesIn [3 ]string
27982803 valuesOut [3 ]interface {}
27992804 }{
2800- {"bit8null" , "BIT(8)" , "BIT" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0x0" , "NULL" , "0x42" }, [3 ]interface {}{rbx0 , rbNULL , rbx42 }},
2805+ {"bit8null" , "BIT(8)" , "BIT" , scanTypeBytes , true , 0 , 0 , [3 ]string {"0x0" , "NULL" , "0x42" }, [3 ]interface {}{bx0 , bNULL , bx42 }},
28012806 {"boolnull" , "BOOL" , "TINYINT" , scanTypeNullInt , true , 0 , 0 , [3 ]string {"NULL" , "true" , "0" }, [3 ]interface {}{niNULL , ni1 , ni0 }},
28022807 {"bool" , "BOOL NOT NULL" , "TINYINT" , scanTypeInt8 , false , 0 , 0 , [3 ]string {"1" , "0" , "FALSE" }, [3 ]interface {}{int8 (1 ), int8 (0 ), int8 (0 )}},
28032808 {"intnull" , "INTEGER" , "INT" , scanTypeNullInt , true , 0 , 0 , [3 ]string {"0" , "NULL" , "42" }, [3 ]interface {}{ni0 , niNULL , ni42 }},
@@ -2811,30 +2816,31 @@ func TestRowsColumnTypes(t *testing.T) {
28112816 {"tinyuint" , "TINYINT UNSIGNED NOT NULL" , "UNSIGNED TINYINT" , scanTypeUint8 , false , 0 , 0 , [3 ]string {"0" , "255" , "42" }, [3 ]interface {}{uint8 (0 ), uint8 (255 ), uint8 (42 )}},
28122817 {"smalluint" , "SMALLINT UNSIGNED NOT NULL" , "UNSIGNED SMALLINT" , scanTypeUint16 , false , 0 , 0 , [3 ]string {"0" , "65535" , "42" }, [3 ]interface {}{uint16 (0 ), uint16 (65535 ), uint16 (42 )}},
28132818 {"biguint" , "BIGINT UNSIGNED NOT NULL" , "UNSIGNED BIGINT" , scanTypeUint64 , false , 0 , 0 , [3 ]string {"0" , "65535" , "42" }, [3 ]interface {}{uint64 (0 ), uint64 (65535 ), uint64 (42 )}},
2819+ {"mediumuint" , "MEDIUMINT UNSIGNED NOT NULL" , "UNSIGNED MEDIUMINT" , scanTypeUint32 , false , 0 , 0 , [3 ]string {"0" , "16777215" , "42" }, [3 ]interface {}{uint32 (0 ), uint32 (16777215 ), uint32 (42 )}},
28142820 {"uint13" , "INT(13) UNSIGNED NOT NULL" , "UNSIGNED INT" , scanTypeUint32 , false , 0 , 0 , [3 ]string {"0" , "1337" , "42" }, [3 ]interface {}{uint32 (0 ), uint32 (1337 ), uint32 (42 )}},
28152821 {"float" , "FLOAT NOT NULL" , "FLOAT" , scanTypeFloat32 , false , math .MaxInt64 , math .MaxInt64 , [3 ]string {"0" , "42" , "13.37" }, [3 ]interface {}{float32 (0 ), float32 (42 ), float32 (13.37 )}},
28162822 {"floatnull" , "FLOAT" , "FLOAT" , scanTypeNullFloat , true , math .MaxInt64 , math .MaxInt64 , [3 ]string {"0" , "NULL" , "13.37" }, [3 ]interface {}{nf0 , nfNULL , nf1337 }},
28172823 {"float74null" , "FLOAT(7,4)" , "FLOAT" , scanTypeNullFloat , true , math .MaxInt64 , 4 , [3 ]string {"0" , "NULL" , "13.37" }, [3 ]interface {}{nf0 , nfNULL , nf1337 }},
28182824 {"double" , "DOUBLE NOT NULL" , "DOUBLE" , scanTypeFloat64 , false , math .MaxInt64 , math .MaxInt64 , [3 ]string {"0" , "42" , "13.37" }, [3 ]interface {}{float64 (0 ), float64 (42 ), float64 (13.37 )}},
28192825 {"doublenull" , "DOUBLE" , "DOUBLE" , scanTypeNullFloat , true , math .MaxInt64 , math .MaxInt64 , [3 ]string {"0" , "NULL" , "13.37" }, [3 ]interface {}{nf0 , nfNULL , nf1337 }},
2820- {"decimal1" , "DECIMAL(10,6) NOT NULL" , "DECIMAL" , scanTypeRawBytes , false , 10 , 6 , [3 ]string {"0" , "13.37" , "1234.123456" }, [3 ]interface {}{sql . RawBytes ( "0.000000" ), sql . RawBytes ( "13.370000" ), sql . RawBytes ( "1234.123456" ) }},
2821- {"decimal1null" , "DECIMAL(10,6)" , "DECIMAL" , scanTypeRawBytes , true , 10 , 6 , [3 ]string {"0" , "NULL" , "1234.123456" }, [3 ]interface {}{sql . RawBytes ("0.000000" ), rbNULL , sql . RawBytes ("1234.123456" )}},
2822- {"decimal2" , "DECIMAL(8,4) NOT NULL" , "DECIMAL" , scanTypeRawBytes , false , 8 , 4 , [3 ]string {"0" , "13.37" , "1234.123456" }, [3 ]interface {}{sql . RawBytes ( "0.0000" ), sql . RawBytes ( "13.3700" ), sql . RawBytes ( "1234.1235" ) }},
2823- {"decimal2null" , "DECIMAL(8,4)" , "DECIMAL" , scanTypeRawBytes , true , 8 , 4 , [3 ]string {"0" , "NULL" , "1234.123456" }, [3 ]interface {}{sql . RawBytes ("0.0000" ), rbNULL , sql . RawBytes ("1234.1235" )}},
2824- {"decimal3" , "DECIMAL(5,0) NOT NULL" , "DECIMAL" , scanTypeRawBytes , false , 5 , 0 , [3 ]string {"0" , "13.37" , "-12345.123456" }, [3 ]interface {}{rb0 , sql . RawBytes ( "13" ), sql . RawBytes ( "-12345" ) }},
2825- {"decimal3null" , "DECIMAL(5,0)" , "DECIMAL" , scanTypeRawBytes , true , 5 , 0 , [3 ]string {"0" , "NULL" , "-12345.123456" }, [3 ]interface {}{rb0 , rbNULL , sql . RawBytes ("-12345" )}},
2826- {"char25null" , "CHAR(25)" , "CHAR" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0 , rbNULL , rbTest }},
2827- {"varchar42" , "VARCHAR(42) NOT NULL" , "VARCHAR" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2828- {"binary4null" , "BINARY(4)" , "BINARY" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0pad4 , rbNULL , rbTest }},
2829- {"varbinary42" , "VARBINARY(42) NOT NULL" , "VARBINARY" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2830- {"tinyblobnull" , "TINYBLOB" , "BLOB" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0 , rbNULL , rbTest }},
2831- {"tinytextnull" , "TINYTEXT" , "TEXT" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0 , rbNULL , rbTest }},
2832- {"blobnull" , "BLOB" , "BLOB" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0 , rbNULL , rbTest }},
2833- {"textnull" , "TEXT" , "TEXT" , scanTypeRawBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{rb0 , rbNULL , rbTest }},
2834- {"mediumblob" , "MEDIUMBLOB NOT NULL" , "BLOB" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2835- {"mediumtext" , "MEDIUMTEXT NOT NULL" , "TEXT" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2836- {"longblob" , "LONGBLOB NOT NULL" , "BLOB" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2837- {"longtext" , "LONGTEXT NOT NULL" , "TEXT" , scanTypeRawBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{rb0 , rbTest , rb42 }},
2826+ {"decimal1" , "DECIMAL(10,6) NOT NULL" , "DECIMAL" , scanTypeString , false , 10 , 6 , [3 ]string {"0" , "13.37" , "1234.123456" }, [3 ]interface {}{"0.000000" , "13.370000" , "1234.123456" }},
2827+ {"decimal1null" , "DECIMAL(10,6)" , "DECIMAL" , scanTypeNullString , true , 10 , 6 , [3 ]string {"0" , "NULL" , "1234.123456" }, [3 ]interface {}{ns ("0.000000" ), nsNULL , ns ("1234.123456" )}},
2828+ {"decimal2" , "DECIMAL(8,4) NOT NULL" , "DECIMAL" , scanTypeString , false , 8 , 4 , [3 ]string {"0" , "13.37" , "1234.123456" }, [3 ]interface {}{"0.0000" , "13.3700" , "1234.1235" }},
2829+ {"decimal2null" , "DECIMAL(8,4)" , "DECIMAL" , scanTypeNullString , true , 8 , 4 , [3 ]string {"0" , "NULL" , "1234.123456" }, [3 ]interface {}{ns ("0.0000" ), nsNULL , ns ("1234.1235" )}},
2830+ {"decimal3" , "DECIMAL(5,0) NOT NULL" , "DECIMAL" , scanTypeString , false , 5 , 0 , [3 ]string {"0" , "13.37" , "-12345.123456" }, [3 ]interface {}{"0" , "13" , "-12345" }},
2831+ {"decimal3null" , "DECIMAL(5,0)" , "DECIMAL" , scanTypeNullString , true , 5 , 0 , [3 ]string {"0" , "NULL" , "-12345.123456" }, [3 ]interface {}{ns0 , nsNULL , ns ("-12345" )}},
2832+ {"char25null" , "CHAR(25)" , "CHAR" , scanTypeNullString , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{ns0 , nsNULL , nsTest }},
2833+ {"varchar42" , "VARCHAR(42) NOT NULL" , "VARCHAR" , scanTypeString , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{"0" , "Test" , "42" }},
2834+ {"binary4null" , "BINARY(4)" , "BINARY" , scanTypeBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{b0pad4 , bNULL , bTest }},
2835+ {"varbinary42" , "VARBINARY(42) NOT NULL" , "VARBINARY" , scanTypeBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{b0 , bTest , b42 }},
2836+ {"tinyblobnull" , "TINYBLOB" , "BLOB" , scanTypeBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{b0 , bNULL , bTest }},
2837+ {"tinytextnull" , "TINYTEXT" , "TEXT" , scanTypeNullString , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{ns0 , nsNULL , nsTest }},
2838+ {"blobnull" , "BLOB" , "BLOB" , scanTypeBytes , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{b0 , bNULL , bTest }},
2839+ {"textnull" , "TEXT" , "TEXT" , scanTypeNullString , true , 0 , 0 , [3 ]string {"0" , "NULL" , "'Test'" }, [3 ]interface {}{ns0 , nsNULL , nsTest }},
2840+ {"mediumblob" , "MEDIUMBLOB NOT NULL" , "BLOB" , scanTypeBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{b0 , bTest , b42 }},
2841+ {"mediumtext" , "MEDIUMTEXT NOT NULL" , "TEXT" , scanTypeString , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{"0" , "Test" , "42" }},
2842+ {"longblob" , "LONGBLOB NOT NULL" , "BLOB" , scanTypeBytes , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{b0 , bTest , b42 }},
2843+ {"longtext" , "LONGTEXT NOT NULL" , "TEXT" , scanTypeString , false , 0 , 0 , [3 ]string {"0" , "'Test'" , "42" }, [3 ]interface {}{"0" , "Test" , "42" }},
28382844 {"datetime" , "DATETIME" , "DATETIME" , scanTypeNullTime , true , 0 , 0 , [3 ]string {"'2006-01-02 15:04:05'" , "'2006-01-02 15:04:05.1'" , "'2006-01-02 15:04:05.111111'" }, [3 ]interface {}{nt0 , nt0 , nt0 }},
28392845 {"datetime2" , "DATETIME(2)" , "DATETIME" , scanTypeNullTime , true , 2 , 2 , [3 ]string {"'2006-01-02 15:04:05'" , "'2006-01-02 15:04:05.1'" , "'2006-01-02 15:04:05.111111'" }, [3 ]interface {}{nt0 , nt1 , nt2 }},
28402846 {"datetime6" , "DATETIME(6)" , "DATETIME" , scanTypeNullTime , true , 6 , 6 , [3 ]string {"'2006-01-02 15:04:05'" , "'2006-01-02 15:04:05.1'" , "'2006-01-02 15:04:05.111111'" }, [3 ]interface {}{nt0 , nt1 , nt6 }},
@@ -2945,7 +2951,10 @@ func TestRowsColumnTypes(t *testing.T) {
29452951 continue
29462952 }
29472953 }
2948-
2954+ // Avoid panic caused by nil scantype.
2955+ if t .Failed () {
2956+ return
2957+ }
29492958 values := make ([]interface {}, len (tt ))
29502959 for i := range values {
29512960 values [i ] = reflect .New (types [i ]).Interface ()
@@ -2956,14 +2965,10 @@ func TestRowsColumnTypes(t *testing.T) {
29562965 if err != nil {
29572966 t .Fatalf ("failed to scan values in %v" , err )
29582967 }
2959- for j := range values {
2960- value := reflect .ValueOf (values [ j ] ).Elem ().Interface ()
2968+ for j , value := range values {
2969+ value := reflect .ValueOf (value ).Elem ().Interface ()
29612970 if ! reflect .DeepEqual (value , columns [j ].valuesOut [i ]) {
2962- if columns [j ].scanType == scanTypeRawBytes {
2963- t .Errorf ("row %d, column %d: %v != %v" , i , j , string (value .(sql.RawBytes )), string (columns [j ].valuesOut [i ].(sql.RawBytes )))
2964- } else {
2965- t .Errorf ("row %d, column %d: %v != %v" , i , j , value , columns [j ].valuesOut [i ])
2966- }
2971+ t .Errorf ("row %d, column %d: %v != %v" , i , j , value , columns [j ].valuesOut [i ])
29672972 }
29682973 }
29692974 i ++
0 commit comments