From 07c2ad18467c551367f1e0dea565bbeb241a56bc Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Tue, 9 Jul 2013 12:51:00 -0500 Subject: [PATCH] Failure of Prepare should not break connection --- connection.go | 10 ++++------ connection_test.go | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/connection.go b/connection.go index 96963dfb..82477838 100644 --- a/connection.go +++ b/connection.go @@ -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 } } } diff --git a/connection_test.go b/connection_test.go index 3881aafd..002f9e31 100644 --- a/connection_test.go +++ b/connection_test.go @@ -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) + } +}