Skip to content

Commit 159e975

Browse files
authored
feat(scalar): Support all int variations in decimal scalar (#937)
Added due to cloudquery/cloudquery#11115, where I'm using decimal to represent all different int types. For the tests of that PR I need to convert Go int types (generated by the test data) to scalars so I can compare with the data read from the database ---
1 parent 8cfc215 commit 159e975

File tree

2 files changed

+248
-0
lines changed

2 files changed

+248
-0
lines changed

scalar/decimal.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,24 @@ func (s *Decimal256) Set(val any) error {
7373
return nil
7474
}
7575
return s.Set(*value)
76+
case int:
77+
s.Value = decimal256.FromI64(int64(value))
78+
case int8:
79+
s.Value = decimal256.FromI64(int64(value))
80+
case int16:
81+
s.Value = decimal256.FromI64(int64(value))
82+
case int32:
83+
s.Value = decimal256.FromI64(int64(value))
7684
case int64:
7785
s.Value = decimal256.FromI64(value)
86+
case uint:
87+
s.Value = decimal256.FromU64(uint64(value))
88+
case uint8:
89+
s.Value = decimal256.FromU64(uint64(value))
90+
case uint16:
91+
s.Value = decimal256.FromU64(uint64(value))
92+
case uint32:
93+
s.Value = decimal256.FromU64(uint64(value))
7894
case uint64:
7995
s.Value = decimal256.FromU64(value)
8096
case string:
@@ -83,12 +99,60 @@ func (s *Decimal256) Set(val any) error {
8399
return err
84100
}
85101
s.Value = v
102+
case *int:
103+
if value == nil {
104+
s.Valid = false
105+
return nil
106+
}
107+
return s.Set(*value)
108+
case *int8:
109+
if value == nil {
110+
s.Valid = false
111+
return nil
112+
}
113+
return s.Set(*value)
114+
case *int16:
115+
if value == nil {
116+
s.Valid = false
117+
return nil
118+
}
119+
return s.Set(*value)
120+
case *int32:
121+
if value == nil {
122+
s.Valid = false
123+
return nil
124+
}
125+
return s.Set(*value)
86126
case *int64:
87127
if value == nil {
88128
s.Valid = false
89129
return nil
90130
}
91131
return s.Set(*value)
132+
case *uint:
133+
if value == nil {
134+
s.Valid = false
135+
return nil
136+
}
137+
return s.Set(*value)
138+
case *uint8:
139+
if value == nil {
140+
s.Valid = false
141+
return nil
142+
}
143+
return s.Set(*value)
144+
case *uint16:
145+
if value == nil {
146+
s.Valid = false
147+
return nil
148+
}
149+
return s.Set(*value)
150+
case *uint32:
151+
if value == nil {
152+
s.Valid = false
153+
return nil
154+
}
155+
return s.Set(*value)
92156
case *uint64:
93157
if value == nil {
94158
s.Valid = false
@@ -167,8 +231,24 @@ func (s *Decimal128) Set(val any) error {
167231
return nil
168232
}
169233
return s.Set(*value)
234+
case int:
235+
s.Value = decimal128.FromI64(int64(value))
236+
case int8:
237+
s.Value = decimal128.FromI64(int64(value))
238+
case int16:
239+
s.Value = decimal128.FromI64(int64(value))
240+
case int32:
241+
s.Value = decimal128.FromI64(int64(value))
170242
case int64:
171243
s.Value = decimal128.FromI64(value)
244+
case uint:
245+
s.Value = decimal128.FromU64(uint64(value))
246+
case uint8:
247+
s.Value = decimal128.FromU64(uint64(value))
248+
case uint16:
249+
s.Value = decimal128.FromU64(uint64(value))
250+
case uint32:
251+
s.Value = decimal128.FromU64(uint64(value))
172252
case uint64:
173253
s.Value = decimal128.FromU64(value)
174254
case string:
@@ -177,12 +257,60 @@ func (s *Decimal128) Set(val any) error {
177257
return err
178258
}
179259
s.Value = v
260+
case *int:
261+
if value == nil {
262+
s.Valid = false
263+
return nil
264+
}
265+
return s.Set(*value)
266+
case *int8:
267+
if value == nil {
268+
s.Valid = false
269+
return nil
270+
}
271+
return s.Set(*value)
272+
case *int16:
273+
if value == nil {
274+
s.Valid = false
275+
return nil
276+
}
277+
return s.Set(*value)
278+
case *int32:
279+
if value == nil {
280+
s.Valid = false
281+
return nil
282+
}
283+
return s.Set(*value)
180284
case *int64:
181285
if value == nil {
182286
s.Valid = false
183287
return nil
184288
}
185289
return s.Set(*value)
290+
case *uint:
291+
if value == nil {
292+
s.Valid = false
293+
return nil
294+
}
295+
return s.Set(*value)
296+
case *uint8:
297+
if value == nil {
298+
s.Valid = false
299+
return nil
300+
}
301+
return s.Set(*value)
302+
case *uint16:
303+
if value == nil {
304+
s.Valid = false
305+
return nil
306+
}
307+
return s.Set(*value)
308+
case *uint32:
309+
if value == nil {
310+
s.Valid = false
311+
return nil
312+
}
313+
return s.Set(*value)
186314
case *uint64:
187315
if value == nil {
188316
s.Valid = false

scalar/decimal_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package scalar
2+
3+
import (
4+
"testing"
5+
6+
"github.com/apache/arrow/go/v13/arrow"
7+
"github.com/apache/arrow/go/v13/arrow/decimal128"
8+
"github.com/apache/arrow/go/v13/arrow/decimal256"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
// nolint:dupl
13+
func TestDecimal128Set(t *testing.T) {
14+
str := "100.32"
15+
decimalType := &arrow.Decimal128Type{Precision: 5, Scale: 2}
16+
strDecimal, _ := decimal128.FromString(str, decimalType.Precision, decimalType.Scale)
17+
18+
intVal := int(1)
19+
int8Val := int8(1)
20+
int16Val := int16(1)
21+
int32Val := int32(1)
22+
int64Val := int64(1)
23+
uintVal := uint(1)
24+
uint8Val := uint8(1)
25+
uint16Val := uint16(1)
26+
uint32Val := uint32(1)
27+
uint64Val := uint64(1)
28+
29+
successfulTests := []struct {
30+
source any
31+
decimalType *arrow.Decimal128Type
32+
expect Decimal128
33+
}{
34+
{source: str, expect: Decimal128{Value: strDecimal, Valid: true, Type: decimalType}, decimalType: decimalType},
35+
{source: &str, expect: Decimal128{Value: strDecimal, Valid: true, Type: decimalType}, decimalType: decimalType},
36+
{source: intVal, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
37+
{source: int8Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
38+
{source: int16Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
39+
{source: int32Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
40+
{source: int64Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
41+
{source: uintVal, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
42+
{source: uint8Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
43+
{source: uint16Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
44+
{source: uint32Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
45+
{source: uint64Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
46+
{source: &intVal, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
47+
{source: &int8Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
48+
{source: &int16Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
49+
{source: &int32Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
50+
{source: &int64Val, expect: Decimal128{Value: decimal128.FromI64(1), Valid: true}},
51+
{source: &uintVal, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
52+
{source: &uint8Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
53+
{source: &uint16Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
54+
{source: &uint32Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
55+
{source: &uint64Val, expect: Decimal128{Value: decimal128.FromU64(1), Valid: true}},
56+
}
57+
58+
for i, tt := range successfulTests {
59+
r := Decimal128{}
60+
r.Type = tt.decimalType
61+
err := r.Set(tt.source)
62+
require.NoError(t, err, "No error expected for test %d", i)
63+
require.Equal(t, tt.expect, r, "Unexpected result for test %d", i)
64+
}
65+
}
66+
67+
// nolint:dupl
68+
func TestDecimal256Set(t *testing.T) {
69+
str := "100.32"
70+
decimalType := &arrow.Decimal256Type{Precision: 5, Scale: 2}
71+
strDecimal, _ := decimal256.FromString(str, decimalType.Precision, decimalType.Scale)
72+
73+
intVal := int(1)
74+
int8Val := int8(1)
75+
int16Val := int16(1)
76+
int32Val := int32(1)
77+
int64Val := int64(1)
78+
uintVal := uint(1)
79+
uint8Val := uint8(1)
80+
uint16Val := uint16(1)
81+
uint32Val := uint32(1)
82+
uint64Val := uint64(1)
83+
84+
successfulTests := []struct {
85+
source any
86+
decimalType *arrow.Decimal256Type
87+
expect Decimal256
88+
}{
89+
{source: str, expect: Decimal256{Value: strDecimal, Valid: true, Type: decimalType}, decimalType: decimalType},
90+
{source: &str, expect: Decimal256{Value: strDecimal, Valid: true, Type: decimalType}, decimalType: decimalType},
91+
{source: intVal, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
92+
{source: int8Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
93+
{source: int16Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
94+
{source: int32Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
95+
{source: int64Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
96+
{source: uintVal, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
97+
{source: uint8Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
98+
{source: uint16Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
99+
{source: uint32Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
100+
{source: uint64Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
101+
{source: &intVal, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
102+
{source: &int8Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
103+
{source: &int16Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
104+
{source: &int32Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
105+
{source: &int64Val, expect: Decimal256{Value: decimal256.FromI64(1), Valid: true}},
106+
{source: &uintVal, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
107+
{source: &uint8Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
108+
{source: &uint16Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
109+
{source: &uint32Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
110+
{source: &uint64Val, expect: Decimal256{Value: decimal256.FromU64(1), Valid: true}},
111+
}
112+
113+
for i, tt := range successfulTests {
114+
r := Decimal256{}
115+
r.Type = tt.decimalType
116+
err := r.Set(tt.source)
117+
require.NoError(t, err, "No error expected for test %d", i)
118+
require.Equal(t, tt.expect, r, "Unexpected result for test %d", i)
119+
}
120+
}

0 commit comments

Comments
 (0)