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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var elements []ValueTranscoder
|
||||||
|
|
||||||
if len(arrayHeader.Dimensions) == 0 {
|
if len(arrayHeader.Dimensions) == 0 {
|
||||||
*dst = ArrayType{dimensions: arrayHeader.Dimensions, status: Present}
|
dst.elements = elements
|
||||||
|
dst.dimensions = arrayHeader.Dimensions
|
||||||
|
dst.status = Present
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +199,7 @@ func (dst *ArrayType) DecodeBinary(ci *ConnInfo, src []byte) error {
|
|||||||
elementCount *= d.Length
|
elementCount *= d.Length
|
||||||
}
|
}
|
||||||
|
|
||||||
elements := make([]ValueTranscoder, elementCount)
|
elements = make([]ValueTranscoder, elementCount)
|
||||||
|
|
||||||
for i := range elements {
|
for i := range elements {
|
||||||
elem := dst.newElement()
|
elem := dst.newElement()
|
||||||
|
@ -60,3 +60,25 @@ func TestArrayTypeTranscode(t *testing.T) {
|
|||||||
|
|
||||||
require.EqualValues(t, []string{"red", "green", "blue"}, dstStrings)
|
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