Skip to content

Commit 69367b9

Browse files
authored
Merge pull request #558 from ydb-platform/fix_phantom_result_sets
Fix empty result sets from stream
2 parents f595b61 + 0db84bf commit 69367b9

File tree

7 files changed

+46
-3
lines changed

7 files changed

+46
-3
lines changed

tests/aio/query/test_query_session.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,13 @@ async def test_basic_execute(self, session: QuerySession):
103103
async def test_two_results(self, session: QuerySession):
104104
await session.create()
105105
res = []
106+
counter = 0
106107

107108
async with await session.execute("select 1; select 2") as results:
108109
async for result_set in results:
110+
counter += 1
109111
if len(result_set.rows) > 0:
110112
res.append(list(result_set.rows[0].values()))
111113

112114
assert res == [[1], [2]]
115+
assert counter == 2

tests/aio/query/test_query_transaction.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,18 @@ async def test_execute_as_context_manager(self, tx: QueryTxContext):
9292
res = [result_set async for result_set in results]
9393

9494
assert len(res) == 1
95+
96+
@pytest.mark.asyncio
97+
async def test_execute_two_results(self, tx: QueryTxContext):
98+
await tx.begin()
99+
counter = 0
100+
res = []
101+
102+
async with await tx.execute("select 1; select 2") as results:
103+
async for result_set in results:
104+
counter += 1
105+
if len(result_set.rows) > 0:
106+
res.append(list(result_set.rows[0].values()))
107+
108+
assert res == [[1], [2]]
109+
assert counter == 2

tests/query/test_query_session.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,16 @@ def test_basic_execute(self, session: QuerySession):
9898
def test_two_results(self, session: QuerySession):
9999
session.create()
100100
res = []
101+
counter = 0
101102

102103
with session.execute("select 1; select 2") as results:
103104
for result_set in results:
105+
counter += 1
104106
if len(result_set.rows) > 0:
105107
res.append(list(result_set.rows[0].values()))
106108

107109
assert res == [[1], [2]]
110+
assert counter == 2
108111

109112
def test_thread_leaks(self, session: QuerySession):
110113
session.create()

tests/query/test_query_transaction.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,16 @@ def test_execute_as_context_manager(self, tx: QueryTxContext):
7979
res = [result_set for result_set in results]
8080

8181
assert len(res) == 1
82+
83+
def test_execute_two_results(self, tx: QueryTxContext):
84+
tx.begin()
85+
counter = 0
86+
res = []
87+
88+
with tx.execute("select 1; select 2") as results:
89+
for result_set in results:
90+
counter += 1
91+
res.append(list(result_set.rows[0].values()))
92+
93+
assert res == [[1], [2]]
94+
assert counter == 2

ydb/_utilities.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,10 @@ def __iter__(self):
161161
return self
162162

163163
def _next(self):
164-
return self.wrapper(next(self.it))
164+
res = self.wrapper(next(self.it))
165+
if res is not None:
166+
return res
167+
return self._next()
165168

166169
def next(self):
167170
return self._next()

ydb/aio/_utilities.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ def __aiter__(self):
1717
return self
1818

1919
async def _next(self):
20-
return self.wrapper(await self.it.__anext__())
20+
res = self.wrapper(await self.it.__anext__())
21+
if res is not None:
22+
return res
23+
return await self._next()
2124

2225
async def next(self):
2326
return await self._next()

ydb/query/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,7 @@ def wrap_execute_query_response(
192192
elif tx and response_pb.tx_meta and not tx.tx_id:
193193
tx._move_to_beginned(response_pb.tx_meta.id)
194194

195-
return convert.ResultSet.from_message(response_pb.result_set, settings)
195+
if response_pb.HasField("result_set"):
196+
return convert.ResultSet.from_message(response_pb.result_set, settings)
197+
198+
return None

0 commit comments

Comments
 (0)