mirror of
https://github.com/FirebirdSQL/firebird-qa.git
synced 2025-01-22 21:43:06 +01:00
179 lines
6.4 KiB
Python
179 lines
6.4 KiB
Python
#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:\\mixirebird\\qabtestbtest.py", line 2103, in run
|
||
-- test_recipe.run(self,result)
|
||
-- File "c:\\mixirebird\\qabtestbtest.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
|
||
|