Working on a project using https://github.com/jmoiron/sqlx, I ran into this issue when using PrepareContext()/QueryRowContext with a context with timeout.
The following test case exercises the problem
func TestIssue1046(t *testing.T) {
ctxTimeout := time.Second * 2
sleepSQL := `SELECT pg_sleep(10) AS id`
db := openTestConn(t)
defer db.Close()
ctx, cancel := context.WithTimeout(context.Background(), ctxTimeout)
defer cancel()
stmt, err := db.PrepareContext(ctx, sleepSQL)
if err != nil {
t.Fatal(err)
}
var d []uint8
err = stmt.QueryRowContext(ctx).Scan(&d)
dl, _ := ctx.Deadline()
since := time.Since(dl)
if since > ctxTimeout {
t.Logf("FAIL %s: query returned after context deadline: %v\n", t.Name(), since)
t.Fail()
}
expectedErr := &Error{Message: "canceling statement due to user request"}
if err == nil || err.Error() != expectedErr.Error() {
t.Logf("ctx.Err(): [%T]%+v\n", ctx.Err(), ctx.Err())
t.Logf("got err: [%T] %+v expected err: [%T] %+v", err, err, expectedErr, expectedErr)
t.Fail()
}
}
Working on a project using https://github.com/jmoiron/sqlx, I ran into this issue when using
PrepareContext()
/QueryRowContext
with a context with timeout.The following test case exercises the problem