mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
database/sql: add NullTime
This matches NullBool, NullFloat64, and NullInt64. Fixes #30305 Change-Id: I79bfcf04a3d43b965d2a3159b0ac22f3e8084a53 Reviewed-on: https://go-review.googlesource.com/c/go/+/170699 Run-TryBot: Daniel Theophanes <kardianos@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
c7a4099b99
commit
d47da9497f
3 changed files with 44 additions and 1 deletions
|
|
@ -1158,7 +1158,9 @@ func converterForType(typ string) driver.ValueConverter {
|
||||||
// TODO(coopernurse): add type-specific converter
|
// TODO(coopernurse): add type-specific converter
|
||||||
return driver.Null{Converter: driver.DefaultParameterConverter}
|
return driver.Null{Converter: driver.DefaultParameterConverter}
|
||||||
case "datetime":
|
case "datetime":
|
||||||
return driver.DefaultParameterConverter
|
return driver.NotNull{Converter: driver.DefaultParameterConverter}
|
||||||
|
case "nulldatetime":
|
||||||
|
return driver.Null{Converter: driver.DefaultParameterConverter}
|
||||||
case "any":
|
case "any":
|
||||||
return anyTypeConverter{}
|
return anyTypeConverter{}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -286,6 +286,32 @@ func (n NullBool) Value() (driver.Value, error) {
|
||||||
return n.Bool, nil
|
return n.Bool, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NullTime represents a time.Time that may be null.
|
||||||
|
// NullTime implements the Scanner interface so
|
||||||
|
// it can be used as a scan destination, similar to NullString.
|
||||||
|
type NullTime struct {
|
||||||
|
Time time.Time
|
||||||
|
Valid bool // Valid is true if Time is not NULL
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan implements the Scanner interface.
|
||||||
|
func (n *NullTime) Scan(value interface{}) error {
|
||||||
|
if value == nil {
|
||||||
|
n.Time, n.Valid = time.Time{}, false
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
n.Valid = true
|
||||||
|
return convertAssign(&n.Time, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value implements the driver Valuer interface.
|
||||||
|
func (n NullTime) Value() (driver.Value, error) {
|
||||||
|
if !n.Valid {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return n.Time, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Scanner is an interface used by Scan.
|
// Scanner is an interface used by Scan.
|
||||||
type Scanner interface {
|
type Scanner interface {
|
||||||
// Scan assigns a value from a database driver.
|
// Scan assigns a value from a database driver.
|
||||||
|
|
|
||||||
|
|
@ -1695,6 +1695,21 @@ func TestNullBoolParam(t *testing.T) {
|
||||||
nullTestRun(t, spec)
|
nullTestRun(t, spec)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNullTimeParam(t *testing.T) {
|
||||||
|
t0 := time.Time{}
|
||||||
|
t1 := time.Date(2000, 1, 1, 8, 9, 10, 11, time.UTC)
|
||||||
|
t2 := time.Date(2010, 1, 1, 8, 9, 10, 11, time.UTC)
|
||||||
|
spec := nullTestSpec{"nulldatetime", "datetime", [6]nullTestRow{
|
||||||
|
{NullTime{t1, true}, t2, NullTime{t1, true}},
|
||||||
|
{NullTime{t1, false}, t2, NullTime{t0, false}},
|
||||||
|
{t1, t2, NullTime{t1, true}},
|
||||||
|
{NullTime{t1, true}, t2, NullTime{t1, true}},
|
||||||
|
{NullTime{t1, false}, t2, NullTime{t0, false}},
|
||||||
|
{t2, NullTime{t1, false}, nil},
|
||||||
|
}}
|
||||||
|
nullTestRun(t, spec)
|
||||||
|
}
|
||||||
|
|
||||||
func nullTestRun(t *testing.T, spec nullTestSpec) {
|
func nullTestRun(t *testing.T, spec nullTestSpec) {
|
||||||
db := newTestDB(t, "")
|
db := newTestDB(t, "")
|
||||||
defer closeDB(t, db)
|
defer closeDB(t, db)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue