add a case in Next scan to fix issue 190 and issue 316

This commit is contained in:
B1nj0y 2017-10-16 14:49:22 +08:00
parent 5160b48509
commit 9c8272d9f6
2 changed files with 22 additions and 1 deletions

View File

@ -1150,6 +1150,27 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
t = t.In(rc.s.c.loc) t = t.In(rc.s.c.loc)
} }
dest[i] = t dest[i] = t
// this case is for a nullable datetime typed colomn a chance to be parsed
// to resolve the problem in issue #190 and issue #316
case "":
var t time.Time
s = strings.TrimSuffix(s, "Z")
for _, format := range SQLiteTimestampFormats {
if timeVal, err = time.ParseInLocation(format, s, time.UTC); err == nil {
t = timeVal
break
}
}
// if not parsed as a datetime type successfully, do as the default case does
if err != nil {
dest[i] = []byte(s)
} else {
if rc.s.c.loc != nil {
t = t.In(rc.s.c.loc)
}
dest[i] = t
}
default: default:
dest[i] = []byte(s) dest[i] = []byte(s)
} }

View File

@ -1111,7 +1111,7 @@ func TestDateTimeNow(t *testing.T) {
defer db.Close() defer db.Close()
var d time.Time var d time.Time
err = db.QueryRow("SELECT datetime('now')").Scan(TimeStamp{&d}) err = db.QueryRow("SELECT datetime('now')").Scan(&d)
if err != nil { if err != nil {
t.Fatal("Failed to scan datetime:", err) t.Fatal("Failed to scan datetime:", err)
} }