From 3ae6b92f4ca0e5d2879799d7e072034f06e97655 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 12 Feb 2019 13:17:18 -0500 Subject: [PATCH] Harden 'ArrayQueryParameter.from_api_repr' against missing 'parameterValue'. Closes #7309. --- bigquery/google/cloud/bigquery/query.py | 4 +++- bigquery/tests/unit/test_query.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bigquery/google/cloud/bigquery/query.py b/bigquery/google/cloud/bigquery/query.py index 685d83cf9c7f..726b598d3aaf 100644 --- a/bigquery/google/cloud/bigquery/query.py +++ b/bigquery/google/cloud/bigquery/query.py @@ -230,7 +230,9 @@ def _from_api_repr_struct(cls, resource): def _from_api_repr_scalar(cls, resource): name = resource.get("name") array_type = resource["parameterType"]["arrayType"]["type"] - values = [value["value"] for value in resource["parameterValue"]["arrayValues"]] + parameter_value = resource.get("parameterValue", {}) + array_values = parameter_value.get("arrayValues", ()) + values = [value["value"] for value in array_values] converted = [ _QUERY_PARAMS_FROM_JSON[array_type](value, None) for value in values ] diff --git a/bigquery/tests/unit/test_query.py b/bigquery/tests/unit/test_query.py index f50335082349..896ab78e3024 100644 --- a/bigquery/tests/unit/test_query.py +++ b/bigquery/tests/unit/test_query.py @@ -362,6 +362,18 @@ def test_from_api_repr_wo_name(self): self.assertEqual(param.array_type, "INT64") self.assertEqual(param.values, [1, 2]) + def test_from_api_repr_wo_values(self): + # Back-end may not send back values for empty array params. See #7309 + RESOURCE = { + "name": "foo", + "parameterType": {"type": "ARRAY", "arrayType": {"type": "INT64"}}, + } + klass = self._get_target_class() + param = klass.from_api_repr(RESOURCE) + self.assertEqual(param.name, "foo") + self.assertEqual(param.array_type, "INT64") + self.assertEqual(param.values, []) + def test_from_api_repr_w_struct_type(self): from google.cloud.bigquery.query import StructQueryParameter