11package converters
22
33import (
4+ "encoding/json"
45 "fmt"
56 "math/big"
67 "reflect"
@@ -25,6 +26,8 @@ var matchRegexes = map[string]*regexp.Regexp{
2526 "Nullable(Date)" : regexp .MustCompile (`^Nullable\(Date\(?` ),
2627 "Nullable(Decimal)" : regexp .MustCompile (`^Nullable\(Decimal` ),
2728 "Nullable(String)" : regexp .MustCompile (`Nullable\(String` ),
29+ "Variant" : regexp .MustCompile (`^(Variant|Array|Map|Tuple|JSON)` ),
30+ "Nullable(Variant)" : regexp .MustCompile (`^Nullable\((Variant|Array|Map|Tuple|JSON)` ),
2831}
2932
3033var Converters = map [string ]Converter {
@@ -185,6 +188,18 @@ var Converters = map[string]Converter{
185188 matchRegex : matchRegexes ["Nullable(Decimal)" ],
186189 scanType : reflect .PointerTo (reflect .PointerTo (reflect .TypeOf (decimal.Decimal {}))),
187190 },
191+ "Variant" : {
192+ convert : variantConvert ,
193+ fieldType : data .FieldTypeJSON ,
194+ matchRegex : matchRegexes ["Variant" ],
195+ scanType : reflect .PointerTo (reflect .TypeOf ("" )),
196+ },
197+ "Nullable(Variant)" : {
198+ convert : variantNullableConvert ,
199+ fieldType : data .FieldTypeNullableJSON ,
200+ matchRegex : matchRegexes ["Nullable(Variant)" ],
201+ scanType : reflect .PointerTo (reflect .PointerTo (reflect .TypeOf ("" ))),
202+ },
188203}
189204
190205func DatabendConverters () []sqlutil.Converter {
@@ -288,3 +303,29 @@ func bigIntNullableConvert(in interface{}) (interface{}, error) {
288303 f , _ := new (big.Float ).SetInt (* * v ).Float64 ()
289304 return & f , nil
290305}
306+
307+ func variantConvert (in interface {}) (interface {}, error ) {
308+ if in == nil {
309+ return json .RawMessage ("null" ), nil
310+ }
311+ v , ok := in .(* string )
312+ if ! ok {
313+ return nil , fmt .Errorf ("invalid variant - %v" , in )
314+ }
315+ return json .RawMessage (* v ), nil
316+ }
317+
318+ func variantNullableConvert (in interface {}) (interface {}, error ) {
319+ if in == nil {
320+ return (* json .RawMessage )(nil ), nil
321+ }
322+ v , ok := in .(* * string )
323+ if ! ok {
324+ return nil , fmt .Errorf ("invalid variant - %v" , in )
325+ }
326+ if * v == nil {
327+ return (* json .RawMessage )(nil ), nil
328+ }
329+ raw := json .RawMessage (* * v )
330+ return & raw , nil
331+ }
0 commit comments