2 @message |
assert
- Expected: data dispersion is low.
+ UNEXPECTED: standard deviation of elapsed time ratios is 1.1729631028124896 - greater than MAX_STD_DEV=0.8
+ Elapsed time ratios: [1.3529411764705883, 4.815217391304348, 1.3927765237020315, 2.4586709886547813, 2.09228740936058, 1.9514807813484563, 2.155150145301905]
LOG DETAILS:
2025-04-28 01:46:44.460
2025-04-28 01:46:44.468 act = <firebird.qa.plugin.Action object at [hex]>
2025-04-28 01:46:44.486 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-04-28 01:46:44.494
2025-04-28 01:46:44.511 @pytest.mark.version('>=5.0.3')
2025-04-28 01:46:44.526 def test_1(act: Action, capsys):
2025-04-28 01:46:44.538
2025-04-28 01:46:44.546 #############################################
2025-04-28 01:46:44.566 MAX_STD_DEV = 0.5 if os.name == 'nt' else 0.8
2025-04-28 01:46:44.575 #############################################
2025-04-28 01:46:44.591
2025-04-28 01:46:44.606
2025-04-28 01:46:44.618 ddl_lst = []
2025-04-28 01:46:44.634 ddl_lst.extend(
2025-04-28 01:46:44.650 (
2025-04-28 01:46:44.668 """
2025-04-28 01:46:44.675 recreate table log_table(
2025-04-28 01:46:44.680 log_id bigint generated by default as identity constraint pk_log_table primary key
2025-04-28 01:46:44.685 ,field_name varchar(31) not null
2025-04-28 01:46:44.691 ,old_value blob
2025-04-28 01:46:44.696 )
2025-04-28 01:46:44.701 """
2025-04-28 01:46:44.706 ,"""
2025-04-28 01:46:44.713 recreate table test_table (
2025-04-28 01:46:44.719 id bigint not null,
2025-04-28 01:46:44.725 fld_01 varchar(40),
2025-04-28 01:46:44.732 fld_02 date,
2025-04-28 01:46:44.738 fld_03 varchar(40),
2025-04-28 01:46:44.744 fld_04 date,
2025-04-28 01:46:44.750 fld_05 varchar(1000),
2025-04-28 01:46:44.757 fld_06 varchar(1000),
2025-04-28 01:46:44.763 fld_07 numeric(15,2),
2025-04-28 01:46:44.768 fld_08 date,
2025-04-28 01:46:44.774 fld_09 varchar(95),
2025-04-28 01:46:44.779 fld_10 bigint,
2025-04-28 01:46:44.784 fld_11 bigint,
2025-04-28 01:46:44.790 fld_12 bigint,
2025-04-28 01:46:44.796 fld_13 varchar(250),
2025-04-28 01:46:44.801 fld_14 bigint,
2025-04-28 01:46:44.807 fld_15 date,
2025-04-28 01:46:44.813 fld_16 integer,
2025-04-28 01:46:44.819 fld_17 bigint,
2025-04-28 01:46:44.825 fld_18 date,
2025-04-28 01:46:44.831 fld_19 bigint,
2025-04-28 01:46:44.837 fld_20 varchar(95),
2025-04-28 01:46:44.843 fld_21 date,
2025-04-28 01:46:44.849 fld_22 bigint,
2025-04-28 01:46:44.855 fld_23 numeric(16,0),
2025-04-28 01:46:44.861 fld_24 smallint,
2025-04-28 01:46:44.867 fld_25 bigint,
2025-04-28 01:46:44.872 fld_26 bigint,
2025-04-28 01:46:44.878 fld_27 smallint default 0,
2025-04-28 01:46:44.884 fld_28 date,
2025-04-28 01:46:44.889 fld_29 smallint,
2025-04-28 01:46:44.895 fld_30 date,
2025-04-28 01:46:44.901 fld_31 date,
2025-04-28 01:46:44.906 fld_32 date,
2025-04-28 01:46:44.912 fld_33 date,
2025-04-28 01:46:44.918 fld_34 date,
2025-04-28 01:46:44.924 fld_35 date,
2025-04-28 01:46:44.930 fld_36 date,
2025-04-28 01:46:44.935 fld_37 date,
2025-04-28 01:46:44.942 fld_38 date,
2025-04-28 01:46:44.948 fld_39 date,
2025-04-28 01:46:44.954 fld_40 smallint,
2025-04-28 01:46:44.960 fld_41 smallint,
2025-04-28 01:46:44.967 fld_42 smallint,
2025-04-28 01:46:44.973 fld_43 bigint,
2025-04-28 01:46:44.979 fld_44 bigint,
2025-04-28 01:46:44.985 fld_45 bigint,
2025-04-28 01:46:44.990 fld_46 smallint,
2025-04-28 01:46:44.996 fld_47 varchar(1000),
2025-04-28 01:46:45.002 fld_48 bigint,
2025-04-28 01:46:45.008 fld_49 varchar(4000),
2025-04-28 01:46:45.019 fld_50 bigint
2025-04-28 01:46:45.028 )
2025-04-28 01:46:45.036 """
2025-04-28 01:46:45.044 ,'create generator audit'
2025-04-28 01:46:45.051 ,'alter table test_table add constraint pk_test_table primary key (id) using descending index pk_test_table'
2025-04-28 01:46:45.057 ,"""
2025-04-28 01:46:45.062 create or alter trigger h$test_table for test_table
2025-04-28 01:46:45.067 active after update position 0
2025-04-28 01:46:45.072 as
2025-04-28 01:46:45.077 declare id bigint;
2025-04-28 01:46:45.083 declare o blob sub_type 1 segment size 80;
2025-04-28 01:46:45.088 begin
2025-04-28 01:46:45.094 id = gen_id(audit, 1);
2025-04-28 01:46:45.099 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-04-28 01:46:45.104 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-04-28 01:46:45.109 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-04-28 01:46:45.114 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-04-28 01:46:45.119 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-04-28 01:46:45.125 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-04-28 01:46:45.131 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-04-28 01:46:45.136 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-04-28 01:46:45.142 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-04-28 01:46:45.148 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-04-28 01:46:45.153
2025-04-28 01:46:45.159
2025-04-28 01:46:45.166 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-04-28 01:46:45.173 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-04-28 01:46:45.178 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-04-28 01:46:45.183 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-04-28 01:46:45.188 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-04-28 01:46:45.193 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-04-28 01:46:45.199 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-04-28 01:46:45.204 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-04-28 01:46:45.209 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-04-28 01:46:45.214 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-04-28 01:46:45.220
2025-04-28 01:46:45.226
2025-04-28 01:46:45.232 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-04-28 01:46:45.238 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-04-28 01:46:45.244 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-04-28 01:46:45.253 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-04-28 01:46:45.260 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-04-28 01:46:45.266 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-04-28 01:46:45.273 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-04-28 01:46:45.279 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-04-28 01:46:45.287 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-04-28 01:46:45.293 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-04-28 01:46:45.299
2025-04-28 01:46:45.305
2025-04-28 01:46:45.311 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-04-28 01:46:45.319 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-04-28 01:46:45.326 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-04-28 01:46:45.332 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-04-28 01:46:45.338 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-04-28 01:46:45.345 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-04-28 01:46:45.350 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-04-28 01:46:45.356 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-04-28 01:46:45.361 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-04-28 01:46:45.366 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-04-28 01:46:45.371
2025-04-28 01:46:45.377
2025-04-28 01:46:45.383
2025-04-28 01:46:45.388 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-04-28 01:46:45.394 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-04-28 01:46:45.400 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-04-28 01:46:45.405 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-04-28 01:46:45.410 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-04-28 01:46:45.415 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-04-28 01:46:45.420 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-04-28 01:46:45.426 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-04-28 01:46:45.431 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-04-28 01:46:45.436 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-04-28 01:46:45.441 end
2025-04-28 01:46:45.446 """
2025-04-28 01:46:45.451 ,"""
2025-04-28 01:46:45.457 execute block
2025-04-28 01:46:45.462 as
2025-04-28 01:46:45.467 declare id bigint;
2025-04-28 01:46:45.473 begin
2025-04-28 01:46:45.479 id = 0;
2025-04-28 01:46:45.484 while (id < 128000) do
2025-04-28 01:46:45.490 begin
2025-04-28 01:46:45.496 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-04-28 01:46:45.503 values (
2025-04-28 01:46:45.509 :id,
2025-04-28 01:46:45.515 'Identifier',
2025-04-28 01:46:45.521 '2025-01-23',
2025-04-28 01:46:45.528 '1234567890123456789',
2025-04-28 01:46:45.534 '2025-01-23',
2025-04-28 01:46:45.540 'Test data',
2025-04-28 01:46:45.546 'Test another data',
2025-04-28 01:46:45.552 500,
2025-04-28 01:46:45.558 '2025-01-24',
2025-04-28 01:46:45.565 'Test Test Test',
2025-04-28 01:46:45.571 3,
2025-04-28 01:46:45.577 12345678901234,
2025-04-28 01:46:45.583 12,
2025-04-28 01:46:45.589 'Test',
2025-04-28 01:46:45.596 12345678901234,
2025-04-28 01:46:45.602 '2025-01-30',
2025-04-28 01:46:45.607 0,
2025-04-28 01:46:45.613 NULL,
2025-04-28 01:46:45.618 '2025-01-31',
2025-04-28 01:46:45.624 12345679801234,
2025-04-28 01:46:45.630 'Test Test data',
2025-04-28 01:46:45.635 NULL,
2025-04-28 01:46:45.640 1234,
2025-04-28 01:46:45.646 1234567,
2025-04-28 01:46:45.652 2025,
2025-04-28 01:46:45.657 NULL,
2025-04-28 01:46:45.663 NULL,
2025-04-28 01:46:45.668 0,
2025-04-28 01:46:45.673 '2025-02-01',
2025-04-28 01:46:45.683 0,
2025-04-28 01:46:45.692 NULL,
2025-04-28 01:46:45.701 NULL,
2025-04-28 01:46:45.709 NULL,
2025-04-28 01:46:45.719 NULL,
2025-04-28 01:46:45.729 '2025-01-15',
2025-04-28 01:46:45.736 NULL,
2025-04-28 01:46:45.743 NULL,
2025-04-28 01:46:45.750 NULL,
2025-04-28 01:46:45.755 NULL,
2025-04-28 01:46:45.761 NULL,
2025-04-28 01:46:45.768 1,
2025-04-28 01:46:45.774 0,
2025-04-28 01:46:45.781 0,
2025-04-28 01:46:45.787 NULL,
2025-04-28 01:46:45.793 12346579801234,
2025-04-28 01:46:45.799 12345678901234,
2025-04-28 01:46:45.806 NULL,
2025-04-28 01:46:45.812 'Long test data for varchar(1000)',
2025-04-28 01:46:45.820 12345678901234,
2025-04-28 01:46:45.827 '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-04-28 01:46:45.833 0
2025-04-28 01:46:45.840 );
2025-04-28 01:46:45.847
2025-04-28 01:46:45.853 id = id + 1;
2025-04-28 01:46:45.859 end
2025-04-28 01:46:45.866 end
2025-04-28 01:46:45.872 """
2025-04-28 01:46:45.878 ,"""
2025-04-28 01:46:45.884 create or alter procedure run_test(a int)
2025-04-28 01:46:45.891 returns (t_cnt int, t_diff bigint)
2025-04-28 01:46:45.896 as
2025-04-28 01:46:45.902 declare id bigint;
2025-04-28 01:46:45.907 declare t_begin timestamp;
2025-04-28 01:46:45.913 declare t_end timestamp;
2025-04-28 01:46:45.919 begin
2025-04-28 01:46:45.924 t_cnt = a;
2025-04-28 01:46:45.930 t_begin = 'now';
2025-04-28 01:46:45.936 for
2025-04-28 01:46:45.942 select id
2025-04-28 01:46:45.949 from test_table
2025-04-28 01:46:45.955 where
2025-04-28 01:46:45.960 id >= 0 and id < :t_cnt
2025-04-28 01:46:45.966 into :id do
2025-04-28 01:46:45.972 update test_table set fld_50 = :t_cnt where id = :id;
2025-04-28 01:46:45.978 t_end = 'now';
2025-04-28 01:46:45.987 t_diff = datediff(millisecond from :t_begin to :t_end);
2025-04-28 01:46:45.993 suspend;
2025-04-28 01:46:45.998 end
2025-04-28 01:46:46.004 """
2025-04-28 01:46:46.011 )
2025-04-28 01:46:46.016 )
2025-04-28 01:46:46.022
2025-04-28 01:46:46.028 with act.db.connect() as con:
2025-04-28 01:46:46.034 for x in ddl_lst:
2025-04-28 01:46:46.040 con.execute_immediate(x)
2025-04-28 01:46:46.045 con.commit()
2025-04-28 01:46:46.051
2025-04-28 01:46:46.057 #--------------------------------------
2025-04-28 01:46:46.062
2025-04-28 01:46:46.069 cur = con.cursor()
2025-04-28 01:46:46.076 rs = None
2025-04-28 01:46:46.083 ps = cur.prepare('select t.* from run_test(?) t')
2025-04-28 01:46:46.090 elapsed_time_ratios = []
2025-04-28 01:46:46.098 ms_prev = -1
2025-04-28 01:46:46.106 for n in (0.375, 0.75, 1.5, 3, 6, 12, 24, 48):
2025-04-28 01:46:46.113 # d1 = py_dt.timedelta(0)
2025-04-28 01:46:46.119 rs = cur.execute(ps, ( int(n * 1000),))
2025-04-28 01:46:46.126 t1 = py_dt.datetime.now()
2025-04-28 01:46:46.132 cur.fetchall()
2025-04-28 01:46:46.139 t2 = py_dt.datetime.now()
2025-04-28 01:46:46.145 con.commit()
2025-04-28 01:46:46.151 d1 = t2-t1
2025-04-28 01:46:46.157 ms_curr = d1.seconds*1000 + d1.microseconds//1000
2025-04-28 01:46:46.163
2025-04-28 01:46:46.169 if ms_prev > 0:
2025-04-28 01:46:46.175 elapsed_time_ratios.append(ms_curr / ms_prev)
2025-04-28 01:46:46.181 ms_prev = ms_curr
2025-04-28 01:46:46.186
2025-04-28 01:46:46.191 if rs:
2025-04-28 01:46:46.196 rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
2025-04-28 01:46:46.202 if ps:
2025-04-28 01:46:46.207 ps.free()
2025-04-28 01:46:46.213
2025-04-28 01:46:46.218 expected_msg = 'Expected: data dispersion is low.'
2025-04-28 01:46:46.224 std_deviation = stdev(elapsed_time_ratios)
2025-04-28 01:46:46.230 if std_deviation <= MAX_STD_DEV:
2025-04-28 01:46:46.236 print(expected_msg)
2025-04-28 01:46:46.242 else:
2025-04-28 01:46:46.248 print(f'UNEXPECTED: standard deviation of elapsed time ratios is {std_deviation} - greater than {MAX_STD_DEV=}')
2025-04-28 01:46:46.253 print(f'Elapsed time ratios: {elapsed_time_ratios}')
2025-04-28 01:46:46.258
2025-04-28 01:46:46.263 act.expected_stdout = f"""
2025-04-28 01:46:46.269 {expected_msg}
2025-04-28 01:46:46.275 """
2025-04-28 01:46:46.282 act.stdout = capsys.readouterr().out
2025-04-28 01:46:46.288 > assert act.clean_stdout == act.clean_expected_stdout
2025-04-28 01:46:46.296 E assert
2025-04-28 01:46:46.303 E - Expected: data dispersion is low.
2025-04-28 01:46:46.310 E + UNEXPECTED: standard deviation of elapsed time ratios is 1.1729631028124896 - greater than MAX_STD_DEV=0.8
2025-04-28 01:46:46.315 E + Elapsed time ratios: [1.3529411764705883, 4.815217391304348, 1.3927765237020315, 2.4586709886547813, 2.09228740936058, 1.9514807813484563, 2.155150145301905]
2025-04-28 01:46:46.321
2025-04-28 01:46:46.328 tests/bugs/gh_8421_test.py:332: AssertionError
2025-04-28 01:46:46.334 ---------------------------- Captured stdout setup -----------------------------
2025-04-28 01:46:46.340 Creating db: localhost:/var/tmp/qa_2024/test_11727/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 1.1729631028124896 - greater than MAX_STD_DEV=0.8
E + Elapsed time ratios: [1.3529411764705883, 4.815217391304348, 1.3927765237020315, 2.4586709886547813, 2.09228740936058, 1.9514807813484563, 2.155150145301905]
tests/bugs/gh_8421_test.py:332: AssertionError
|