Skip to content

Commit d132409

Browse files
authored
fix: handle Unmergable errors when merging struct responses (#152)
Co-authored-by: larkee <[email protected]>
1 parent ff97fad commit d132409

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

google/cloud/spanner_v1/streamed.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,13 @@ def _merge_struct(lhs, rhs, type_):
286286
lhs.append(first)
287287
else:
288288
last = lhs.pop()
289-
lhs.append(_merge_by_type(last, first, candidate_type))
289+
try:
290+
merged = _merge_by_type(last, first, candidate_type)
291+
except Unmergeable:
292+
lhs.append(last)
293+
lhs.append(first)
294+
else:
295+
lhs.append(merged)
290296
return Value(list_value=ListValue(values=lhs + rhs))
291297

292298

tests/unit/test_streamed.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,26 @@ def test__merge_chunk_array_of_struct_unmergeable(self):
448448
self.assertEqual(merged, expected)
449449
self.assertIsNone(streamed._pending_chunk)
450450

451+
def test__merge_chunk_array_of_struct_unmergeable_split(self):
452+
iterator = _MockCancellableIterator()
453+
streamed = self._make_one(iterator)
454+
struct_type = self._make_struct_type(
455+
[("name", "STRING"), ("height", "FLOAT64"), ("eye_color", "STRING")]
456+
)
457+
FIELDS = [self._make_array_field("test", element_type=struct_type)]
458+
streamed._metadata = self._make_result_set_metadata(FIELDS)
459+
partial = self._make_list_value([u"Phred Phlyntstone", 1.65])
460+
streamed._pending_chunk = self._make_list_value(value_pbs=[partial])
461+
rest = self._make_list_value(["brown"])
462+
chunk = self._make_list_value(value_pbs=[rest])
463+
464+
merged = streamed._merge_chunk(chunk)
465+
466+
struct = self._make_list_value([u"Phred Phlyntstone", 1.65, "brown"])
467+
expected = self._make_list_value(value_pbs=[struct])
468+
self.assertEqual(merged, expected)
469+
self.assertIsNone(streamed._pending_chunk)
470+
451471
def test_merge_values_empty_and_empty(self):
452472
iterator = _MockCancellableIterator()
453473
streamed = self._make_one(iterator)

0 commit comments

Comments
 (0)