feat: make conversion between numeric values and arrays less strict
closes https://github.com/jackc/pgx/issues/642
This commit is contained in:
+140
@@ -61,6 +61,101 @@ func (dst *Int2Array) Set(src interface{}) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case []int32:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int2Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int2Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int2, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int2Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case []uint32:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int2Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int2Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int2, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int2Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case []int64:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int2Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int2Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int2, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int2Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case []uint64:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int2Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int2Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int2, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int2Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case []int:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int2Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int2Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int2, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int2Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case []Int2:
|
case []Int2:
|
||||||
if value == nil {
|
if value == nil {
|
||||||
*dst = Int2Array{Status: Null}
|
*dst = Int2Array{Status: Null}
|
||||||
@@ -117,6 +212,51 @@ func (src *Int2Array) AssignTo(dst interface{}) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
case *[]int32:
|
||||||
|
*v = make([]int32, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case *[]uint32:
|
||||||
|
*v = make([]uint32, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case *[]int64:
|
||||||
|
*v = make([]int64, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case *[]uint64:
|
||||||
|
*v = make([]uint64, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case *[]int:
|
||||||
|
*v = make([]int, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if nextDst, retry := GetAssignToDstType(dst); retry {
|
if nextDst, retry := GetAssignToDstType(dst); retry {
|
||||||
return src.AssignTo(nextDst)
|
return src.AssignTo(nextDst)
|
||||||
|
|||||||
@@ -61,6 +61,44 @@ func (dst *Int4Array) Set(src interface{}) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case []int64:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int4Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int4Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int4, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int4Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case []uint64:
|
||||||
|
if value == nil {
|
||||||
|
*dst = Int4Array{Status: Null}
|
||||||
|
} else if len(value) == 0 {
|
||||||
|
*dst = Int4Array{Status: Present}
|
||||||
|
} else {
|
||||||
|
elements := make([]Int4, len(value))
|
||||||
|
for i := range value {
|
||||||
|
if err := elements[i].Set(value[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*dst = Int4Array{
|
||||||
|
Elements: elements,
|
||||||
|
Dimensions: []ArrayDimension{{Length: int32(len(elements)), LowerBound: 1}},
|
||||||
|
Status: Present,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case []int:
|
case []int:
|
||||||
if value == nil {
|
if value == nil {
|
||||||
*dst = Int4Array{Status: Null}
|
*dst = Int4Array{Status: Null}
|
||||||
@@ -136,6 +174,24 @@ func (src *Int4Array) AssignTo(dst interface{}) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
|
case *[]int64:
|
||||||
|
*v = make([]int64, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
|
case *[]uint64:
|
||||||
|
*v = make([]uint64, len(src.Elements))
|
||||||
|
for i := range src.Elements {
|
||||||
|
if err := src.Elements[i].AssignTo(&((*v)[i])); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
|
||||||
case *[]int:
|
case *[]int:
|
||||||
*v = make([]int, len(src.Elements))
|
*v = make([]int, len(src.Elements))
|
||||||
for i := range src.Elements {
|
for i := range src.Elements {
|
||||||
|
|||||||
Regular → Executable
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
erb pgtype_array_type=Int2Array pgtype_element_type=Int2 go_array_types=[]int16,[]uint16 element_type_name=int2 text_null=NULL binary_format=true typed_array.go.erb > int2_array.go
|
erb pgtype_array_type=Int2Array pgtype_element_type=Int2 go_array_types=[]int16,[]uint16,[]int32,[]uint32,[]int64,[]uint64,[]int element_type_name=int2 text_null=NULL binary_format=true typed_array.go.erb > int2_array.go
|
||||||
erb pgtype_array_type=Int4Array pgtype_element_type=Int4 go_array_types=[]int32,[]uint32,[]int element_type_name=int4 text_null=NULL binary_format=true typed_array.go.erb > int4_array.go
|
erb pgtype_array_type=Int4Array pgtype_element_type=Int4 go_array_types=[]int32,[]uint32,[]int64,[]uint64,[]int element_type_name=int4 text_null=NULL binary_format=true typed_array.go.erb > int4_array.go
|
||||||
erb pgtype_array_type=Int8Array pgtype_element_type=Int8 go_array_types=[]int64,[]uint64 element_type_name=int8 text_null=NULL binary_format=true typed_array.go.erb > int8_array.go
|
erb pgtype_array_type=Int8Array pgtype_element_type=Int8 go_array_types=[]int64,[]uint64 element_type_name=int8 text_null=NULL binary_format=true typed_array.go.erb > int8_array.go
|
||||||
erb pgtype_array_type=BoolArray pgtype_element_type=Bool go_array_types=[]bool element_type_name=bool text_null=NULL binary_format=true typed_array.go.erb > bool_array.go
|
erb pgtype_array_type=BoolArray pgtype_element_type=Bool go_array_types=[]bool element_type_name=bool text_null=NULL binary_format=true typed_array.go.erb > bool_array.go
|
||||||
erb pgtype_array_type=DateArray pgtype_element_type=Date go_array_types=[]time.Time element_type_name=date text_null=NULL binary_format=true typed_array.go.erb > date_array.go
|
erb pgtype_array_type=DateArray pgtype_element_type=Date go_array_types=[]time.Time element_type_name=date text_null=NULL binary_format=true typed_array.go.erb > date_array.go
|
||||||
|
|||||||
Reference in New Issue
Block a user