diff --git a/tests/bugs/core_4747_test.py b/tests/bugs/core_4747_test.py index 52ad3dcb..08ebe429 100644 --- a/tests/bugs/core_4747_test.py +++ b/tests/bugs/core_4747_test.py @@ -3,11 +3,24 @@ """ ID: issue-5052 ISSUE: 5052 -TITLE: Error "invalid BLOB ID" can occur when retrieving MON$STATEMENTS.MON$SQL_TEXT - using ES/EDS and db_connect argument is not specified +TITLE: Error "invalid BLOB ID" can occur when retrieving MON$STATEMENTS.MON$SQL_TEXT using ES/EDS and db_connect argument is not specified DESCRIPTION: JIRA: CORE-4747 FBTEST: bugs.core_4747 +NOTES: + [01.12.2023] pzotov + 1. Comments between statements are now handled by ISQL as *part* of some statement that follow after. + This causes these comment be reflected in mon$sql_statement.mon$sql_text if we want to search . + Because of this, it was decided to take out such comment from executable code (see 'test_sql' content: + previously it contained "21.05.2017: 4.0 Classic now has..." - but now this comment removed from there). + + This (new) behaviour of ISQL was introduced after implementation of PR #7868 + See example with 'strange appearance of comments': https://github.com/FirebirdSQL/firebird/pull/7868#issuecomment-1826727278 + + Currently this is not considered as a bug, see note by Adriano: https://groups.google.com/g/firebird-devel/c/AM8vlA3YJws + 2. QA does not allow to check too ancient FB version which is mentioned in the ticket (3.0.0 Beta 1, date: 12-apr-2015). + + Checked on 6.0.0.157, 5.0.0.1284, 4.0.5.3033 """ import pytest @@ -15,87 +28,80 @@ from firebird.qa import * db = db_factory() -test_script = """ - set list on; - set blob all; +substitutions=[ ('RUNNING_STT_ID[ ]+[0-9]+', 'RUNNING_STT_ID'), + ('RUNNING_TRN_ID[ ]+[0-9]+', 'RUNNING_TRN_ID'), + ('RUNNING_STT_TEXT.*', '') + ] - recreate table test(sid int, tid int, txt blob); - commit; - - -- NB, 21.05.2017: 4.0 Classic now has record in mon$statements with data from RDB$AUTH_MAPPING table. - -- We have to prevent appearance of this row in resultset which is to be analyzed, thus adding clause: - -- "where s.mon$sql_text containing 'test' ..." - - insert into test(sid, tid, txt) select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing 'test' rows 1; - commit; - - set term ^; - execute block returns( msg varchar(10), running_stt_id int, running_trn_id int, running_stt_text blob) as - declare v_dbname varchar(255); - declare v_stt1 varchar(1024) = 'select t.sid, t.tid, t.txt from test t'; - declare v_stt2 varchar(1024) = 'select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing ''test'' and s.mon$transaction_id = current_transaction rows 1'; - declare v_usr rdb$user = 'sysdba'; - declare v_pwd varchar(20) = 'masterkey'; - declare v_trn int; - begin - -- NOTE: v_dbname is NOT initialized with database connection string. - - msg = 'point-1'; - execute statement (v_stt1) - on external (v_dbname) - as user :v_usr password :v_pwd - into running_stt_id, running_trn_id, running_stt_text; - suspend; - - msg = 'point-2'; - execute statement (v_stt2) - on external (v_dbname) - as user :v_usr password :v_pwd - into running_stt_id, running_trn_id, running_stt_text ; - suspend; - end - ^ - set term ;^ - commit; - -- |||||||||||||||||||||||||||| - -- ###################################||| FB 4.0+, SS and SC |||############################## - -- |||||||||||||||||||||||||||| - -- If we check SS or SC and ExtConnPoolLifeTime > 0 (config parameter FB 4.0+) then current - -- DB (bugs.core_NNNN.fdb) will be 'captured' by firebird.exe process and fbt_run utility - -- will not able to drop this database at the final point of test. - -- Moreover, DB file will be hold until all activity in firebird.exe completed and AFTER this - -- we have to wait for seconds after it (discussion and small test see - -- in the letter to hvlad and dimitr 13.10.2019 11:10). - -- This means that one need to kill all connections to prevent from exception on cleanup phase: - -- SQLCODE: -901 / lock time-out on wait transaction / object is in use - -- ############################################################################################# - delete from mon$attachments where mon$attachment_id != current_connection; - commit; - -""" - -act = isql_act('db', test_script, - substitutions=[('RUNNING_STT_ID[ ]+[0-9]+', 'RUNNING_STT_ID'), - ('RUNNING_TRN_ID[ ]+[0-9]+', 'RUNNING_TRN_ID'), - ('RUNNING_STT_TEXT.*', '')]) - -expected_stdout = """ - MSG point-1 - RUNNING_STT_ID 111 - RUNNING_TRN_ID 219 - RUNNING_STT_TEXT 91:0 - insert into test(sid, tid, txt) select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing 'test' rows 1 - - MSG point-2 - RUNNING_STT_ID 140 - RUNNING_TRN_ID 224 - RUNNING_STT_TEXT 0:1 - select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing 'test' and s.mon$transaction_id = current_transaction rows 1 -""" +act = python_act('db', substitutions = substitutions) @pytest.mark.version('>=3') def test_1(act: Action): + + TEST_DML = "insert into test(sid, tid, txt) select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing 'test' rows 1" + + # 21.05.2017: 4.0 Classic now has record in mon$statements with data from RDB$AUTH_MAPPING table. + # We have to prevent appearance of this row in resultset which is to be analyzed, thus adding clause: + # "where s.mon$sql_text containing 'test' ..." + # + TEST_QRY = "select s.mon$statement_id, s.mon$transaction_id, s.mon$sql_text from mon$statements s where s.mon$sql_text containing 'test' and s.mon$transaction_id = current_transaction rows 1" + + test_sql = f""" + set list on; + set blob all; + + recreate table test(sid int, tid int, txt blob); + commit; + + {TEST_DML}; + commit; + + set term ^; + execute block returns( msg varchar(10), running_stt_id int, running_trn_id int, running_stt_text blob) as + declare v_dbname varchar(255); + declare v_stt1 varchar(1024) = 'select t.sid, t.tid, t.txt from test t'; + declare v_stt2 varchar(1024) = q'!{TEST_QRY}!'; + declare v_usr rdb$user = '{act.db.user}'; + declare v_pwd varchar(20) = '{act.db.password}'; + declare v_trn int; + begin + -- NOTE: v_dbname is NOT initialized with database connection string. + + msg = 'point-1'; + execute statement (v_stt1) + on external (v_dbname) + as user :v_usr password :v_pwd + into running_stt_id, running_trn_id, running_stt_text; + suspend; + + msg = 'point-2'; + execute statement (v_stt2) + on external (v_dbname) + as user :v_usr password :v_pwd + into running_stt_id, running_trn_id, running_stt_text ; + suspend; + end + ^ + set term ;^ + commit; + + """ + + expected_stdout = f""" + MSG point-1 + RUNNING_STT_ID 111 + RUNNING_TRN_ID 219 + RUNNING_STT_TEXT 91:0 + {TEST_DML} + + MSG point-2 + RUNNING_STT_ID 140 + RUNNING_TRN_ID 224 + RUNNING_STT_TEXT 0:1 + {TEST_QRY} + """ + act.expected_stdout = expected_stdout - act.execute() + act.isql(switches=['-q'], input = test_sql, combine_output = True) assert act.clean_stdout == act.clean_expected_stdout