6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 13:33:07 +01:00

Added/Updated tests\bugs\gh_8225_test.py: Checked on 5.0.2.1482-604555f. NOT: parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x.

This commit is contained in:
pavel-zotov 2024-08-23 22:56:18 +03:00
parent 9f45c1f713
commit 3626071f72

110
tests/bugs/gh_8225_test.py Normal file
View File

@ -0,0 +1,110 @@
#coding:utf-8
"""
ID: issue-8225
ISSUE: https://github.com/FirebirdSQL/firebird/issues/8225
TITLE: Problematic queries when SubQueryConversion = true
DESCRIPTION:
NOTES:
[23.08.2024] pzotov
1. Explained plan output temporary disabled: there is question about missed(?) indentation after 'Refetch'.
Sent letter to dimitr, 23.08.2024 21:42.
2. Parameter 'SubQueryConversion' currently presents only in FB 5.x and _NOT_ in FB 6.x.
Because of that, testing version are limited only for 5.0.2. FB 6.x currently is NOT tested.
Confirmed bug on 5.0.2.1479-adfe97a.
Checked on 5.0.2.1482-604555f.
"""
import pytest
from firebird.qa import *
from firebird.driver import driver_config, connect
init_script = """
create domain dm_emp_id smallint;
create domain dm_dep_id smallint;
create domain dm_name varchar(20);
create table department (
dept_no dm_dep_id not null
,dept_name dm_name not null
);
create table employee (
emp_no dm_emp_id not null
,last_name dm_name not null
,dept_no dm_dep_id not null
,constraint emp_key primary key (emp_no)
);
commit;
insert into department( dept_no, dept_name) values (1, 'd1');
insert into department( dept_no, dept_name) values (2, 'd2');
insert into department( dept_no, dept_name) values (3, 'd3');
insert into employee( emp_no, last_name, dept_no) values (1, 'e1', 1);
insert into employee( emp_no, last_name, dept_no) values (2, 'e2', 2);
insert into employee( emp_no, last_name, dept_no) values (3, 'e3', 3);
insert into employee( emp_no, last_name, dept_no) values (4, 'e4', 1);
insert into employee( emp_no, last_name, dept_no) values (5, 'e5', 1);
insert into employee( emp_no, last_name, dept_no) values (6, 'e6', 1);
insert into employee( emp_no, last_name, dept_no) values (7, 'e7', 2);
insert into employee( emp_no, last_name, dept_no) values (8, 'e8', 3);
insert into employee( emp_no, last_name, dept_no) values (9, 'e9', 3);
commit;
update department d set dept_no = -dept_no where exists(select * from employee e where e.dept_no = d.dept_no) rows 1;
insert into employee( emp_no, last_name, dept_no) values (12, 'e12', -(select max(dept_no)+1 from department) );
commit;
"""
db = db_factory(init=init_script)
act = python_act('db')
#-----------------------------------------------------------
def replace_leading(source, char="."):
stripped = source.lstrip()
return char * (len(source) - len(stripped)) + stripped
#-----------------------------------------------------------
@pytest.mark.version('>=5.0.2,<6')
def test_1(act: Action, capsys):
test_sql = """
select d.dept_no, d.dept_name from department d
where exists(select * from employee e where e.dept_no = d.dept_no)
order by dept_no rows 1
"""
for sq_conv in ('true','false',):
srv_cfg = driver_config.register_server(name = f'srv_cfg_8225_{sq_conv}', config = '')
db_cfg_name = f'db_cfg_8225_{sq_conv}'
db_cfg_object = driver_config.register_database(name = db_cfg_name)
db_cfg_object.server.value = srv_cfg.name
db_cfg_object.database.value = str(act.db.db_path)
db_cfg_object.config.value = f"""
SubQueryConversion = {sq_conv}
"""
with connect(db_cfg_name, user = act.db.user, password = act.db.password) as con:
cur = con.cursor()
cur.execute("select g.rdb$config_name, g.rdb$config_value from rdb$database r left join rdb$config g on g.rdb$config_name = 'SubQueryConversion'")
for r in cur:
print(r[0],r[1])
ps = cur.prepare(test_sql)
# temporary, until question with indentation will be solved by dimitr -- print( '\n'.join([replace_leading(s) for s in ps.detailed_plan.split('\n')]) )
for r in cur.execute(ps):
print(r[0],r[1])
con.rollback()
act.expected_stdout = f"""
SubQueryConversion true
2 d2
SubQueryConversion false
2 d2
"""
act.stdout = capsys.readouterr().out
assert act.clean_stdout == act.clean_expected_stdout