Skip to content

Commit e783a41

Browse files
authored
Fix execute result (#9)
Before, `client.execute` would always return 0. After, it returns the number of rows inserted/deleted/updated.
1 parent 30aee1b commit e783a41

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

src/altertable_flightsql/client.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,18 @@ def execute(
242242

243243
# Execute via DoPut
244244
writer, reader = self._client.do_put(descriptor, pa.schema([]))
245-
writer.close()
245+
# Signal end of upload while keeping the read side open to receive the
246+
# server's DoPutUpdateResult metadata. writer.close() would close both
247+
# sides prematurely, causing reader.read() to return None.
248+
writer.done_writing()
246249

247250
# Read result from metadata
248251
result = sql_pb2.DoPutUpdateResult()
249252
metadata = reader.read()
250253
if metadata:
251-
result.ParseFromString(metadata)
254+
result.ParseFromString(bytes(metadata))
252255

256+
writer.close()
253257
return result.record_count
254258

255259
def ingest(

tests/test_execute.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
Integration tests for client.execute() DML row count reporting.
3+
4+
Verifies that execute() correctly returns the number of rows
5+
affected by INSERT, UPDATE, and DELETE statements.
6+
"""
7+
8+
from altertable_flightsql import Client
9+
from tests.conftest import TableInfo
10+
11+
12+
class TestExecuteRowCount:
13+
"""Test that execute() returns the correct number of affected rows."""
14+
15+
def test_insert_returns_row_count(self, altertable_client: Client, test_table: TableInfo):
16+
"""Test that INSERT returns the number of inserted rows."""
17+
rows = altertable_client.execute(
18+
f"INSERT INTO {test_table.full_name} (id, name, value) VALUES (4, 'Dave', 400), (5, 'Eve', 500)"
19+
)
20+
assert rows == 2
21+
22+
def test_update_returns_row_count(self, altertable_client: Client, test_table: TableInfo):
23+
"""Test that UPDATE returns the number of updated rows."""
24+
rows = altertable_client.execute(
25+
f"UPDATE {test_table.full_name} SET value = 999 WHERE value >= 200"
26+
)
27+
assert rows == 2
28+
29+
def test_delete_returns_row_count(self, altertable_client: Client, test_table: TableInfo):
30+
"""Test that DELETE returns the number of deleted rows."""
31+
rows = altertable_client.execute(f"DELETE FROM {test_table.full_name} WHERE id IN (1, 2)")
32+
assert rows == 2
33+
34+
def test_delete_no_match_returns_zero(self, altertable_client: Client, test_table: TableInfo):
35+
"""Test that DELETE with no matching rows returns 0."""
36+
rows = altertable_client.execute(f"DELETE FROM {test_table.full_name} WHERE id = 9999")
37+
assert rows == 0
38+
39+
def test_update_no_match_returns_zero(self, altertable_client: Client, test_table: TableInfo):
40+
"""Test that UPDATE with no matching rows returns 0."""
41+
rows = altertable_client.execute(
42+
f"UPDATE {test_table.full_name} SET value = 0 WHERE id = 9999"
43+
)
44+
assert rows == 0

0 commit comments

Comments
 (0)