diff --git a/google/cloud/bigquery/_job_helpers.py b/google/cloud/bigquery/_job_helpers.py index 27e90246f..b6cf4d38b 100644 --- a/google/cloud/bigquery/_job_helpers.py +++ b/google/cloud/bigquery/_job_helpers.py @@ -720,11 +720,11 @@ def _wait_or_cancel( ) ) return query_results - except Exception: + except (KeyboardInterrupt, Exception): # Attempt to cancel the job since we can't return the results. try: job.cancel(retry=retry, timeout=api_timeout) - except Exception: + except (KeyboardInterrupt, Exception): # Don't eat the original exception if cancel fails. pass raise diff --git a/tests/unit/test__job_helpers.py b/tests/unit/test__job_helpers.py index 10cbefe13..58f9a24d4 100644 --- a/tests/unit/test__job_helpers.py +++ b/tests/unit/test__job_helpers.py @@ -1162,3 +1162,30 @@ def test_wait_or_cancel_exception_raises_original_exception(): timeout=123, retry=retry, ) + + +def test_wait_or_cancel_keyboard_interrupt_cancels_job(): + job = mock.create_autospec(job_query.QueryJob, instance=True) + job.result.side_effect = KeyboardInterrupt() + retry = retries.Retry() + + with pytest.raises(KeyboardInterrupt): + _job_helpers._wait_or_cancel( + job, + api_timeout=123, + wait_timeout=456, + retry=retry, + page_size=789, + max_results=101112, + ) + + job.result.assert_called_once_with( + timeout=456, + retry=retry, + page_size=789, + max_results=101112, + ) + job.cancel.assert_called_once_with( + timeout=123, + retry=retry, + ) \ No newline at end of file