<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Hello! Thank you for review! New patch below. This time I wasn't<br>
able to insert diff between two last versions, but I will do it<br>
in next patches.<br>
</p>
<br>
<div class="moz-cite-prefix">On 10/10/2018 02:18 PM, Vladislav
Shpilevoy wrote:<br>
</div>
<blockquote type="cite"
cite="mid:c98c8bdb-c5dc-639c-06be-17e63a93d9b5@tarantool.org"> <br>
<br>
On 06/10/2018 12:04, <a class="moz-txt-link-abbreviated"
href="mailto:imeevma@tarantool.org">imeevma@tarantool.org</a>
wrote: <br>
<blockquote type="cite">At the moment all collations that don't
have their "strength" <br>
option set works the same way as ones with this option set to <br>
"identical". It is not efficient, according to ICU Comparison <br>
Levels. This patch updates this option of old collations and set
<br>
its default value to "primary" for new ones. <br>
<br>
Closes #3573 <br>
--- <br>
Branch:
<a class="moz-txt-link-freetext"
href="https://github.com/tarantool/tarantool/tree/imeevma/gh-3573-fix-collation-strength">https://github.com/tarantool/tarantool/tree/imeevma/gh-3573-fix-collation-strength</a><br>
Issue: <a class="moz-txt-link-freetext"
href="https://github.com/tarantool/tarantool/issues/3573">https://github.com/tarantool/tarantool/issues/3573</a>
<br>
<br>
src/box/bootstrap.snap | Bin 1888 -> 1886 bytes <br>
src/box/coll_id_def.c | 4 +- <br>
src/box/lua/upgrade.lua | 29 ++++++++++++++- <br>
src/coll.c | 33 ++++++++-------- <br>
src/coll_def.c | 1 - <br>
src/coll_def.h | 3 +- <br>
test/box-py/bootstrap.result | 2 +- <br>
test/box/ddl.result | 6 +-- <br>
test/box/tree_pk.result | 2 +- <br>
test/box/tree_pk.test.lua | 2 +- <br>
test/sql/collation.result | 87
+++++++++++++++++++++++++++++++++++++++++++ <br>
test/sql/collation.test.lua | 32 ++++++++++++++++ <br>
test/unit/coll.cpp | 2 + <br>
13 files changed, 176 insertions(+), 27 deletions(-) <br>
<br>
diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap <br>
</blockquote>
<br>
1. Please, remove binary diff before sending an email. <br>
</blockquote>
Ok, understood.<br>
<blockquote type="cite"
cite="mid:c98c8bdb-c5dc-639c-06be-17e63a93d9b5@tarantool.org"> <br>
<blockquote type="cite">index
65739384a66d6ba4a538553ccf4677536ba15280..84b27c0d8b9d6d683692e2ef55034ffcc68d11d0
100644 <br>
GIT binary patch <br>
delta 1884 <br>
zcmV-i2c!7l4&Dxs7k@P^HZUz`Ff(N|W@R=CNp5p=VQyn(Iv_J<IA&xwVKpsbHZx@{
<br>
zG-feoEjVOmHZ3+eGhs9}W;HQnWj6{|Lu_wjYdRo%eF_TIx(m9^2Ic_Hx7lmzr2qf` <br>
z001bpFZ}>e?KS}FOGFS!z*dm~D2k#jilV6AqMxq(Vp{_Az<(~`=k4N^J9QNuj=Z`N
<br>
z=~K!63-eO4{Xa?goO8~~I%_^CBZ1<YnJQf6Sh@N@2|aY1nNsKg<N)~qVZO0ZrY}vD
<br>
zy%3s9<K4NfXf{L+b=bqk3;S2c?QOCMxO?C6GZ^+!^Gx$zyD--w?m=0vdDwn;L5_Ra <br>
z)wQCd>0t|o-+y-Dh~($*C8WEVmHYnrJ?s76-+IqxnZ_~OWX>t2h{+{DrBamb3&R_{
<br>
z;m#^i0F_EH-wt>E9?reGOaJa1M|9-I2^O^Z-q&Fr-e!`irB*7%IjR0I-ygdXsZ@$r
<br>
zrW6m`p$oIkN~NgMQRS>Um8$bR)M@pqdwLxd>fHSbwLRQvC`i)w)n+f9GNDZZi|h
<br>
zlyVA75fPvxtQad)dZGZJvM8eKGmha6=5D?nx8-c_J_zeu`v1DV+jWcK4cc+893buI <br>
zVX8r;QhfFBBJJm)9VdzbkxqxLn6=FsmP(}<_UA-89k%Q^X%-~K>}{G9><f;VmNfL9
<br>
z#@04x5`P$pS*0n1pkL1_nK1_{m7>0%zmJtW*}uBmjeXzF$Dyk+jJDtPUE>@0o!5-$
<br>
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua <br>
index d9c2ae4..07cace0 100644 <br>
--- a/src/box/lua/upgrade.lua <br>
+++ b/src/box/lua/upgrade.lua <br>
@@ -578,6 +578,32 @@ local function upgrade_to_2_1_0() <br>
box.space._schema:format(format) <br>
end <br>
+--------------------------------------------------------------------------------<br>
+-- Tarantool 2.1.1 <br>
+--------------------------------------------------------------------------------
<br>
+ <br>
+function update_collation_strength_field() <br>
+ local _collation = box.space[box.schema.COLLATION_ID] <br>
+ local _format = _collation:format() <br>
+ for _, collation in ipairs(_collation:select()) do <br>
+ if (collation.opts.strength == nil) then <br>
+ local old_collation = _collation:get{collation.id}
<br>
+ local new_collation = {} <br>
+ for _,field in ipairs(_format) do <br>
+ new_collation[field.name] =
old_collation[field.name] <br>
+ end <br>
+ new_collation.opts.strength = 'identical' <br>
+ _collation:delete{old_collation.id} <br>
+
_collation:insert(_collation:frommap(new_collation)) <br>
</blockquote>
<br>
2. This looks much simpler: <br>
<br>
@@ -584,17 +584,11 @@ end <br>
<br>
function update_collation_strength_field() <br>
local _collation = box.space[box.schema.COLLATION_ID] <br>
- local _format = _collation:format() <br>
for _, collation in ipairs(_collation:select()) do <br>
- if (collation.opts.strength == nil) then <br>
- local old_collation = _collation:get{collation.id} <br>
- local new_collation = {} <br>
- for _,field in ipairs(_format) do <br>
- new_collation[field.name] =
old_collation[field.name] <br>
- end <br>
- new_collation.opts.strength = 'identical' <br>
- _collation:delete{old_collation.id} <br>
- _collation:insert(_collation:frommap(new_collation))
<br>
+ if collation.opts.strength == nil then <br>
+ local collation =
_collation:get{collation.id}:totable() <br>
+ collation[6].strength = 'identical' <br>
+ _collation:replace(collation) <br>
end <br>
end <br>
end <br>
<br>
<br>
I did not test it though. Please, apply and debug if <br>
necessary. <br>
</blockquote>
Done.<br>
<br>
<blockquote type="cite"
cite="mid:c98c8bdb-c5dc-639c-06be-17e63a93d9b5@tarantool.org">
<blockquote type="cite">+ end <br>
+ end <br>
+end <br>
diff --git a/test/sql/collation.result
b/test/sql/collation.result <br>
index 79ba9ab..3c53be1 100644 <br>
--- a/test/sql/collation.result <br>
+++ b/test/sql/collation.result <br>
@@ -110,3 +110,90 @@ cn:close() <br>
box.schema.user.revoke('guest', 'read,write,execute',
'universe') <br>
--- <br>
... <br>
+-- <br>
+-- gh-3573: Strength in the _collation space <br>
+-- Collation without 'strength' option set now works as one
with <br>
+-- 'strength' set to 'primary'. <br>
+-- <br>
+box.internal.collation.create('c0', 'ICU', 'unicode') <br>
+--- <br>
+... <br>
+box.internal.collation.create('c1', 'ICU', 'unicode',
{strength='primary'}) <br>
+--- <br>
+... <br>
+box.internal.collation.create('c2', 'ICU', 'unicode',
{strength='secondary'}) <br>
+--- <br>
+... <br>
+box.internal.collation.create('c5', 'ICU', 'unicode',
{strength='identical'}) <br>
+--- <br>
+... <br>
+box.sql.execute([[create table tc (id int primary key
autoincrement, s0 string collate "c0", s1 string collate "c1",
s2 string collate "c2", s5 string collate "c5")]]) <br>
+--- <br>
+... <br>
+box.sql.execute([[insert into tc values (null, 'a', 'a', 'a',
'a')]]) <br>
+--- <br>
+... <br>
+box.sql.execute([[insert into tc values (null, 'A', 'A', 'A',
'A')]]) <br>
+--- <br>
+... <br>
+box.sql.execute([[insert into tc values (null, 'á', 'á', 'á',
'á')]]) <br>
+--- <br>
+... <br>
+box.sql.execute([[insert into tc values (null, 'â', 'â', 'â',
'â')]]) <br>
+--- <br>
+... <br>
+box.sql.execute([[select * from tc where s0 = 'a']]) <br>
+--- <br>
+- - [1, 'a', 'a', 'a', 'a'] <br>
+ - [2, 'A', 'A', 'A', 'A'] <br>
+ - [3, 'á', 'á', 'á', 'á'] <br>
+ - [4, 'â', 'â', 'â', 'â'] <br>
+... <br>
+box.sql.execute([[select * from tc where s1 = 'a']]) <br>
+--- <br>
+- - [1, 'a', 'a', 'a', 'a'] <br>
+ - [2, 'A', 'A', 'A', 'A'] <br>
+ - [3, 'á', 'á', 'á', 'á'] <br>
+ - [4, 'â', 'â', 'â', 'â'] <br>
+... <br>
+box.sql.execute([[select * from tc where s2 = 'a']]) <br>
+--- <br>
+- - [1, 'a', 'a', 'a', 'a'] <br>
+ - [2, 'A', 'A', 'A', 'A'] <br>
+... <br>
+box.sql.execute([[select * from tc where s5 = 'a']]) <br>
+--- <br>
+- - [1, 'a', 'a', 'a', 'a'] <br>
+... <br>
+a = box.sql.execute([[select id from tc where s0 = 'a']]) <br>
+--- <br>
+... <br>
+b = box.sql.execute([[select id from tc where s1 = 'a']]) <br>
+--- <br>
+... <br>
+count = 0 <br>
+--- <br>
+... <br>
+for k,v in pairs(a) do if (a[k][1] ~= b[k][1]) then count =
count + 1 end end <br>
</blockquote>
<br>
3. You printed both a and b whole above and they are the same. Why
do you <br>
need this additional check in a cycle? <br>
</blockquote>
Fixed, removed unnecessary checks and added comments.<br>
<br>
<b>New patch:</b><br>
<br>
commit e55064f796d9320035db5fb2e3d5030601ee7333<br>
Author: Mergen Imeev <a class="moz-txt-link-rfc2396E" href="mailto:imeevma@gmail.com"><imeevma@gmail.com></a><br>
Date: Tue Sep 25 21:30:36 2018 +0300<br>
<br>
box: update collation strength option.<br>
<br>
At the moment all collations that don't have their "strength"<br>
option set works the same way as ones with this option set to<br>
"identical". It is not efficient, according to ICU Comparison<br>
Levels. This patch updates this option of old collations and set<br>
its default value to "primary" for new ones.<br>
<br>
Closes #3573<br>
<br>
diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap<br>
index 6573938..3d3232f 100644<br>
Binary files a/src/box/bootstrap.snap and b/src/box/bootstrap.snap
differ<br>
diff --git a/src/box/coll_id_def.c b/src/box/coll_id_def.c<br>
index 9fe0cda..43f3b63 100644<br>
--- a/src/box/coll_id_def.c<br>
+++ b/src/box/coll_id_def.c<br>
@@ -55,8 +55,8 @@ icu_case_first_from_str(const char *str, uint32_t
len)<br>
static int64_t<br>
icu_strength_from_str(const char *str, uint32_t len)<br>
{<br>
- return strnindex(coll_icu_strength_strs + 1, str, len,<br>
- coll_icu_strength_MAX - 1) + 1;<br>
+ return strnindex(coll_icu_strength_strs, str, len,<br>
+ coll_icu_strength_MAX);<br>
}<br>
<br>
const struct opt_def coll_icu_opts_reg[] = {<br>
diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua<br>
index d9c2ae4..66dcef4 100644<br>
--- a/src/box/lua/upgrade.lua<br>
+++ b/src/box/lua/upgrade.lua<br>
@@ -578,6 +578,27 @@ local function upgrade_to_2_1_0()<br>
box.space._schema:format(format)<br>
end<br>
<br>
+--------------------------------------------------------------------------------<br>
+-- Tarantool 2.1.1<br>
+--------------------------------------------------------------------------------<br>
+<br>
+function update_collation_strength_field()<br>
+ local _collation = box.space[box.schema.COLLATION_ID]<br>
+ for _, collation in ipairs(_collation:select()) do<br>
+ if (collation.opts.strength == nil) then<br>
+ local new_collation =
_collation:get{collation.id}:totable()<br>
+ new_collation[6].strength = 'identical'<br>
+ _collation:delete{collation.id}<br>
+ _collation:insert(new_collation)<br>
+ end<br>
+ end<br>
+end<br>
+<br>
+local function upgrade_to_2_1_1()<br>
+ update_collation_strength_field()<br>
+end<br>
+<br>
+<br>
local function get_version()<br>
local version = box.space._schema:get{'version'}<br>
if version == nil then<br>
@@ -605,7 +626,8 @@ local function upgrade(options)<br>
{version = mkversion(1, 7, 7), func = upgrade_to_1_7_7,
auto = true},<br>
{version = mkversion(1, 10, 0), func = upgrade_to_1_10_0,
auto = true},<br>
{version = mkversion(1, 10, 2), func = upgrade_to_1_10_2,
auto = true},<br>
- {version = mkversion(2, 1, 0), func = upgrade_to_2_1_0,
auto = true}<br>
+ {version = mkversion(2, 1, 0), func = upgrade_to_2_1_0,
auto = true},<br>
+ {version = mkversion(2, 1, 1), func = upgrade_to_2_1_1,
auto = true}<br>
}<br>
<br>
for _, handler in ipairs(handlers) do<br>
diff --git a/src/coll.c b/src/coll.c<br>
index 6a76f1f..9b719f2 100644<br>
--- a/src/coll.c<br>
+++ b/src/coll.c<br>
@@ -193,22 +193,25 @@ coll_icu_init_cmp(struct coll *coll, const
struct coll_def *def)<br>
return -1;<br>
}<br>
}<br>
- if (def->icu.strength != COLL_ICU_STRENGTH_DEFAULT) {<br>
- enum coll_icu_strength w = def->icu.strength;<br>
- UColAttributeValue v =<br>
- w == COLL_ICU_STRENGTH_PRIMARY ? UCOL_PRIMARY :<br>
- w == COLL_ICU_STRENGTH_SECONDARY ? UCOL_SECONDARY :<br>
- w == COLL_ICU_STRENGTH_TERTIARY ? UCOL_TERTIARY :<br>
- w == COLL_ICU_STRENGTH_QUATERNARY ? UCOL_QUATERNARY :<br>
- w == COLL_ICU_STRENGTH_IDENTICAL ? UCOL_IDENTICAL :<br>
- UCOL_DEFAULT;<br>
- ucol_setAttribute(collator, UCOL_STRENGTH, v, &status);<br>
- if (U_FAILURE(status)) {<br>
- diag_set(CollationError, "failed to set strength: %s",<br>
- u_errorName(status));<br>
- return -1;<br>
- }<br>
+ /*<br>
+ * Set "strength" option of collation. Default values is<br>
+ * "primary".<br>
+ */<br>
+ enum coll_icu_strength w = def->icu.strength;<br>
+ UColAttributeValue v =<br>
+ w == COLL_ICU_STRENGTH_PRIMARY ? UCOL_PRIMARY :<br>
+ w == COLL_ICU_STRENGTH_SECONDARY ? UCOL_SECONDARY :<br>
+ w == COLL_ICU_STRENGTH_TERTIARY ? UCOL_TERTIARY :<br>
+ w == COLL_ICU_STRENGTH_QUATERNARY ? UCOL_QUATERNARY :<br>
+ w == COLL_ICU_STRENGTH_IDENTICAL ? UCOL_IDENTICAL :<br>
+ UCOL_DEFAULT;<br>
+ ucol_setAttribute(collator, UCOL_STRENGTH, v, &status);<br>
+ if (U_FAILURE(status)) {<br>
+ diag_set(CollationError, "failed to set strength: %s",<br>
+ u_errorName(status));<br>
+ return -1;<br>
}<br>
+<br>
if (def->icu.numeric_collation != COLL_ICU_DEFAULT) {<br>
enum coll_icu_on_off w = def->icu.numeric_collation;<br>
UColAttributeValue v = w == COLL_ICU_ON ? UCOL_ON :<br>
diff --git a/src/coll_def.c b/src/coll_def.c<br>
index df58cac..1323643 100644<br>
--- a/src/coll_def.c<br>
+++ b/src/coll_def.c<br>
@@ -54,7 +54,6 @@ const char *coll_icu_case_first_strs[] = {<br>
};<br>
<br>
const char *coll_icu_strength_strs[] = {<br>
- "DEFAULT",<br>
"PRIMARY",<br>
"SECONDARY",<br>
"TERTIARY",<br>
diff --git a/src/coll_def.h b/src/coll_def.h<br>
index 7c20abf..2a1cb68 100644<br>
--- a/src/coll_def.h<br>
+++ b/src/coll_def.h<br>
@@ -84,8 +84,7 @@ extern const char *coll_icu_case_first_strs[];<br>
<br>
/** Strength ICU settings */<br>
enum coll_icu_strength {<br>
- COLL_ICU_STRENGTH_DEFAULT = 0,<br>
- COLL_ICU_STRENGTH_PRIMARY,<br>
+ COLL_ICU_STRENGTH_PRIMARY = 0,<br>
COLL_ICU_STRENGTH_SECONDARY,<br>
COLL_ICU_STRENGTH_TERTIARY,<br>
COLL_ICU_STRENGTH_QUATERNARY,<br>
diff --git a/test/box-py/bootstrap.result
b/test/box-py/bootstrap.result<br>
index 506aca3..2532b70 100644<br>
--- a/test/box-py/bootstrap.result<br>
+++ b/test/box-py/bootstrap.result<br>
@@ -5,7 +5,7 @@ box.space._schema:select{}<br>
---<br>
- - ['cluster', '<cluster uuid>']<br>
- ['max_id', 511]<br>
- - ['version', 2, 1, 0]<br>
+ - ['version', 2, 1, 1]<br>
...<br>
box.space._cluster:select{}<br>
---<br>
diff --git a/test/box/ddl.result b/test/box/ddl.result<br>
index c9a8e96..396318f 100644<br>
--- a/test/box/ddl.result<br>
+++ b/test/box/ddl.result<br>
@@ -484,14 +484,14 @@ box.space._collation:auto_increment{'test', 0,
'ICU', 'ru_RU', setmap{}}<br>
...<br>
box.space._collation:select{}<br>
---<br>
-- - [1, 'unicode', 1, 'ICU', '', {}]<br>
+- - [1, 'unicode', 1, 'ICU', '', {'strength': 'identical'}]<br>
- [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]<br>
- [3, 'test', 0, 'ICU', 'ru_RU', {}]<br>
...<br>
test_run:cmd('restart server default')<br>
box.space._collation:select{}<br>
---<br>
-- - [1, 'unicode', 1, 'ICU', '', {}]<br>
+- - [1, 'unicode', 1, 'ICU', '', {'strength': 'identical'}]<br>
- [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]<br>
- [3, 'test', 0, 'ICU', 'ru_RU', {}]<br>
...<br>
@@ -512,7 +512,7 @@ utf8.cmp('abc', 'def')<br>
...<br>
box.space._collation:replace(t)<br>
---<br>
-- [1, 'unicode', 1, 'ICU', '', {}]<br>
+- [1, 'unicode', 1, 'ICU', '', {'strength': 'identical'}]<br>
...<br>
--<br>
-- gh-2839: allow to store custom fields in field definition.<br>
diff --git a/test/box/tree_pk.result b/test/box/tree_pk.result<br>
index df3c78b..7366ed8 100644<br>
--- a/test/box/tree_pk.result<br>
+++ b/test/box/tree_pk.result<br>
@@ -690,7 +690,7 @@ s:drop()<br>
...<br>
--https://github.com/tarantool/tarantool/issues/2649<br>
-- create standart index and alter it to collation index<br>
-box.internal.collation.create('test', 'ICU', 'ru-RU')<br>
+box.internal.collation.create('test', 'ICU', 'ru-RU', {strength =
'identical'})<br>
---<br>
...<br>
box.internal.collation.create('test-ci', 'ICU', 'ru-RU', {strength
= 'secondary'})<br>
diff --git a/test/box/tree_pk.test.lua b/test/box/tree_pk.test.lua<br>
index 1190ab4..b4ee65c 100644<br>
--- a/test/box/tree_pk.test.lua<br>
+++ b/test/box/tree_pk.test.lua<br>
@@ -238,7 +238,7 @@ s:drop()<br>
<br>
--https://github.com/tarantool/tarantool/issues/2649<br>
-- create standart index and alter it to collation index<br>
-box.internal.collation.create('test', 'ICU', 'ru-RU')<br>
+box.internal.collation.create('test', 'ICU', 'ru-RU', {strength =
'identical'})<br>
box.internal.collation.create('test-ci', 'ICU', 'ru-RU', {strength
= 'secondary'})<br>
s = box.schema.space.create('test')<br>
i1 = s:create_index('i1', { type = 'tree', parts = {{1, 'str'}},
unique = true })<br>
diff --git a/test/sql/collation.result b/test/sql/collation.result<br>
index 79ba9ab..5fdb8ee 100644<br>
--- a/test/sql/collation.result<br>
+++ b/test/sql/collation.result<br>
@@ -110,3 +110,77 @@ cn:close()<br>
box.schema.user.revoke('guest', 'read,write,execute', 'universe')<br>
---<br>
...<br>
+--<br>
+-- gh-3573: Strength in the _collation space<br>
+-- Collation without 'strength' option set now works as one with<br>
+-- 'strength' set to 'primary'.<br>
+--<br>
+box.internal.collation.create('c0', 'ICU', 'unicode')<br>
+---<br>
+...<br>
+box.internal.collation.create('c1', 'ICU', 'unicode',
{strength='primary'})<br>
+---<br>
+...<br>
+box.internal.collation.create('c2', 'ICU', 'unicode',
{strength='secondary'})<br>
+---<br>
+...<br>
+box.internal.collation.create('c5', 'ICU', 'unicode',
{strength='identical'})<br>
+---<br>
+...<br>
+box.sql.execute([[create table tc (id int primary key
autoincrement, s0 string collate "c0", s1 string collate "c1", s2
string collate "c2", s5 string collate "c5")]])<br>
+---<br>
+...<br>
+box.sql.execute([[insert into tc values (null, 'a', 'a', 'a',
'a')]])<br>
+---<br>
+...<br>
+box.sql.execute([[insert into tc values (null, 'A', 'A', 'A',
'A')]])<br>
+---<br>
+...<br>
+box.sql.execute([[insert into tc values (null, 'á', 'á', 'á',
'á')]])<br>
+---<br>
+...<br>
+box.sql.execute([[insert into tc values (null, 'â', 'â', 'â',
'â')]])<br>
+---<br>
+...<br>
+-- Should be same as the next one.<br>
+box.sql.execute([[select * from tc where s0 = 'a']])<br>
+---<br>
+- - [1, 'a', 'a', 'a', 'a']<br>
+ - [2, 'A', 'A', 'A', 'A']<br>
+ - [3, 'á', 'á', 'á', 'á']<br>
+ - [4, 'â', 'â', 'â', 'â']<br>
+...<br>
+-- Should return all records.<br>
+box.sql.execute([[select * from tc where s1 = 'a']])<br>
+---<br>
+- - [1, 'a', 'a', 'a', 'a']<br>
+ - [2, 'A', 'A', 'A', 'A']<br>
+ - [3, 'á', 'á', 'á', 'á']<br>
+ - [4, 'â', 'â', 'â', 'â']<br>
+...<br>
+-- Should return two records.<br>
+box.sql.execute([[select * from tc where s2 = 'a']])<br>
+---<br>
+- - [1, 'a', 'a', 'a', 'a']<br>
+ - [2, 'A', 'A', 'A', 'A']<br>
+...<br>
+-- Should return one record.<br>
+box.sql.execute([[select * from tc where s5 = 'a']])<br>
+---<br>
+- - [1, 'a', 'a', 'a', 'a']<br>
+...<br>
+box.sql.execute([[drop table tc]])<br>
+---<br>
+...<br>
+box.internal.collation.drop('c0')<br>
+---<br>
+...<br>
+box.internal.collation.drop('c1')<br>
+---<br>
+...<br>
+box.internal.collation.drop('c2')<br>
+---<br>
+...<br>
+box.internal.collation.drop('c5')<br>
+---<br>
+...<br>
diff --git a/test/sql/collation.test.lua
b/test/sql/collation.test.lua<br>
index 935dea8..130245b 100644<br>
--- a/test/sql/collation.test.lua<br>
+++ b/test/sql/collation.test.lua<br>
@@ -43,3 +43,32 @@ cn:execute('select 1 limit ? collate not_exist',
{1})<br>
<br>
cn:close()<br>
box.schema.user.revoke('guest', 'read,write,execute', 'universe')<br>
+<br>
+--<br>
+-- gh-3573: Strength in the _collation space<br>
+-- Collation without 'strength' option set now works as one with<br>
+-- 'strength' set to 'primary'.<br>
+--<br>
+box.internal.collation.create('c0', 'ICU', 'unicode')<br>
+box.internal.collation.create('c1', 'ICU', 'unicode',
{strength='primary'})<br>
+box.internal.collation.create('c2', 'ICU', 'unicode',
{strength='secondary'})<br>
+box.internal.collation.create('c5', 'ICU', 'unicode',
{strength='identical'})<br>
+box.sql.execute([[create table tc (id int primary key
autoincrement, s0 string collate "c0", s1 string collate "c1", s2
string collate "c2", s5 string collate "c5")]])<br>
+box.sql.execute([[insert into tc values (null, 'a', 'a', 'a',
'a')]])<br>
+box.sql.execute([[insert into tc values (null, 'A', 'A', 'A',
'A')]])<br>
+box.sql.execute([[insert into tc values (null, 'á', 'á', 'á',
'á')]])<br>
+box.sql.execute([[insert into tc values (null, 'â', 'â', 'â',
'â')]])<br>
+-- Should be same as the next one.<br>
+box.sql.execute([[select * from tc where s0 = 'a']])<br>
+-- Should return all records.<br>
+box.sql.execute([[select * from tc where s1 = 'a']])<br>
+-- Should return two records.<br>
+box.sql.execute([[select * from tc where s2 = 'a']])<br>
+-- Should return one record.<br>
+box.sql.execute([[select * from tc where s5 = 'a']])<br>
+<br>
+box.sql.execute([[drop table tc]])<br>
+box.internal.collation.drop('c0')<br>
+box.internal.collation.drop('c1')<br>
+box.internal.collation.drop('c2')<br>
+box.internal.collation.drop('c5')<br>
diff --git a/test/unit/coll.cpp b/test/unit/coll.cpp<br>
index 94374a7..acbc7f4 100644<br>
--- a/test/unit/coll.cpp<br>
+++ b/test/unit/coll.cpp<br>
@@ -51,6 +51,7 @@ manual_test()<br>
memset(&def, 0, sizeof(def));<br>
snprintf(def.locale, sizeof(def.locale), "%s", "ru_RU");<br>
def.type = COLL_TYPE_ICU;<br>
+ def.icu.strength = COLL_ICU_STRENGTH_IDENTICAL;<br>
struct coll *coll;<br>
<br>
cout << " -- default ru_RU -- " << endl;<br>
@@ -134,6 +135,7 @@ hash_test()<br>
struct coll *coll;<br>
<br>
/* Case sensitive */<br>
+ def.icu.strength = COLL_ICU_STRENGTH_IDENTICAL;<br>
coll = coll_new(&def);<br>
assert(coll != NULL);<br>
cout << "Case sensitive" << endl;<br>
<br>
</body>
</html>