Execute failures don't break connection

pgx-vs-pq
Jack Christensen 2013-07-09 10:17:53 -05:00
parent a1c24661cd
commit 6fb360ba6c
2 changed files with 39 additions and 7 deletions

View File

@ -142,7 +142,9 @@ func (c *Connection) SelectFunc(sql string, onDataRow func(*DataRowReader) error
case commandComplete:
case bindComplete:
default:
err = c.processContextFreeMsg(t, r)
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
err = e
}
}
} else {
return rxErr
@ -406,9 +408,7 @@ func (c *Connection) Execute(sql string, arguments ...interface{}) (commandTag s
}
for {
var t byte
var r *MessageReader
if t, r, err = c.rxMsg(); err == nil {
if t, r, rxErr := c.rxMsg(); rxErr == nil {
switch t {
case readyForQuery:
return
@ -418,12 +418,12 @@ func (c *Connection) Execute(sql string, arguments ...interface{}) (commandTag s
case commandComplete:
commandTag = r.ReadString()
default:
if err = c.processContextFreeMsg(t, r); err != nil {
return
if e := c.processContextFreeMsg(t, r); e != nil && err == nil {
err = e
}
}
} else {
return
return "", rxErr
}
}
}

View File

@ -179,7 +179,22 @@ func TestExecute(t *testing.T) {
if results != "SELECT 1" {
t.Errorf("Unexpected results from Execute: %v", results)
}
}
func TestExecuteFailure(t *testing.T) {
conn, err := Connect(*defaultConnectionParameters)
if err != nil {
t.Fatalf("Unable to establish connection: %v", err)
}
defer conn.Close()
if _, err := conn.Execute("select;"); err == nil {
t.Fatal("Expected SQL syntax error")
}
if _, err := conn.SelectValue("select 1"); err != nil {
t.Fatalf("Execute failure appears to have broken connection: %v", err)
}
}
func TestSelectFunc(t *testing.T) {
@ -204,6 +219,23 @@ func TestSelectFunc(t *testing.T) {
}
}
func TestSelectFuncFailure(t *testing.T) {
conn, err := Connect(*defaultConnectionParameters)
if err != nil {
t.Fatalf("Unable to establish connection: %v", err)
}
defer conn.Close()
// using SelectValue as it delegates to SelectFunc and is easier to work with
if _, err := conn.SelectValue("select;"); err == nil {
t.Fatal("Expected SQL syntax error")
}
if _, err := conn.SelectValue("select 1"); err != nil {
t.Fatalf("SelectFunc failure appears to have broken connection: %v", err)
}
}
func TestSelectRows(t *testing.T) {
conn := getSharedConnection()