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}
var parseErr error
readloop:
for {
msg, err := pgConn.ReceiveMessage()
@ -454,14 +456,17 @@ readloop:
psd.Fields = make([]pgproto3.FieldDescription, len(msg.Fields))
copy(psd.Fields, msg.Fields)
case *pgproto3.ErrorResponse:
go pgConn.recoverFromTimeout()
return nil, errorResponseToPgError(msg)
parseErr = errorResponseToPgError(msg)
case *pgproto3.ReadyForQuery:
break readloop
}
}
<-pgConn.controller
if parseErr != nil {
return nil, parseErr
}
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) {
t.Parallel()