diff --git a/record.go b/record.go index 14b415c3..26411af2 100644 --- a/record.go +++ b/record.go @@ -2,6 +2,7 @@ package pgtype import ( "encoding/binary" + "reflect" "github.com/pkg/errors" ) @@ -111,6 +112,9 @@ func (dst *Record) DecodeBinary(ci *ConnInfo, src []byte) error { rp += fieldLen } + // Duplicate struct to scan into + binaryDecoder = reflect.New(reflect.ValueOf(binaryDecoder).Elem().Type()).Interface().(BinaryDecoder) + if err := binaryDecoder.DecodeBinary(ci, fieldBytes); err != nil { return err } diff --git a/record_test.go b/record_test.go index df17501f..dc01cbbf 100644 --- a/record_test.go +++ b/record_test.go @@ -35,6 +35,16 @@ func TestRecordTranscode(t *testing.T) { Status: pgtype.Present, }, }, + { + sql: `select row(100.0::float4, 1.09::float4)`, + expected: pgtype.Record{ + Fields: []pgtype.Value{ + &pgtype.Float4{Float: 100, Status: pgtype.Present}, + &pgtype.Float4{Float: 1.09, Status: pgtype.Present}, + }, + Status: pgtype.Present, + }, + }, { sql: `select row('foo'::text, array[1, 2, null, 4]::int4[], 42::int4)`, expected: pgtype.Record{ @@ -87,7 +97,7 @@ func TestRecordTranscode(t *testing.T) { } if !reflect.DeepEqual(tt.expected, result) { - t.Errorf("%d: expected %v, got %v", i, tt.expected, result) + t.Errorf("%d: expected %#v, got %#v", i, tt.expected, result) } } }