Fix prepare failure

pull/483/head
Jack Christensen 2019-01-12 15:38:20 -06:00
parent c4050134cc
commit 340a2a5886
2 changed files with 21 additions and 2 deletions

View File

@ -438,6 +438,8 @@ func (pgConn *PgConn) Prepare(ctx context.Context, name, sql string, paramOIDs [
psd := &PreparedStatementDescription{Name: name, SQL: sql} psd := &PreparedStatementDescription{Name: name, SQL: sql}
var parseErr error
readloop: readloop:
for { for {
msg, err := pgConn.ReceiveMessage() msg, err := pgConn.ReceiveMessage()
@ -454,14 +456,17 @@ readloop:
psd.Fields = make([]pgproto3.FieldDescription, len(msg.Fields)) psd.Fields = make([]pgproto3.FieldDescription, len(msg.Fields))
copy(psd.Fields, msg.Fields) copy(psd.Fields, msg.Fields)
case *pgproto3.ErrorResponse: case *pgproto3.ErrorResponse:
go pgConn.recoverFromTimeout() parseErr = errorResponseToPgError(msg)
return nil, errorResponseToPgError(msg)
case *pgproto3.ReadyForQuery: case *pgproto3.ReadyForQuery:
break readloop break readloop
} }
} }
<-pgConn.controller <-pgConn.controller
if parseErr != nil {
return nil, parseErr
}
return psd, nil return psd, nil
} }

View File

@ -235,6 +235,20 @@ func TestConnectWithAfterConnectTargetSessionAttrsReadWrite(t *testing.T) {
} }
} }
func TestConnPrepareFailure(t *testing.T) {
t.Parallel()
pgConn, err := pgconn.Connect(context.Background(), os.Getenv("PGX_TEST_DATABASE"))
require.Nil(t, err)
defer closeConn(t, pgConn)
psd, err := pgConn.Prepare(context.Background(), "ps1", "SYNTAX ERROR", nil)
require.Nil(t, psd)
require.NotNil(t, err)
ensureConnValid(t, pgConn)
}
func TestConnExec(t *testing.T) { func TestConnExec(t *testing.T) {
t.Parallel() t.Parallel()