Skip to content

Commit 90f26f4

Browse files
authored
feat: Support INTERVAL type (#219)
* Bump cloud.google.com/go/spanner to v1.80.0 * Support INTERVAL type * Fix typo
1 parent eed796c commit 90f26f4

3 files changed

Lines changed: 52 additions & 1 deletion

File tree

decoder.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,17 @@ func DecodeColumn(column spanner.GenericColumnValue) (string, error) {
175175
for _, v := range vs {
176176
decoded = append(decoded, nullJSONToString(v))
177177
}
178+
case sppb.TypeCode_INTERVAL:
179+
var vs []spanner.NullInterval
180+
if err := column.Decode(&vs); err != nil {
181+
return "", err
182+
}
183+
if vs == nil {
184+
return "NULL", nil
185+
}
186+
for _, v := range vs {
187+
decoded = append(decoded, nullIntervalToString(v))
188+
}
178189
case sppb.TypeCode_UUID:
179190
var vs []spanner.NullUUID
180191
if err := column.Decode(&vs); err != nil {
@@ -248,6 +259,12 @@ func DecodeColumn(column spanner.GenericColumnValue) (string, error) {
248259
return "", err
249260
}
250261
return nullJSONToString(v), nil
262+
case sppb.TypeCode_INTERVAL:
263+
var v spanner.NullInterval
264+
if err := column.Decode(&v); err != nil {
265+
return "", err
266+
}
267+
return nullIntervalToString(v), nil
251268
case sppb.TypeCode_UUID:
252269
var v spanner.NullUUID
253270
if err := column.Decode(&v); err != nil {
@@ -341,6 +358,14 @@ func nullJSONToString(v spanner.NullJSON) string {
341358
}
342359
}
343360

361+
func nullIntervalToString(v spanner.NullInterval) string {
362+
if v.Valid {
363+
return v.String()
364+
} else {
365+
return "NULL"
366+
}
367+
}
368+
344369
func nullUUIDToString(v spanner.NullUUID) string {
345370
if v.Valid {
346371
return v.String()

decoder_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ func TestDecodeColumn(t *testing.T) {
139139
value: spanner.NullJSON{Value: nil, Valid: true},
140140
want: `null`,
141141
},
142+
{
143+
desc: "interval",
144+
value: spanner.NullInterval{
145+
Interval: spanner.Interval{Months: 1, Days: 1, Nanos: big.NewInt(3_600_000_000_000)},
146+
Valid: true,
147+
},
148+
want: `P1M1DT1H`,
149+
},
142150
{
143151
desc: "uuid",
144152
value: spanner.NullUUID{UUID: uuid.MustParse("1778a92d-dcdb-4e7c-a515-b6f953b59e54"), Valid: true},
@@ -196,6 +204,11 @@ func TestDecodeColumn(t *testing.T) {
196204
value: spanner.NullJSON{Value: nil, Valid: false},
197205
want: "NULL",
198206
},
207+
{
208+
desc: "null interval",
209+
value: spanner.NullInterval{Interval: spanner.Interval{}, Valid: false},
210+
want: "NULL",
211+
},
199212
{
200213
desc: "null uuid",
201214
value: spanner.NullUUID{UUID: uuid.UUID{}, Valid: false},
@@ -278,6 +291,14 @@ func TestDecodeColumn(t *testing.T) {
278291
},
279292
want: `[{"msg":"foo"}, {"msg":"bar"}]`,
280293
},
294+
{
295+
desc: "array interval",
296+
value: []spanner.NullInterval{
297+
{Interval: spanner.Interval{Months: 1, Days: 1, Nanos: big.NewInt(3_600_000_000_000)}, Valid: true},
298+
{Interval: spanner.Interval{}, Valid: true},
299+
},
300+
want: `[P1M1DT1H, P0Y]`,
301+
},
281302
{
282303
desc: "array uuid",
283304
value: []spanner.NullUUID{
@@ -338,6 +359,11 @@ func TestDecodeColumn(t *testing.T) {
338359
value: []spanner.NullJSON(nil),
339360
want: "NULL",
340361
},
362+
{
363+
desc: "null array interval",
364+
value: []spanner.NullInterval(nil),
365+
want: "NULL",
366+
},
341367
{
342368
desc: "null array uuid",
343369
value: []spanner.NullUUID(nil),

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ require (
88
github.com/apstndb/gsqlsep v0.0.0-20240823174243-432be37d515a
99
github.com/chzyer/readline v1.5.1
1010
github.com/google/go-cmp v0.7.0
11+
github.com/google/uuid v1.6.0
1112
github.com/jessevdk/go-flags v1.6.1
1213
github.com/olekukonko/tablewriter v0.0.5
1314
github.com/xlab/treeprint v1.2.0
@@ -37,7 +38,6 @@ require (
3738
github.com/go-logr/stdr v1.2.2 // indirect
3839
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
3940
github.com/google/s2a-go v0.1.9 // indirect
40-
github.com/google/uuid v1.6.0 // indirect
4141
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
4242
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
4343
github.com/mattn/go-runewidth v0.0.9 // indirect

0 commit comments

Comments
 (0)