mirror of
https://github.com/jackc/pgx.git
synced 2025-05-31 11:42:24 +00:00
Fix ArrayType DecodeBinary empty array breaks future reads
This commit is contained in:
parent
aa245bcc44
commit
7a3e774a52
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user