6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-02-02 02:40:42 +01:00

Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Anton Zuev 2023-03-10 10:15:38 +03:00
commit 034b469851
3 changed files with 131 additions and 61 deletions

Binary file not shown.

View File

@ -0,0 +1,66 @@
#coding:utf-8
"""
ID: issue-7488
ISSUE: 7488
TITLE: Invalid real to string cast
NOTES:
[14.02.2023] pzotov
Confirmed bug on 5.0.0.967; 4.0.3.2904
Checked on intermediate builds 5.0.0.970; 4.0.3.2906
"""
import pytest
from firebird.qa import *
db = db_factory()
test_script = """
set list on;
select x, cast(x as varchar(10)) s
from
(
select 345.12e-2 x from rdb$database union all
select 4512e-4 from rdb$database union all
select 3451.2e-3 from rdb$database union all
select 34.512e-1 from rdb$database union all
select 3.4512e0 from rdb$database union all
select 0.34512e1 from rdb$database union all
select 0.034512e2 from rdb$database union all
select 0.0034512e3 from rdb$database
);
"""
act = isql_act('db', test_script)
expected_stdout = """
X 3.451200000000000
S 3.45
X 0.4512000000000000
S 0.45
X 3.451200000000000
S 3.45
X 3.451200000000000
S 3.45
X 3.451200000000000
S 3.45
X 3.451200000000000
S 3.45
X 3.451200000000000
S 3.45
X 3.451200000000000
S 3.45
"""
@pytest.mark.version('>=4.0.3')
def test_1(act: Action):
act.expected_stdout = expected_stdout
act.execute(combine_output = True)
assert act.clean_stdout == act.clean_expected_stdout

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