2
0

Adds checks for zero length arrays.

Assigning values from nil or zero length elements or dimensions now return immediately as there are no values to assign.
This commit is contained in:
Simo Haasanen
2020-10-20 19:52:05 +01:00
parent e92478ec70
commit 9639a69d45
44 changed files with 210 additions and 0 deletions
+4
View File
@@ -190,6 +190,10 @@ func (dst ACLItemArray) Get() interface{} {
func (src *ACLItemArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -189,6 +189,11 @@ func TestACLItemArrayAssignTo(t *testing.T) {
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.ACLItemArray{Status: pgtype.Present},
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.ACLItemArray{
Elements: []pgtype.ACLItem{
+4
View File
@@ -192,6 +192,10 @@ func (dst BoolArray) Get() interface{} {
func (src *BoolArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -168,6 +168,11 @@ func TestBoolArrayAssignTo(t *testing.T) {
dst: &boolSlice,
expected: (([]bool)(nil)),
},
{
src: pgtype.BoolArray{Status: pgtype.Present},
dst: &boolSlice,
expected: (([]bool)(nil)),
},
{
src: pgtype.BoolArray{
Elements: []pgtype.Bool{{Bool: true, Status: pgtype.Present}, {Bool: false, Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst BPCharArray) Get() interface{} {
func (src *BPCharArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+4
View File
@@ -173,6 +173,10 @@ func (dst ByteaArray) Get() interface{} {
func (src *ByteaArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -157,6 +157,11 @@ func TestByteaArrayAssignTo(t *testing.T) {
dst: &byteByteSlice,
expected: (([][]byte)(nil)),
},
{
src: pgtype.ByteaArray{Status: pgtype.Present},
dst: &byteByteSlice,
expected: (([][]byte)(nil)),
},
{
src: pgtype.ByteaArray{
Elements: []pgtype.Bytea{{Bytes: []byte{1}, Status: pgtype.Present}, {Bytes: []byte{2}, Status: pgtype.Present}},
+4
View File
@@ -212,6 +212,10 @@ func (dst CIDRArray) Get() interface{} {
func (src *CIDRArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+10
View File
@@ -217,11 +217,21 @@ func TestCIDRArrayAssignTo(t *testing.T) {
dst: &ipnetSlice,
expected: (([]*net.IPNet)(nil)),
},
{
src: pgtype.CIDRArray{Status: pgtype.Present},
dst: &ipnetSlice,
expected: (([]*net.IPNet)(nil)),
},
{
src: pgtype.CIDRArray{Status: pgtype.Null},
dst: &ipSlice,
expected: (([]net.IP)(nil)),
},
{
src: pgtype.CIDRArray{Status: pgtype.Present},
dst: &ipSlice,
expected: (([]net.IP)(nil)),
},
{
src: pgtype.CIDRArray{
Elements: []pgtype.CIDR{
+4
View File
@@ -193,6 +193,10 @@ func (dst DateArray) Get() interface{} {
func (src *DateArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -182,6 +182,11 @@ func TestDateArrayAssignTo(t *testing.T) {
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.DateArray{Status: pgtype.Present},
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.DateArray{
Elements: []pgtype.Date{
+4
View File
@@ -190,6 +190,10 @@ func (dst EnumArray) Get() interface{} {
func (src *EnumArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -167,6 +167,11 @@ func TestEnumArrayArrayAssignTo(t *testing.T) {
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.EnumArray{Status: pgtype.Present},
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.EnumArray{
Elements: []pgtype.GenericText{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst Float4Array) Get() interface{} {
func (src *Float4Array) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -167,6 +167,11 @@ func TestFloat4ArrayAssignTo(t *testing.T) {
dst: &float32Slice,
expected: (([]float32)(nil)),
},
{
src: pgtype.Float4Array{Status: pgtype.Present},
dst: &float32Slice,
expected: (([]float32)(nil)),
},
{
src: pgtype.Float4Array{
Elements: []pgtype.Float4{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst Float8Array) Get() interface{} {
func (src *Float8Array) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -143,6 +143,11 @@ func TestFloat8ArrayAssignTo(t *testing.T) {
dst: &float64Slice,
expected: (([]float64)(nil)),
},
{
src: pgtype.Float8Array{Status: pgtype.Present},
dst: &float64Slice,
expected: (([]float64)(nil)),
},
{
src: pgtype.Float8Array{
Elements: []pgtype.Float8{{Float: 1, Status: pgtype.Present}, {Float: 2, Status: pgtype.Present}},
+4
View File
@@ -173,6 +173,10 @@ func (dst HstoreArray) Get() interface{} {
func (src *HstoreArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+3
View File
@@ -302,6 +302,9 @@ func TestHstoreArrayAssignTo(t *testing.T) {
{
src: pgtype.HstoreArray{Status: pgtype.Null}, dst: &hstoreSlice, expected: (([]map[string]string)(nil)),
},
{
src: pgtype.HstoreArray{Status: pgtype.Present}, dst: &hstoreSlice, expected: (([]map[string]string)(nil)),
},
{
src: pgtype.HstoreArray{
Elements: []pgtype.Hstore{
+4
View File
@@ -212,6 +212,10 @@ func (dst InetArray) Get() interface{} {
func (src *InetArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+10
View File
@@ -217,11 +217,21 @@ func TestInetArrayAssignTo(t *testing.T) {
dst: &ipnetSlice,
expected: (([]*net.IPNet)(nil)),
},
{
src: pgtype.InetArray{Status: pgtype.Present},
dst: &ipnetSlice,
expected: (([]*net.IPNet)(nil)),
},
{
src: pgtype.InetArray{Status: pgtype.Null},
dst: &ipSlice,
expected: (([]net.IP)(nil)),
},
{
src: pgtype.InetArray{Status: pgtype.Present},
dst: &ipSlice,
expected: (([]net.IP)(nil)),
},
{
src: pgtype.InetArray{
Elements: []pgtype.Inet{
+4
View File
@@ -458,6 +458,10 @@ func (dst Int2Array) Get() interface{} {
func (src *Int2Array) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -219,6 +219,11 @@ func TestInt2ArrayAssignTo(t *testing.T) {
dst: &int16Slice,
expected: (([]int16)(nil)),
},
{
src: pgtype.Int2Array{Status: pgtype.Present},
dst: &int16Slice,
expected: (([]int16)(nil)),
},
{
src: pgtype.Int2Array{
Elements: []pgtype.Int2{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
+4
View File
@@ -458,6 +458,10 @@ func (dst Int4Array) Get() interface{} {
func (src *Int4Array) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -233,6 +233,11 @@ func TestInt4ArrayAssignTo(t *testing.T) {
dst: &int32Slice,
expected: (([]int32)(nil)),
},
{
src: pgtype.Int4Array{Status: pgtype.Present},
dst: &int32Slice,
expected: (([]int32)(nil)),
},
{
src: pgtype.Int4Array{
Elements: []pgtype.Int4{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
+4
View File
@@ -458,6 +458,10 @@ func (dst Int8Array) Get() interface{} {
func (src *Int8Array) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -226,6 +226,11 @@ func TestInt8ArrayAssignTo(t *testing.T) {
dst: &int64Slice,
expected: (([]int64)(nil)),
},
{
src: pgtype.Int8Array{Status: pgtype.Present},
dst: &int64Slice,
expected: (([]int64)(nil)),
},
{
src: pgtype.Int8Array{
Elements: []pgtype.Int8{{Int: 1, Status: pgtype.Present}, {Int: 2, Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst JSONBArray) Get() interface{} {
func (src *JSONBArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+4
View File
@@ -193,6 +193,10 @@ func (dst MacaddrArray) Get() interface{} {
func (src *MacaddrArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -166,6 +166,11 @@ func TestMacaddrArrayAssignTo(t *testing.T) {
dst: &macaddrSlice,
expected: (([]net.HardwareAddr)(nil)),
},
{
src: pgtype.MacaddrArray{Status: pgtype.Present},
dst: &macaddrSlice,
expected: (([]net.HardwareAddr)(nil)),
},
{
src: pgtype.MacaddrArray{
Elements: []pgtype.Macaddr{
+4
View File
@@ -306,6 +306,10 @@ func (dst NumericArray) Get() interface{} {
func (src *NumericArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -190,6 +190,11 @@ func TestNumericArrayAssignTo(t *testing.T) {
dst: &float32Slice,
expected: (([]float32)(nil)),
},
{
src: pgtype.NumericArray{Status: pgtype.Present},
dst: &float32Slice,
expected: (([]float32)(nil)),
},
{
src: pgtype.NumericArray{
Elements: []pgtype.Numeric{{Int: big.NewInt(1), Status: pgtype.Present}, {Int: big.NewInt(2), Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst TextArray) Get() interface{} {
func (src *TextArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -168,6 +168,11 @@ func TestTextArrayAssignTo(t *testing.T) {
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.TextArray{Status: pgtype.Present},
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.TextArray{
Elements: []pgtype.Text{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},
+4
View File
@@ -193,6 +193,10 @@ func (dst TimestampArray) Get() interface{} {
func (src *TimestampArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -162,6 +162,11 @@ func TestTimestampArrayAssignTo(t *testing.T) {
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.TimestampArray{Status: pgtype.Present},
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.TimestampArray{
Elements: []pgtype.Timestamp{
+4
View File
@@ -193,6 +193,10 @@ func (dst TimestamptzArray) Get() interface{} {
func (src *TimestamptzArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -198,6 +198,11 @@ func TestTimestamptzArrayAssignTo(t *testing.T) {
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.TimestamptzArray{Status: pgtype.Present},
dst: &timeSlice,
expected: (([]time.Time)(nil)),
},
{
src: pgtype.TimestamptzArray{
Elements: []pgtype.Timestamptz{
+4
View File
@@ -154,6 +154,10 @@ func (dst TstzrangeArray) Get() interface{} {
func (src *TstzrangeArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+4
View File
@@ -174,6 +174,10 @@ func (dst <%= pgtype_array_type %>) Get() interface{} {
func (src *<%= pgtype_array_type %>) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1{
// Attempt to match to select common types:
switch v := dst.(type) {
+4
View File
@@ -230,6 +230,10 @@ func (dst UUIDArray) Get() interface{} {
func (src *UUIDArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+11
View File
@@ -214,6 +214,7 @@ func TestUUIDArrayAssignTo(t *testing.T) {
var byteArraySlice [][16]byte
var byteSliceSlice [][]byte
var stringSlice []string
var byteSlice []byte
var byteArraySliceDim2 [][][16]byte
var stringSliceDim4 [][][][]string
var byteArrayDim2 [2][1][16]byte
@@ -252,6 +253,16 @@ func TestUUIDArrayAssignTo(t *testing.T) {
dst: &byteSliceSlice,
expected: ([][]byte)(nil),
},
{
src: pgtype.UUIDArray{Status: pgtype.Present},
dst: &byteSlice,
expected: ([]byte)(nil),
},
{
src: pgtype.UUIDArray{Status: pgtype.Present},
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.UUIDArray{
Elements: []pgtype.UUID{{Bytes: [16]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, Status: pgtype.Present}},
+4
View File
@@ -192,6 +192,10 @@ func (dst VarcharArray) Get() interface{} {
func (src *VarcharArray) AssignTo(dst interface{}) error {
switch src.Status {
case Present:
if len(src.Elements) == 0 || len(src.Dimensions) == 0 {
// No values to assign
return nil
}
if len(src.Dimensions) <= 1 {
// Attempt to match to select common types:
switch v := dst.(type) {
+5
View File
@@ -168,6 +168,11 @@ func TestVarcharArrayAssignTo(t *testing.T) {
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.VarcharArray{Status: pgtype.Present},
dst: &stringSlice,
expected: (([]string)(nil)),
},
{
src: pgtype.VarcharArray{
Elements: []pgtype.Varchar{{String: "foo", Status: pgtype.Present}, {String: "bar", Status: pgtype.Present}},