diff --git a/bigquery/google/cloud/bigquery/magics.py b/bigquery/google/cloud/bigquery/magics.py index 9bf2019c5c2e..2eee7e087f30 100644 --- a/bigquery/google/cloud/bigquery/magics.py +++ b/bigquery/google/cloud/bigquery/magics.py @@ -130,6 +130,7 @@ from __future__ import print_function import ast +import sys import time from concurrent import futures @@ -417,11 +418,20 @@ def _cell_magic(line, query): elif args.maximum_bytes_billed is not None: value = int(args.maximum_bytes_billed) job_config.maximum_bytes_billed = value - query_job = _run_query(client, query, job_config) + + error = None + try: + query_job = _run_query(client, query, job_config) + except Exception as ex: + error = str(ex) if not args.verbose: display.clear_output() + if error: + print("\nERROR:\n", error, file=sys.stderr) + return + result = query_job.to_dataframe(bqstorage_client=bqstorage_client) if args.destination_var: IPython.get_ipython().push({args.destination_var: result}) diff --git a/bigquery/tests/unit/test_magics.py b/bigquery/tests/unit/test_magics.py index 44e0571d1ee4..1a896dda0829 100644 --- a/bigquery/tests/unit/test_magics.py +++ b/bigquery/tests/unit/test_magics.py @@ -32,6 +32,7 @@ except ImportError: # pragma: NO COVER IPython = None +from google.api_core import exceptions import google.auth.credentials try: @@ -815,3 +816,30 @@ def test_bigquery_magic_with_improperly_formatted_params(): with pytest.raises(SyntaxError): ip.run_cell_magic("bigquery", "--params {17}", sql) + + +@pytest.mark.usefixtures("ipython_interactive") +def test_bigquery_magic_omits_tracebacks_from_error_message(): + ip = IPython.get_ipython() + ip.extension_manager.load_extension("google.cloud.bigquery") + + credentials_mock = mock.create_autospec( + google.auth.credentials.Credentials, instance=True + ) + default_patch = mock.patch( + "google.auth.default", return_value=(credentials_mock, "general-project") + ) + + run_query_patch = mock.patch( + "google.cloud.bigquery.magics._run_query", + autospec=True, + side_effect=exceptions.BadRequest("Syntax error in SQL query"), + ) + + with run_query_patch, default_patch, io.capture_output() as captured_io: + ip.run_cell_magic("bigquery", "", "SELECT foo FROM WHERE LIMIT bar") + + output = captured_io.stderr + assert "400 Syntax error in SQL query" in output + assert "Traceback (most recent call last)" not in output + assert "Syntax error" not in captured_io.stdout