mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 13:33:07 +01:00
Added/Updated tests\bugs\gh_7118_test.py: Checked on 3.0.11.33665, 4.0.3.2904, 5.0.0.964
This commit is contained in:
parent
280087592e
commit
a9c15435e3
85
tests/bugs/gh_7118_test.py
Normal file
85
tests/bugs/gh_7118_test.py
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#coding:utf-8
|
||||||
|
|
||||||
|
"""
|
||||||
|
ID: issue-7118
|
||||||
|
ISSUE: https://github.com/FirebirdSQL/firebird/issues/7118
|
||||||
|
TITLE: Chained JOIN .. USING across the same column names may be optimized badly
|
||||||
|
NOTES:
|
||||||
|
[01.03.2023] pzotov
|
||||||
|
Checked on 3.0.11.33665, 4.0.3.2904, 5.0.0.964
|
||||||
|
"""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from firebird.qa import *
|
||||||
|
|
||||||
|
db = db_factory()
|
||||||
|
|
||||||
|
test_script = """
|
||||||
|
recreate table t1 (id int primary key, col int);
|
||||||
|
create index t1_col on t1 (col);
|
||||||
|
recreate table t2 (id int primary key, col int);
|
||||||
|
create index t2_col on t2 (col);
|
||||||
|
recreate table t3 (id int primary key, col int);
|
||||||
|
create index t3_col on t3 (col);
|
||||||
|
|
||||||
|
set plan;
|
||||||
|
select *
|
||||||
|
from t1 t1
|
||||||
|
inner join t2 t2 on t1.id = t2.id
|
||||||
|
inner join t3 t3 on t1.id = t3.id
|
||||||
|
where
|
||||||
|
t1.col = 0
|
||||||
|
and t2.col = 0
|
||||||
|
and t3.col = 0;
|
||||||
|
-- PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY11), T3 INDEX (RDB$PRIMARY12))
|
||||||
|
|
||||||
|
select *
|
||||||
|
from t1 t1
|
||||||
|
inner join t2 t2 on t1.id = t2.id
|
||||||
|
inner join t3 t3 on t2.id = t3.id
|
||||||
|
where
|
||||||
|
t1.col = 0
|
||||||
|
and t2.col = 0
|
||||||
|
and t3.col = 0;
|
||||||
|
-- PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY11), T3 INDEX (RDB$PRIMARY12))
|
||||||
|
|
||||||
|
select *
|
||||||
|
from t1 t1
|
||||||
|
inner join t2 t2 on t1.id = t2.id
|
||||||
|
inner join t3 t3 on t1.id = t3.id and t2.id = t3.id
|
||||||
|
where
|
||||||
|
t1.col = 0
|
||||||
|
and t2.col = 0
|
||||||
|
and t3.col = 0;
|
||||||
|
-- PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY11), T3 INDEX (RDB$PRIMARY12))
|
||||||
|
|
||||||
|
select *
|
||||||
|
from t1 t1
|
||||||
|
inner join t2 t2 using (id)
|
||||||
|
inner join t3 t3 using (id)
|
||||||
|
where
|
||||||
|
t1.col = 0
|
||||||
|
and t2.col = 0
|
||||||
|
and t3.col = 0;
|
||||||
|
-- The last query with USING syntax gets a different (usually worse) plan.
|
||||||
|
-- This issue is closely related to #3357, because using (id) is internally
|
||||||
|
-- transformed into coalesce(t1.id, t2.id) = t3.id.
|
||||||
|
-- PLAN HASH (JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY11)), T3 INDEX (T3_COL))
|
||||||
|
"""
|
||||||
|
|
||||||
|
act = isql_act('db', test_script)
|
||||||
|
|
||||||
|
""
|
||||||
|
|
||||||
|
expected_stdout = """
|
||||||
|
PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY2), T3 INDEX (RDB$PRIMARY3))
|
||||||
|
PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY2), T3 INDEX (RDB$PRIMARY3))
|
||||||
|
PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY2), T3 INDEX (RDB$PRIMARY3))
|
||||||
|
PLAN JOIN (T1 INDEX (T1_COL), T2 INDEX (RDB$PRIMARY2), T3 INDEX (RDB$PRIMARY3))
|
||||||
|
"""
|
||||||
|
|
||||||
|
@pytest.mark.version('>=3.0.9')
|
||||||
|
def test_1(act: Action):
|
||||||
|
act.expected_stdout = expected_stdout
|
||||||
|
act.execute(combine_output = True)
|
||||||
|
assert act.clean_stdout == act.clean_expected_stdout
|
Loading…
Reference in New Issue
Block a user