in memstore/common/data_value.go [807:937]
func GetDataValue(col interface{}, columnIDInSchema int, columnType string) (DataValue, error) {
dataType := DataTypeFromString(columnType)
if dataStr, ok := col.(string); ok {
return ValueFromString(dataStr, dataType)
}
val := DataValue{
DataType: dataType,
}
var ok bool
switch dataType {
case Bool:
var b bool
val.IsBool = true
if b, ok = col.(bool); !ok {
return val, fmt.Errorf("Invalid bool value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
val.Valid = true
val.BoolVal = b
case Int8:
var i8 int8
if i8, ok = col.(int8); !ok {
t := reflect.TypeOf(i8)
if reflect.TypeOf(col).ConvertibleTo(t) {
i8 = int8(reflect.ValueOf(col).Convert(t).Int())
} else {
return val, fmt.Errorf("Invalid int8 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&i8)
case Uint8, SmallEnum:
var ui8 uint8
if ui8, ok = col.(uint8); !ok {
t := reflect.TypeOf(ui8)
if reflect.TypeOf(col).ConvertibleTo(t) {
ui8 = uint8(reflect.ValueOf(col).Convert(t).Uint())
} else {
return val, fmt.Errorf("Invalid uint8 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&ui8)
case Int16:
var i16 int16
if i16, ok = col.(int16); !ok {
t := reflect.TypeOf(i16)
if reflect.TypeOf(col).ConvertibleTo(t) {
i16 = int16(reflect.ValueOf(col).Convert(t).Int())
} else {
return val, fmt.Errorf("Invalid int16 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&i16)
case Uint16, BigEnum:
var ui16 uint16
if ui16, ok = col.(uint16); !ok {
t := reflect.TypeOf(ui16)
if reflect.TypeOf(col).ConvertibleTo(t) {
ui16 = uint16(reflect.ValueOf(col).Convert(t).Uint())
} else {
return val, fmt.Errorf("Invalid uint16 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&ui16)
case Int32:
var i32 int32
if i32, ok = col.(int32); !ok {
t := reflect.TypeOf(i32)
if reflect.TypeOf(col).ConvertibleTo(t) {
i32 = int32(reflect.ValueOf(col).Convert(t).Int())
} else {
return val, fmt.Errorf("Invalid int32 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&i32)
case Uint32:
var ui32 uint32
if ui32, ok = col.(uint32); !ok {
t := reflect.TypeOf(ui32)
if reflect.TypeOf(col).ConvertibleTo(t) {
ui32 = uint32(reflect.ValueOf(col).Convert(t).Uint())
} else {
return val, fmt.Errorf("Invalid uint32 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&ui32)
case Int64:
var i64 int64
if i64, ok = col.(int64); !ok {
t := reflect.TypeOf(i64)
if reflect.TypeOf(col).ConvertibleTo(t) {
i64 = int64(reflect.ValueOf(col).Convert(t).Int())
} else {
return val, fmt.Errorf("Invalid int64 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&i64)
case Float32:
var f32 float32
if f32, ok = col.(float32); !ok {
t := reflect.TypeOf(f32)
if reflect.TypeOf(col).ConvertibleTo(t) {
f32 = float32(reflect.ValueOf(col).Convert(t).Float())
} else {
return val, fmt.Errorf("Invalid float32 value, col:%d, val:%v, type:%s",
columnIDInSchema, col, reflect.TypeOf(col))
}
}
val.Valid = true
val.OtherVal = unsafe.Pointer(&f32)
default:
return val, fmt.Errorf("Invalid data type, col:%d, val:%v, type:%d",
columnIDInSchema, col, dataType)
}
return val, nil
}