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.
This commit is contained in:
2 files changed
+34
-2
No files matched your search
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
Reference in new issue
Block a user