Failure of Prepare should not break connection

pgx-vs-pq
Jack Christensen 2013-07-09 12:51:00 -05:00
parent 6fb360ba6c
commit 07c2ad1846
2 changed files with 21 additions and 6 deletions

View File

@ -274,9 +274,7 @@ func (c *Connection) Prepare(name, sql string) (err error) {
ps := PreparedStatement{Name: name}
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 parseComplete:
case parameterDescription:
@ -293,12 +291,12 @@ func (c *Connection) Prepare(name, sql string) (err error) {
c.preparedStatements[name] = &ps
return
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

@ -437,3 +437,20 @@ func TestPrepare(t *testing.T) {
}
}
}
func TestPrepareFailure(t *testing.T) {
conn, err := Connect(*defaultConnectionParameters)
if err != nil {
t.Fatalf("Unable to establish connection: %v", err)
}
defer conn.Close()
if err = conn.Prepare("badSQL", "select foo"); err == nil {
t.Fatal("Prepare should have failed with syntax error")
}
if _, err = conn.SelectValue("select 1"); err != nil {
t.Fatalf("Prepare failure appears to have broken connection: %v", err)
}
}