6
0
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:
pavel-zotov 2023-03-09 14:10:06 +03:00
parent bb2a02d75f
commit 16d07d6101

View File

@ -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()