From e511c267de18c2f68e538d61960a4d85e93a8734 Mon Sep 17 00:00:00 2001 From: Laurent Debacker Date: Thu, 9 Apr 2015 22:10:55 +0200 Subject: [PATCH] Unit test demonstrating infinite loop Hi, I have just created a unit test demonstrating an infinite loop during cleanup in a defered function. The CPU will just sit at 100% use. I know this is a special case, but it's would be nice if a buggy Scanner doesn't make cleanup functions like rows.Close run indefinitely. Sadly, I'm not sure how to fix/improve this. --- values_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/values_test.go b/values_test.go index a4c240ba..3f9fa023 100644 --- a/values_test.go +++ b/values_test.go @@ -223,6 +223,37 @@ func TestArrayDecoding(t *testing.T) { } } +type buggyScanner struct {} + +func (*buggyScanner) Scan(r *pgx.ValueReader) error { + r.ReadInt32() + return nil +} + +func TestBuggyScanner(t *testing.T) { + t.Parallel() + + conn := mustConnect(t, *defaultConnConfig) + defer closeConn(t, conn) + + rows, err := conn.Query("select 'tevvvvvzvzst', array[]::text[] union select 'ko', array[]::text[]") + if err != nil { + t.Errorf(`error retrieving rows with array: %v`, err) + } + defer rows.Close() + + for rows.Next() { + var s string + var b buggyScanner + err = rows.Scan(&s, &b) + if err != nil { + t.Errorf(`error reading array: %v`, err) + } + } + + ensureConnValid(t, conn) +} + func TestEmptyArrayDecoding(t *testing.T) { t.Parallel()