diff --git a/google/cloud/bigquery/job/query.py b/google/cloud/bigquery/job/query.py index ac0c51973..dbef226fa 100644 --- a/google/cloud/bigquery/job/query.py +++ b/google/cloud/bigquery/job/query.py @@ -1554,6 +1554,8 @@ def result( # type: ignore # (incompatible with supertype) ) first = True + if self.state is None: + self._begin(retry=retry, timeout=timeout) def do_get_result(): nonlocal first @@ -1581,14 +1583,18 @@ def do_get_result(): self._retry_do_query = retry_do_query self._job_retry = job_retry - super(QueryJob, self).result(retry=retry, timeout=timeout) - # Since the job could already be "done" (e.g. got a finished job # via client.get_job), the superclass call to done() might not # set the self._query_results cache. if self._query_results is None or not self._query_results.complete: self._reload_query_results(retry=retry, timeout=timeout) + # jobs.getQueryResults should be called before jobs.get. The + # jobs.getQueryResults request will raise an exception for + # failed jobs. This means our job retry mechanism can start + # earlier without a wasted call to jobs.get. + super(QueryJob, self).result(retry=retry, timeout=timeout) + if retry_do_query is not None and job_retry is not None: do_get_result = job_retry(do_get_result)