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