From 0bc891e7802a3f5b958a8e961d2be50c32a9018c Mon Sep 17 00:00:00 2001 From: Iurii Krasnoshchok Date: Wed, 20 Dec 2017 14:47:52 +0100 Subject: [PATCH 1/2] Return error on unknown oid while decoding record instead of panic --- pgtype/record.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pgtype/record.go b/pgtype/record.go index 26411af2..aeca1c54 100644 --- a/pgtype/record.go +++ b/pgtype/record.go @@ -98,9 +98,10 @@ func (dst *Record) DecodeBinary(ci *ConnInfo, src []byte) error { var binaryDecoder BinaryDecoder if dt, ok := ci.DataTypeForOID(fieldOID); ok { - if binaryDecoder, ok = dt.Value.(BinaryDecoder); !ok { - return errors.Errorf("unknown oid while decoding record: %v", fieldOID) - } + binaryDecoder, _ = dt.Value.(BinaryDecoder) + } + if binaryDecoder == nil { + return errors.Errorf("unknown oid while decoding record: %v", fieldOID) } var fieldBytes []byte From 21dad60cf756db45958bf26eccbe0c53b5d14d22 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 23 Dec 2017 10:24:09 -0600 Subject: [PATCH 2/2] Add test for record with unknown OID --- pgtype/record_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pgtype/record_test.go b/pgtype/record_test.go index dc01cbbf..7cc8a59f 100644 --- a/pgtype/record_test.go +++ b/pgtype/record_test.go @@ -102,6 +102,28 @@ func TestRecordTranscode(t *testing.T) { } } +func TestRecordWithUnknownOID(t *testing.T) { + conn := testutil.MustConnectPgx(t) + defer testutil.MustClose(t, conn) + + _, err := conn.Exec(`drop type if exists floatrange; + +create type floatrange as range ( + subtype = float8, + subtype_diff = float8mi +);`) + if err != nil { + t.Fatal(err) + } + defer conn.Exec("drop type floatrange") + + var result pgtype.Record + err = conn.QueryRow("select row('foo'::text, floatrange(1, 10), 'bar'::text)").Scan(&result) + if err == nil { + t.Errorf("expected error but none") + } +} + func TestRecordAssignTo(t *testing.T) { var valueSlice []pgtype.Value var interfaceSlice []interface{}