#coding:utf-8 # # id: bugs.core_4382 # title: User savepoints are not released on commit # decription: # Added separate code for 4.0: one need to be sure that all changes have been flushed on disk before we launch gstat. # See letter from hvlad, 02.02.2019 22:30. # ::: NOTE ::: # !! It looks strange but if we put preparing statement in 'init_script' section than result of 'gstat -i' will be WRONG, # even if we do db_conn.close() before runProgram('gstat' ...) !! # Checked on: # 4.0.0.1421: OK, 3.340s. // SS, SC, CS # 3.0.5.33097: OK, 1.113s. # 2.5.9.27127: OK, 0.650s. # # tracker_id: CORE-4382 # min_versions: ['2.5.4'] # versions: 2.5.4, 4.0 # qmid: import pytest from firebird.qa import db_factory, python_act, Action # version: 2.5.4 # resources: None substitutions_1 = [('^((?!nodes).)*$', ''), ('Root page: [0-9]+,', ''), ('Depth', 'depth')] init_script_1 = """ create table g_test (f integer); create index g_ind on g_test (f); insert into g_test values (1); commit; update g_test set f=2; savepoint a; update g_test set f=3; savepoint b; update g_test set f=4; savepoint c; update g_test set f=5; savepoint d; update g_test set f=6; savepoint e; update g_test set f=7; commit; select * from g_test; COMMIT; -- Confirmed result of "gstat -i" -- 1) for 3.0 Alpha1 & Alpha2: -- Root page: 203, depth: 1, leaf buckets: 1, nodes: 6 -- ^- orphans, must be: 1 -- 2) for 2.5.3: -- Depth: 1, leaf buckets: 1, nodes: 6 -- ^- upper case! ^- orphans, must be: 1 """ db_1 = db_factory(page_size=4096, sql_dialect=3, init=init_script_1) # test_script_1 #--- # runProgram('gstat',['-i','-user',user_name,'-pas',user_password,dsn]) #--- act_1 = python_act('db_1', substitutions=substitutions_1) expected_stdout_1 = """ Root page: 203, depth: 1, leaf buckets: 1, nodes: 2 """ @pytest.mark.version('>=2.5.4,<4.0') def test_1(act_1: Action): act_1.expected_stdout = expected_stdout_1 act_1.gstat(switches=['-i']) assert act_1.clean_stdout == act_1.clean_expected_stdout # version: 4.0 # resources: None substitutions_2 = [('^((?!nodes).)*$', ''), ('Root page: [0-9]+,', ''), ('Depth', 'depth')] init_script_2 = """""" db_2 = db_factory(page_size=4096, sql_dialect=3, init=init_script_2) # test_script_2 #--- # # import os # os.environ["ISC_USER"] = user_name # os.environ["ISC_PASSWORD"] = user_password # db_conn.close() # # sql_prep=''' # create table g_test (f integer); # create index g_ind on g_test (f); # insert into g_test values (1); # commit; # update g_test set f=2; # savepoint a; # update g_test set f=3; # savepoint b; # update g_test set f=4; # savepoint c; # update g_test set f=5; # savepoint d; # update g_test set f=6; # savepoint e; # update g_test set f=7; # commit; # select * from g_test; # ''' # runProgram( 'isql',[ '-q', dsn], sql_prep ), # runProgram( 'gstat',['-i', dsn] ) #--- act_2 = python_act('db_2', substitutions=substitutions_2) expected_stdout_2 = """ Root page: 203, depth: 1, leaf buckets: 1, nodes: 2 """ @pytest.mark.version('>=4.0') def test_2(act_2: Action): sql_scipt = """ create table g_test (f integer); create index g_ind on g_test (f); insert into g_test values (1); commit; update g_test set f=2; savepoint a; update g_test set f=3; savepoint b; update g_test set f=4; savepoint c; update g_test set f=5; savepoint d; update g_test set f=6; savepoint e; update g_test set f=7; commit; select * from g_test; """ act_2.isql(switches=['-q'], input=sql_scipt) act_2.reset() act_2.expected_stdout = expected_stdout_2 act_2.gstat(switches=['-i']) assert act_2.clean_stdout == act_2.clean_expected_stdout