2 @message |
Server crashed ?
firebird.driver.types.DatabaseError: Error writing data to the connection.
LOG DETAILS:
2025-02-20 11:17:25.354
2025-02-20 11:17:25.362 act = <firebird.qa.plugin.Action object at [hex]>
2025-02-20 11:17:25.369 tmp_user = <firebird.qa.plugin.User object at [hex]>
2025-02-20 11:17:25.376 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-02-20 11:17:25.383
2025-02-20 11:17:25.391 @pytest.mark.version('>=3.0.4')
2025-02-20 11:17:25.404 def test_1(act: Action, tmp_user: User, capsys):
2025-02-20 11:17:25.415
2025-02-20 11:17:25.423 init_ddl = [
2025-02-20 11:17:25.430 """
2025-02-20 11:17:25.437 set bail on;
2025-02-20 11:17:25.443 recreate sequence g;
2025-02-20 11:17:25.453 create table test(id int primary key, measure int, iter_no int);
2025-02-20 11:17:25.465
2025-02-20 11:17:25.477 create view v_test1 as select * from test;
2025-02-20 11:17:25.490 """
2025-02-20 11:17:25.503 ,'\n'.join( ['create view v_test%s as select * from v_test%s;' % (str(i), str(i-1)) for i in range(2,NESTED_LIMIT+1) ] )
2025-02-20 11:17:25.511 ,f"""
2025-02-20 11:17:25.519 commit;
2025-02-20 11:17:25.526
2025-02-20 11:17:25.533 set term ^;
2025-02-20 11:17:25.549 create procedure sp_run(a_measure smallint, n_iterations int) as
2025-02-20 11:17:25.558 begin
2025-02-20 11:17:25.565 while ( n_iterations > 0 ) do
2025-02-20 11:17:25.572 begin
2025-02-20 11:17:25.581 execute statement 'update v_test{NESTED_LIMIT} set measure = ' || a_measure || ', iter_no = ' || n_iterations;
2025-02-20 11:17:25.590 n_iterations = n_iterations - 1;
2025-02-20 11:17:25.602 end
2025-02-20 11:17:25.614
2025-02-20 11:17:25.624 end
2025-02-20 11:17:25.633 ^
2025-02-20 11:17:25.646 set term ;^
2025-02-20 11:17:25.656 commit;
2025-02-20 11:17:25.664
2025-02-20 11:17:25.671 grant execute on procedure sp_run to {tmp_user.name};
2025-02-20 11:17:25.679 grant select, update on v_test{NESTED_LIMIT} to {tmp_user.name};
2025-02-20 11:17:25.685 grant usage on sequence g to {tmp_user.name};
2025-02-20 11:17:25.690 commit;
2025-02-20 11:17:25.697
2025-02-20 11:17:25.709 insert into v_test{NESTED_LIMIT}(id, measure, iter_no) values(0,-1,-1);
2025-02-20 11:17:25.719 commit;
2025-02-20 11:17:25.728 """
2025-02-20 11:17:25.735 ]
2025-02-20 11:17:25.741
2025-02-20 11:17:25.751 act.expected_stdout = ''
2025-02-20 11:17:25.767 act.isql(input = '\n'.join(init_ddl), combine_output = True)
2025-02-20 11:17:25.777 assert act.clean_stdout == act.clean_expected_stdout
2025-02-20 11:17:25.789 act.reset()
2025-02-20 11:17:25.800
2025-02-20 11:17:25.809 #------------------------------------------------------------
2025-02-20 11:17:25.823
2025-02-20 11:17:25.835 pid_sttm = 'select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection'
2025-02-20 11:17:25.845 with act.db.connect() as con_sysdba, act.db.connect(user = tmp_user.name, password = tmp_user.password) as con_nondba:
2025-02-20 11:17:25.860 cur_sysdba = con_sysdba.cursor()
2025-02-20 11:17:25.875 cur_nondba = con_nondba.cursor()
2025-02-20 11:17:25.891 cur_sysdba.execute(pid_sttm)
2025-02-20 11:17:25.902 cur_nondba.execute(pid_sttm)
2025-02-20 11:17:25.912 pid_sysdba = cur_sysdba.fetchone()[0]
2025-02-20 11:17:25.920 pid_nondba = cur_nondba.fetchone()[0]
2025-02-20 11:17:25.928
2025-02-20 11:17:25.935 sp_time = {}
2025-02-20 11:17:25.943 for who in (act.db.user, tmp_user.name):
2025-02-20 11:17:25.950 fb_pid = pid_sysdba if who == act.db.user else pid_nondba
2025-02-20 11:17:25.956 con = con_sysdba if who == act.db.user else con_nondba
2025-02-20 11:17:25.962 cur = cur_sysdba if who == act.db.user else cur_nondba
2025-02-20 11:17:25.971
2025-02-20 11:17:25.985 for iter_no in range(0, N_MEASURES):
2025-02-20 11:17:25.996 fb_info_init = psutil.Process(fb_pid).cpu_times()
2025-02-20 11:17:26.005 > cur.callproc( 'sp_run', (iter_no, N_COUNT_PER_MEASURE,) )
2025-02-20 11:17:26.016
2025-02-20 11:17:26.029 tests/bugs/gh_6220_test.py:147:
2025-02-20 11:17:26.038 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:26.049
2025-02-20 11:17:26.059 self = <firebird.driver.core.Cursor object at [hex]>
2025-02-20 11:17:26.069 proc_name = 'sp_run', parameters = (18, 100)
2025-02-20 11:17:26.077
2025-02-20 11:17:26.086 def callproc(self, proc_name: str, parameters: Sequence=None) -> None:
2025-02-20 11:17:26.095 """Executes a stored procedure with the given name.
2025-02-20 11:17:26.103
2025-02-20 11:17:26.110 Arguments:
2025-02-20 11:17:26.120 proc_name: Stored procedure name.
2025-02-20 11:17:26.128 parameters: Sequence of parameters. Must contain one entry for each argument
2025-02-20 11:17:26.137 that the procedure expects.
2025-02-20 11:17:26.147
2025-02-20 11:17:26.161 .. note::
2025-02-20 11:17:26.173
2025-02-20 11:17:26.182 If stored procedure does have output parameters, you must retrieve their values
2025-02-20 11:17:26.191 saparatelly by `.Cursor.fetchone()` call. This method is not very convenient,
2025-02-20 11:17:26.201 but conforms to Python DB API 2.0. If you don't require conformance to Python
2025-02-20 11:17:26.215 DB API, it's recommended to use more convenient method `.Cursor.call_procedure()`
2025-02-20 11:17:26.226 instead.
2025-02-20 11:17:26.233 """
2025-02-20 11:17:26.246 params = [] if parameters is None else parameters
2025-02-20 11:17:26.262 sql = ('EXECUTE PROCEDURE ' + proc_name + ' '
2025-02-20 11:17:26.271 + ','.join('?' * len(params)))
2025-02-20 11:17:26.278 > self.execute(sql, params)
2025-02-20 11:17:26.285
2025-02-20 11:17:26.292 ../lib/python3.11/site-packages/firebird/driver/core.py:3682:
2025-02-20 11:17:26.299 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:26.307
2025-02-20 11:17:26.315 self = <firebird.driver.core.Cursor object at [hex]>
2025-02-20 11:17:26.324 operation = 'EXECUTE PROCEDURE sp_run ?,?', parameters = (18, 100)
2025-02-20 11:17:26.331
2025-02-20 11:17:26.341 def execute(self, operation: Union[str, Statement], parameters: Sequence[Any]=None) -> Cursor:
2025-02-20 11:17:26.348 """Executes SQL command or prepared `Statement`.
2025-02-20 11:17:26.355
2025-02-20 11:17:26.362 Starts new transaction if transaction manager associated with cursor is not active.
2025-02-20 11:17:26.374
2025-02-20 11:17:26.383 Arguments:
2025-02-20 11:17:26.392 operation: SQL command or prepared `Statement`.
2025-02-20 11:17:26.400 parameters: Sequence of parameters. Must contain one entry for each argument
2025-02-20 11:17:26.408 that the operation expects.
2025-02-20 11:17:26.415
2025-02-20 11:17:26.422 Returns:
2025-02-20 11:17:26.431 `self` so call to execute could be used as iterator over returned rows.
2025-02-20 11:17:26.444
2025-02-20 11:17:26.453 Note:
2025-02-20 11:17:26.466 If `operation` is a string with SQL command that is exactly the same as the
2025-02-20 11:17:26.480 last executed command, the internally prepared `Statement` from last execution
2025-02-20 11:17:26.489 is reused.
2025-02-20 11:17:26.495
2025-02-20 11:17:26.502 If cursor is open, it's closed before new statement is executed.
2025-02-20 11:17:26.509 """
2025-02-20 11:17:26.515 > self._execute(operation, parameters)
2025-02-20 11:17:26.520
2025-02-20 11:17:26.530 ../lib/python3.11/site-packages/firebird/driver/core.py:3755:
2025-02-20 11:17:26.537 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:26.544
2025-02-20 11:17:26.551 self = <firebird.driver.core.Cursor object at [hex]>
2025-02-20 11:17:26.567 operation = 'EXECUTE PROCEDURE sp_run ?,?', parameters = (18, 100)
2025-02-20 11:17:26.575 flags = <CursorFlag.NONE: 0>
2025-02-20 11:17:26.582
2025-02-20 11:17:26.592 def _execute(self, operation: Union[str, Statement],
2025-02-20 11:17:26.604 parameters: Sequence=None, flags: CursorFlag=CursorFlag.NONE) -> None:
2025-02-20 11:17:26.614 if not self._transaction.is_active():
2025-02-20 11:17:26.623 self._transaction.begin()
2025-02-20 11:17:26.630 if isinstance(operation, Statement):
2025-02-20 11:17:26.642 if operation._connection() is not self._connection:
2025-02-20 11:17:26.653 raise InterfaceError('Cannot execute Statement that was created by different Connection.')
2025-02-20 11:17:26.667 self.close()
2025-02-20 11:17:26.676 self._stmt = operation
2025-02-20 11:17:26.684 self.__internal = False
2025-02-20 11:17:26.693 elif self._stmt is not None and self._stmt.sql == operation:
2025-02-20 11:17:26.701 # We should execute the same SQL string again
2025-02-20 11:17:26.715 self._clear()
2025-02-20 11:17:26.725 else:
2025-02-20 11:17:26.739 self.close()
2025-02-20 11:17:26.751 self._stmt = self._connection._prepare(operation, self._transaction)
2025-02-20 11:17:26.760 self.__internal = True
2025-02-20 11:17:26.769 self._cursor_flags = flags
2025-02-20 11:17:26.776 in_meta = None
2025-02-20 11:17:26.783 # Execute the statement
2025-02-20 11:17:26.791 try:
2025-02-20 11:17:26.799 if self._stmt._in_cnt > 0:
2025-02-20 11:17:26.807 in_meta, self._stmt._in_buffer = self._pack_input(self._stmt._in_meta,
2025-02-20 11:17:26.816 self._stmt._in_buffer,
2025-02-20 11:17:26.823 parameters)
2025-02-20 11:17:26.830 if self._stmt.has_cursor():
2025-02-20 11:17:26.841 # Statement returns multiple rows
2025-02-20 11:17:26.849 self._result = self._stmt._istmt.open_cursor(self._transaction._tra,
2025-02-20 11:17:26.860 in_meta, self._stmt._in_buffer,
2025-02-20 11:17:26.871 self._stmt._out_meta,
2025-02-20 11:17:26.885 flags)
2025-02-20 11:17:26.897 else:
2025-02-20 11:17:26.913 # Statement may return single row
2025-02-20 11:17:26.924 > self._stmt._istmt.execute(self._transaction._tra, in_meta,
2025-02-20 11:17:26.932 self._stmt._in_buffer,
2025-02-20 11:17:26.941 self._stmt._out_meta, self._stmt._out_buffer)
2025-02-20 11:17:26.947
2025-02-20 11:17:26.956 ../lib/python3.11/site-packages/firebird/driver/core.py:3643:
2025-02-20 11:17:26.964 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:26.971
2025-02-20 11:17:26.979 self = <firebird.driver.interfaces.iStatement object at [hex]>
2025-02-20 11:17:26.987 transaction = <firebird.driver.interfaces.iTransaction object at [hex]>
2025-02-20 11:17:26.995 in_meta = <firebird.driver.interfaces.iMessageMetadata object at [hex]>
2025-02-20 11:17:27.004 in_buffer = <ctypes.c_char_Array_10 object at [hex]>, out_meta = None
2025-02-20 11:17:27.011 out_buffer = None
2025-02-20 11:17:27.019
2025-02-20 11:17:27.027 def execute(self, transaction: iTransaction, in_meta: iMessageMetadata, in_buffer: bytes,
2025-02-20 11:17:27.035 out_meta: iMessageMetadata, out_buffer: bytes) -> None:
2025-02-20 11:17:27.045 """Executes any SQL statement except returning multiple rows of data.
2025-02-20 11:17:27.055 Partial analogue of `isc_dsql_execute2()` - in and out XSLQDAs replaced with input
2025-02-20 11:17:27.066 and output messages with appropriate buffers."""
2025-02-20 11:17:27.078 result = self.vtable.execute(self, self.status, transaction, in_meta, in_buffer, out_meta, out_buffer)
2025-02-20 11:17:27.087 > self._check()
2025-02-20 11:17:27.100
2025-02-20 11:17:27.113 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:778:
2025-02-20 11:17:27.124 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:27.133
2025-02-20 11:17:27.141 self = <firebird.driver.interfaces.iStatement object at [hex]>
2025-02-20 11:17:27.147
2025-02-20 11:17:27.155 def _check(self) -> None:
2025-02-20 11:17:27.162 state = self.status.get_state()
2025-02-20 11:17:27.172 if StateFlag.ERRORS in state:
2025-02-20 11:17:27.188 > raise self.__report(DatabaseError, self.status.get_errors())
2025-02-20 11:17:27.199 E firebird.driver.types.DatabaseError: Error reading data from the connection.
2025-02-20 11:17:27.209
2025-02-20 11:17:27.221 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
2025-02-20 11:17:27.231
2025-02-20 11:17:27.240 During handling of the above exception, another exception occurred:
2025-02-20 11:17:27.248
2025-02-20 11:17:27.263 act = <firebird.qa.plugin.Action object at [hex]>
2025-02-20 11:17:27.278 tmp_user = <firebird.qa.plugin.User object at [hex]>
2025-02-20 11:17:27.291 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-02-20 11:17:27.301
2025-02-20 11:17:27.314 @pytest.mark.version('>=3.0.4')
2025-02-20 11:17:27.330 def test_1(act: Action, tmp_user: User, capsys):
2025-02-20 11:17:27.346
2025-02-20 11:17:27.356 init_ddl = [
2025-02-20 11:17:27.364 """
2025-02-20 11:17:27.371 set bail on;
2025-02-20 11:17:27.377 recreate sequence g;
2025-02-20 11:17:27.383 create table test(id int primary key, measure int, iter_no int);
2025-02-20 11:17:27.390
2025-02-20 11:17:27.400 create view v_test1 as select * from test;
2025-02-20 11:17:27.413 """
2025-02-20 11:17:27.422 ,'\n'.join( ['create view v_test%s as select * from v_test%s;' % (str(i), str(i-1)) for i in range(2,NESTED_LIMIT+1) ] )
2025-02-20 11:17:27.431 ,f"""
2025-02-20 11:17:27.443 commit;
2025-02-20 11:17:27.455
2025-02-20 11:17:27.467 set term ^;
2025-02-20 11:17:27.476 create procedure sp_run(a_measure smallint, n_iterations int) as
2025-02-20 11:17:27.483 begin
2025-02-20 11:17:27.490 while ( n_iterations > 0 ) do
2025-02-20 11:17:27.495 begin
2025-02-20 11:17:27.501 execute statement 'update v_test{NESTED_LIMIT} set measure = ' || a_measure || ', iter_no = ' || n_iterations;
2025-02-20 11:17:27.508 n_iterations = n_iterations - 1;
2025-02-20 11:17:27.517 end
2025-02-20 11:17:27.526
2025-02-20 11:17:27.536 end
2025-02-20 11:17:27.550 ^
2025-02-20 11:17:27.563 set term ;^
2025-02-20 11:17:27.572 commit;
2025-02-20 11:17:27.580
2025-02-20 11:17:27.588 grant execute on procedure sp_run to {tmp_user.name};
2025-02-20 11:17:27.596 grant select, update on v_test{NESTED_LIMIT} to {tmp_user.name};
2025-02-20 11:17:27.603 grant usage on sequence g to {tmp_user.name};
2025-02-20 11:17:27.610 commit;
2025-02-20 11:17:27.616
2025-02-20 11:17:27.623 insert into v_test{NESTED_LIMIT}(id, measure, iter_no) values(0,-1,-1);
2025-02-20 11:17:27.632 commit;
2025-02-20 11:17:27.644 """
2025-02-20 11:17:27.658 ]
2025-02-20 11:17:27.672
2025-02-20 11:17:27.681 act.expected_stdout = ''
2025-02-20 11:17:27.688 act.isql(input = '\n'.join(init_ddl), combine_output = True)
2025-02-20 11:17:27.695 assert act.clean_stdout == act.clean_expected_stdout
2025-02-20 11:17:27.704 act.reset()
2025-02-20 11:17:27.717
2025-02-20 11:17:27.725 #------------------------------------------------------------
2025-02-20 11:17:27.736
2025-02-20 11:17:27.750 pid_sttm = 'select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection'
2025-02-20 11:17:27.762 > with act.db.connect() as con_sysdba, act.db.connect(user = tmp_user.name, password = tmp_user.password) as con_nondba:
2025-02-20 11:17:27.774
2025-02-20 11:17:27.785 tests/bugs/gh_6220_test.py:131:
2025-02-20 11:17:27.795 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:27.812
2025-02-20 11:17:27.831 self = Connection[5418]
2025-02-20 11:17:27.839 exc_type = <class 'firebird.driver.types.DatabaseError'>
2025-02-20 11:17:27.844 exc_value = DatabaseError('Error reading data from the connection.')
2025-02-20 11:17:27.855 traceback = <traceback object at [hex]>
2025-02-20 11:17:27.865
2025-02-20 11:17:27.875 def __exit__(self, exc_type, exc_value, traceback) -> None:
2025-02-20 11:17:27.883 > self.close()
2025-02-20 11:17:27.894
2025-02-20 11:17:27.907 ../lib/python3.11/site-packages/firebird/driver/core.py:1666:
2025-02-20 11:17:27.918 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:27.929
2025-02-20 11:17:27.938 self = Connection[5418]
2025-02-20 11:17:27.945
2025-02-20 11:17:27.954 def close(self) -> None:
2025-02-20 11:17:27.962 """Close the connection and release all associated resources.
2025-02-20 11:17:27.974
2025-02-20 11:17:27.983 Closes all event collectors, transaction managers (with rollback) and statements
2025-02-20 11:17:27.990 associated with this connection before attempt (see Hooks) to close the
2025-02-20 11:17:27.997 connection itself.
2025-02-20 11:17:28.007
2025-02-20 11:17:28.017 Hooks:
2025-02-20 11:17:28.025 Event `.ConnectionHook.DETACH_REQUEST`: Executed before connection
2025-02-20 11:17:28.032 is closed. Hook must have signature::
2025-02-20 11:17:28.038
2025-02-20 11:17:28.044 hook_func(connection: Connection) -> bool
2025-02-20 11:17:28.051
2025-02-20 11:17:28.058 .. note::
2025-02-20 11:17:28.064
2025-02-20 11:17:28.073 If any hook function returns True, connection is NOT closed.
2025-02-20 11:17:28.080
2025-02-20 11:17:28.087 Event `.ConnectionHook.CLOSED`: Executed after connection is closed.
2025-02-20 11:17:28.094 Hook must have signature::
2025-02-20 11:17:28.101
2025-02-20 11:17:28.107 hook_func(connection: Connection) -> None
2025-02-20 11:17:28.114
2025-02-20 11:17:28.129 Any value returned by hook is ignored.
2025-02-20 11:17:28.138
2025-02-20 11:17:28.146 Important:
2025-02-20 11:17:28.152 Closed connection SHALL NOT be used anymore.
2025-02-20 11:17:28.162 """
2025-02-20 11:17:28.170 if not self.is_closed():
2025-02-20 11:17:28.178 retain = False
2025-02-20 11:17:28.186 try:
2025-02-20 11:17:28.193 > self._close()
2025-02-20 11:17:28.201
2025-02-20 11:17:28.209 ../lib/python3.11/site-packages/firebird/driver/core.py:1854:
2025-02-20 11:17:28.217 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:28.223
2025-02-20 11:17:28.229 self = Connection[5418]
2025-02-20 11:17:28.235
2025-02-20 11:17:28.240 def _close(self) -> None:
2025-02-20 11:17:28.246 if self.__schema is not None:
2025-02-20 11:17:28.254 self.__schema._set_internal(False)
2025-02-20 11:17:28.262 self.__schema.close()
2025-02-20 11:17:28.269 if self.__monitor is not None:
2025-02-20 11:17:28.275 self.__monitor._set_internal(False)
2025-02-20 11:17:28.283 self.__monitor.close()
2025-02-20 11:17:28.289 self._ic.close()
2025-02-20 11:17:28.295 for collector in self.__ecollectors:
2025-02-20 11:17:28.300 collector.close()
2025-02-20 11:17:28.306 > self.main_transaction._finish(DefaultAction.ROLLBACK)
2025-02-20 11:17:28.312
2025-02-20 11:17:28.318 ../lib/python3.11/site-packages/firebird/driver/core.py:1691:
2025-02-20 11:17:28.333 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:28.344
2025-02-20 11:17:28.352 self = <firebird.driver.core.TransactionManager object at [hex]>
2025-02-20 11:17:28.359 default_action = <DefaultAction.ROLLBACK: 2>
2025-02-20 11:17:28.365
2025-02-20 11:17:28.372 def _finish(self, default_action: DefaultAction=None) -> None:
2025-02-20 11:17:28.387 try:
2025-02-20 11:17:28.399 if self._tra is not None:
2025-02-20 11:17:28.405 if default_action is None:
2025-02-20 11:17:28.413 default_action = self.default_action
2025-02-20 11:17:28.421 if default_action == DefaultAction.COMMIT:
2025-02-20 11:17:28.432 self.commit()
2025-02-20 11:17:28.447 else:
2025-02-20 11:17:28.461 > self.rollback()
2025-02-20 11:17:28.468
2025-02-20 11:17:28.474 ../lib/python3.11/site-packages/firebird/driver/core.py:2399:
2025-02-20 11:17:28.481 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:28.488
2025-02-20 11:17:28.495 self = <firebird.driver.core.TransactionManager object at [hex]>
2025-02-20 11:17:28.502
2025-02-20 11:17:28.512 def rollback(self, *, retaining: bool=False, savepoint: str=None) -> None:
2025-02-20 11:17:28.525 """Rolls back the transaction managed by this instance.
2025-02-20 11:17:28.538
2025-02-20 11:17:28.546 Arguments:
2025-02-20 11:17:28.555 retaining: When True, the transaction context is retained after rollback.
2025-02-20 11:17:28.564 savepoint: When specified, the transaction is rolled back to savepoint with given name.
2025-02-20 11:17:28.572
2025-02-20 11:17:28.579 Raises:
2025-02-20 11:17:28.587 InterfaceError: When both retaining and savepoint parameters are specified.
2025-02-20 11:17:28.594 """
2025-02-20 11:17:28.605 assert not self.__closed
2025-02-20 11:17:28.614 assert self.is_active()
2025-02-20 11:17:28.623 if retaining and savepoint:
2025-02-20 11:17:28.633 raise InterfaceError("Can't rollback to savepoint while retaining context")
2025-02-20 11:17:28.641 if savepoint:
2025-02-20 11:17:28.657 self.execute_immediate(f'rollback to {savepoint}')
2025-02-20 11:17:28.667 else:
2025-02-20 11:17:28.676 if retaining:
2025-02-20 11:17:28.683 self._tra.rollback_retaining()
2025-02-20 11:17:28.691 else:
2025-02-20 11:17:28.699 > self._close_cursors()
2025-02-20 11:17:28.711
2025-02-20 11:17:28.721 ../lib/python3.11/site-packages/firebird/driver/core.py:2486:
2025-02-20 11:17:28.729 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:28.735
2025-02-20 11:17:28.743 self = <firebird.driver.core.TransactionManager object at [hex]>
2025-02-20 11:17:28.756
2025-02-20 11:17:28.770 def _close_cursors(self) -> None:
2025-02-20 11:17:28.780 for cursor in self._cursors:
2025-02-20 11:17:28.788 c = cursor()
2025-02-20 11:17:28.796 if c:
2025-02-20 11:17:28.803 > c.close()
2025-02-20 11:17:28.812
2025-02-20 11:17:28.821 ../lib/python3.11/site-packages/firebird/driver/core.py:2388:
2025-02-20 11:17:28.829 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:28.842
2025-02-20 11:17:28.853 self = <firebird.driver.core.Cursor object at [hex]>
2025-02-20 11:17:28.861
2025-02-20 11:17:28.868 def close(self) -> None:
2025-02-20 11:17:28.880 """Close the cursor and release all associated resources.
2025-02-20 11:17:28.889
2025-02-20 11:17:28.897 The result set (if any) from last executed statement is released, and if executed
2025-02-20 11:17:28.903 `Statement` was not supplied externally, it's released as well.
2025-02-20 11:17:28.918
2025-02-20 11:17:28.932 Note:
2025-02-20 11:17:28.942 The closed cursor could be used to execute further SQL commands.
2025-02-20 11:17:28.956 """
2025-02-20 11:17:28.965 self._clear()
2025-02-20 11:17:28.974 if self._stmt is not None:
2025-02-20 11:17:28.981 if self.__internal:
2025-02-20 11:17:28.989 > self._stmt.free()
2025-02-20 11:17:28.996
2025-02-20 11:17:29.003 ../lib/python3.11/site-packages/firebird/driver/core.py:3791:
2025-02-20 11:17:29.011 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:29.018
2025-02-20 11:17:29.025 self = Statement[EXECUTE PROCEDURE sp_run ?,?]
2025-02-20 11:17:29.032
2025-02-20 11:17:29.038 def free(self) -> None:
2025-02-20 11:17:29.047 """Release the statement and all associated resources.
2025-02-20 11:17:29.053
2025-02-20 11:17:29.059 Important:
2025-02-20 11:17:29.066 The statement SHALL NOT be used after call to this method.
2025-02-20 11:17:29.077 """
2025-02-20 11:17:29.091 if self._in_meta is not None:
2025-02-20 11:17:29.102 self._in_meta.release()
2025-02-20 11:17:29.110 self._in_meta = None
2025-02-20 11:17:29.123 if self._out_meta is not None:
2025-02-20 11:17:29.134 self._out_meta.release()
2025-02-20 11:17:29.144 self._out_meta = None
2025-02-20 11:17:29.153 if self._istmt is not None:
2025-02-20 11:17:29.160 > self._istmt.free()
2025-02-20 11:17:29.167
2025-02-20 11:17:29.174 ../lib/python3.11/site-packages/firebird/driver/core.py:2736:
2025-02-20 11:17:29.183 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:29.191
2025-02-20 11:17:29.198 self = <firebird.driver.interfaces.iStatement object at [hex]>
2025-02-20 11:17:29.207
2025-02-20 11:17:29.216 def free(self) -> None:
2025-02-20 11:17:29.225 "Free statement, releases interface on success"
2025-02-20 11:17:29.245 self.vtable.free(self, self.status)
2025-02-20 11:17:29.255 > self._check()
2025-02-20 11:17:29.264
2025-02-20 11:17:29.272 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:832:
2025-02-20 11:17:29.280 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
2025-02-20 11:17:29.287
2025-02-20 11:17:29.294 self = <firebird.driver.interfaces.iStatement object at [hex]>
2025-02-20 11:17:29.301
2025-02-20 11:17:29.307 def _check(self) -> None:
2025-02-20 11:17:29.314 state = self.status.get_state()
2025-02-20 11:17:29.322 if StateFlag.ERRORS in state:
2025-02-20 11:17:29.332 > raise self.__report(DatabaseError, self.status.get_errors())
2025-02-20 11:17:29.345 E firebird.driver.types.DatabaseError: Error writing data to the connection.
2025-02-20 11:17:29.354
2025-02-20 11:17:29.361 ../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
2025-02-20 11:17:29.376 ---------------------------- Captured stdout setup -----------------------------
2025-02-20 11:17:29.392 Creating db: localhost:/var/tmp/qa_2024/test_11415/test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
2025-02-20 11:17:29.404 CREATE user: TMP$GH_6220 PLUGIN: Srp
2025-02-20 11:17:29.415 --------------------------- Captured stdout teardown ---------------------------
2025-02-20 11:17:29.429 DROP user: TMP$GH_6220 PLUGIN: Srp
|
3 #text |
act = <firebird.qa.plugin.Action pytest object at [hex]>
tmp_user = <firebird.qa.plugin.User pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.version('>=3.0.4')
def test_1(act: Action, tmp_user: User, capsys):
init_ddl = [
"""
set bail on;
recreate sequence g;
create table test(id int primary key, measure int, iter_no int);
create view v_test1 as select * from test;
"""
,'\n'.join( ['create view v_test%s as select * from v_test%s;' % (str(i), str(i-1)) for i in range(2,NESTED_LIMIT+1) ] )
,f"""
commit;
set term ^;
create procedure sp_run(a_measure smallint, n_iterations int) as
begin
while ( n_iterations > 0 ) do
begin
execute statement 'update v_test{NESTED_LIMIT} set measure = ' || a_measure || ', iter_no = ' || n_iterations;
n_iterations = n_iterations - 1;
end
end
^
set term ;^
commit;
grant execute on procedure sp_run to {tmp_user.name};
grant select, update on v_test{NESTED_LIMIT} to {tmp_user.name};
grant usage on sequence g to {tmp_user.name};
commit;
insert into v_test{NESTED_LIMIT}(id, measure, iter_no) values(0,-1,-1);
commit;
"""
]
act.expected_stdout = ''
act.isql(input = '\n'.join(init_ddl), combine_output = True)
assert act.clean_stdout == act.clean_expected_stdout
act.reset()
#------------------------------------------------------------
pid_sttm = 'select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection'
with act.db.connect() as con_sysdba, act.db.connect(user = tmp_user.name, password = tmp_user.password) as con_nondba:
cur_sysdba = con_sysdba.cursor()
cur_nondba = con_nondba.cursor()
cur_sysdba.execute(pid_sttm)
cur_nondba.execute(pid_sttm)
pid_sysdba = cur_sysdba.fetchone()[0]
pid_nondba = cur_nondba.fetchone()[0]
sp_time = {}
for who in (act.db.user, tmp_user.name):
fb_pid = pid_sysdba if who == act.db.user else pid_nondba
con = con_sysdba if who == act.db.user else con_nondba
cur = cur_sysdba if who == act.db.user else cur_nondba
for iter_no in range(0, N_MEASURES):
fb_info_init = psutil.Process(fb_pid).cpu_times()
> cur.callproc( 'sp_run', (iter_no, N_COUNT_PER_MEASURE,) )
tests/bugs/gh_6220_test.py:147:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
proc_name = 'sp_run', parameters = (18, 100)
def callproc(self, proc_name: str, parameters: Sequence=None) -> None:
"""Executes a stored procedure with the given name.
Arguments:
proc_name: Stored procedure name.
parameters: Sequence of parameters. Must contain one entry for each argument
that the procedure expects.
.. note::
If stored procedure does have output parameters, you must retrieve their values
saparatelly by `.Cursor.fetchone()` call. This method is not very convenient,
but conforms to Python DB API 2.0. If you don't require conformance to Python
DB API, it's recommended to use more convenient method `.Cursor.call_procedure()`
instead.
"""
params = [] if parameters is None else parameters
sql = ('EXECUTE PROCEDURE ' + proc_name + ' '
+ ','.join('?' * len(params)))
> self.execute(sql, params)
../lib/python3.11/site-packages/firebird/driver/core.py:3682:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
operation = 'EXECUTE PROCEDURE sp_run ?,?', parameters = (18, 100)
def execute(self, operation: Union[str, Statement], parameters: Sequence[Any]=None) -> Cursor:
"""Executes SQL command or prepared `Statement`.
Starts new transaction if transaction manager associated with cursor is not active.
Arguments:
operation: SQL command or prepared `Statement`.
parameters: Sequence of parameters. Must contain one entry for each argument
that the operation expects.
Returns:
`self` so call to execute could be used as iterator over returned rows.
Note:
If `operation` is a string with SQL command that is exactly the same as the
last executed command, the internally prepared `Statement` from last execution
is reused.
If cursor is open, it's closed before new statement is executed.
"""
> self._execute(operation, parameters)
../lib/python3.11/site-packages/firebird/driver/core.py:3755:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
operation = 'EXECUTE PROCEDURE sp_run ?,?', parameters = (18, 100)
flags = <CursorFlag.NONE: 0>
def _execute(self, operation: Union[str, Statement],
parameters: Sequence=None, flags: CursorFlag=CursorFlag.NONE) -> None:
if not self._transaction.is_active():
self._transaction.begin()
if isinstance(operation, Statement):
if operation._connection() is not self._connection:
raise InterfaceError('Cannot execute Statement that was created by different Connection.')
self.close()
self._stmt = operation
self.__internal = False
elif self._stmt is not None and self._stmt.sql == operation:
# We should execute the same SQL string again
self._clear()
else:
self.close()
self._stmt = self._connection._prepare(operation, self._transaction)
self.__internal = True
self._cursor_flags = flags
in_meta = None
# Execute the statement
try:
if self._stmt._in_cnt > 0:
in_meta, self._stmt._in_buffer = self._pack_input(self._stmt._in_meta,
self._stmt._in_buffer,
parameters)
if self._stmt.has_cursor():
# Statement returns multiple rows
self._result = self._stmt._istmt.open_cursor(self._transaction._tra,
in_meta, self._stmt._in_buffer,
self._stmt._out_meta,
flags)
else:
# Statement may return single row
> self._stmt._istmt.execute(self._transaction._tra, in_meta,
self._stmt._in_buffer,
self._stmt._out_meta, self._stmt._out_buffer)
../lib/python3.11/site-packages/firebird/driver/core.py:3643:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iStatement pytest object at [hex]>
transaction = <firebird.driver.interfaces.iTransaction pytest object at [hex]>
in_meta = <firebird.driver.interfaces.iMessageMetadata pytest object at [hex]>
in_buffer = <ctypes.c_char_Array_10 pytest object at [hex]>, out_meta = None
out_buffer = None
def execute(self, transaction: iTransaction, in_meta: iMessageMetadata, in_buffer: bytes,
out_meta: iMessageMetadata, out_buffer: bytes) -> None:
"""Executes any SQL statement except returning multiple rows of data.
Partial analogue of `isc_dsql_execute2()` - in and out XSLQDAs replaced with input
and output messages with appropriate buffers."""
result = self.vtable.execute(self, self.status, transaction, in_meta, in_buffer, out_meta, out_buffer)
> self._check()
../lib/python3.11/site-packages/firebird/driver/interfaces.py:778:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iStatement pytest object at [hex]>
def _check(self) -> None:
state = self.status.get_state()
if StateFlag.ERRORS in state:
> raise self.__report(DatabaseError, self.status.get_errors())
E firebird.driver.types.DatabaseError: Error reading data from the connection.
../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
During handling of the above exception, another exception occurred:
act = <firebird.qa.plugin.Action pytest object at [hex]>
tmp_user = <firebird.qa.plugin.User pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.version('>=3.0.4')
def test_1(act: Action, tmp_user: User, capsys):
init_ddl = [
"""
set bail on;
recreate sequence g;
create table test(id int primary key, measure int, iter_no int);
create view v_test1 as select * from test;
"""
,'\n'.join( ['create view v_test%s as select * from v_test%s;' % (str(i), str(i-1)) for i in range(2,NESTED_LIMIT+1) ] )
,f"""
commit;
set term ^;
create procedure sp_run(a_measure smallint, n_iterations int) as
begin
while ( n_iterations > 0 ) do
begin
execute statement 'update v_test{NESTED_LIMIT} set measure = ' || a_measure || ', iter_no = ' || n_iterations;
n_iterations = n_iterations - 1;
end
end
^
set term ;^
commit;
grant execute on procedure sp_run to {tmp_user.name};
grant select, update on v_test{NESTED_LIMIT} to {tmp_user.name};
grant usage on sequence g to {tmp_user.name};
commit;
insert into v_test{NESTED_LIMIT}(id, measure, iter_no) values(0,-1,-1);
commit;
"""
]
act.expected_stdout = ''
act.isql(input = '\n'.join(init_ddl), combine_output = True)
assert act.clean_stdout == act.clean_expected_stdout
act.reset()
#------------------------------------------------------------
pid_sttm = 'select mon$server_pid as p from mon$attachments where mon$attachment_id = current_connection'
> with act.db.connect() as con_sysdba, act.db.connect(user = tmp_user.name, password = tmp_user.password) as con_nondba:
tests/bugs/gh_6220_test.py:131:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[5418]
exc_type = <class 'firebird.driver.types.DatabaseError'>
exc_value = DatabaseError('Error reading data from the connection.')
traceback = <traceback pytest object at [hex]>
def __exit__(self, exc_type, exc_value, traceback) -> None:
> self.close()
../lib/python3.11/site-packages/firebird/driver/core.py:1666:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[5418]
def close(self) -> None:
"""Close the connection and release all associated resources.
Closes all event collectors, transaction managers (with rollback) and statements
associated with this connection before attempt (see Hooks) to close the
connection itself.
Hooks:
Event `.ConnectionHook.DETACH_REQUEST`: Executed before connection
is closed. Hook must have signature::
hook_func(connection: Connection) -> bool
.. note::
If any hook function returns True, connection is NOT closed.
Event `.ConnectionHook.CLOSED`: Executed after connection is closed.
Hook must have signature::
hook_func(connection: Connection) -> None
Any value returned by hook is ignored.
Important:
Closed connection SHALL NOT be used anymore.
"""
if not self.is_closed():
retain = False
try:
> self._close()
../lib/python3.11/site-packages/firebird/driver/core.py:1854:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Connection[5418]
def _close(self) -> None:
if self.__schema is not None:
self.__schema._set_internal(False)
self.__schema.close()
if self.__monitor is not None:
self.__monitor._set_internal(False)
self.__monitor.close()
self._ic.close()
for collector in self.__ecollectors:
collector.close()
> self.main_transaction._finish(DefaultAction.ROLLBACK)
../lib/python3.11/site-packages/firebird/driver/core.py:1691:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.TransactionManager pytest object at [hex]>
default_action = <DefaultAction.ROLLBACK: 2>
def _finish(self, default_action: DefaultAction=None) -> None:
try:
if self._tra is not None:
if default_action is None:
default_action = self.default_action
if default_action == DefaultAction.COMMIT:
self.commit()
else:
> self.rollback()
../lib/python3.11/site-packages/firebird/driver/core.py:2399:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.TransactionManager pytest object at [hex]>
def rollback(self, *, retaining: bool=False, savepoint: str=None) -> None:
"""Rolls back the transaction managed by this instance.
Arguments:
retaining: When True, the transaction context is retained after rollback.
savepoint: When specified, the transaction is rolled back to savepoint with given name.
Raises:
InterfaceError: When both retaining and savepoint parameters are specified.
"""
assert not self.__closed
assert self.is_active()
if retaining and savepoint:
raise InterfaceError("Can't rollback to savepoint while retaining context")
if savepoint:
self.execute_immediate(f'rollback to {savepoint}')
else:
if retaining:
self._tra.rollback_retaining()
else:
> self._close_cursors()
../lib/python3.11/site-packages/firebird/driver/core.py:2486:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.TransactionManager pytest object at [hex]>
def _close_cursors(self) -> None:
for cursor in self._cursors:
c = cursor()
if c:
> c.close()
../lib/python3.11/site-packages/firebird/driver/core.py:2388:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.core.Cursor pytest object at [hex]>
def close(self) -> None:
"""Close the cursor and release all associated resources.
The result set (if any) from last executed statement is released, and if executed
`Statement` was not supplied externally, it's released as well.
Note:
The closed cursor could be used to execute further SQL commands.
"""
self._clear()
if self._stmt is not None:
if self.__internal:
> self._stmt.free()
../lib/python3.11/site-packages/firebird/driver/core.py:3791:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = Statement[EXECUTE PROCEDURE sp_run ?,?]
def free(self) -> None:
"""Release the statement and all associated resources.
Important:
The statement SHALL NOT be used after call to this method.
"""
if self._in_meta is not None:
self._in_meta.release()
self._in_meta = None
if self._out_meta is not None:
self._out_meta.release()
self._out_meta = None
if self._istmt is not None:
> self._istmt.free()
../lib/python3.11/site-packages/firebird/driver/core.py:2736:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iStatement pytest object at [hex]>
def free(self) -> None:
"Free statement, releases interface on success"
self.vtable.free(self, self.status)
> self._check()
../lib/python3.11/site-packages/firebird/driver/interfaces.py:832:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <firebird.driver.interfaces.iStatement pytest object at [hex]>
def _check(self) -> None:
state = self.status.get_state()
if StateFlag.ERRORS in state:
> raise self.__report(DatabaseError, self.status.get_errors())
E firebird.driver.types.DatabaseError: Error writing data to the connection.
../lib/python3.11/site-packages/firebird/driver/interfaces.py:113: DatabaseError
|