From 602e78b2747c8d385fe0b3b0872eafd7f12cc8ea Mon Sep 17 00:00:00 2001 From: Max Hawkins <maxhawkins@google.com> Date: Wed, 18 Jun 2014 01:25:41 -0700 Subject: [PATCH] Fix nil panic in postgresql/result.go SQL errors from CursorQuery() were unhandled in Next(). Caused nil panic when using Collection.One and db.Cond was invalid. Fixed by handling errors. --- postgresql/database_test.go | 22 ++++++++++++++++++++++ postgresql/result.go | 13 ++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/postgresql/database_test.go b/postgresql/database_test.go index a515ccb6..19624f94 100644 --- a/postgresql/database_test.go +++ b/postgresql/database_test.go @@ -159,6 +159,28 @@ func TestTruncate(t *testing.T) { } } +func TestSetCursorError(t *testing.T) { + sess, err := db.Open(wrapperName, settings) + if err != nil { + t.Fatal(err) + } + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + t.Fatal(err) + } + + // trigger Postgres error. "" is not an int. + res := artist.Find(db.Cond{"id": ""}) + + var row map[string]interface{} + err = res.One(&row) + if err == db.ErrNoMoreRows || err == nil { + t.Fatalf("err = %#v, want PQ error", err) + } +} + // This test appends some data into the "artist" table. func TestAppend(t *testing.T) { diff --git a/postgresql/result.go b/postgresql/result.go index 83ddb38d..5b3a49b8 100644 --- a/postgresql/result.go +++ b/postgresql/result.go @@ -147,24 +147,19 @@ func (self *Result) One(dst interface{}) error { // Fetches the next result from the resultset. func (self *Result) Next(dst interface{}) error { - - var err error - - // Current cursor. - err = self.setCursor() - + err := self.setCursor() if err != nil { self.Close() + return err } - // Fetching the next result from the cursor. err = self.table.T.FetchRow(dst, self.cursor) - if err != nil { self.Close() + return err } - return err + return nil } // Removes the matching items from the collection. -- GitLab