Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions bigquery/gcloud/aio/bigquery/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,26 +101,28 @@ def parse(field: dict[str, Any], value: Any) -> Any:
)
raise

value = flatten(value)

if field['mode'] == 'NULLABLE' and value is None:
return value
return None

if field['mode'] == 'REPEATED':
if field['type'] == 'RECORD':
return [{
f['name']: parse(f, x)
for f, x in zip(field['fields'], xs)
}
for xs in flatten(value)]
for xs in value]

return [convert(x) for x in flatten(value)]
return [convert(x) for x in value]

if field['type'] == 'RECORD':
return {
f['name']: parse(f, x)
for f, x in zip(field['fields'], flatten(value))
for f, x in zip(field['fields'], value)
}

return convert(flatten(value))
return convert(value)


def query_response_to_dict(response: dict[str, Any]) -> list[dict[str, Any]]:
Expand Down
2 changes: 2 additions & 0 deletions bigquery/tests/unit/utils_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,8 @@ def test_parse_nullable(kind):
# make sure we never convert to a falsey typed equivalent
# eg. for BOOLEAN, None != False
assert parse(field, None) is None
# BigQuery API wraps null values as {'v': None} -- must not crash
assert parse(field, {'v': None}) is None


@pytest.mark.parametrize(
Expand Down