aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sqlite3.go30
-rw-r--r--sqlite3_test.go16
2 files changed, 23 insertions, 23 deletions
diff --git a/sqlite3.go b/sqlite3.go
index 1207bf1..87e2cf3 100644
--- a/sqlite3.go
+++ b/sqlite3.go
@@ -299,7 +299,7 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
case C.SQLITE_INTEGER:
val := int64(C.sqlite3_column_int64(rc.s.s, C.int(i)))
switch rc.decltype[i] {
- case "timestamp":
+ case "timestamp", "datetime":
dest[i] = time.Unix(val, 0)
case "boolean":
dest[i] = val > 0
@@ -325,21 +325,21 @@ func (rc *SQLiteRows) Next(dest []driver.Value) error {
var err error
s := C.GoString((*C.char)(unsafe.Pointer(C.sqlite3_column_text(rc.s.s, C.int(i)))))
- switch dest[i].(type) {
- case *time.Time:
- if rc.decltype[i] == "timestamp" || rc.decltype[i] == "datetime" {
- dest[i], err = time.Parse(SQLiteTimestampFormat, s)
- if err != nil {
- dest[i], err = time.Parse(SQLiteDateFormat, s)
- if err != nil {
- dest[i], err = time.Parse(SQLiteDatetimeFormat, s)
- if err != nil {
- dest[i] = s
- }
- }
+ switch rc.decltype[i] {
+ case "timestamp", "datetime":
+ for {
+ if dest[i], err = time.Parse(SQLiteTimestampFormat, s); err == nil {
+ break
+ }
+ if dest[i], err = time.Parse(SQLiteDateFormat, s); err == nil {
+ break
+ }
+ if dest[i], err = time.Parse(SQLiteDatetimeFormat, s); err == nil {
+ break
}
- } else {
- dest[i] = s
+ // The column is a time value, so return the zero time on parse failure.
+ dest[i] = time.Time{}
+ break
}
default:
dest[i] = s
diff --git a/sqlite3_test.go b/sqlite3_test.go
index 68d9680..3529fe7 100644
--- a/sqlite3_test.go
+++ b/sqlite3_test.go
@@ -3,7 +3,6 @@ package sqlite
import (
"database/sql"
"os"
- "strings"
"testing"
"time"
)
@@ -297,16 +296,17 @@ func TestTimestamp(t *testing.T) {
t.Errorf("Value for id 2 should be %v, not %v", timestamp2, ts)
}
}
- }
- if seen != 2 {
- t.Error("Expected to see two valid timestamps")
+ if id == 3 {
+ seen += 1
+ if !ts.IsZero() {
+ t.Errorf("Value for id 3 should be the zero time, not %v", ts)
+ }
+ }
}
- // make sure "nonsense" triggered an error
- err = rows.Err()
- if err == nil || !strings.Contains(err.Error(), "cannot parse \"nonsense\"") {
- t.Error("Expected error from \"nonsense\" timestamp")
+ if seen != 3 {
+ t.Error("Expected to see three timestamps")
}
}