diff --git a/value_transcoder.go b/value_transcoder.go index 2085346d..056891c8 100644 --- a/value_transcoder.go +++ b/value_transcoder.go @@ -109,8 +109,9 @@ func init() { // date ValueTranscoders[Oid(1082)] = &ValueTranscoder{ - DecodeText: decodeDateFromText, - EncodeTo: encodeDate} + DecodeText: decodeDateFromText, + DecodeBinary: decodeDateFromBinary, + EncodeTo: encodeDate} // timestamptz ValueTranscoders[Oid(1184)] = &ValueTranscoder{ @@ -477,6 +478,11 @@ func decodeDateFromText(mr *MessageReader, size int32) interface{} { return t } +func decodeDateFromBinary(mr *MessageReader, size int32) interface{} { + dayOffset := mr.ReadInt32() + return time.Date(2000, 1, int(1+dayOffset), 0, 0, 0, 0, time.Local) +} + func encodeDate(w *WriteBuf, value interface{}) error { t, ok := value.(time.Time) if !ok { diff --git a/value_transcoder_test.go b/value_transcoder_test.go index 8741e05c..229839fd 100644 --- a/value_transcoder_test.go +++ b/value_transcoder_test.go @@ -62,17 +62,6 @@ func TestDateTranscode(t *testing.T) { conn := mustConnect(t, *defaultConnConfig) defer closeConn(t, conn) - actualDate := time.Date(2013, 1, 2, 0, 0, 0, 0, time.Local) - - var v interface{} - var d time.Time - - v = mustSelectValue(t, conn, "select $1::date", actualDate) - d = v.(time.Time) - if !actualDate.Equal(d) { - t.Errorf("Did not transcode date successfully: %v is not %v", v, actualDate) - } - mustPrepare(t, conn, "testTranscode", "select $1::date") defer func() { if err := conn.Deallocate("testTranscode"); err != nil { @@ -80,10 +69,33 @@ func TestDateTranscode(t *testing.T) { } }() - v = mustSelectValue(t, conn, "testTranscode", actualDate) - d = v.(time.Time) - if !actualDate.Equal(d) { - t.Errorf("Did not transcode date successfully: %v is not %v", v, actualDate) + dates := []time.Time{ + time.Date(1990, 1, 1, 0, 0, 0, 0, time.Local), + time.Date(1999, 12, 31, 0, 0, 0, 0, time.Local), + time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local), + time.Date(2001, 1, 2, 0, 0, 0, 0, time.Local), + time.Date(2004, 2, 29, 0, 0, 0, 0, time.Local), + time.Date(2013, 7, 4, 0, 0, 0, 0, time.Local), + time.Date(2013, 12, 25, 0, 0, 0, 0, time.Local), + } + + for _, actualDate := range dates { + var v interface{} + var d time.Time + + // Test text format + v = mustSelectValue(t, conn, "select $1::date", actualDate) + d = v.(time.Time) + if !actualDate.Equal(d) { + t.Errorf("Did not transcode date successfully: %v is not %v", v, actualDate) + } + + // Test binary format + v = mustSelectValue(t, conn, "testTranscode", actualDate) + d = v.(time.Time) + if !actualDate.Equal(d) { + t.Errorf("Did not transcode date successfully: %v is not %v", v, actualDate) + } } }