Skip to content

Commit a19e1e1

Browse files
committed
Fix handling of v5 stmt info codes
1 parent 295f976 commit a19e1e1

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

src/firebird/driver/core.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,7 +1353,7 @@ def get_info(self, info_code: DbInfoCode, page_number: int=None) -> Any:
13531353
elif tag == isc_info_error: # pragma: no cover
13541354
raise InterfaceError("An error response was received")
13551355
else: # pragma: no cover
1356-
raise InterfaceError("Result code does not match request code")
1356+
raise InterfaceError(f"Result code does not match request code {info_code}")
13571357
#
13581358
if info_code in (DbInfoCode.ACTIVE_TRANSACTIONS, DbInfoCode.LIMBO):
13591359
# we'll rewind back, otherwise it will break the repeating cluster processing
@@ -2357,12 +2357,13 @@ def get_info(self, info_code: TraInfoCode) -> Any:
23572357
"""
23582358
if info_code not in self._handlers:
23592359
raise NotSupportedError(f"Info code {info_code} not supported by engine version {self._mngr()._connection()._engine_version()}")
2360+
self.response.clear()
23602361
request = bytes([info_code])
23612362
self._get_data(request)
23622363
tag = self.response.get_tag()
23632364
if request[0] != tag:
23642365
raise InterfaceError("An error response was received" if tag == isc_info_error
2365-
else "Result code does not match request code")
2366+
else f"Result code does not match request code {info_code}")
23662367
#
23672368
return self._handlers[info_code]()
23682369
# Functions
@@ -2799,13 +2800,15 @@ def get_info(self, info_code: StmtInfoCode) -> Any:
27992800
"""
28002801
if info_code not in self._handlers:
28012802
raise NotSupportedError(f"Info code {info_code} not supported by engine version {self._stmt()._connection()._engine_version()}")
2803+
self.response.clear()
28022804
request = bytes([info_code])
28032805
self._get_data(request)
2806+
if self.response.is_eof():
2807+
return None
28042808
tag = self.response.get_tag()
28052809
if request[0] != tag:
28062810
raise InterfaceError("An error response was received" if tag == isc_info_error
2807-
else "Result code does not match request code")
2808-
#
2811+
else f"Result code does not match request code {info_code}")
28092812
return self._handlers[info_code]()
28102813

28112814
class StatementInfoProvider4(StatementInfoProvider3):

tests/test_info_providers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
@pytest.fixture()
4343
def prepared_statement(db_connection):
4444
"""Provides a prepared statement for statement info tests."""
45+
# This is needed for StmtInfoCode.EXEC_PATH_BLR_BYTES and EXEC_PATH_BLR_TEXT to work
46+
with db_connection.cursor() as cur:
47+
cur.execute('set debug option dsql_keep_blr = true')
48+
db_connection.commit()
4549
# Need a transaction active for prepare
4650
with db_connection.transaction_manager() as tm:
4751
with tm.cursor() as cur:

0 commit comments

Comments
 (0)