2 @message |
assert
- Expected: data dispersion is low.
+ UNEXPECTED: standard deviation of elapsed time ratios is 0.819453368167856 - greater than MAX_STD_DEV=0.8
+ Elapsed time ratios: [1.13, 3.743362831858407, 2.0307328605200947, 1.7974388824214202, 2.3873056994818653, 2.0390667390124797, 1.6464874933475253]
LOG DETAILS:
2025-05-21 01:52:14.913
2025-05-21 01:52:14.926 act = <firebird.qa.plugin.Action object at [hex]>
2025-05-21 01:52:14.943 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-05-21 01:52:14.954
2025-05-21 01:52:14.970 @pytest.mark.version('>=5.0.3')
2025-05-21 01:52:14.986 def test_1(act: Action, capsys):
2025-05-21 01:52:14.998
2025-05-21 01:52:15.014 #############################################
2025-05-21 01:52:15.031 MAX_STD_DEV = 0.5 if os.name == 'nt' else 0.8
2025-05-21 01:52:15.046 #############################################
2025-05-21 01:52:15.055
2025-05-21 01:52:15.066
2025-05-21 01:52:15.083 ddl_lst = []
2025-05-21 01:52:15.094 ddl_lst.extend(
2025-05-21 01:52:15.119 (
2025-05-21 01:52:15.139 """
2025-05-21 01:52:15.155 recreate table log_table(
2025-05-21 01:52:15.167 log_id bigint generated by default as identity constraint pk_log_table primary key
2025-05-21 01:52:15.187 ,field_name varchar(31) not null
2025-05-21 01:52:15.207 ,old_value blob
2025-05-21 01:52:15.227 )
2025-05-21 01:52:15.242 """
2025-05-21 01:52:15.262 ,"""
2025-05-21 01:52:15.278 recreate table test_table (
2025-05-21 01:52:15.294 id bigint not null,
2025-05-21 01:52:15.301 fld_01 varchar(40),
2025-05-21 01:52:15.319 fld_02 date,
2025-05-21 01:52:15.342 fld_03 varchar(40),
2025-05-21 01:52:15.350 fld_04 date,
2025-05-21 01:52:15.362 fld_05 varchar(1000),
2025-05-21 01:52:15.379 fld_06 varchar(1000),
2025-05-21 01:52:15.394 fld_07 numeric(15,2),
2025-05-21 01:52:15.414 fld_08 date,
2025-05-21 01:52:15.430 fld_09 varchar(95),
2025-05-21 01:52:15.442 fld_10 bigint,
2025-05-21 01:52:15.454 fld_11 bigint,
2025-05-21 01:52:15.474 fld_12 bigint,
2025-05-21 01:52:15.482 fld_13 varchar(250),
2025-05-21 01:52:15.494 fld_14 bigint,
2025-05-21 01:52:15.502 fld_15 date,
2025-05-21 01:52:15.518 fld_16 integer,
2025-05-21 01:52:15.534 fld_17 bigint,
2025-05-21 01:52:15.540 fld_18 date,
2025-05-21 01:52:15.554 fld_19 bigint,
2025-05-21 01:52:15.566 fld_20 varchar(95),
2025-05-21 01:52:15.579 fld_21 date,
2025-05-21 01:52:15.595 fld_22 bigint,
2025-05-21 01:52:15.605 fld_23 numeric(16,0),
2025-05-21 01:52:15.623 fld_24 smallint,
2025-05-21 01:52:15.639 fld_25 bigint,
2025-05-21 01:52:15.646 fld_26 bigint,
2025-05-21 01:52:15.658 fld_27 smallint default 0,
2025-05-21 01:52:15.670 fld_28 date,
2025-05-21 01:52:15.686 fld_29 smallint,
2025-05-21 01:52:15.694 fld_30 date,
2025-05-21 01:52:15.702 fld_31 date,
2025-05-21 01:52:15.713 fld_32 date,
2025-05-21 01:52:15.721 fld_33 date,
2025-05-21 01:52:15.739 fld_34 date,
2025-05-21 01:52:15.759 fld_35 date,
2025-05-21 01:52:15.775 fld_36 date,
2025-05-21 01:52:15.794 fld_37 date,
2025-05-21 01:52:15.810 fld_38 date,
2025-05-21 01:52:15.826 fld_39 date,
2025-05-21 01:52:15.847 fld_40 smallint,
2025-05-21 01:52:15.858 fld_41 smallint,
2025-05-21 01:52:15.874 fld_42 smallint,
2025-05-21 01:52:15.883 fld_43 bigint,
2025-05-21 01:52:15.899 fld_44 bigint,
2025-05-21 01:52:15.906 fld_45 bigint,
2025-05-21 01:52:15.927 fld_46 smallint,
2025-05-21 01:52:15.934 fld_47 varchar(1000),
2025-05-21 01:52:15.954 fld_48 bigint,
2025-05-21 01:52:15.963 fld_49 varchar(4000),
2025-05-21 01:52:15.970 fld_50 bigint
2025-05-21 01:52:15.990 )
2025-05-21 01:52:15.998 """
2025-05-21 01:52:16.010 ,'create generator audit'
2025-05-21 01:52:16.022 ,'alter table test_table add constraint pk_test_table primary key (id) using descending index pk_test_table'
2025-05-21 01:52:16.038 ,"""
2025-05-21 01:52:16.049 create or alter trigger h$test_table for test_table
2025-05-21 01:52:16.062 active after update position 0
2025-05-21 01:52:16.070 as
2025-05-21 01:52:16.086 declare id bigint;
2025-05-21 01:52:16.102 declare o blob sub_type 1 segment size 80;
2025-05-21 01:52:16.109 begin
2025-05-21 01:52:16.122 id = gen_id(audit, 1);
2025-05-21 01:52:16.135 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-05-21 01:52:16.142 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-05-21 01:52:16.154 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-05-21 01:52:16.170 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-05-21 01:52:16.186 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-05-21 01:52:16.202 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-05-21 01:52:16.218 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-05-21 01:52:16.230 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-05-21 01:52:16.241 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-05-21 01:52:16.259 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-05-21 01:52:16.274
2025-05-21 01:52:16.294
2025-05-21 01:52:16.310 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-05-21 01:52:16.326 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-05-21 01:52:16.342 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-05-21 01:52:16.350 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-05-21 01:52:16.366 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-05-21 01:52:16.375 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-05-21 01:52:16.391 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-05-21 01:52:16.410 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-05-21 01:52:16.418 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-05-21 01:52:16.441 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-05-21 01:52:16.453
2025-05-21 01:52:16.462
2025-05-21 01:52:16.481 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-05-21 01:52:16.495 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-05-21 01:52:16.513 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-05-21 01:52:16.533 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-05-21 01:52:16.547 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-05-21 01:52:16.555 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-05-21 01:52:16.571 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-05-21 01:52:16.583 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-05-21 01:52:16.591 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-05-21 01:52:16.602 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-05-21 01:52:16.613
2025-05-21 01:52:16.634
2025-05-21 01:52:16.644 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-05-21 01:52:16.669 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-05-21 01:52:16.685 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-05-21 01:52:16.705 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-05-21 01:52:16.721 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-05-21 01:52:16.737 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-05-21 01:52:16.757 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-05-21 01:52:16.773 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-05-21 01:52:16.789 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-05-21 01:52:16.798 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-05-21 01:52:16.818
2025-05-21 01:52:16.834
2025-05-21 01:52:16.842
2025-05-21 01:52:16.855 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-05-21 01:52:16.875 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-05-21 01:52:16.890 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-05-21 01:52:16.906 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-05-21 01:52:16.918 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-05-21 01:52:16.934 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-05-21 01:52:16.942 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-05-21 01:52:16.954 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-05-21 01:52:16.970 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-05-21 01:52:16.983 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-05-21 01:52:17.002 end
2025-05-21 01:52:17.018 """
2025-05-21 01:52:17.034 ,"""
2025-05-21 01:52:17.050 execute block
2025-05-21 01:52:17.062 as
2025-05-21 01:52:17.078 declare id bigint;
2025-05-21 01:52:17.093 begin
2025-05-21 01:52:17.105 id = 0;
2025-05-21 01:52:17.118 while (id < 128000) do
2025-05-21 01:52:17.132 begin
2025-05-21 01:52:17.146 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-05-21 01:52:17.162 values (
2025-05-21 01:52:17.174 :id,
2025-05-21 01:52:17.186 'Identifier',
2025-05-21 01:52:17.198 '2025-01-23',
2025-05-21 01:52:17.211 '1234567890123456789',
2025-05-21 01:52:17.231 '2025-01-23',
2025-05-21 01:52:17.246 'Test data',
2025-05-21 01:52:17.262 'Test another data',
2025-05-21 01:52:17.279 500,
2025-05-21 01:52:17.294 '2025-01-24',
2025-05-21 01:52:17.307 'Test Test Test',
2025-05-21 01:52:17.322 3,
2025-05-21 01:52:17.334 12345678901234,
2025-05-21 01:52:17.350 12,
2025-05-21 01:52:17.367 'Test',
2025-05-21 01:52:17.382 12345678901234,
2025-05-21 01:52:17.398 '2025-01-30',
2025-05-21 01:52:17.410 0,
2025-05-21 01:52:17.426 NULL,
2025-05-21 01:52:17.434 '2025-01-31',
2025-05-21 01:52:17.450 12345679801234,
2025-05-21 01:52:17.470 'Test Test data',
2025-05-21 01:52:17.477 NULL,
2025-05-21 01:52:17.494 1234,
2025-05-21 01:52:17.510 1234567,
2025-05-21 01:52:17.526 2025,
2025-05-21 01:52:17.538 NULL,
2025-05-21 01:52:17.555 NULL,
2025-05-21 01:52:17.567 0,
2025-05-21 01:52:17.586 '2025-02-01',
2025-05-21 01:52:17.598 0,
2025-05-21 01:52:17.606 NULL,
2025-05-21 01:52:17.618 NULL,
2025-05-21 01:52:17.630 NULL,
2025-05-21 01:52:17.646 NULL,
2025-05-21 01:52:17.658 '2025-01-15',
2025-05-21 01:52:17.666 NULL,
2025-05-21 01:52:17.678 NULL,
2025-05-21 01:52:17.694 NULL,
2025-05-21 01:52:17.711 NULL,
2025-05-21 01:52:17.726 NULL,
2025-05-21 01:52:17.742 1,
2025-05-21 01:52:17.758 0,
2025-05-21 01:52:17.765 0,
2025-05-21 01:52:17.777 NULL,
2025-05-21 01:52:17.790 12346579801234,
2025-05-21 01:52:17.802 12345678901234,
2025-05-21 01:52:17.817 NULL,
2025-05-21 01:52:17.835 'Long test data for varchar(1000)',
2025-05-21 01:52:17.851 12345678901234,
2025-05-21 01:52:17.866 '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-05-21 01:52:17.874 0
2025-05-21 01:52:17.886 );
2025-05-21 01:52:17.898
2025-05-21 01:52:17.915 id = id + 1;
2025-05-21 01:52:17.935 end
2025-05-21 01:52:17.951 end
2025-05-21 01:52:17.967 """
2025-05-21 01:52:17.983 ,"""
2025-05-21 01:52:17.999 create or alter procedure run_test(a int)
2025-05-21 01:52:18.011 returns (t_cnt int, t_diff bigint)
2025-05-21 01:52:18.027 as
2025-05-21 01:52:18.043 declare id bigint;
2025-05-21 01:52:18.058 declare t_begin timestamp;
2025-05-21 01:52:18.070 declare t_end timestamp;
2025-05-21 01:52:18.082 begin
2025-05-21 01:52:18.091 t_cnt = a;
2025-05-21 01:52:18.106 t_begin = 'now';
2025-05-21 01:52:18.122 for
2025-05-21 01:52:18.130 select id
2025-05-21 01:52:18.142 from test_table
2025-05-21 01:52:18.162 where
2025-05-21 01:52:18.178 id >= 0 and id < :t_cnt
2025-05-21 01:52:18.194 into :id do
2025-05-21 01:52:18.210 update test_table set fld_50 = :t_cnt where id = :id;
2025-05-21 01:52:18.222 t_end = 'now';
2025-05-21 01:52:18.238 t_diff = datediff(millisecond from :t_begin to :t_end);
2025-05-21 01:52:18.255 suspend;
2025-05-21 01:52:18.270 end
2025-05-21 01:52:18.283 """
2025-05-21 01:52:18.298 )
2025-05-21 01:52:18.314 )
2025-05-21 01:52:18.335
2025-05-21 01:52:18.346 with act.db.connect() as con:
2025-05-21 01:52:18.359 for x in ddl_lst:
2025-05-21 01:52:18.371 con.execute_immediate(x)
2025-05-21 01:52:18.394 con.commit()
2025-05-21 01:52:18.406
2025-05-21 01:52:18.422 #--------------------------------------
2025-05-21 01:52:18.438
2025-05-21 01:52:18.454 cur = con.cursor()
2025-05-21 01:52:18.470 rs = None
2025-05-21 01:52:18.486 ps = cur.prepare('select t.* from run_test(?) t')
2025-05-21 01:52:18.502 elapsed_time_ratios = []
2025-05-21 01:52:18.519 ms_prev = -1
2025-05-21 01:52:18.531 for n in (0.375, 0.75, 1.5, 3, 6, 12, 24, 48):
2025-05-21 01:52:18.545 # d1 = py_dt.timedelta(0)
2025-05-21 01:52:18.558 rs = cur.execute(ps, ( int(n * 1000),))
2025-05-21 01:52:18.566 t1 = py_dt.datetime.now()
2025-05-21 01:52:18.582 cur.fetchall()
2025-05-21 01:52:18.593 t2 = py_dt.datetime.now()
2025-05-21 01:52:18.605 con.commit()
2025-05-21 01:52:18.615 d1 = t2-t1
2025-05-21 01:52:18.630 ms_curr = d1.seconds*1000 + d1.microseconds//1000
2025-05-21 01:52:18.642
2025-05-21 01:52:18.661 if ms_prev > 0:
2025-05-21 01:52:18.681 elapsed_time_ratios.append(ms_curr / ms_prev)
2025-05-21 01:52:18.697 ms_prev = ms_curr
2025-05-21 01:52:18.712
2025-05-21 01:52:18.725 if rs:
2025-05-21 01:52:18.735 rs.close() # <<< EXPLICITLY CLOSING CURSOR RESULTS
2025-05-21 01:52:18.750 if ps:
2025-05-21 01:52:18.762 ps.free()
2025-05-21 01:52:18.785
2025-05-21 01:52:18.801 expected_msg = 'Expected: data dispersion is low.'
2025-05-21 01:52:18.817 std_deviation = stdev(elapsed_time_ratios)
2025-05-21 01:52:18.827 if std_deviation <= MAX_STD_DEV:
2025-05-21 01:52:18.839 print(expected_msg)
2025-05-21 01:52:18.846 else:
2025-05-21 01:52:18.863 print(f'UNEXPECTED: standard deviation of elapsed time ratios is {std_deviation} - greater than {MAX_STD_DEV=}')
2025-05-21 01:52:18.878 print(f'Elapsed time ratios: {elapsed_time_ratios}')
2025-05-21 01:52:18.887
2025-05-21 01:52:18.892 act.expected_stdout = f"""
2025-05-21 01:52:18.905 {expected_msg}
2025-05-21 01:52:18.921 """
2025-05-21 01:52:18.931 act.stdout = capsys.readouterr().out
2025-05-21 01:52:18.942 > assert act.clean_stdout == act.clean_expected_stdout
2025-05-21 01:52:18.958 E assert
2025-05-21 01:52:18.969 E - Expected: data dispersion is low.
2025-05-21 01:52:18.981 E + UNEXPECTED: standard deviation of elapsed time ratios is 0.819453368167856 - greater than MAX_STD_DEV=0.8
2025-05-21 01:52:19.001 E + Elapsed time ratios: [1.13, 3.743362831858407, 2.0307328605200947, 1.7974388824214202, 2.3873056994818653, 2.0390667390124797, 1.6464874933475253]
2025-05-21 01:52:19.011
2025-05-21 01:52:19.025 tests/bugs/gh_8421_test.py:332: AssertionError
2025-05-21 01:52:19.045 ---------------------------- Captured stdout setup -----------------------------
2025-05-21 01:52:19.055 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.819453368167856 - greater than MAX_STD_DEV=0.8
E + Elapsed time ratios: [1.13, 3.743362831858407, 2.0307328605200947, 1.7974388824214202, 2.3873056994818653, 2.0390667390124797, 1.6464874933475253]
tests/bugs/gh_8421_test.py:332: AssertionError
|