feat(timestamp): Support -/+infinity for Valuer

When converting a timestamp.Timestamp for use in SQL, this now correctly
converts the NegativeInfinity and PositiveInfinity constants into the
corresponding `-infinity` and `infinity` SQL constants.
pull/4445/head
Timothy Messier 2 years ago
parent e09bf09a95
commit 0f765e7149
No known key found for this signature in database
GPG Key ID: EFD2F184F7600572

@ -37,10 +37,16 @@ func (ts *Timestamp) Scan(value any) error {
// Scan implements driver.Valuer for protobuf Timestamp.
func (ts *Timestamp) Value() (driver.Value, error) {
if ts == nil {
switch {
case ts == nil:
return nil, nil
case ts.AsTime().Equal(NegativeInfinityTS):
return "-infinity", nil
case ts.AsTime().Equal(PositiveInfinityTS):
return "infinity", nil
default:
return ts.Timestamp.AsTime(), nil
}
return ts.Timestamp.AsTime(), nil
}
// GormDataType gorm common data type (required)

@ -33,6 +33,18 @@ func Test_TimestampValue(t *testing.T) {
require.NoError(t, err)
assert.Equal(t, v, utcDate(10000, 1, 1))
})
t.Run("negativeInfinity", func(t *testing.T) {
ts := New(NegativeInfinityTS)
v, err := ts.Value()
require.NoError(t, err)
assert.Equal(t, v, "-infinity")
})
t.Run("positiveInfinity", func(t *testing.T) {
ts := New(PositiveInfinityTS)
v, err := ts.Value()
require.NoError(t, err)
assert.Equal(t, v, "infinity")
})
}
func Test_TimestampScan(t *testing.T) {
@ -65,6 +77,20 @@ func Test_TimestampScan(t *testing.T) {
err := ts.Scan(v)
require.Nil(err)
})
t.Run("negativeInfinity", func(t *testing.T) {
v := "-infinity"
ts := Timestamp{}
err := ts.Scan(v)
require.NoError(err)
assert.Equal(ts.AsTime(), NegativeInfinityTS)
})
t.Run("positiveInfinity", func(t *testing.T) {
v := "infinity"
ts := Timestamp{}
err := ts.Scan(v)
require.NoError(err)
assert.Equal(ts.AsTime(), PositiveInfinityTS)
})
}
const maxValidSeconds = 253402300800

Loading…
Cancel
Save