#coding:utf-8 """ ID: issue-6001 ISSUE: 6001 TITLE: Invalid parameters of gds transaction in ISQL DESCRIPTION: ISQL hangs when trying to show various system objects in a case when other attachment has uncommitted changes to that objects We create (in Python connection) one table TEST1 with PK and commit transaction. Then we create second (similar) table TEST2 but do not commit transaction. After this we launch ISQL in async. mode and ask him to perform SHOW TABLE and SHOW INDEX commands. ISQL: 1) should NOT hang (it did this because of launching Tx in read committed NO record_version); 2) should output only info about table TEST1 and ints PK index. 3) should not output any info about non-committed DDL of table TEST2. Confirmed bug on 3.0.3.32837 and 4.0.0.800 (ISQL did hang when issued any of 'SHOW TABLE' / 'SHOW INDEX' copmmand). JIRA: CORE-5737 FBTEST: bugs.core_5737 """ import pytest import subprocess import time from pathlib import Path from firebird.qa import * db = db_factory() act = python_act('db') expected_stdout = """ TEST1 TEST1_ID_PK_DESC UNIQUE DESCENDING INDEX ON TEST1(ID) """ show_script = temp_file('show_script.sql') show_output = temp_file('show_script.out') @pytest.mark.version('>=3.0.3') def test_1(act: Action, show_script: Path, show_output: Path): show_script.write_text('show table;show index;') with act.db.connect() as con: con.execute_immediate('recreate table test1(id int primary key using descending index test1_id_pk_desc)') con.commit() c = con.cursor() c.execute('recreate table test2(id int primary key using descending index test2_id_pk_desc)') # WARNING: we launch ISQL here in async mode in order to have ability to kill its # process if it will hang! with open(show_output, mode='w') as show_out: p_show_sql = subprocess.Popen([act.vars['isql'], '-i', str(show_script), '-user', act.db.user, '-password', act.db.password, act.db.dsn], stdout=show_out, stderr=subprocess.STDOUT) try: time.sleep(4) finally: p_show_sql.terminate() # act.expected_stdout = expected_stdout act.stdout = show_output.read_text() assert act.clean_stdout == act.clean_expected_stdout