From 2e630dddf9b2ebf2301b92c934f90c3b51e1b439 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Tue, 29 Aug 2017 15:37:22 -0500 Subject: [PATCH] Fix decoding row with same type values Row decoding was reusing and returning connection owned values for decoding. Instead allocate new value each time. fixes #313 --- record.go | 4 ++++ record_test.go | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) 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) } } }