2 @message |
assert
- Expected: data dispersion is low.
+ UNEXPECTED: standard deviation of elapsed time ratios is 0.8825679663148706 - greater than MAX_STD_DEV=0.8
+ Elapsed time ratios: [1.0256410256410255, 3.908333333333333, 1.7228144989339018, 1.8440594059405941, 2.2187919463087247, 1.9770114942528736, 1.9892900856793145]
LOG DETAILS:
2025-06-10 01:53:52.824
2025-06-10 01:53:52.834 act = <firebird.qa.plugin.Action object at [hex]>
2025-06-10 01:53:52.841 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-06-10 01:53:52.849
2025-06-10 01:53:52.855 @pytest.mark.version('>=5.0.3')
2025-06-10 01:53:52.860 def test_1(act: Action, capsys):
2025-06-10 01:53:52.868
2025-06-10 01:53:52.875 #############################################
2025-06-10 01:53:52.882 MAX_STD_DEV = 0.5 if os.name == 'nt' else 0.8
2025-06-10 01:53:52.888 #############################################
2025-06-10 01:53:52.893
2025-06-10 01:53:52.906
2025-06-10 01:53:52.915 ddl_lst = []
2025-06-10 01:53:52.922 ddl_lst.extend(
2025-06-10 01:53:52.934 (
2025-06-10 01:53:52.946 """
2025-06-10 01:53:52.957 recreate table log_table(
2025-06-10 01:53:52.965 log_id bigint generated by default as identity constraint pk_log_table primary key
2025-06-10 01:53:52.971 ,field_name varchar(31) not null
2025-06-10 01:53:52.981 ,old_value blob
2025-06-10 01:53:52.992 )
2025-06-10 01:53:52.998 """
2025-06-10 01:53:53.005 ,"""
2025-06-10 01:53:53.012 recreate table test_table (
2025-06-10 01:53:53.019 id bigint not null,
2025-06-10 01:53:53.025 fld_01 varchar(40),
2025-06-10 01:53:53.030 fld_02 date,
2025-06-10 01:53:53.039 fld_03 varchar(40),
2025-06-10 01:53:53.049 fld_04 date,
2025-06-10 01:53:53.060 fld_05 varchar(1000),
2025-06-10 01:53:53.066 fld_06 varchar(1000),
2025-06-10 01:53:53.074 fld_07 numeric(15,2),
2025-06-10 01:53:53.081 fld_08 date,
2025-06-10 01:53:53.088 fld_09 varchar(95),
2025-06-10 01:53:53.093 fld_10 bigint,
2025-06-10 01:53:53.099 fld_11 bigint,
2025-06-10 01:53:53.104 fld_12 bigint,
2025-06-10 01:53:53.109 fld_13 varchar(250),
2025-06-10 01:53:53.115 fld_14 bigint,
2025-06-10 01:53:53.121 fld_15 date,
2025-06-10 01:53:53.127 fld_16 integer,
2025-06-10 01:53:53.133 fld_17 bigint,
2025-06-10 01:53:53.140 fld_18 date,
2025-06-10 01:53:53.147 fld_19 bigint,
2025-06-10 01:53:53.153 fld_20 varchar(95),
2025-06-10 01:53:53.168 fld_21 date,
2025-06-10 01:53:53.175 fld_22 bigint,
2025-06-10 01:53:53.181 fld_23 numeric(16,0),
2025-06-10 01:53:53.189 fld_24 smallint,
2025-06-10 01:53:53.201 fld_25 bigint,
2025-06-10 01:53:53.213 fld_26 bigint,
2025-06-10 01:53:53.224 fld_27 smallint default 0,
2025-06-10 01:53:53.231 fld_28 date,
2025-06-10 01:53:53.239 fld_29 smallint,
2025-06-10 01:53:53.245 fld_30 date,
2025-06-10 01:53:53.254 fld_31 date,
2025-06-10 01:53:53.264 fld_32 date,
2025-06-10 01:53:53.271 fld_33 date,
2025-06-10 01:53:53.278 fld_34 date,
2025-06-10 01:53:53.286 fld_35 date,
2025-06-10 01:53:53.292 fld_36 date,
2025-06-10 01:53:53.298 fld_37 date,
2025-06-10 01:53:53.303 fld_38 date,
2025-06-10 01:53:53.308 fld_39 date,
2025-06-10 01:53:53.314 fld_40 smallint,
2025-06-10 01:53:53.321 fld_41 smallint,
2025-06-10 01:53:53.327 fld_42 smallint,
2025-06-10 01:53:53.335 fld_43 bigint,
2025-06-10 01:53:53.341 fld_44 bigint,
2025-06-10 01:53:53.347 fld_45 bigint,
2025-06-10 01:53:53.353 fld_46 smallint,
2025-06-10 01:53:53.358 fld_47 varchar(1000),
2025-06-10 01:53:53.364 fld_48 bigint,
2025-06-10 01:53:53.372 fld_49 varchar(4000),
2025-06-10 01:53:53.383 fld_50 bigint
2025-06-10 01:53:53.389 )
2025-06-10 01:53:53.396 """
2025-06-10 01:53:53.408 ,'create generator audit'
2025-06-10 01:53:53.420 ,'alter table test_table add constraint pk_test_table primary key (id) using descending index pk_test_table'
2025-06-10 01:53:53.430 ,"""
2025-06-10 01:53:53.440 create or alter trigger h$test_table for test_table
2025-06-10 01:53:53.448 active after update position 0
2025-06-10 01:53:53.463 as
2025-06-10 01:53:53.476 declare id bigint;
2025-06-10 01:53:53.487 declare o blob sub_type 1 segment size 80;
2025-06-10 01:53:53.501 begin
2025-06-10 01:53:53.513 id = gen_id(audit, 1);
2025-06-10 01:53:53.525 o = old.fld_01; if (o is distinct from new.fld_01) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_01', :o); end
2025-06-10 01:53:53.533 o = old.fld_02; if (o is distinct from new.fld_02) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_02', :o); end
2025-06-10 01:53:53.543 o = old.fld_03; if (o is distinct from new.fld_03) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_03', :o); end
2025-06-10 01:53:53.551 o = old.fld_04; if (o is distinct from new.fld_04) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_04', :o); end
2025-06-10 01:53:53.560 o = old.fld_05; if (o is distinct from new.fld_05) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_05', :o); end
2025-06-10 01:53:53.568 o = old.fld_06; if (o is distinct from new.fld_06) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_06', :o); end
2025-06-10 01:53:53.575 o = old.fld_07; if (o is distinct from new.fld_07) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_07', :o); end
2025-06-10 01:53:53.586 o = old.fld_08; if (o is distinct from new.fld_08) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_08', :o); end
2025-06-10 01:53:53.596 o = old.fld_09; if (o is distinct from new.fld_09) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_09', :o); end
2025-06-10 01:53:53.604 o = old.fld_10; if (o is distinct from new.fld_10) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_10', :o); end
2025-06-10 01:53:53.615
2025-06-10 01:53:53.623
2025-06-10 01:53:53.629 o = old.fld_11; if (o is distinct from new.fld_11) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_11', :o); end
2025-06-10 01:53:53.634 o = old.fld_12; if (o is distinct from new.fld_12) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_12', :o); end
2025-06-10 01:53:53.640 o = old.fld_13; if (o is distinct from new.fld_13) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_13', :o); end
2025-06-10 01:53:53.646 o = old.fld_14; if (o is distinct from new.fld_14) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_14', :o); end
2025-06-10 01:53:53.652 o = old.fld_15; if (o is distinct from new.fld_15) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_15', :o); end
2025-06-10 01:53:53.658 o = old.fld_16; if (o is distinct from new.fld_16) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_16', :o); end
2025-06-10 01:53:53.664 o = old.fld_17; if (o is distinct from new.fld_17) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_17', :o); end
2025-06-10 01:53:53.669 o = old.fld_18; if (o is distinct from new.fld_18) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_18', :o); end
2025-06-10 01:53:53.675 o = old.fld_19; if (o is distinct from new.fld_19) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_19', :o); end
2025-06-10 01:53:53.681 o = old.fld_20; if (o is distinct from new.fld_20) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_20', :o); end
2025-06-10 01:53:53.686
2025-06-10 01:53:53.691
2025-06-10 01:53:53.696 o = old.fld_21; if (o is distinct from new.fld_21) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_21', :o); end
2025-06-10 01:53:53.701 o = old.fld_22; if (o is distinct from new.fld_22) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_22', :o); end
2025-06-10 01:53:53.707 o = old.fld_23; if (o is distinct from new.fld_23) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_23', :o); end
2025-06-10 01:53:53.712 o = old.fld_24; if (o is distinct from new.fld_24) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_24', :o); end
2025-06-10 01:53:53.718 o = old.fld_25; if (o is distinct from new.fld_25) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_25', :o); end
2025-06-10 01:53:53.723 o = old.fld_26; if (o is distinct from new.fld_26) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_26', :o); end
2025-06-10 01:53:53.729 o = old.fld_27; if (o is distinct from new.fld_27) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_27', :o); end
2025-06-10 01:53:53.734 o = old.fld_28; if (o is distinct from new.fld_28) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_28', :o); end
2025-06-10 01:53:53.745 o = old.fld_29; if (o is distinct from new.fld_29) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_29', :o); end
2025-06-10 01:53:53.751 o = old.fld_30; if (o is distinct from new.fld_30) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_30', :o); end
2025-06-10 01:53:53.757
2025-06-10 01:53:53.763
2025-06-10 01:53:53.769 o = old.fld_31; if (o is distinct from new.fld_31) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_31', :o); end
2025-06-10 01:53:53.775 o = old.fld_32; if (o is distinct from new.fld_32) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_32', :o); end
2025-06-10 01:53:53.780 o = old.fld_33; if (o is distinct from new.fld_33) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_33', :o); end
2025-06-10 01:53:53.788 o = old.fld_34; if (o is distinct from new.fld_34) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_34', :o); end
2025-06-10 01:53:53.794 o = old.fld_35; if (o is distinct from new.fld_35) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_35', :o); end
2025-06-10 01:53:53.799 o = old.fld_36; if (o is distinct from new.fld_36) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_36', :o); end
2025-06-10 01:53:53.806 o = old.fld_37; if (o is distinct from new.fld_37) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_37', :o); end
2025-06-10 01:53:53.813 o = old.fld_38; if (o is distinct from new.fld_38) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_38', :o); end
2025-06-10 01:53:53.827 o = old.fld_39; if (o is distinct from new.fld_39) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_39', :o); end
2025-06-10 01:53:53.841 o = old.fld_40; if (o is distinct from new.fld_40) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_40', :o); end
2025-06-10 01:53:53.851
2025-06-10 01:53:53.865
2025-06-10 01:53:53.875
2025-06-10 01:53:53.881 o = old.fld_41; if (o is distinct from new.fld_41) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_41', :o); end
2025-06-10 01:53:53.888 o = old.fld_42; if (o is distinct from new.fld_42) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_42', :o); end
2025-06-10 01:53:53.893 o = old.fld_43; if (o is distinct from new.fld_43) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_43', :o); end
2025-06-10 01:53:53.898 o = old.fld_44; if (o is distinct from new.fld_44) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_44', :o); end
2025-06-10 01:53:53.904 o = old.fld_45; if (o is distinct from new.fld_45) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_45', :o); end
2025-06-10 01:53:53.910 o = old.fld_46; if (o is distinct from new.fld_46) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_46', :o); end
2025-06-10 01:53:53.916 o = old.fld_47; if (o is distinct from new.fld_47) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_47', :o); end
2025-06-10 01:53:53.921 o = old.fld_48; if (o is distinct from new.fld_48) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_48', :o); end
2025-06-10 01:53:53.927 o = old.fld_49; if (o is distinct from new.fld_49) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_49', :o); end
2025-06-10 01:53:53.933 o = old.fld_50; if (o is distinct from new.fld_50) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_50', :o); end
2025-06-10 01:53:53.937 end
2025-06-10 01:53:53.942 """
2025-06-10 01:53:53.947 ,"""
2025-06-10 01:53:53.951 execute block
2025-06-10 01:53:53.956 as
2025-06-10 01:53:53.960 declare id bigint;
2025-06-10 01:53:53.970 begin
2025-06-10 01:53:53.978 id = 0;
2025-06-10 01:53:53.984 while (id < 128000) do
2025-06-10 01:53:53.990 begin
2025-06-10 01:53:53.996 insert into test_table (id,fld_01,fld_02,fld_03,fld_04,fld_05,fld_06,fld_07,fld_08,fld_09,fld_10,fld_11,fld_12,fld_13,fld_14,fld_15,fld_16,fld_17,fld_18,fld_19,fld_20,fld_21,fld_22,fld_23,fld_24,fld_25,fld_26,fld_27,fld_28,fld_29,fld_30,fld_31,fld_32,fld_33,fld_34,fld_35,fld_36,fld_37,fld_38,fld_39,fld_40,fld_41,fld_42,fld_43,fld_44,fld_45,fld_46,fld_47,fld_48,fld_49,fld_50)
2025-06-10 01:53:54.001 values (
2025-06-10 01:53:54.007 :id,
2025-06-10 01:53:54.012 'Identifier',
2025-06-10 01:53:54.017 '2025-01-23',
2025-06-10 01:53:54.022 '1234567890123456789',
2025-06-10 01:53:54.028 '2025-01-23',
2025-06-10 01:53:54.033 'Test data',
2025-06-10 01:53:54.038 'Test another data',
2025-06-10 01:53:54.043 500,
2025-06-10 01:53:54.048 '2025-01-24',
2025-06-10 01:53:54.053 'Test Test Test',
2025-06-10 01:53:54.059 3,
2025-06-10 01:53:54.063 12345678901234,
2025-06-10 01:53:54.068 12,
2025-06-10 01:53:54.074 'Test',
2025-06-10 01:53:54.079 12345678901234,
2025-06-10 01:53:54.084 '2025-01-30',
2025-06-10 01:53:54.089 0,
2025-06-10 01:53:54.095 NULL,
2025-06-10 01:53:54.100 '2025-01-31',
2025-06-10 01:53:54.105 12345679801234,
2025-06-10 01:53:54.110 'Test Test data',
2025-06-10 01:53:54.116 NULL,
2025-06-10 01:53:54.121 1234,
2025-06-10 01:53:54.126 1234567,
2025-06-10 01:53:54.130 2025,
2025-06-10 01:53:54.135 NULL,
2025-06-10 01:53:54.140 NULL,
2025-06-10 01:53:54.145 0,
2025-06-10 01:53:54.150 '2025-02-01',
2025-06-10 01:53:54.155 0,
2025-06-10 01:53:54.160 NULL,
2025-06-10 01:53:54.167 NULL,
2025-06-10 01:53:54.172 NULL,
2025-06-10 01:53:54.178 NULL,
2025-06-10 01:53:54.184 '2025-01-15',
2025-06-10 01:53:54.190 NULL,
2025-06-10 01:53:54.195 NULL,
2025-06-10 01:53:54.201 NULL,
2025-06-10 01:53:54.206 NULL,
2025-06-10 01:53:54.212 NULL,
2025-06-10 01:53:54.217 1,
2025-06-10 01:53:54.222 0,
2025-06-10 01:53:54.228 0,
2025-06-10 01:53:54.233 NULL,
2025-06-10 01:53:54.238 12346579801234,
2025-06-10 01:53:54.243 12345678901234,
2025-06-10 01:53:54.248 NULL,
2025-06-10 01:53:54.253 'Long test data for varchar(1000)',
2025-06-10 01:53:54.258 12345678901234,
2025-06-10 01:53:54.264 'Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)...',
2025-06-10 01:53:54.269 0
2025-06-10 01:53:54.274 );
2025-06-10 01:53:54.278
2025-06-10 01:53:54.283 id = id + 1;
2025-06-10 01:53:54.288 end
2025-06-10 01:53:54.293 end
2025-06-10 01:53:54.298 """
2025-06-10 01:53:54.304 ,"""
2025-06-10 01:53:54.310 create or alter procedure run_test(a int)
2025-06-10 01:53:54.318 returns (t_cnt int, t_diff bigint)
2025-06-10 01:53:54.325 as
2025-06-10 01:53:54.331 declare id bigint;
2025-06-10 01:53:54.336 declare t_begin timestamp;
2025-06-10 01:53:54.342 declare t_end timestamp;
2025-06-10 01:53:54.347 begin
2025-06-10 01:53:54.352 t_cnt = a;
2025-06-10 01:53:54.357 t_begin = 'now';
2025-06-10 01:53:54.363 for
2025-06-10 01:53:54.368 select id
2025-06-10 01:53:54.374 from test_table
2025-06-10 01:53:54.379 where
2025-06-10 01:53:54.384 id >= 0 and id < :t_cnt
2025-06-10 01:53:54.389 into :id do
2025-06-10 01:53:54.395 update test_table set fld_50 = :t_cnt where id = :id;
2025-06-10 01:53:54.400 t_end = 'now';
2025-06-10 01:53:54.405 t_diff = datediff(millisecond from :t_begin to :t_end);
2025-06-10 01:53:54.411 suspend;
2025-06-10 01:53:54.416 end
2025-06-10 01:53:54.421 """
2025-06-10 01:53:54.426 )
2025-06-10 01:53:54.431 )
2025-06-10 01:53:54.436
2025-06-10 01:53:54.441 with act.db.connect() as con:
2025-06-10 01:53:54.447 for x in ddl_lst:
2025-06-10 01:53:54.452 con.execute_immediate(x)
2025-06-10 01:53:54.457 con.commit()
2025-06-10 01:53:54.462
2025-06-10 01:53:54.467 #--------------------------------------
2025-06-10 01:53:54.473
2025-06-10 01:53:54.478 cur = con.cursor()
2025-06-10 01:53:54.483 rs = None
2025-06-10 01:53:54.489 ps = cur.prepare('select t.* from run_test(?) t')
2025-06-10 01:53:54.493 elapsed_time_ratios = []
2025-06-10 01:53:54.498 ms_prev = -1
2025-06-10 01:53:54.504 for n in (0.375, 0.75, 1.5, 3, 6, 12, 24, 48):
2025-06-10 01:53:54.509 # d1 = py_dt.timedelta(0)
2025-06-10 01:53:54.515 rs = cur.execute(ps, ( int(n * 1000),))
2025-06-10 01:53:54.520 t1 = py_dt.datetime.now()
2025-06-10 01:53:54.527 cur.fetchall()
2025-06-10 01:53:54.532 t2 = py_dt.datetime.now()
2025-06-10 01:53:54.537 con.commit()
2025-06-10 01:53:54.541 d1 = t2-t1
2025-06-10 01:53:54.547 ms_curr = d1.seconds*1000 + d1.microseconds//1000
2025-06-10 01:53:54.552
2025-06-10 01:53:54.556 if ms_prev > 0:
2025-06-10 01:53:54.561 elapsed_time_ratios.append(ms_curr / ms_prev)
2025-06-10 01:53:54.566 ms_prev = ms_curr
2025-06-10 01:53:54.571
2025-06-10 01:53:54.575 if rs:
2025-06-10 01:53:54.580 rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
2025-06-10 01:53:54.585 if ps:
2025-06-10 01:53:54.591 ps.free()
2025-06-10 01:53:54.597
2025-06-10 01:53:54.602 expected_msg = 'Expected: data dispersion is low.'
2025-06-10 01:53:54.607 std_deviation = stdev(elapsed_time_ratios)
2025-06-10 01:53:54.612 if std_deviation <= MAX_STD_DEV:
2025-06-10 01:53:54.617 print(expected_msg)
2025-06-10 01:53:54.621 else:
2025-06-10 01:53:54.626 print(f'UNEXPECTED: standard deviation of elapsed time ratios is {std_deviation} - greater than {MAX_STD_DEV=}')
2025-06-10 01:53:54.631 print(f'Elapsed time ratios: {elapsed_time_ratios}')
2025-06-10 01:53:54.636
2025-06-10 01:53:54.641 act.expected_stdout = f"""
2025-06-10 01:53:54.646 {expected_msg}
2025-06-10 01:53:54.651 """
2025-06-10 01:53:54.656 act.stdout = capsys.readouterr().out
2025-06-10 01:53:54.662 > assert act.clean_stdout == act.clean_expected_stdout
2025-06-10 01:53:54.667 E assert
2025-06-10 01:53:54.672 E - Expected: data dispersion is low.
2025-06-10 01:53:54.677 E + UNEXPECTED: standard deviation of elapsed time ratios is 0.8825679663148706 - greater than MAX_STD_DEV=0.8
2025-06-10 01:53:54.683 E + Elapsed time ratios: [1.0256410256410255, 3.908333333333333, 1.7228144989339018, 1.8440594059405941, 2.2187919463087247, 1.9770114942528736, 1.9892900856793145]
2025-06-10 01:53:54.688
2025-06-10 01:53:54.693 tests/bugs/gh_8421_test.py:332: AssertionError
2025-06-10 01:53:54.699 ---------------------------- Captured stdout setup -----------------------------
2025-06-10 01:53:54.705 Creating db: localhost:/var/tmp/qa_2024/test_11729/test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
|
3 #text |
act = <firebird.qa.plugin.Action pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>
@pytest.mark.version('>=5.0.3')
def test_1(act: Action, capsys):
#############################################
MAX_STD_DEV = 0.5 if os.name == 'nt' else 0.8
#############################################
ddl_lst = []
ddl_lst.extend(
(
"""
recreate table log_table(
log_id bigint generated by default as identity constraint pk_log_table primary key
,field_name varchar(31) not null
,old_value blob
)
"""
,"""
recreate table test_table (
id bigint not null,
fld_01 varchar(40),
fld_02 date,
fld_03 varchar(40),
fld_04 date,
fld_05 varchar(1000),
fld_06 varchar(1000),
fld_07 numeric(15,2),
fld_08 date,
fld_09 varchar(95),
fld_10 bigint,
fld_11 bigint,
fld_12 bigint,
fld_13 varchar(250),
fld_14 bigint,
fld_15 date,
fld_16 integer,
fld_17 bigint,
fld_18 date,
fld_19 bigint,
fld_20 varchar(95),
fld_21 date,
fld_22 bigint,
fld_23 numeric(16,0),
fld_24 smallint,
fld_25 bigint,
fld_26 bigint,
fld_27 smallint default 0,
fld_28 date,
fld_29 smallint,
fld_30 date,
fld_31 date,
fld_32 date,
fld_33 date,
fld_34 date,
fld_35 date,
fld_36 date,
fld_37 date,
fld_38 date,
fld_39 date,
fld_40 smallint,
fld_41 smallint,
fld_42 smallint,
fld_43 bigint,
fld_44 bigint,
fld_45 bigint,
fld_46 smallint,
fld_47 varchar(1000),
fld_48 bigint,
fld_49 varchar(4000),
fld_50 bigint
)
"""
,'create generator audit'
,'alter table test_table add constraint pk_test_table primary key (id) using descending index pk_test_table'
,"""
create or alter trigger h$test_table for test_table
active after update position 0
as
declare id bigint;
declare o blob sub_type 1 segment size 80;
begin
id = gen_id(audit, 1);
o = old.fld_01; if (o is distinct from new.fld_01) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_01', :o); end
o = old.fld_02; if (o is distinct from new.fld_02) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_02', :o); end
o = old.fld_03; if (o is distinct from new.fld_03) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_03', :o); end
o = old.fld_04; if (o is distinct from new.fld_04) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_04', :o); end
o = old.fld_05; if (o is distinct from new.fld_05) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_05', :o); end
o = old.fld_06; if (o is distinct from new.fld_06) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_06', :o); end
o = old.fld_07; if (o is distinct from new.fld_07) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_07', :o); end
o = old.fld_08; if (o is distinct from new.fld_08) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_08', :o); end
o = old.fld_09; if (o is distinct from new.fld_09) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_09', :o); end
o = old.fld_10; if (o is distinct from new.fld_10) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_10', :o); end
o = old.fld_11; if (o is distinct from new.fld_11) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_11', :o); end
o = old.fld_12; if (o is distinct from new.fld_12) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_12', :o); end
o = old.fld_13; if (o is distinct from new.fld_13) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_13', :o); end
o = old.fld_14; if (o is distinct from new.fld_14) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_14', :o); end
o = old.fld_15; if (o is distinct from new.fld_15) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_15', :o); end
o = old.fld_16; if (o is distinct from new.fld_16) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_16', :o); end
o = old.fld_17; if (o is distinct from new.fld_17) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_17', :o); end
o = old.fld_18; if (o is distinct from new.fld_18) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_18', :o); end
o = old.fld_19; if (o is distinct from new.fld_19) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_19', :o); end
o = old.fld_20; if (o is distinct from new.fld_20) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_20', :o); end
o = old.fld_21; if (o is distinct from new.fld_21) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_21', :o); end
o = old.fld_22; if (o is distinct from new.fld_22) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_22', :o); end
o = old.fld_23; if (o is distinct from new.fld_23) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_23', :o); end
o = old.fld_24; if (o is distinct from new.fld_24) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_24', :o); end
o = old.fld_25; if (o is distinct from new.fld_25) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_25', :o); end
o = old.fld_26; if (o is distinct from new.fld_26) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_26', :o); end
o = old.fld_27; if (o is distinct from new.fld_27) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_27', :o); end
o = old.fld_28; if (o is distinct from new.fld_28) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_28', :o); end
o = old.fld_29; if (o is distinct from new.fld_29) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_29', :o); end
o = old.fld_30; if (o is distinct from new.fld_30) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_30', :o); end
o = old.fld_31; if (o is distinct from new.fld_31) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_31', :o); end
o = old.fld_32; if (o is distinct from new.fld_32) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_32', :o); end
o = old.fld_33; if (o is distinct from new.fld_33) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_33', :o); end
o = old.fld_34; if (o is distinct from new.fld_34) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_34', :o); end
o = old.fld_35; if (o is distinct from new.fld_35) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_35', :o); end
o = old.fld_36; if (o is distinct from new.fld_36) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_36', :o); end
o = old.fld_37; if (o is distinct from new.fld_37) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_37', :o); end
o = old.fld_38; if (o is distinct from new.fld_38) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_38', :o); end
o = old.fld_39; if (o is distinct from new.fld_39) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_39', :o); end
o = old.fld_40; if (o is distinct from new.fld_40) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_40', :o); end
o = old.fld_41; if (o is distinct from new.fld_41) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_41', :o); end
o = old.fld_42; if (o is distinct from new.fld_42) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_42', :o); end
o = old.fld_43; if (o is distinct from new.fld_43) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_43', :o); end
o = old.fld_44; if (o is distinct from new.fld_44) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_44', :o); end
o = old.fld_45; if (o is distinct from new.fld_45) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_45', :o); end
o = old.fld_46; if (o is distinct from new.fld_46) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_46', :o); end
o = old.fld_47; if (o is distinct from new.fld_47) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_47', :o); end
o = old.fld_48; if (o is distinct from new.fld_48) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_48', :o); end
o = old.fld_49; if (o is distinct from new.fld_49) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_49', :o); end
o = old.fld_50; if (o is distinct from new.fld_50) then begin insert into log_table(log_id, field_name, old_value) values(:id, 'fld_50', :o); end
end
"""
,"""
execute block
as
declare id bigint;
begin
id = 0;
while (id < 128000) do
begin
insert into test_table (id,fld_01,fld_02,fld_03,fld_04,fld_05,fld_06,fld_07,fld_08,fld_09,fld_10,fld_11,fld_12,fld_13,fld_14,fld_15,fld_16,fld_17,fld_18,fld_19,fld_20,fld_21,fld_22,fld_23,fld_24,fld_25,fld_26,fld_27,fld_28,fld_29,fld_30,fld_31,fld_32,fld_33,fld_34,fld_35,fld_36,fld_37,fld_38,fld_39,fld_40,fld_41,fld_42,fld_43,fld_44,fld_45,fld_46,fld_47,fld_48,fld_49,fld_50)
values (
:id,
'Identifier',
'2025-01-23',
'1234567890123456789',
'2025-01-23',
'Test data',
'Test another data',
500,
'2025-01-24',
'Test Test Test',
3,
12345678901234,
12,
'Test',
12345678901234,
'2025-01-30',
0,
NULL,
'2025-01-31',
12345679801234,
'Test Test data',
NULL,
1234,
1234567,
2025,
NULL,
NULL,
0,
'2025-02-01',
0,
NULL,
NULL,
NULL,
NULL,
'2025-01-15',
NULL,
NULL,
NULL,
NULL,
NULL,
1,
0,
0,
NULL,
12346579801234,
12345678901234,
NULL,
'Long test data for varchar(1000)',
12345678901234,
'Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)... Very long test data for varchar(4000)...',
0
);
id = id + 1;
end
end
"""
,"""
create or alter procedure run_test(a int)
returns (t_cnt int, t_diff bigint)
as
declare id bigint;
declare t_begin timestamp;
declare t_end timestamp;
begin
t_cnt = a;
t_begin = 'now';
for
select id
from test_table
where
id >= 0 and id < :t_cnt
into :id do
update test_table set fld_50 = :t_cnt where id = :id;
t_end = 'now';
t_diff = datediff(millisecond from :t_begin to :t_end);
suspend;
end
"""
)
)
with act.db.connect() as con:
for x in ddl_lst:
con.execute_immediate(x)
con.commit()
#--------------------------------------
cur = con.cursor()
rs = None
ps = cur.prepare('select t.* from run_test(?) t')
elapsed_time_ratios = []
ms_prev = -1
for n in (0.375, 0.75, 1.5, 3, 6, 12, 24, 48):
# d1 = py_dt.timedelta(0)
rs = cur.execute(ps, ( int(n * 1000),))
t1 = py_dt.datetime.now()
cur.fetchall()
t2 = py_dt.datetime.now()
con.commit()
d1 = t2-t1
ms_curr = d1.seconds*1000 + d1.microseconds//1000
if ms_prev > 0:
elapsed_time_ratios.append(ms_curr / ms_prev)
ms_prev = ms_curr
if rs:
rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
if ps:
ps.free()
expected_msg = 'Expected: data dispersion is low.'
std_deviation = stdev(elapsed_time_ratios)
if std_deviation <= MAX_STD_DEV:
print(expected_msg)
else:
print(f'UNEXPECTED: standard deviation of elapsed time ratios is {std_deviation} - greater than {MAX_STD_DEV=}')
print(f'Elapsed time ratios: {elapsed_time_ratios}')
act.expected_stdout = f"""
{expected_msg}
"""
act.stdout = capsys.readouterr().out
> assert act.clean_stdout == act.clean_expected_stdout
E assert
E - Expected: data dispersion is low.
E + UNEXPECTED: standard deviation of elapsed time ratios is 0.8825679663148706 - greater than MAX_STD_DEV=0.8
E + Elapsed time ratios: [1.0256410256410255, 3.908333333333333, 1.7228144989339018, 1.8440594059405941, 2.2187919463087247, 1.9770114942528736, 1.9892900856793145]
tests/bugs/gh_8421_test.py:332: AssertionError
|