6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 21:43:06 +01:00
firebird-qa/tests/bugs/core_3401_test.py

179 lines
6.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#coding:utf-8
#
# id: bugs.core_3401
# title: Collation errors with [type of] <domain>, type of column
# decription:
# tracker_id: CORE-3401
# min_versions: ['3.0']
# versions: 3.0
# qmid:
import pytest
from firebird.qa import db_factory, isql_act, Action
# version: 3.0
# resources: None
substitutions_1 = []
init_script_1 = """"""
db_1 = db_factory(sql_dialect=3, init=init_script_1)
test_script_1 = """
-----------------------------------------------------------------------------------------------
-- NB-1. Initial test (which is in the tracker) considered only ASCII characters 'a' vs 'A'.
-- This test compares many NON-ascii characters with diacritical marks - it was done intentionally.
-- All the cases successfully PASSED on WI-T3.0.0.31767 (Win XP) and LI-T3.0.0.31719 (Ubuntu 14.10).
-- Firebird WI-V2.5.4.26857 FAILS in test-cases 1,2 and 4.
-- NB-2. Attribute 'connection_character_set': 'UTF8' - is MANDATORY in this test,
-- otherwise fbt_run raises exception:
-- traceback:
-- File "c:\\mix irebird\\qa btest btest.py", line 2103, in run
-- test_recipe.run(self,result)
-- File "c:\\mix irebird\\qa btest btest.py", line 731, in run
-- script = self.test_script.encode('ascii')
-- ----------------------------------------------------------------------
-- exception:
-- UnicodeEncodeError:
-- ascii
-- . . .
-- 505
-- 511
-- ordinal not in range(128)
-- (no any exceptions when run corresponding script in ISQL with absent charset of connection).
-----------------------------------------------------------------------------------------------
create or alter procedure selproc_dom as begin end;
create or alter procedure selproc_typeof_col_ci_dir as begin end;
commit;
recreate table t(id int);
commit;
set term ^;
execute block as
begin
execute statement 'drop domain dom_ci';
when any do begin end
end
^
set term ;^
commit;
-- Following letters was included in the character literals:
-- ÁÉÍÓÚÝ ÀÈÌÒÙ ÂÊÎÔÛ ÃÑÕ ÄËÏÖÜŸ ÇŠ ==> all latin letters with diacritical marks
-- (with acute, grave, circumflex, tilde, umlaute, cedil and caron)
-- ΔΘΛΞΣΨΩ ==> few letters from greek alphabet
-- ĄĘŁŹŻ ==> few letters from polish alphabet
-- ЙЁ ==> two letters from cyrillic (russian) with diacritical marks
-- ЊЋЏ ==> few letters from serbian alphabet
-- ĂŞŢ ==> few letters from romanian alphabet
-- create a case-insensitive domain:
create domain dom_ci as varchar(150) character set utf8 collate unicode_ci;
commit;
-- create two case-insensitive columns: one via the domain, one directly:
recreate table t(
col_ci_dom dom_ci,
col_ci_dir varchar(150) character set utf8 collate unicode_ci
);
commit;
set list on;
-- (Case 1) test <lower> = <UPPER> when casting to type of column col_ci_dir:
with q(a_lower, a_upper) as (
select cast('áéíóúý àèìòù âêîôû ãñõ äëïöüÿ çš δθλξσψω ąęłźż йё њћџ ăşţ' as type of column t.col_ci_dir),
cast('ÁÉÍÓÚÝ ÀÈÌÒÙ ÂÊÎÔÛ ÃÑÕ ÄËÏÖÜŸ ÇŠ ΔΘΛΞΣΨΩ ĄĘŁŹŻ ЙЁ ЊЋЏ ĂŞŢ' as type of column t.col_ci_dir)
from rdb$database
)
select 'case-1' msg, case when a_lower = a_upper then 1 else 0 end equal
from q;
------------------------------------------------------------------------------------
-- (Case 2) test <lower> = <UPPER> in domain dom_ci, using local vars in an executable block:
-- (With "type of dom_ci" and "type of column t.col_ci_dom", the result is also 1.
-- But with "type of column t.col_ci_dir", the result is 0.)
set term ^;
execute block returns (msg varchar(10), equal smallint)
as
-- this worked fine:
-- declare ü dom_ci = <lower>;
-- declare y dom_ci = <UPPER>;
-- "But with "type of column t.col_ci_dir", the result is 0."
declare x type of column t.col_ci_dir = 'áéíóúý àèìòù âêîôû ãñõ äëïöüÿ çš δθλξσψω ąęłźż йё њћџ ăşţ';
declare y type of column t.col_ci_dir = 'ÁÉÍÓÚÝ ÀÈÌÒÙ ÂÊÎÔÛ ÃÑÕ ÄËÏÖÜŸ ÇŠ ΔΘΛΞΣΨΩ ĄĘŁŹŻ ЙЁ ЊЋЏ ĂŞŢ';
begin
msg='case-2';
equal = case when x = y then 1 else 0 end;
suspend;
end
^
set term ;^
------------------------------------------------------------------------------------
-- (Case 3) test <lower> = <UPPER> in domain dom_ci, using stored procedure with input params:
set term ^;
create or alter procedure selproc_dom(x dom_ci, y dom_ci) returns (equal smallint)
as
begin
equal = case when x = y then 1 else 0 end;
suspend;
end
^
set term ;^
commit;
select 'case-3' msg, p.equal
from selproc_dom(
'áéíóúý àèìòù âêîôû ãñõ äëïöüÿ çš δθλξσψω ąęłźż йё њћџ ăşţ',
'ÁÉÍÓÚÝ ÀÈÌÒÙ ÂÊÎÔÛ ÃÑÕ ÄËÏÖÜŸ ÇŠ ΔΘΛΞΣΨΩ ĄĘŁŹŻ ЙЁ ЊЋЏ ĂŞŢ'
) p;
---------------------------------------------------------------------------------------
set term ^;
create or alter procedure selproc_typeof_col_ci_dir(
x type of column t.col_ci_dir,
y type of column t.col_ci_dir
)
returns (equal smallint) as
begin
equal = case when x = y then 1 else 0 end;
suspend;
end
^
set term ;^
commit;
select 'case-4' msg, p.*
from selproc_typeof_col_ci_dir(
'áéíóúý àèìòù âêîôû ãñõ äëïöüÿ çš δθλξσψω ąęłźż йё њћџ ăşţ',
'ÁÉÍÓÚÝ ÀÈÌÒÙ ÂÊÎÔÛ ÃÑÕ ÄËÏÖÜŸ ÇŠ ΔΘΛΞΣΨΩ ĄĘŁŹŻ ЙЁ ЊЋЏ ĂŞŢ'
) p;
"""
act_1 = isql_act('db_1', test_script_1, substitutions=substitutions_1)
expected_stdout_1 = """
MSG case-1
EQUAL 1
MSG case-2
EQUAL 1
MSG case-3
EQUAL 1
MSG case-4
EQUAL 1
"""
@pytest.mark.version('>=3.0')
def test_1(act_1: Action):
act_1.expected_stdout = expected_stdout_1
act_1.execute()
assert act_1.clean_expected_stdout == act_1.clean_stdout