Skip to content

Commit ae73333

Browse files
committed
Merge pull request #140 from xiam/master
Fix TIME value sign byte
2 parents 90025ed + 7854c58 commit ae73333

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

driver_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,44 @@ func TestDateTime(t *testing.T) {
514514
}
515515
}
516516

517+
// This tests for https://github.com/go-sql-driver/mysql/pull/139
518+
//
519+
// An extra (invisible) nil byte was being added to the beginning of positive
520+
// time strings.
521+
func TestTimeSign(t *testing.T) {
522+
runTests(t, dsn, func(dbt *DBTest) {
523+
var sTimes = []struct {
524+
value string
525+
fieldType string
526+
}{
527+
{"12:34:56", "TIME"},
528+
{"-12:34:56", "TIME"},
529+
// As described in http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
530+
// they *should* work, but only in 5.6+.
531+
// { "12:34:56.789", "TIME(3)" },
532+
// { "-12:34:56.789", "TIME(3)" },
533+
}
534+
535+
for _, sTime := range sTimes {
536+
dbt.db.Exec("DROP TABLE IF EXISTS test")
537+
dbt.mustExec("CREATE TABLE test (id INT, time_field " + sTime.fieldType + ")")
538+
dbt.mustExec("INSERT INTO test (id, time_field) VALUES(1, '" + sTime.value + "')")
539+
rows := dbt.mustQuery("SELECT time_field FROM test WHERE id = ?", 1)
540+
if rows.Next() {
541+
var oTime string
542+
rows.Scan(&oTime)
543+
if oTime != sTime.value {
544+
dbt.Errorf(`time values differ: got %q, expected %q.`, oTime, sTime.value)
545+
}
546+
} else {
547+
dbt.Error("expecting at least one row.")
548+
}
549+
}
550+
551+
})
552+
553+
}
554+
517555
func TestNULL(t *testing.T) {
518556
runTests(t, dsn, func(dbt *DBTest) {
519557
nullStmt, err := dbt.db.Prepare("SELECT NULL")

packets.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -1137,16 +1137,15 @@ func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error {
11371137
}
11381138
}
11391139

1140-
var sign byte
1140+
var sign string
11411141
if data[pos] == 1 {
1142-
sign = byte('-')
1142+
sign = "-"
11431143
}
11441144

11451145
switch num {
11461146
case 8:
11471147
dest[i] = []byte(fmt.Sprintf(
1148-
"%c%02d:%02d:%02d",
1149-
sign,
1148+
sign+"%02d:%02d:%02d",
11501149
uint16(data[pos+1])*24+uint16(data[pos+5]),
11511150
data[pos+6],
11521151
data[pos+7],
@@ -1155,8 +1154,7 @@ func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error {
11551154
continue
11561155
case 12:
11571156
dest[i] = []byte(fmt.Sprintf(
1158-
"%c%02d:%02d:%02d.%06d",
1159-
sign,
1157+
sign+"%02d:%02d:%02d.%06d",
11601158
uint16(data[pos+1])*24+uint16(data[pos+5]),
11611159
data[pos+6],
11621160
data[pos+7],

0 commit comments

Comments
 (0)