@@ -594,7 +594,8 @@ class TrinoResult(object):
594
594
595
595
def __init__ (self , query , rows = None , experimental_python_types : bool = False ):
596
596
self ._query = query
597
- self ._rows = rows or []
597
+ # Initial rows from the first POST request
598
+ self ._rows = rows
598
599
self ._rownumber = 0
599
600
self ._experimental_python_types = experimental_python_types
600
601
@@ -603,20 +604,17 @@ def rownumber(self) -> int:
603
604
return self ._rownumber
604
605
605
606
def __iter__ (self ):
606
- # Initial fetch from the first POST request
607
- for row in self ._rows :
608
- self ._rownumber += 1
609
- yield self ._map_row (self ._experimental_python_types , row , self ._query .columns )
610
- self ._rows = None
611
-
612
- # Subsequent fetches from GET requests until next_uri is empty.
613
- while not self ._query .finished :
614
- rows = self ._query .fetch ()
615
- for row in rows :
607
+ # A query only transitions to a FINISHED state when the results are fully consumed:
608
+ # The reception of the data is acknowledged by calling the next_uri before exposing the data through dbapi.
609
+ while not self ._query .finished or self ._rows is not None :
610
+ next_rows = self ._query .fetch () if not self ._query .finished else None
611
+ for row in self ._rows :
616
612
self ._rownumber += 1
617
613
logger .debug ("row %s" , row )
618
614
yield self ._map_row (self ._experimental_python_types , row , self ._query .columns )
619
615
616
+ self ._rows = next_rows
617
+
620
618
@property
621
619
def response_headers (self ):
622
620
return self ._query .response_headers
@@ -723,7 +721,7 @@ def __init__(
723
721
self ._request = request
724
722
self ._update_type = None
725
723
self ._sql = sql
726
- self ._result = TrinoResult ( self , experimental_python_types = experimental_python_types )
724
+ self ._result : Optional [ TrinoResult ] = None
727
725
self ._response_headers = None
728
726
self ._experimental_python_types = experimental_python_types
729
727
0 commit comments