Browse Source

Merge pull request #140 from xiam/master

Fix TIME value sign byte
Julien Schmidt 12 years ago
parent
commit
ae73333d84
2 changed files with 42 additions and 6 deletions
  1. 38 0
      driver_test.go
  2. 4 6
      packets.go

+ 38 - 0
driver_test.go

@@ -514,6 +514,44 @@ func TestDateTime(t *testing.T) {
 	}
 }
 
+// This tests for https://github.com/go-sql-driver/mysql/pull/139
+//
+// An extra (invisible) nil byte was being added to the beginning of positive
+// time strings.
+func TestTimeSign(t *testing.T) {
+	runTests(t, dsn, func(dbt *DBTest) {
+		var sTimes = []struct {
+			value     string
+			fieldType string
+		}{
+			{"12:34:56", "TIME"},
+			{"-12:34:56", "TIME"},
+			// As described in http://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
+			// they *should* work, but only in 5.6+.
+			// { "12:34:56.789", "TIME(3)" },
+			// { "-12:34:56.789", "TIME(3)" },
+		}
+
+		for _, sTime := range sTimes {
+			dbt.db.Exec("DROP TABLE IF EXISTS test")
+			dbt.mustExec("CREATE TABLE test (id INT, time_field " + sTime.fieldType + ")")
+			dbt.mustExec("INSERT INTO test (id, time_field) VALUES(1, '" + sTime.value + "')")
+			rows := dbt.mustQuery("SELECT time_field FROM test WHERE id = ?", 1)
+			if rows.Next() {
+				var oTime string
+				rows.Scan(&oTime)
+				if oTime != sTime.value {
+					dbt.Errorf(`time values differ: got %q, expected %q.`, oTime, sTime.value)
+				}
+			} else {
+				dbt.Error("expecting at least one row.")
+			}
+		}
+
+	})
+
+}
+
 func TestNULL(t *testing.T) {
 	runTests(t, dsn, func(dbt *DBTest) {
 		nullStmt, err := dbt.db.Prepare("SELECT NULL")

+ 4 - 6
packets.go

@@ -1137,16 +1137,15 @@ func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error {
 				}
 			}
 
-			var sign byte
+			var sign string
 			if data[pos] == 1 {
-				sign = byte('-')
+				sign = "-"
 			}
 
 			switch num {
 			case 8:
 				dest[i] = []byte(fmt.Sprintf(
-					"%c%02d:%02d:%02d",
-					sign,
+					sign+"%02d:%02d:%02d",
 					uint16(data[pos+1])*24+uint16(data[pos+5]),
 					data[pos+6],
 					data[pos+7],
@@ -1155,8 +1154,7 @@ func (rows *mysqlRows) readBinaryRow(dest []driver.Value) error {
 				continue
 			case 12:
 				dest[i] = []byte(fmt.Sprintf(
-					"%c%02d:%02d:%02d.%06d",
-					sign,
+					sign+"%02d:%02d:%02d.%06d",
 					uint16(data[pos+1])*24+uint16(data[pos+5]),
 					data[pos+6],
 					data[pos+7],