diff --git a/tests/bugs/gh_8178_addi_test.py b/tests/bugs/gh_8178_addi_test.py new file mode 100644 index 00000000..cbceb042 --- /dev/null +++ b/tests/bugs/gh_8178_addi_test.py @@ -0,0 +1,117 @@ +#coding:utf-8 + +""" +ID: issue-8178 +ISSUE: https://github.com/FirebirdSQL/firebird/pull/8178 +TITLE: Check result of conversion to string in COALESCE that involves all families of data types. +DESCRIPTION: + Additional test for gh_8178 +NOTES: + [12.07.2024] pzotov + Checked on 6.0.0.392, 5.0.1.1434, 4.0.5.3127, 3.0.12.33765 +""" + +import pytest +from firebird.qa import * + +db = db_factory() + +test_script = """ + set list on; + recreate table dvalues( + t_int int default 12345 + ,t_boo boolean default true + ,t_chr char default 'A' + ,t_blb blob default 'bbbbbbblllllllloooooooooobbbbbbbb' + ,t_dat date default '01.01.1991' + ,t_tim time default '01:02:03.456' + ,t_tst timestamp default '01.02.2003 23:34:56' + ,t_nul char default null + ); + insert into dvalues default values; + commit; + --------------------------------------------------------- + recreate table dtypes(f smallint, t varchar(20)); + insert into dtypes(f,t) values( 1,'int'); + insert into dtypes(f,t) values( 2,'boo'); + insert into dtypes(f,t) values( 3,'chr'); + insert into dtypes(f,t) values( 4,'blb'); + insert into dtypes(f,t) values( 5,'dat'); + insert into dtypes(f,t) values( 6,'tim'); + insert into dtypes(f,t) values( 7,'tst'); + --insert into dtypes(f,t) values( 8,'nul'); + commit; + + set count on; + + set term ^; + execute block returns( checked_expr varchar(1024), raised_gds int) as + declare v_expr varchar(1024); + declare v_done smallint; + begin + for + select + --a.t as a_t, b.t as b_t, c.t as c_t, d.t as d_t, e.t as e_t, f.t as f_t, g.t as g_t + --,a.f as a_f, b.f as b_f, c.f as c_f, d.f as d_f, e.f as e_f, f.f as f_f, g.f as g_f, + 'select iif( coalesce(' + || + iif( a.t = 'nul', 'null', 't_'||a.t) + || + iif( b.t = 'nul', ', null', ', t_'||b.t) + || + iif( c.t = 'nul', ', null', ', t_'||c.t) + || + iif( d.t = 'nul', ', null', ', t_'||d.t) + || + iif( e.t = 'nul', ', null', ', t_'||e.t) + || + iif( f.t = 'nul', ', null', ', t_'||f.t) + || + iif( g.t = 'nul', ', null', ', t_'||g.t) + || + ') is distinct from null, 1, 0 ) as x from dvalues' as expr + from dtypes a + cross join dtypes b + cross join dtypes c + cross join dtypes d + cross join dtypes e + cross join dtypes f + cross join dtypes g + where + a.f not in (b.f, c.f, d.f, e.f, f.f, g.f) + and b.f not in (c.f, d.f, e.f, f.f, g.f) + and c.f not in (d.f, e.f, f.f, g.f) + and d.f not in (e.f, f.f, g.f) + and e.f not in (f.f, g.f) + and f.f not in (g.f) + order by a.t, b.t, c.t, d.t, e.t, f.t, g.t + as cursor k + do begin + checked_expr = k.expr; + raised_gds = 0; + begin + execute statement checked_expr into v_done; + when any do + begin + raised_gds = gdscode; + end + end + if (raised_gds <> 0) then + suspend; + end + end + ^ + set term ;^ +""" + +act = isql_act('db', test_script) + +expected_stdout = """ + Records affected: 0 +""" + +@pytest.mark.version('>=3.0.12') +def test_1(act: Action): + act.expected_stdout = expected_stdout + act.execute(combine_output = True) + assert act.clean_stdout == act.clean_expected_stdout