Fix panic on assigning empty array to non-slice or array

See https://github.com/jackc/pgx/issues/881
This commit is contained in:
Jack Christensen 2020-11-27 11:56:21 -06:00
parent 740b3a5115
commit 00d516f5c4
25 changed files with 156 additions and 0 deletions

View File

@ -228,6 +228,12 @@ func (src *ACLItemArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -5,6 +5,7 @@ import (
"testing"
"github.com/jackc/pgtype"
"github.com/stretchr/testify/require"
)
func TestParseUntypedTextArray(t *testing.T) {
@ -113,3 +114,14 @@ func TestParseUntypedTextArray(t *testing.T) {
}
}
}
// https://github.com/jackc/pgx/issues/881
func TestArrayAssignToEmptyToNonSlice(t *testing.T) {
var a pgtype.Int4Array
err := a.Set([]int32{})
require.NoError(t, err)
var iface interface{}
err = a.AssignTo(&iface)
require.EqualError(t, err, "cannot assign *pgtype.Int4Array to *interface {}")
}

View File

@ -230,6 +230,12 @@ func (src *BoolArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *BPCharArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -202,6 +202,12 @@ func (src *ByteaArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -259,6 +259,12 @@ func (src *CIDRArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -231,6 +231,12 @@ func (src *DateArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -228,6 +228,12 @@ func (src *EnumArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *Float4Array) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *Float8Array) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -202,6 +202,12 @@ func (src *HstoreArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -259,6 +259,12 @@ func (src *InetArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -622,6 +622,12 @@ func (src *Int2Array) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -622,6 +622,12 @@ func (src *Int4Array) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -622,6 +622,12 @@ func (src *Int8Array) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *JSONBArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -231,6 +231,12 @@ func (src *MacaddrArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -398,6 +398,12 @@ func (src *NumericArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *TextArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -231,6 +231,12 @@ func (src *TimestampArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -231,6 +231,12 @@ func (src *TimestamptzArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -183,6 +183,12 @@ func (src *TstzrangeArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -203,6 +203,12 @@ func (src *<%= pgtype_array_type %>) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -286,6 +286,12 @@ func (src *UUIDArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))

View File

@ -230,6 +230,12 @@ func (src *VarcharArray) AssignTo(dst interface{}) error {
value = value.Elem()
}
switch value.Kind() {
case reflect.Array, reflect.Slice:
default:
return errors.Errorf("cannot assign %T to %T", src, dst)
}
if len(src.Elements) == 0 {
if value.Kind() == reflect.Slice {
value.Set(reflect.MakeSlice(value.Type(), 0, 0))