mirror of
https://github.com/jackc/pgx.git
synced 2025-05-29 18:53:50 +00:00
Fix simple protocol empty array and original recursive empty array issue
Original issue https://github.com/jackc/pgtype/issues/68 This crash occurred in the recursive assignment system used to support multidimensional arrays. This was fixed in 9639a69d451f55456f598c1aa8b93053f8df3088. However, that fix incorrectly used nil instead of an empty slice. In hindsight, it appears the fundamental error is that an assignment to a slice of a type that is not specified is handled with the recursive / reflection path. Or another way of looking at it is as an unexpected feature where []T can now be scanned if individual elements are assignable to T even if []T is not specifically handled. But this new reflection / recursive path did not handle empty arrays. This fix handles the reflection path for an empty slice by allocating an empty slice.
This commit is contained in:
parent
9d7fc8e63a
commit
af0ca3a39b
@ -190,10 +190,6 @@ 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) {
|
||||
@ -232,6 +228,13 @@ func (src *ACLItemArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -192,7 +192,7 @@ func TestACLItemArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.ACLItemArray{Status: pgtype.Present},
|
||||
dst: &stringSlice,
|
||||
expected: (([]string)(nil)),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.ACLItemArray{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *BoolArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -171,7 +171,7 @@ func TestBoolArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.BoolArray{Status: pgtype.Present},
|
||||
dst: &boolSlice,
|
||||
expected: (([]bool)(nil)),
|
||||
expected: []bool{},
|
||||
},
|
||||
{
|
||||
src: pgtype.BoolArray{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *BPCharArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -173,10 +173,6 @@ 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) {
|
||||
@ -206,6 +202,13 @@ func (src *ByteaArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -160,7 +160,7 @@ func TestByteaArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.ByteaArray{Status: pgtype.Present},
|
||||
dst: &byteByteSlice,
|
||||
expected: (([][]byte)(nil)),
|
||||
expected: [][]byte{},
|
||||
},
|
||||
{
|
||||
src: pgtype.ByteaArray{
|
||||
|
@ -212,10 +212,6 @@ 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) {
|
||||
@ -263,6 +259,13 @@ func (src *CIDRArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -220,7 +220,7 @@ func TestCIDRArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.CIDRArray{Status: pgtype.Present},
|
||||
dst: &ipnetSlice,
|
||||
expected: (([]*net.IPNet)(nil)),
|
||||
expected: []*net.IPNet{},
|
||||
},
|
||||
{
|
||||
src: pgtype.CIDRArray{Status: pgtype.Null},
|
||||
@ -230,7 +230,7 @@ func TestCIDRArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.CIDRArray{Status: pgtype.Present},
|
||||
dst: &ipSlice,
|
||||
expected: (([]net.IP)(nil)),
|
||||
expected: []net.IP{},
|
||||
},
|
||||
{
|
||||
src: pgtype.CIDRArray{
|
||||
|
@ -193,10 +193,6 @@ 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) {
|
||||
@ -235,6 +231,13 @@ func (src *DateArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -185,7 +185,7 @@ func TestDateArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.DateArray{Status: pgtype.Present},
|
||||
dst: &timeSlice,
|
||||
expected: (([]time.Time)(nil)),
|
||||
expected: []time.Time{},
|
||||
},
|
||||
{
|
||||
src: pgtype.DateArray{
|
||||
|
@ -190,10 +190,6 @@ 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) {
|
||||
@ -232,6 +228,13 @@ func (src *EnumArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -170,7 +170,7 @@ func TestEnumArrayArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.EnumArray{Status: pgtype.Present},
|
||||
dst: &stringSlice,
|
||||
expected: (([]string)(nil)),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.EnumArray{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *Float4Array) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -170,7 +170,7 @@ func TestFloat4ArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.Float4Array{Status: pgtype.Present},
|
||||
dst: &float32Slice,
|
||||
expected: (([]float32)(nil)),
|
||||
expected: []float32{},
|
||||
},
|
||||
{
|
||||
src: pgtype.Float4Array{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *Float8Array) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -146,7 +146,7 @@ func TestFloat8ArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.Float8Array{Status: pgtype.Present},
|
||||
dst: &float64Slice,
|
||||
expected: (([]float64)(nil)),
|
||||
expected: []float64{},
|
||||
},
|
||||
{
|
||||
src: pgtype.Float8Array{
|
||||
|
@ -173,10 +173,6 @@ 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) {
|
||||
@ -206,6 +202,13 @@ func (src *HstoreArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -303,7 +303,7 @@ 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{Status: pgtype.Present}, dst: &hstoreSlice, expected: []map[string]string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.HstoreArray{
|
||||
|
@ -212,10 +212,6 @@ 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) {
|
||||
@ -263,6 +259,13 @@ func (src *InetArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -220,7 +220,7 @@ func TestInetArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.InetArray{Status: pgtype.Present},
|
||||
dst: &ipnetSlice,
|
||||
expected: (([]*net.IPNet)(nil)),
|
||||
expected: []*net.IPNet{},
|
||||
},
|
||||
{
|
||||
src: pgtype.InetArray{Status: pgtype.Null},
|
||||
@ -230,7 +230,7 @@ func TestInetArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.InetArray{Status: pgtype.Present},
|
||||
dst: &ipSlice,
|
||||
expected: (([]net.IP)(nil)),
|
||||
expected: []net.IP{},
|
||||
},
|
||||
{
|
||||
src: pgtype.InetArray{
|
||||
|
@ -458,10 +458,6 @@ 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) {
|
||||
@ -626,6 +622,13 @@ func (src *Int2Array) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -222,7 +222,7 @@ func TestInt2ArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.Int2Array{Status: pgtype.Present},
|
||||
dst: &int16Slice,
|
||||
expected: (([]int16)(nil)),
|
||||
expected: []int16{},
|
||||
},
|
||||
{
|
||||
src: pgtype.Int2Array{
|
||||
|
@ -458,10 +458,6 @@ 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) {
|
||||
@ -626,6 +622,13 @@ func (src *Int4Array) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -236,7 +236,7 @@ func TestInt4ArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.Int4Array{Status: pgtype.Present},
|
||||
dst: &int32Slice,
|
||||
expected: (([]int32)(nil)),
|
||||
expected: []int32{},
|
||||
},
|
||||
{
|
||||
src: pgtype.Int4Array{
|
||||
|
@ -458,10 +458,6 @@ 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) {
|
||||
@ -626,6 +622,13 @@ func (src *Int8Array) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -229,7 +229,7 @@ func TestInt8ArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.Int8Array{Status: pgtype.Present},
|
||||
dst: &int64Slice,
|
||||
expected: (([]int64)(nil)),
|
||||
expected: []int64{},
|
||||
},
|
||||
{
|
||||
src: pgtype.Int8Array{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *JSONBArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -193,10 +193,6 @@ 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) {
|
||||
@ -235,6 +231,13 @@ func (src *MacaddrArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -169,7 +169,7 @@ func TestMacaddrArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.MacaddrArray{Status: pgtype.Present},
|
||||
dst: &macaddrSlice,
|
||||
expected: (([]net.HardwareAddr)(nil)),
|
||||
expected: []net.HardwareAddr{},
|
||||
},
|
||||
{
|
||||
src: pgtype.MacaddrArray{
|
||||
|
@ -306,10 +306,6 @@ 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) {
|
||||
@ -402,6 +398,13 @@ func (src *NumericArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -193,7 +193,7 @@ func TestNumericArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.NumericArray{Status: pgtype.Present},
|
||||
dst: &float32Slice,
|
||||
expected: (([]float32)(nil)),
|
||||
expected: []float32{},
|
||||
},
|
||||
{
|
||||
src: pgtype.NumericArray{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *TextArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -171,7 +171,7 @@ func TestTextArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.TextArray{Status: pgtype.Present},
|
||||
dst: &stringSlice,
|
||||
expected: (([]string)(nil)),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.TextArray{
|
||||
|
@ -193,10 +193,6 @@ 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) {
|
||||
@ -235,6 +231,13 @@ func (src *TimestampArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -165,7 +165,7 @@ func TestTimestampArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.TimestampArray{Status: pgtype.Present},
|
||||
dst: &timeSlice,
|
||||
expected: (([]time.Time)(nil)),
|
||||
expected: []time.Time{},
|
||||
},
|
||||
{
|
||||
src: pgtype.TimestampArray{
|
||||
|
@ -193,10 +193,6 @@ 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) {
|
||||
@ -235,6 +231,13 @@ func (src *TimestamptzArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -201,7 +201,7 @@ func TestTimestamptzArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.TimestamptzArray{Status: pgtype.Present},
|
||||
dst: &timeSlice,
|
||||
expected: (([]time.Time)(nil)),
|
||||
expected: []time.Time{},
|
||||
},
|
||||
{
|
||||
src: pgtype.TimestamptzArray{
|
||||
|
@ -154,10 +154,6 @@ 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) {
|
||||
@ -187,6 +183,13 @@ func (src *TstzrangeArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -174,10 +174,6 @@ 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) {
|
||||
@ -207,6 +203,13 @@ func (src *<%= pgtype_array_type %>) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -230,10 +230,6 @@ 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) {
|
||||
@ -290,6 +286,13 @@ func (src *UUIDArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -256,12 +256,12 @@ func TestUUIDArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.UUIDArray{Status: pgtype.Present},
|
||||
dst: &byteSlice,
|
||||
expected: ([]byte)(nil),
|
||||
expected: []byte{},
|
||||
},
|
||||
{
|
||||
src: pgtype.UUIDArray{Status: pgtype.Present},
|
||||
dst: &stringSlice,
|
||||
expected: (([]string)(nil)),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.UUIDArray{
|
||||
|
@ -192,10 +192,6 @@ 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) {
|
||||
@ -234,6 +230,13 @@ func (src *VarcharArray) AssignTo(dst interface{}) error {
|
||||
value = value.Elem()
|
||||
}
|
||||
|
||||
if len(src.Elements) == 0 {
|
||||
if value.Kind() == reflect.Slice {
|
||||
value.Set(reflect.MakeSlice(value.Type(), 0, 0))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
elementCount, err := src.assignToRecursive(value, 0, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -171,7 +171,7 @@ func TestVarcharArrayAssignTo(t *testing.T) {
|
||||
{
|
||||
src: pgtype.VarcharArray{Status: pgtype.Present},
|
||||
dst: &stringSlice,
|
||||
expected: (([]string)(nil)),
|
||||
expected: []string{},
|
||||
},
|
||||
{
|
||||
src: pgtype.VarcharArray{
|
||||
|
Loading…
x
Reference in New Issue
Block a user