diff --git a/statement.go b/statement.go index 23e2dad4..b0357275 100644 --- a/statement.go +++ b/statement.go @@ -203,32 +203,31 @@ func (s *stmt) execute(ctx context.Context, args []driver.NamedValue) (*C.duckdb } defer C.duckdb_destroy_pending(&pendingRes) - for { + done := make(chan bool) + defer close(done) + + go func() { select { - // if context is cancelled or deadline exceeded, don't execute further case <-ctx.Done(): // also need to interrupt to cancel the query C.duckdb_interrupt(*s.c.con) - return nil, ctx.Err() - default: - // continue - } - state := C.duckdb_pending_execute_task(pendingRes) - if state == C.DUCKDB_PENDING_ERROR { - dbErr := C.GoString(C.duckdb_pending_error(pendingRes)) - return nil, errors.New(dbErr) - } - if C.duckdb_pending_execution_is_finished(state) { - break + return + case <-done: + return } - } + }() var res C.duckdb_result if state := C.duckdb_execute_pending(pendingRes, &res); state == C.DuckDBError { + if ctx.Err() != nil { + return nil, ctx.Err() + } + dbErr := C.GoString(C.duckdb_result_error(&res)) C.duckdb_destroy_result(&res) return nil, errors.New(dbErr) } + return &res, nil }