From 7a3e774a5210e09e9c9471252e5e7f276e3d455c Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Tue, 14 Jul 2020 11:58:03 -0500 Subject: [PATCH] Fix ArrayType DecodeBinary empty array breaks future reads --- array_type.go | 8 ++++++-- array_type_test.go | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) 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) +}