diff --git a/array_type.go b/array_type.go index 32ce7ac4..04b8710c 100644 --- a/array_type.go +++ b/array_type.go @@ -185,8 +185,12 @@ func (dst *ArrayType) DecodeBinary(ci *ConnInfo, src []byte) error { return err } + var elements []ValueTranscoder + if len(arrayHeader.Dimensions) == 0 { - *dst = ArrayType{dimensions: arrayHeader.Dimensions, status: Present} + dst.elements = elements + dst.dimensions = arrayHeader.Dimensions + dst.status = Present return nil } @@ -195,7 +199,7 @@ func (dst *ArrayType) DecodeBinary(ci *ConnInfo, src []byte) error { elementCount *= d.Length } - elements := make([]ValueTranscoder, elementCount) + elements = make([]ValueTranscoder, elementCount) for i := range elements { elem := dst.newElement() diff --git a/array_type_test.go b/array_type_test.go index 0f296bb5..626df4dc 100644 --- a/array_type_test.go +++ b/array_type_test.go @@ -60,3 +60,25 @@ func TestArrayTypeTranscode(t *testing.T) { require.EqualValues(t, []string{"red", "green", "blue"}, dstStrings) } + +func TestArrayTypeEmptyArrayDoesNotBreakArrayType(t *testing.T) { + conn := testutil.MustConnectPgx(t) + defer testutil.MustCloseContext(t, conn) + + conn.ConnInfo().RegisterDataType(pgtype.DataType{ + Value: pgtype.NewArrayType("_text", pgtype.TextOID, func() pgtype.ValueTranscoder { return &pgtype.Text{} }), + Name: "_text", + OID: pgtype.TextArrayOID, + }) + + var dstStrings []string + err := conn.QueryRow(context.Background(), "select '{}'::text[]").Scan(&dstStrings) + require.NoError(t, err) + + require.EqualValues(t, []string{}, dstStrings) + + err = conn.QueryRow(context.Background(), "select $1::text[]", []string{"red", "green", "blue"}).Scan(&dstStrings) + require.NoError(t, err) + + require.EqualValues(t, []string{"red", "green", "blue"}, dstStrings) +}