Fix ArrayType DecodeBinary empty array breaks future reads

This commit is contained in:
Jack Christensen 2020-07-14 11:58:03 -05:00
parent aa245bcc44
commit 7a3e774a52
2 changed files with 28 additions and 2 deletions

View File

@ -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()

View File

@ -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)
}