mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-02-02 02:40:42 +01:00
Added/Updated tests\functional\arno\optimizer\test_opt_multi_index_selection_06.py: -m Adjusted allowed versions: FB 3.x and 4.x issue same execution plan. Plan in FB 5.x differs. Version 5.x is not checked currently. Wait for resolution.
This commit is contained in:
parent
bb2a02d75f
commit
16d07d6101
@ -7,85 +7,89 @@ DESCRIPTION:
|
||||
Check if it will select the index with the best selectivity and with the biggest segment match.
|
||||
Prefer "lower and upper bound" (but not the same value (BETWEEN)) above only upper or lower bound ( >=, >, <, <=).
|
||||
FBTEST: functional.arno.optimizer.opt_multi_index_selection_06
|
||||
NOTES:
|
||||
[09.03.2023] pzotov
|
||||
Adjusted allowed versions: FB 3.x and 4.x issue same execution plan.
|
||||
Plan in FB 5.x differs: PLAN (ST INDEX (I_F3_F1_ASC)).
|
||||
Version 5.x is not checked currently. Wait for resolution.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from firebird.qa import *
|
||||
|
||||
init_script = """CREATE TABLE SelectionTest (
|
||||
F1 INTEGER NOT NULL,
|
||||
F2 INTEGER,
|
||||
F3 INTEGER
|
||||
);
|
||||
init_script = """
|
||||
CREATE TABLE SelectionTest (
|
||||
F1 INTEGER NOT NULL,
|
||||
F2 INTEGER,
|
||||
F3 INTEGER
|
||||
);
|
||||
|
||||
SET TERM ^^ ;
|
||||
CREATE PROCEDURE PR_SelectionTest
|
||||
AS
|
||||
DECLARE VARIABLE FillID INTEGER;
|
||||
BEGIN
|
||||
FillID = 1;
|
||||
WHILE (FillID <= 1000) DO
|
||||
BEGIN
|
||||
INSERT INTO SelectionTest
|
||||
(F1, F2, F3)
|
||||
VALUES
|
||||
(:FillID, (:FILLID / 2) * 2, :FILLID);
|
||||
FillID = FillID + 1;
|
||||
END
|
||||
END
|
||||
^^
|
||||
SET TERM ; ^^
|
||||
SET TERM ^^ ;
|
||||
CREATE PROCEDURE PR_SelectionTest
|
||||
AS
|
||||
DECLARE VARIABLE FillID INTEGER;
|
||||
BEGIN
|
||||
FillID = 1;
|
||||
WHILE (FillID <= 1000) DO
|
||||
BEGIN
|
||||
INSERT INTO SelectionTest
|
||||
(F1, F2, F3)
|
||||
VALUES
|
||||
(:FillID, (:FILLID / 2) * 2, :FILLID);
|
||||
FillID = FillID + 1;
|
||||
END
|
||||
END
|
||||
^^
|
||||
SET TERM ; ^^
|
||||
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
|
||||
/* Fill table with data */
|
||||
EXECUTE PROCEDURE PR_SelectionTest;
|
||||
/* Fill table with data */
|
||||
EXECUTE PROCEDURE PR_SelectionTest;
|
||||
|
||||
COMMIT;
|
||||
COMMIT;
|
||||
|
||||
/* Create indexes */
|
||||
CREATE UNIQUE ASC INDEX I_F1_UNIQUE_ASC ON SelectionTest (F1);
|
||||
CREATE ASC INDEX I_F1_ASC ON SelectionTest (F1);
|
||||
CREATE ASC INDEX I_F2_ASC ON SelectionTest (F2);
|
||||
CREATE ASC INDEX I_F3_ASC ON SelectionTest (F3);
|
||||
CREATE ASC INDEX I_F1_F2_ASC ON SelectionTest (F1, F2);
|
||||
CREATE ASC INDEX I_F1_F3_ASC ON SelectionTest (F1, F3);
|
||||
CREATE ASC INDEX I_F1_F2_F3_ASC ON SelectionTest (F1, F2, F3);
|
||||
CREATE ASC INDEX I_F1_F3_F2_ASC ON SelectionTest (F1, F3, F2);
|
||||
CREATE ASC INDEX I_F2_F1_ASC ON SelectionTest (F2, F1);
|
||||
CREATE ASC INDEX I_F2_F3_ASC ON SelectionTest (F2, F3);
|
||||
CREATE ASC INDEX I_F2_F1_F3_ASC ON SelectionTest (F2, F1, F3);
|
||||
CREATE ASC INDEX I_F2_F3_F1_ASC ON SelectionTest (F2, F3, F1);
|
||||
CREATE ASC INDEX I_F3_F1_ASC ON SelectionTest (F3, F1);
|
||||
CREATE ASC INDEX I_F3_F2_ASC ON SelectionTest (F3, F2);
|
||||
CREATE ASC INDEX I_F3_F1_F2_ASC ON SelectionTest (F3, F1, F2);
|
||||
CREATE ASC INDEX I_F3_F2_F1_ASC ON SelectionTest (F3, F2, F1);
|
||||
|
||||
COMMIT;
|
||||
/* Create indexes */
|
||||
CREATE UNIQUE ASC INDEX I_F1_UNIQUE_ASC ON SelectionTest (F1);
|
||||
CREATE ASC INDEX I_F1_ASC ON SelectionTest (F1);
|
||||
CREATE ASC INDEX I_F2_ASC ON SelectionTest (F2);
|
||||
CREATE ASC INDEX I_F3_ASC ON SelectionTest (F3);
|
||||
CREATE ASC INDEX I_F1_F2_ASC ON SelectionTest (F1, F2);
|
||||
CREATE ASC INDEX I_F1_F3_ASC ON SelectionTest (F1, F3);
|
||||
CREATE ASC INDEX I_F1_F2_F3_ASC ON SelectionTest (F1, F2, F3);
|
||||
CREATE ASC INDEX I_F1_F3_F2_ASC ON SelectionTest (F1, F3, F2);
|
||||
CREATE ASC INDEX I_F2_F1_ASC ON SelectionTest (F2, F1);
|
||||
CREATE ASC INDEX I_F2_F3_ASC ON SelectionTest (F2, F3);
|
||||
CREATE ASC INDEX I_F2_F1_F3_ASC ON SelectionTest (F2, F1, F3);
|
||||
CREATE ASC INDEX I_F2_F3_F1_ASC ON SelectionTest (F2, F3, F1);
|
||||
CREATE ASC INDEX I_F3_F1_ASC ON SelectionTest (F3, F1);
|
||||
CREATE ASC INDEX I_F3_F2_ASC ON SelectionTest (F3, F2);
|
||||
CREATE ASC INDEX I_F3_F1_F2_ASC ON SelectionTest (F3, F1, F2);
|
||||
CREATE ASC INDEX I_F3_F2_F1_ASC ON SelectionTest (F3, F2, F1);
|
||||
COMMIT;
|
||||
"""
|
||||
|
||||
db = db_factory(init=init_script)
|
||||
|
||||
test_script = """SET PLAN ON;
|
||||
SELECT
|
||||
st.F1, st.F2, st.F3
|
||||
FROM
|
||||
SelectionTest st
|
||||
WHERE
|
||||
st.F1 >= 99 and st.F1 <= 101 and
|
||||
st.F2 >= 99 and
|
||||
st.F3 = 100;"""
|
||||
test_script = """
|
||||
set planonly;
|
||||
select
|
||||
st.f1, st.f2, st.f3
|
||||
from
|
||||
selectiontest st
|
||||
where
|
||||
st.f1 >= 99 and st.f1 <= 101 and
|
||||
st.f2 >= 99 and
|
||||
st.f3 = 100;
|
||||
"""
|
||||
|
||||
act = isql_act('db', test_script)
|
||||
|
||||
expected_stdout = """PLAN (ST INDEX (I_F3_F2_ASC))
|
||||
expected_stdout = """
|
||||
PLAN (ST INDEX (I_F3_F2_ASC))
|
||||
"""
|
||||
|
||||
F1 F2 F3
|
||||
============ ============ ============
|
||||
|
||||
100 100 100"""
|
||||
|
||||
@pytest.mark.version('>=3,<4')
|
||||
@pytest.mark.version('>=3,<5')
|
||||
def test_1(act: Action):
|
||||
act.expected_stdout = expected_stdout
|
||||
act.execute()
|
||||
|
Loading…
Reference in New Issue
Block a user