Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test
@ 2020-03-16 16:19 Alexander V. Tikhonov
  2020-03-17 15:00 ` Sergey Bronnikov
  0 siblings, 1 reply; 4+ messages in thread
From: Alexander V. Tikhonov @ 2020-03-16 16:19 UTC (permalink / raw)
  To: Oleg Piskunov; +Cc: tarantool-patches

Divided into tests:
- box/ddl_alter.test.lua
- box/ddl_collation.test.lua
- box/ddl_collation_types.test.lua
- box/ddl_collation_wrong_id.test.lua
- box/ddl_no_collation.test.lua
- box/ddl_parallel.test.lua
- box/ddl_tuple.test.lua
- box/gh-2336-ddl_call_twice.test.lua
- box/gh-2783-ddl_lock.test.lua
- box/gh-2839-ddl_custom_fields.test.lua
- box/gh-2937-ddl_collation_field_def.test.lua
- box/gh-3290-ddl_collation_deleted.test.lua
- box/gh-928-ddl_truncate.test.lua
---

Github: https://github.com/tarantool/tarantool/tree/avtikhon/divide_tests

 test/box/ddl.result                           | 1210 -----------------
 test/box/ddl.test.lua                         |  272 ----
 test/box/ddl_alter.result                     |   37 +
 test/box/ddl_alter.test.lua                   |   12 +
 test/box/ddl_collation.result                 |  853 ++++++++++++
 test/box/ddl_collation.test.lua               |   90 ++
 test/box/ddl_collation_types.result           |   28 +
 test/box/ddl_collation_types.test.lua         |    9 +
 test/box/ddl_collation_wrong_id.result        |   28 +
 test/box/ddl_collation_wrong_id.test.lua      |   10 +
 test/box/ddl_no_collation.result              |   19 +
 test/box/ddl_no_collation.test.lua            |    7 +
 test/box/ddl_parallel.result                  |   61 +
 test/box/ddl_parallel.test.lua                |   30 +
 test/box/ddl_tuple.result                     |   67 +
 test/box/ddl_tuple.test.lua                   |   28 +
 test/box/gh-2336-ddl_call_twice.result        |   51 +
 test/box/gh-2336-ddl_call_twice.test.lua      |   19 +
 test/box/gh-2783-ddl_lock.result              |   62 +
 test/box/gh-2783-ddl_lock.test.lua            |   33 +
 test/box/gh-2839-ddl_custom_fields.result     |   33 +
 test/box/gh-2839-ddl_custom_fields.test.lua   |   13 +
 .../gh-2937-ddl_collation_field_def.result    |   34 +
 .../gh-2937-ddl_collation_field_def.test.lua  |   13 +
 test/box/gh-3290-ddl_collation_deleted.result |   23 +
 .../gh-3290-ddl_collation_deleted.test.lua    |   10 +
 test/box/gh-928-ddl_truncate.result           |   42 +
 test/box/gh-928-ddl_truncate.test.lua         |   17 +
 28 files changed, 1629 insertions(+), 1482 deletions(-)
 delete mode 100644 test/box/ddl.result
 delete mode 100644 test/box/ddl.test.lua
 create mode 100644 test/box/ddl_alter.result
 create mode 100644 test/box/ddl_alter.test.lua
 create mode 100644 test/box/ddl_collation.result
 create mode 100644 test/box/ddl_collation.test.lua
 create mode 100644 test/box/ddl_collation_types.result
 create mode 100644 test/box/ddl_collation_types.test.lua
 create mode 100644 test/box/ddl_collation_wrong_id.result
 create mode 100644 test/box/ddl_collation_wrong_id.test.lua
 create mode 100644 test/box/ddl_no_collation.result
 create mode 100644 test/box/ddl_no_collation.test.lua
 create mode 100644 test/box/ddl_parallel.result
 create mode 100644 test/box/ddl_parallel.test.lua
 create mode 100644 test/box/ddl_tuple.result
 create mode 100644 test/box/ddl_tuple.test.lua
 create mode 100644 test/box/gh-2336-ddl_call_twice.result
 create mode 100644 test/box/gh-2336-ddl_call_twice.test.lua
 create mode 100644 test/box/gh-2783-ddl_lock.result
 create mode 100644 test/box/gh-2783-ddl_lock.test.lua
 create mode 100644 test/box/gh-2839-ddl_custom_fields.result
 create mode 100644 test/box/gh-2839-ddl_custom_fields.test.lua
 create mode 100644 test/box/gh-2937-ddl_collation_field_def.result
 create mode 100644 test/box/gh-2937-ddl_collation_field_def.test.lua
 create mode 100644 test/box/gh-3290-ddl_collation_deleted.result
 create mode 100644 test/box/gh-3290-ddl_collation_deleted.test.lua
 create mode 100644 test/box/gh-928-ddl_truncate.result
 create mode 100644 test/box/gh-928-ddl_truncate.test.lua

diff --git a/test/box/ddl.result b/test/box/ddl.result
deleted file mode 100644
index b995b1493..000000000
--- a/test/box/ddl.result
+++ /dev/null
@@ -1,1210 +0,0 @@
-env = require('test_run')
----
-...
-test_run = env.new()
----
-...
-fiber = require'fiber'
----
-...
--- simple test for parallel ddl execution
-_ = box.schema.space.create('test'):create_index('pk')
----
-...
-ch = fiber.channel(2)
----
-...
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-function f1()
-    box.space.test:create_index('sec', {parts = {2, 'num'}})
-    ch:put(true)
-end;
----
-...
-function f2()
-    box.space.test:create_index('third', {parts = {3, 'string'}})
-    ch:put(true)
-end;
----
-...
-test_run:cmd("setopt delimiter ''");
----
-- true
-...
-_ = {fiber.create(f1), fiber.create(f2)}
----
-...
-ch:get()
----
-- true
-...
-ch:get()
----
-- true
-...
-_ = box.space.test:drop()
----
-...
-test_run:cmd('restart server default')
-env = require('test_run')
----
-...
-test_run = env.new()
----
-...
-fiber = require'fiber'
----
-...
-ch = fiber.channel(2)
----
-...
---issue #928
-space = box.schema.space.create('test_trunc')
----
-...
-_ = space:create_index('pk')
----
-...
-_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
----
-...
-_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
----
-...
-function test_trunc() space:truncate() ch:put(true) end
----
-...
-_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
----
-...
-_ = {ch:get(), ch:get()}
----
-...
-space:drop()
----
-...
--- index should not crash after alter
-space = box.schema.space.create('test_swap')
----
-...
-index = space:create_index('pk')
----
-...
-space:replace({1, 2, 3})
----
-- [1, 2, 3]
-...
-index:rename('primary')
----
-...
-index2 = space:create_index('sec')
----
-...
-space:replace({2, 3, 1})
----
-- [2, 3, 1]
-...
-space:select()
----
-- - [1, 2, 3]
-  - [2, 3, 1]
-...
-space:drop()
----
-...
-ch = fiber.channel(3)
----
-...
-_ = box.schema.space.create('test'):create_index('pk')
----
-...
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-function add_index()
-    box.space.test:create_index('sec', {parts = {2, 'num'}})
-    ch:put(true)
-end;
----
-...
-function insert_tuple(tuple)
-    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
-end;
----
-...
-test_run:cmd("setopt delimiter ''");
----
-- true
-...
-_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
----
-...
-{ch:get(), ch:get(), ch:get()}
----
-- - - false
-    - 'Tuple field 2 type does not match one required by operation: expected unsigned'
-  - - true
-    - [1, 2, 'a']
-  - true
-...
-box.space.test:select()
----
-- - [1, 2, 'a']
-...
-test_run:cmd('restart server default')
-box.space.test:select()
----
-- - [1, 2, 'a']
-...
-box.space.test:drop()
----
-...
--- gh-2336 crash if format called twice during snapshot
-fiber = require'fiber'
----
-...
-space = box.schema.space.create('test_format')
----
-...
-_ = space:create_index('pk', { parts = { 1,'str' }})
----
-...
-space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
----
-...
-str = string.rep("t",1024)
----
-...
-for i = 1, 10000 do space:insert{tostring(i), str} end
----
-...
-ch = fiber.channel(3)
----
-...
-_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
----
-...
-format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
----
-...
-for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
----
-...
-{ch:get(), ch:get(), ch:get()}
----
-- - true
-  - true
-  - true
-...
-space:drop()
----
-...
--- collation
-function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
----
-...
-box.internal.collation.create('test')
----
-- error: Illegal parameters, type (second arg) must be a string
-...
-box.internal.collation.create('test', 'ICU')
----
-- error: Illegal parameters, locale (third arg) must be a string
-...
-box.internal.collation.create(42, 'ICU', 'ru_RU')
----
-- error: Illegal parameters, name (first arg) must be a string
-...
-box.internal.collation.create('test', 42, 'ru_RU')
----
-- error: Illegal parameters, type (second arg) must be a string
-...
-box.internal.collation.create('test', 'ICU', 42)
----
-- error: Illegal parameters, locale (third arg) must be a string
-...
-box.internal.collation.create('test', 'nothing', 'ru_RU')
----
-- error: 'Failed to initialize collation: unknown collation type.'
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', setmap{}) --ok
----
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU')
----
-- error: Duplicate key exists in unique index 'name' in space '_collation'
-...
-box.internal.collation.drop('test')
----
-...
-box.internal.collation.drop('nothing') -- allowed
----
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', 42)
----
-- error: Illegal parameters, options (fourth arg) must be a table or nil
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', 'options')
----
-- error: Illegal parameters, options (fourth arg) must be a table or nil
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {ping='pong'})
----
-- error: 'Wrong collation options (field 5): unexpected option ''ping'''
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='german'})
----
-- error: 'Failed to initialize collation: ICU wrong french_collation option setting,
-    expected ON | OFF.'
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='on'}) --ok
----
-...
-box.internal.collation.drop('test') --ok
----
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='supervillian'})
----
-- error: 'Failed to initialize collation: ICU wrong strength option setting, expected
-    PRIMARY | SECONDARY | TERTIARY | QUATERNARY | IDENTICAL.'
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=42})
----
-- error: 'Wrong collation options (field 5): ''strength'' must be enum'
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=2}) --ok
----
-- error: 'Wrong collation options (field 5): ''strength'' must be enum'
-...
-box.internal.collation.drop('test') --ok
----
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='primary'}) --ok
----
-...
-box.internal.collation.drop('test') --ok
----
-...
-c = box.space._collation:get{1}:totable()
----
-...
-c[2] = 'unicode_test'
----
-...
-box.space._collation:replace(c)
----
-- error: collation does not support alter
-...
-box.begin() box.internal.collation.create('test2', 'ICU', 'ru_RU') box.rollback()
----
-...
-box.internal.collation.create('test', 'ICU', 'ru_RU')
----
-...
-box.internal.collation.exists('test')
----
-- true
-...
-test_run:cmd('restart server default')
-function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
----
-...
-box.internal.collation.exists('test')
----
-- true
-...
-box.internal.collation.drop('test')
----
-...
-box.space._collation:auto_increment{'test'}
----
-- error: Tuple field 3 required by space format is missing
-...
-box.space._collation:auto_increment{'test', 0, 'ICU'}
----
-- error: Tuple field 5 required by space format is missing
-...
-box.space._collation:auto_increment{'test', 'ADMIN', 'ICU', 'ru_RU'}
----
-- error: 'Tuple field 3 type does not match one required by operation: expected unsigned'
-...
-box.space._collation:auto_increment{42, 0, 'ICU', 'ru_RU'}
----
-- error: 'Tuple field 2 type does not match one required by operation: expected string'
-...
-box.space._collation:auto_increment{'test', 0, 42, 'ru_RU'}
----
-- error: 'Tuple field 4 type does not match one required by operation: expected string'
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 42}
----
-- error: 'Tuple field 5 type does not match one required by operation: expected string'
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}} --ok
----
-- [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
----
-- error: Duplicate key exists in unique index 'name' in space '_collation'
-...
-box.space._collation.index.name:delete{'test'} -- ok
----
-- [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
-box.space._collation.index.name:delete{'nothing'} -- allowed
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 42}
----
-- error: 'Tuple field 6 type does not match one required by operation: expected map'
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 'options'}
----
-- error: 'Tuple field 6 type does not match one required by operation: expected map'
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', {ping='pong'}}
----
-- error: 'Wrong collation options (field 5): unexpected option ''ping'''
-...
-opts = {normalization_mode='NORMAL'}
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Failed to initialize collation: ICU wrong normalization_mode option setting,
-    expected ON | OFF.'
-...
-opts.normalization_mode = 'OFF'
----
-...
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} -- ok
----
-...
-_ = box.space._collation.index.name:delete{'test'} -- ok
----
-...
-opts.numeric_collation = 'PERL'
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Failed to initialize collation: ICU wrong numeric_collation option setting,
-    expected ON | OFF.'
-...
-opts.numeric_collation = 'ON'
----
-...
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
----
-...
-_ = box.space._collation.index.name:delete{'test'} -- ok
----
-...
-opts.alternate_handling1 = 'ON'
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Wrong collation options (field 5): unexpected option ''alternate_handling1'''
-...
-opts.alternate_handling1 = nil
----
-...
-opts.alternate_handling = 'ON'
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Failed to initialize collation: ICU wrong alternate_handling option setting,
-    expected NON_IGNORABLE | SHIFTED.'
-...
-opts.alternate_handling = 'SHIFTED'
----
-...
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
----
-...
-_ = box.space._collation.index.name:delete{'test'} -- ok
----
-...
-opts.case_first = 'ON'
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Failed to initialize collation: ICU wrong case_first option setting, expected
-    OFF | UPPER_FIRST | LOWER_FIRST.'
-...
-opts.case_first = 'OFF'
----
-...
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
----
-...
-_ = box.space._collation.index.name:delete{'test'} -- ok
----
-...
-opts.case_level = 'UPPER'
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
----
-- error: 'Failed to initialize collation: ICU wrong case_level option setting, expected
-    ON | OFF.'
-...
-opts.case_level = 'DEFAULT'
----
-...
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
----
-- error: 'Failed to initialize collation: ICU wrong case_level option setting, expected
-    ON | OFF.'
-...
-_ = box.space._collation.index.name:delete{'test'} -- ok
----
-...
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
----
-- [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
-box.space._collation:select{}
----
-- - [0, 'none', 1, 'BINARY', '', {}]
-  - [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
-  - [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]
-  - [3, 'binary', 1, 'BINARY', '', {}]
-  - [4, 'unicode_af_s1', 1, 'ICU', 'af', {'strength': 'primary'}]
-  - [5, 'unicode_af_s2', 1, 'ICU', 'af', {'strength': 'secondary'}]
-  - [6, 'unicode_af_s3', 1, 'ICU', 'af', {'strength': 'tertiary'}]
-  - [7, 'unicode_am_s1', 1, 'ICU', 'am', {'strength': 'primary'}]
-  - [8, 'unicode_am_s2', 1, 'ICU', 'am', {'strength': 'secondary'}]
-  - [9, 'unicode_am_s3', 1, 'ICU', 'am', {'strength': 'tertiary'}]
-  - [10, 'unicode_ar_s1', 1, 'ICU', 'ar', {'strength': 'primary'}]
-  - [11, 'unicode_ar_s2', 1, 'ICU', 'ar', {'strength': 'secondary'}]
-  - [12, 'unicode_ar_s3', 1, 'ICU', 'ar', {'strength': 'tertiary'}]
-  - [13, 'unicode_as_s1', 1, 'ICU', 'as', {'strength': 'primary'}]
-  - [14, 'unicode_as_s2', 1, 'ICU', 'as', {'strength': 'secondary'}]
-  - [15, 'unicode_as_s3', 1, 'ICU', 'as', {'strength': 'tertiary'}]
-  - [16, 'unicode_az_s1', 1, 'ICU', 'az', {'strength': 'primary'}]
-  - [17, 'unicode_az_s2', 1, 'ICU', 'az', {'strength': 'secondary'}]
-  - [18, 'unicode_az_s3', 1, 'ICU', 'az', {'strength': 'tertiary'}]
-  - [19, 'unicode_be_s1', 1, 'ICU', 'be', {'strength': 'primary'}]
-  - [20, 'unicode_be_s2', 1, 'ICU', 'be', {'strength': 'secondary'}]
-  - [21, 'unicode_be_s3', 1, 'ICU', 'be', {'strength': 'tertiary'}]
-  - [22, 'unicode_bn_s1', 1, 'ICU', 'bn', {'strength': 'primary'}]
-  - [23, 'unicode_bn_s2', 1, 'ICU', 'bn', {'strength': 'secondary'}]
-  - [24, 'unicode_bn_s3', 1, 'ICU', 'bn', {'strength': 'tertiary'}]
-  - [25, 'unicode_bs_s1', 1, 'ICU', 'bs', {'strength': 'primary'}]
-  - [26, 'unicode_bs_s2', 1, 'ICU', 'bs', {'strength': 'secondary'}]
-  - [27, 'unicode_bs_s3', 1, 'ICU', 'bs', {'strength': 'tertiary'}]
-  - [28, 'unicode_bs_Cyrl_s1', 1, 'ICU', 'bs_Cyrl', {'strength': 'primary'}]
-  - [29, 'unicode_bs_Cyrl_s2', 1, 'ICU', 'bs_Cyrl', {'strength': 'secondary'}]
-  - [30, 'unicode_bs_Cyrl_s3', 1, 'ICU', 'bs_Cyrl', {'strength': 'tertiary'}]
-  - [31, 'unicode_ca_s1', 1, 'ICU', 'ca', {'strength': 'primary'}]
-  - [32, 'unicode_ca_s2', 1, 'ICU', 'ca', {'strength': 'secondary'}]
-  - [33, 'unicode_ca_s3', 1, 'ICU', 'ca', {'strength': 'tertiary'}]
-  - [34, 'unicode_cs_s1', 1, 'ICU', 'cs', {'strength': 'primary'}]
-  - [35, 'unicode_cs_s2', 1, 'ICU', 'cs', {'strength': 'secondary'}]
-  - [36, 'unicode_cs_s3', 1, 'ICU', 'cs', {'strength': 'tertiary'}]
-  - [37, 'unicode_cy_s1', 1, 'ICU', 'cy', {'strength': 'primary'}]
-  - [38, 'unicode_cy_s2', 1, 'ICU', 'cy', {'strength': 'secondary'}]
-  - [39, 'unicode_cy_s3', 1, 'ICU', 'cy', {'strength': 'tertiary'}]
-  - [40, 'unicode_da_s1', 1, 'ICU', 'da', {'strength': 'primary'}]
-  - [41, 'unicode_da_s2', 1, 'ICU', 'da', {'strength': 'secondary'}]
-  - [42, 'unicode_da_s3', 1, 'ICU', 'da', {'strength': 'tertiary'}]
-  - [43, 'unicode_de__phonebook_s1', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'primary'}]
-  - [44, 'unicode_de__phonebook_s2', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'secondary'}]
-  - [45, 'unicode_de__phonebook_s3', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'tertiary'}]
-  - [46, 'unicode_de_AT_phonebook_s1', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'primary'}]
-  - [47, 'unicode_de_AT_phonebook_s2', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'secondary'}]
-  - [48, 'unicode_de_AT_phonebook_s3', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'tertiary'}]
-  - [49, 'unicode_dsb_s1', 1, 'ICU', 'dsb', {'strength': 'primary'}]
-  - [50, 'unicode_dsb_s2', 1, 'ICU', 'dsb', {'strength': 'secondary'}]
-  - [51, 'unicode_dsb_s3', 1, 'ICU', 'dsb', {'strength': 'tertiary'}]
-  - [52, 'unicode_ee_s1', 1, 'ICU', 'ee', {'strength': 'primary'}]
-  - [53, 'unicode_ee_s2', 1, 'ICU', 'ee', {'strength': 'secondary'}]
-  - [54, 'unicode_ee_s3', 1, 'ICU', 'ee', {'strength': 'tertiary'}]
-  - [55, 'unicode_eo_s1', 1, 'ICU', 'eo', {'strength': 'primary'}]
-  - [56, 'unicode_eo_s2', 1, 'ICU', 'eo', {'strength': 'secondary'}]
-  - [57, 'unicode_eo_s3', 1, 'ICU', 'eo', {'strength': 'tertiary'}]
-  - [58, 'unicode_es_s1', 1, 'ICU', 'es', {'strength': 'primary'}]
-  - [59, 'unicode_es_s2', 1, 'ICU', 'es', {'strength': 'secondary'}]
-  - [60, 'unicode_es_s3', 1, 'ICU', 'es', {'strength': 'tertiary'}]
-  - [61, 'unicode_es__traditional_s1', 1, 'ICU', 'es_u_co_trad', {'strength': 'primary'}]
-  - [62, 'unicode_es__traditional_s2', 1, 'ICU', 'es_u_co_trad', {'strength': 'secondary'}]
-  - [63, 'unicode_es__traditional_s3', 1, 'ICU', 'es_u_co_trad', {'strength': 'tertiary'}]
-  - [64, 'unicode_et_s1', 1, 'ICU', 'et', {'strength': 'primary'}]
-  - [65, 'unicode_et_s2', 1, 'ICU', 'et', {'strength': 'secondary'}]
-  - [66, 'unicode_et_s3', 1, 'ICU', 'et', {'strength': 'tertiary'}]
-  - [67, 'unicode_fa_s1', 1, 'ICU', 'fa', {'strength': 'primary'}]
-  - [68, 'unicode_fa_s2', 1, 'ICU', 'fa', {'strength': 'secondary'}]
-  - [69, 'unicode_fa_s3', 1, 'ICU', 'fa', {'strength': 'tertiary'}]
-  - [70, 'unicode_fi_s1', 1, 'ICU', 'fi', {'strength': 'primary'}]
-  - [71, 'unicode_fi_s2', 1, 'ICU', 'fi', {'strength': 'secondary'}]
-  - [72, 'unicode_fi_s3', 1, 'ICU', 'fi', {'strength': 'tertiary'}]
-  - [73, 'unicode_fi__phonebook_s1', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'primary'}]
-  - [74, 'unicode_fi__phonebook_s2', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'secondary'}]
-  - [75, 'unicode_fi__phonebook_s3', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'tertiary'}]
-  - [76, 'unicode_fil_s1', 1, 'ICU', 'fil', {'strength': 'primary'}]
-  - [77, 'unicode_fil_s2', 1, 'ICU', 'fil', {'strength': 'secondary'}]
-  - [78, 'unicode_fil_s3', 1, 'ICU', 'fil', {'strength': 'tertiary'}]
-  - [79, 'unicode_fo_s1', 1, 'ICU', 'fo', {'strength': 'primary'}]
-  - [80, 'unicode_fo_s2', 1, 'ICU', 'fo', {'strength': 'secondary'}]
-  - [81, 'unicode_fo_s3', 1, 'ICU', 'fo', {'strength': 'tertiary'}]
-  - [82, 'unicode_fr_CA_s1', 1, 'ICU', 'fr_CA', {'strength': 'primary'}]
-  - [83, 'unicode_fr_CA_s2', 1, 'ICU', 'fr_CA', {'strength': 'secondary'}]
-  - [84, 'unicode_fr_CA_s3', 1, 'ICU', 'fr_CA', {'strength': 'tertiary'}]
-  - [85, 'unicode_gu_s1', 1, 'ICU', 'gu', {'strength': 'primary'}]
-  - [86, 'unicode_gu_s2', 1, 'ICU', 'gu', {'strength': 'secondary'}]
-  - [87, 'unicode_gu_s3', 1, 'ICU', 'gu', {'strength': 'tertiary'}]
-  - [88, 'unicode_ha_s1', 1, 'ICU', 'ha', {'strength': 'primary'}]
-  - [89, 'unicode_ha_s2', 1, 'ICU', 'ha', {'strength': 'secondary'}]
-  - [90, 'unicode_ha_s3', 1, 'ICU', 'ha', {'strength': 'tertiary'}]
-  - [91, 'unicode_haw_s1', 1, 'ICU', 'haw', {'strength': 'primary'}]
-  - [92, 'unicode_haw_s2', 1, 'ICU', 'haw', {'strength': 'secondary'}]
-  - [93, 'unicode_haw_s3', 1, 'ICU', 'haw', {'strength': 'tertiary'}]
-  - [94, 'unicode_he_s1', 1, 'ICU', 'he', {'strength': 'primary'}]
-  - [95, 'unicode_he_s2', 1, 'ICU', 'he', {'strength': 'secondary'}]
-  - [96, 'unicode_he_s3', 1, 'ICU', 'he', {'strength': 'tertiary'}]
-  - [97, 'unicode_hi_s1', 1, 'ICU', 'hi', {'strength': 'primary'}]
-  - [98, 'unicode_hi_s2', 1, 'ICU', 'hi', {'strength': 'secondary'}]
-  - [99, 'unicode_hi_s3', 1, 'ICU', 'hi', {'strength': 'tertiary'}]
-  - [100, 'unicode_hr_s1', 1, 'ICU', 'hr', {'strength': 'primary'}]
-  - [101, 'unicode_hr_s2', 1, 'ICU', 'hr', {'strength': 'secondary'}]
-  - [102, 'unicode_hr_s3', 1, 'ICU', 'hr', {'strength': 'tertiary'}]
-  - [103, 'unicode_hu_s1', 1, 'ICU', 'hu', {'strength': 'primary'}]
-  - [104, 'unicode_hu_s2', 1, 'ICU', 'hu', {'strength': 'secondary'}]
-  - [105, 'unicode_hu_s3', 1, 'ICU', 'hu', {'strength': 'tertiary'}]
-  - [106, 'unicode_hy_s1', 1, 'ICU', 'hy', {'strength': 'primary'}]
-  - [107, 'unicode_hy_s2', 1, 'ICU', 'hy', {'strength': 'secondary'}]
-  - [108, 'unicode_hy_s3', 1, 'ICU', 'hy', {'strength': 'tertiary'}]
-  - [109, 'unicode_ig_s1', 1, 'ICU', 'ig', {'strength': 'primary'}]
-  - [110, 'unicode_ig_s2', 1, 'ICU', 'ig', {'strength': 'secondary'}]
-  - [111, 'unicode_ig_s3', 1, 'ICU', 'ig', {'strength': 'tertiary'}]
-  - [112, 'unicode_is_s1', 1, 'ICU', 'is', {'strength': 'primary'}]
-  - [113, 'unicode_is_s2', 1, 'ICU', 'is', {'strength': 'secondary'}]
-  - [114, 'unicode_is_s3', 1, 'ICU', 'is', {'strength': 'tertiary'}]
-  - [115, 'unicode_ja_s1', 1, 'ICU', 'ja', {'strength': 'primary'}]
-  - [116, 'unicode_ja_s2', 1, 'ICU', 'ja', {'strength': 'secondary'}]
-  - [117, 'unicode_ja_s3', 1, 'ICU', 'ja', {'strength': 'tertiary'}]
-  - [118, 'unicode_kk_s1', 1, 'ICU', 'kk', {'strength': 'primary'}]
-  - [119, 'unicode_kk_s2', 1, 'ICU', 'kk', {'strength': 'secondary'}]
-  - [120, 'unicode_kk_s3', 1, 'ICU', 'kk', {'strength': 'tertiary'}]
-  - [121, 'unicode_kl_s1', 1, 'ICU', 'kl', {'strength': 'primary'}]
-  - [122, 'unicode_kl_s2', 1, 'ICU', 'kl', {'strength': 'secondary'}]
-  - [123, 'unicode_kl_s3', 1, 'ICU', 'kl', {'strength': 'tertiary'}]
-  - [124, 'unicode_kn_s1', 1, 'ICU', 'kn', {'strength': 'primary'}]
-  - [125, 'unicode_kn_s2', 1, 'ICU', 'kn', {'strength': 'secondary'}]
-  - [126, 'unicode_kn_s3', 1, 'ICU', 'kn', {'strength': 'tertiary'}]
-  - [127, 'unicode_ko_s1', 1, 'ICU', 'ko', {'strength': 'primary'}]
-  - [128, 'unicode_ko_s2', 1, 'ICU', 'ko', {'strength': 'secondary'}]
-  - [129, 'unicode_ko_s3', 1, 'ICU', 'ko', {'strength': 'tertiary'}]
-  - [130, 'unicode_kok_s1', 1, 'ICU', 'kok', {'strength': 'primary'}]
-  - [131, 'unicode_kok_s2', 1, 'ICU', 'kok', {'strength': 'secondary'}]
-  - [132, 'unicode_kok_s3', 1, 'ICU', 'kok', {'strength': 'tertiary'}]
-  - [133, 'unicode_ky_s1', 1, 'ICU', 'ky', {'strength': 'primary'}]
-  - [134, 'unicode_ky_s2', 1, 'ICU', 'ky', {'strength': 'secondary'}]
-  - [135, 'unicode_ky_s3', 1, 'ICU', 'ky', {'strength': 'tertiary'}]
-  - [136, 'unicode_lkt_s1', 1, 'ICU', 'lkt', {'strength': 'primary'}]
-  - [137, 'unicode_lkt_s2', 1, 'ICU', 'lkt', {'strength': 'secondary'}]
-  - [138, 'unicode_lkt_s3', 1, 'ICU', 'lkt', {'strength': 'tertiary'}]
-  - [139, 'unicode_ln_s1', 1, 'ICU', 'ln', {'strength': 'primary'}]
-  - [140, 'unicode_ln_s2', 1, 'ICU', 'ln', {'strength': 'secondary'}]
-  - [141, 'unicode_ln_s3', 1, 'ICU', 'ln', {'strength': 'tertiary'}]
-  - [142, 'unicode_lt_s1', 1, 'ICU', 'lt', {'strength': 'primary'}]
-  - [143, 'unicode_lt_s2', 1, 'ICU', 'lt', {'strength': 'secondary'}]
-  - [144, 'unicode_lt_s3', 1, 'ICU', 'lt', {'strength': 'tertiary'}]
-  - [145, 'unicode_lv_s1', 1, 'ICU', 'lv', {'strength': 'primary'}]
-  - [146, 'unicode_lv_s2', 1, 'ICU', 'lv', {'strength': 'secondary'}]
-  - [147, 'unicode_lv_s3', 1, 'ICU', 'lv', {'strength': 'tertiary'}]
-  - [148, 'unicode_mk_s1', 1, 'ICU', 'mk', {'strength': 'primary'}]
-  - [149, 'unicode_mk_s2', 1, 'ICU', 'mk', {'strength': 'secondary'}]
-  - [150, 'unicode_mk_s3', 1, 'ICU', 'mk', {'strength': 'tertiary'}]
-  - [151, 'unicode_ml_s1', 1, 'ICU', 'ml', {'strength': 'primary'}]
-  - [152, 'unicode_ml_s2', 1, 'ICU', 'ml', {'strength': 'secondary'}]
-  - [153, 'unicode_ml_s3', 1, 'ICU', 'ml', {'strength': 'tertiary'}]
-  - [154, 'unicode_mr_s1', 1, 'ICU', 'mr', {'strength': 'primary'}]
-  - [155, 'unicode_mr_s2', 1, 'ICU', 'mr', {'strength': 'secondary'}]
-  - [156, 'unicode_mr_s3', 1, 'ICU', 'mr', {'strength': 'tertiary'}]
-  - [157, 'unicode_mt_s1', 1, 'ICU', 'mt', {'strength': 'primary'}]
-  - [158, 'unicode_mt_s2', 1, 'ICU', 'mt', {'strength': 'secondary'}]
-  - [159, 'unicode_mt_s3', 1, 'ICU', 'mt', {'strength': 'tertiary'}]
-  - [160, 'unicode_nb_s1', 1, 'ICU', 'nb', {'strength': 'primary'}]
-  - [161, 'unicode_nb_s2', 1, 'ICU', 'nb', {'strength': 'secondary'}]
-  - [162, 'unicode_nb_s3', 1, 'ICU', 'nb', {'strength': 'tertiary'}]
-  - [163, 'unicode_nn_s1', 1, 'ICU', 'nn', {'strength': 'primary'}]
-  - [164, 'unicode_nn_s2', 1, 'ICU', 'nn', {'strength': 'secondary'}]
-  - [165, 'unicode_nn_s3', 1, 'ICU', 'nn', {'strength': 'tertiary'}]
-  - [166, 'unicode_nso_s1', 1, 'ICU', 'nso', {'strength': 'primary'}]
-  - [167, 'unicode_nso_s2', 1, 'ICU', 'nso', {'strength': 'secondary'}]
-  - [168, 'unicode_nso_s3', 1, 'ICU', 'nso', {'strength': 'tertiary'}]
-  - [169, 'unicode_om_s1', 1, 'ICU', 'om', {'strength': 'primary'}]
-  - [170, 'unicode_om_s2', 1, 'ICU', 'om', {'strength': 'secondary'}]
-  - [171, 'unicode_om_s3', 1, 'ICU', 'om', {'strength': 'tertiary'}]
-  - [172, 'unicode_or_s1', 1, 'ICU', 'or', {'strength': 'primary'}]
-  - [173, 'unicode_or_s2', 1, 'ICU', 'or', {'strength': 'secondary'}]
-  - [174, 'unicode_or_s3', 1, 'ICU', 'or', {'strength': 'tertiary'}]
-  - [175, 'unicode_pa_s1', 1, 'ICU', 'pa', {'strength': 'primary'}]
-  - [176, 'unicode_pa_s2', 1, 'ICU', 'pa', {'strength': 'secondary'}]
-  - [177, 'unicode_pa_s3', 1, 'ICU', 'pa', {'strength': 'tertiary'}]
-  - [178, 'unicode_pl_s1', 1, 'ICU', 'pl', {'strength': 'primary'}]
-  - [179, 'unicode_pl_s2', 1, 'ICU', 'pl', {'strength': 'secondary'}]
-  - [180, 'unicode_pl_s3', 1, 'ICU', 'pl', {'strength': 'tertiary'}]
-  - [181, 'unicode_ro_s1', 1, 'ICU', 'ro', {'strength': 'primary'}]
-  - [182, 'unicode_ro_s2', 1, 'ICU', 'ro', {'strength': 'secondary'}]
-  - [183, 'unicode_ro_s3', 1, 'ICU', 'ro', {'strength': 'tertiary'}]
-  - [184, 'unicode_sa_s1', 1, 'ICU', 'sa', {'strength': 'primary'}]
-  - [185, 'unicode_sa_s2', 1, 'ICU', 'sa', {'strength': 'secondary'}]
-  - [186, 'unicode_sa_s3', 1, 'ICU', 'sa', {'strength': 'tertiary'}]
-  - [187, 'unicode_se_s1', 1, 'ICU', 'se', {'strength': 'primary'}]
-  - [188, 'unicode_se_s2', 1, 'ICU', 'se', {'strength': 'secondary'}]
-  - [189, 'unicode_se_s3', 1, 'ICU', 'se', {'strength': 'tertiary'}]
-  - [190, 'unicode_si_s1', 1, 'ICU', 'si', {'strength': 'primary'}]
-  - [191, 'unicode_si_s2', 1, 'ICU', 'si', {'strength': 'secondary'}]
-  - [192, 'unicode_si_s3', 1, 'ICU', 'si', {'strength': 'tertiary'}]
-  - [193, 'unicode_si__dictionary_s1', 1, 'ICU', 'si_u_co_dict', {'strength': 'primary'}]
-  - [194, 'unicode_si__dictionary_s2', 1, 'ICU', 'si_u_co_dict', {'strength': 'secondary'}]
-  - [195, 'unicode_si__dictionary_s3', 1, 'ICU', 'si_u_co_dict', {'strength': 'tertiary'}]
-  - [196, 'unicode_sk_s1', 1, 'ICU', 'sk', {'strength': 'primary'}]
-  - [197, 'unicode_sk_s2', 1, 'ICU', 'sk', {'strength': 'secondary'}]
-  - [198, 'unicode_sk_s3', 1, 'ICU', 'sk', {'strength': 'tertiary'}]
-  - [199, 'unicode_sl_s1', 1, 'ICU', 'sl', {'strength': 'primary'}]
-  - [200, 'unicode_sl_s2', 1, 'ICU', 'sl', {'strength': 'secondary'}]
-  - [201, 'unicode_sl_s3', 1, 'ICU', 'sl', {'strength': 'tertiary'}]
-  - [202, 'unicode_sq_s1', 1, 'ICU', 'sq', {'strength': 'primary'}]
-  - [203, 'unicode_sq_s2', 1, 'ICU', 'sq', {'strength': 'secondary'}]
-  - [204, 'unicode_sq_s3', 1, 'ICU', 'sq', {'strength': 'tertiary'}]
-  - [205, 'unicode_sr_s1', 1, 'ICU', 'sr', {'strength': 'primary'}]
-  - [206, 'unicode_sr_s2', 1, 'ICU', 'sr', {'strength': 'secondary'}]
-  - [207, 'unicode_sr_s3', 1, 'ICU', 'sr', {'strength': 'tertiary'}]
-  - [208, 'unicode_sr_Latn_s1', 1, 'ICU', 'sr_Latn', {'strength': 'primary'}]
-  - [209, 'unicode_sr_Latn_s2', 1, 'ICU', 'sr_Latn', {'strength': 'secondary'}]
-  - [210, 'unicode_sr_Latn_s3', 1, 'ICU', 'sr_Latn', {'strength': 'tertiary'}]
-  - [211, 'unicode_sv_s1', 1, 'ICU', 'sv', {'strength': 'primary'}]
-  - [212, 'unicode_sv_s2', 1, 'ICU', 'sv', {'strength': 'secondary'}]
-  - [213, 'unicode_sv_s3', 1, 'ICU', 'sv', {'strength': 'tertiary'}]
-  - [214, 'unicode_sv__reformed_s1', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'primary'}]
-  - [215, 'unicode_sv__reformed_s2', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'secondary'}]
-  - [216, 'unicode_sv__reformed_s3', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'tertiary'}]
-  - [217, 'unicode_ta_s1', 1, 'ICU', 'ta', {'strength': 'primary'}]
-  - [218, 'unicode_ta_s2', 1, 'ICU', 'ta', {'strength': 'secondary'}]
-  - [219, 'unicode_ta_s3', 1, 'ICU', 'ta', {'strength': 'tertiary'}]
-  - [220, 'unicode_te_s1', 1, 'ICU', 'te', {'strength': 'primary'}]
-  - [221, 'unicode_te_s2', 1, 'ICU', 'te', {'strength': 'secondary'}]
-  - [222, 'unicode_te_s3', 1, 'ICU', 'te', {'strength': 'tertiary'}]
-  - [223, 'unicode_th_s1', 1, 'ICU', 'th', {'strength': 'primary'}]
-  - [224, 'unicode_th_s2', 1, 'ICU', 'th', {'strength': 'secondary'}]
-  - [225, 'unicode_th_s3', 1, 'ICU', 'th', {'strength': 'tertiary'}]
-  - [226, 'unicode_tn_s1', 1, 'ICU', 'tn', {'strength': 'primary'}]
-  - [227, 'unicode_tn_s2', 1, 'ICU', 'tn', {'strength': 'secondary'}]
-  - [228, 'unicode_tn_s3', 1, 'ICU', 'tn', {'strength': 'tertiary'}]
-  - [229, 'unicode_to_s1', 1, 'ICU', 'to', {'strength': 'primary'}]
-  - [230, 'unicode_to_s2', 1, 'ICU', 'to', {'strength': 'secondary'}]
-  - [231, 'unicode_to_s3', 1, 'ICU', 'to', {'strength': 'tertiary'}]
-  - [232, 'unicode_tr_s1', 1, 'ICU', 'tr', {'strength': 'primary'}]
-  - [233, 'unicode_tr_s2', 1, 'ICU', 'tr', {'strength': 'secondary'}]
-  - [234, 'unicode_tr_s3', 1, 'ICU', 'tr', {'strength': 'tertiary'}]
-  - [235, 'unicode_ug_Cyrl_s1', 1, 'ICU', 'ug', {'strength': 'primary'}]
-  - [236, 'unicode_ug_Cyrl_s2', 1, 'ICU', 'ug', {'strength': 'secondary'}]
-  - [237, 'unicode_ug_Cyrl_s3', 1, 'ICU', 'ug', {'strength': 'tertiary'}]
-  - [238, 'unicode_uk_s1', 1, 'ICU', 'uk', {'strength': 'primary'}]
-  - [239, 'unicode_uk_s2', 1, 'ICU', 'uk', {'strength': 'secondary'}]
-  - [240, 'unicode_uk_s3', 1, 'ICU', 'uk', {'strength': 'tertiary'}]
-  - [241, 'unicode_ur_s1', 1, 'ICU', 'ur', {'strength': 'primary'}]
-  - [242, 'unicode_ur_s2', 1, 'ICU', 'ur', {'strength': 'secondary'}]
-  - [243, 'unicode_ur_s3', 1, 'ICU', 'ur', {'strength': 'tertiary'}]
-  - [244, 'unicode_vi_s1', 1, 'ICU', 'vi', {'strength': 'primary'}]
-  - [245, 'unicode_vi_s2', 1, 'ICU', 'vi', {'strength': 'secondary'}]
-  - [246, 'unicode_vi_s3', 1, 'ICU', 'vi', {'strength': 'tertiary'}]
-  - [247, 'unicode_vo_s1', 1, 'ICU', 'vo', {'strength': 'primary'}]
-  - [248, 'unicode_vo_s2', 1, 'ICU', 'vo', {'strength': 'secondary'}]
-  - [249, 'unicode_vo_s3', 1, 'ICU', 'vo', {'strength': 'tertiary'}]
-  - [250, 'unicode_wae_s1', 1, 'ICU', 'wae', {'strength': 'primary'}]
-  - [251, 'unicode_wae_s2', 1, 'ICU', 'wae', {'strength': 'secondary'}]
-  - [252, 'unicode_wae_s3', 1, 'ICU', 'wae', {'strength': 'tertiary'}]
-  - [253, 'unicode_wo_s1', 1, 'ICU', 'wo', {'strength': 'primary'}]
-  - [254, 'unicode_wo_s2', 1, 'ICU', 'wo', {'strength': 'secondary'}]
-  - [255, 'unicode_wo_s3', 1, 'ICU', 'wo', {'strength': 'tertiary'}]
-  - [256, 'unicode_yo_s1', 1, 'ICU', 'yo', {'strength': 'primary'}]
-  - [257, 'unicode_yo_s2', 1, 'ICU', 'yo', {'strength': 'secondary'}]
-  - [258, 'unicode_yo_s3', 1, 'ICU', 'yo', {'strength': 'tertiary'}]
-  - [259, 'unicode_zh_s1', 1, 'ICU', 'zh', {'strength': 'primary'}]
-  - [260, 'unicode_zh_s2', 1, 'ICU', 'zh', {'strength': 'secondary'}]
-  - [261, 'unicode_zh_s3', 1, 'ICU', 'zh', {'strength': 'tertiary'}]
-  - [262, 'unicode_zh__big5han_s1', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'primary'}]
-  - [263, 'unicode_zh__big5han_s2', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'secondary'}]
-  - [264, 'unicode_zh__big5han_s3', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'tertiary'}]
-  - [265, 'unicode_zh__gb2312han_s1', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'primary'}]
-  - [266, 'unicode_zh__gb2312han_s2', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'secondary'}]
-  - [267, 'unicode_zh__gb2312han_s3', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'tertiary'}]
-  - [268, 'unicode_zh__pinyin_s1', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'primary'}]
-  - [269, 'unicode_zh__pinyin_s2', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'secondary'}]
-  - [270, 'unicode_zh__pinyin_s3', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'tertiary'}]
-  - [271, 'unicode_zh__stroke_s1', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'primary'}]
-  - [272, 'unicode_zh__stroke_s2', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'secondary'}]
-  - [273, 'unicode_zh__stroke_s3', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'tertiary'}]
-  - [274, 'unicode_zh__zhuyin_s1', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'primary'}]
-  - [275, 'unicode_zh__zhuyin_s2', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'secondary'}]
-  - [276, 'unicode_zh__zhuyin_s3', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'tertiary'}]
-  - [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
-test_run:cmd('restart server default')
-box.space._collation:select{}
----
-- - [0, 'none', 1, 'BINARY', '', {}]
-  - [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
-  - [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]
-  - [3, 'binary', 1, 'BINARY', '', {}]
-  - [4, 'unicode_af_s1', 1, 'ICU', 'af', {'strength': 'primary'}]
-  - [5, 'unicode_af_s2', 1, 'ICU', 'af', {'strength': 'secondary'}]
-  - [6, 'unicode_af_s3', 1, 'ICU', 'af', {'strength': 'tertiary'}]
-  - [7, 'unicode_am_s1', 1, 'ICU', 'am', {'strength': 'primary'}]
-  - [8, 'unicode_am_s2', 1, 'ICU', 'am', {'strength': 'secondary'}]
-  - [9, 'unicode_am_s3', 1, 'ICU', 'am', {'strength': 'tertiary'}]
-  - [10, 'unicode_ar_s1', 1, 'ICU', 'ar', {'strength': 'primary'}]
-  - [11, 'unicode_ar_s2', 1, 'ICU', 'ar', {'strength': 'secondary'}]
-  - [12, 'unicode_ar_s3', 1, 'ICU', 'ar', {'strength': 'tertiary'}]
-  - [13, 'unicode_as_s1', 1, 'ICU', 'as', {'strength': 'primary'}]
-  - [14, 'unicode_as_s2', 1, 'ICU', 'as', {'strength': 'secondary'}]
-  - [15, 'unicode_as_s3', 1, 'ICU', 'as', {'strength': 'tertiary'}]
-  - [16, 'unicode_az_s1', 1, 'ICU', 'az', {'strength': 'primary'}]
-  - [17, 'unicode_az_s2', 1, 'ICU', 'az', {'strength': 'secondary'}]
-  - [18, 'unicode_az_s3', 1, 'ICU', 'az', {'strength': 'tertiary'}]
-  - [19, 'unicode_be_s1', 1, 'ICU', 'be', {'strength': 'primary'}]
-  - [20, 'unicode_be_s2', 1, 'ICU', 'be', {'strength': 'secondary'}]
-  - [21, 'unicode_be_s3', 1, 'ICU', 'be', {'strength': 'tertiary'}]
-  - [22, 'unicode_bn_s1', 1, 'ICU', 'bn', {'strength': 'primary'}]
-  - [23, 'unicode_bn_s2', 1, 'ICU', 'bn', {'strength': 'secondary'}]
-  - [24, 'unicode_bn_s3', 1, 'ICU', 'bn', {'strength': 'tertiary'}]
-  - [25, 'unicode_bs_s1', 1, 'ICU', 'bs', {'strength': 'primary'}]
-  - [26, 'unicode_bs_s2', 1, 'ICU', 'bs', {'strength': 'secondary'}]
-  - [27, 'unicode_bs_s3', 1, 'ICU', 'bs', {'strength': 'tertiary'}]
-  - [28, 'unicode_bs_Cyrl_s1', 1, 'ICU', 'bs_Cyrl', {'strength': 'primary'}]
-  - [29, 'unicode_bs_Cyrl_s2', 1, 'ICU', 'bs_Cyrl', {'strength': 'secondary'}]
-  - [30, 'unicode_bs_Cyrl_s3', 1, 'ICU', 'bs_Cyrl', {'strength': 'tertiary'}]
-  - [31, 'unicode_ca_s1', 1, 'ICU', 'ca', {'strength': 'primary'}]
-  - [32, 'unicode_ca_s2', 1, 'ICU', 'ca', {'strength': 'secondary'}]
-  - [33, 'unicode_ca_s3', 1, 'ICU', 'ca', {'strength': 'tertiary'}]
-  - [34, 'unicode_cs_s1', 1, 'ICU', 'cs', {'strength': 'primary'}]
-  - [35, 'unicode_cs_s2', 1, 'ICU', 'cs', {'strength': 'secondary'}]
-  - [36, 'unicode_cs_s3', 1, 'ICU', 'cs', {'strength': 'tertiary'}]
-  - [37, 'unicode_cy_s1', 1, 'ICU', 'cy', {'strength': 'primary'}]
-  - [38, 'unicode_cy_s2', 1, 'ICU', 'cy', {'strength': 'secondary'}]
-  - [39, 'unicode_cy_s3', 1, 'ICU', 'cy', {'strength': 'tertiary'}]
-  - [40, 'unicode_da_s1', 1, 'ICU', 'da', {'strength': 'primary'}]
-  - [41, 'unicode_da_s2', 1, 'ICU', 'da', {'strength': 'secondary'}]
-  - [42, 'unicode_da_s3', 1, 'ICU', 'da', {'strength': 'tertiary'}]
-  - [43, 'unicode_de__phonebook_s1', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'primary'}]
-  - [44, 'unicode_de__phonebook_s2', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'secondary'}]
-  - [45, 'unicode_de__phonebook_s3', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'tertiary'}]
-  - [46, 'unicode_de_AT_phonebook_s1', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'primary'}]
-  - [47, 'unicode_de_AT_phonebook_s2', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'secondary'}]
-  - [48, 'unicode_de_AT_phonebook_s3', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'tertiary'}]
-  - [49, 'unicode_dsb_s1', 1, 'ICU', 'dsb', {'strength': 'primary'}]
-  - [50, 'unicode_dsb_s2', 1, 'ICU', 'dsb', {'strength': 'secondary'}]
-  - [51, 'unicode_dsb_s3', 1, 'ICU', 'dsb', {'strength': 'tertiary'}]
-  - [52, 'unicode_ee_s1', 1, 'ICU', 'ee', {'strength': 'primary'}]
-  - [53, 'unicode_ee_s2', 1, 'ICU', 'ee', {'strength': 'secondary'}]
-  - [54, 'unicode_ee_s3', 1, 'ICU', 'ee', {'strength': 'tertiary'}]
-  - [55, 'unicode_eo_s1', 1, 'ICU', 'eo', {'strength': 'primary'}]
-  - [56, 'unicode_eo_s2', 1, 'ICU', 'eo', {'strength': 'secondary'}]
-  - [57, 'unicode_eo_s3', 1, 'ICU', 'eo', {'strength': 'tertiary'}]
-  - [58, 'unicode_es_s1', 1, 'ICU', 'es', {'strength': 'primary'}]
-  - [59, 'unicode_es_s2', 1, 'ICU', 'es', {'strength': 'secondary'}]
-  - [60, 'unicode_es_s3', 1, 'ICU', 'es', {'strength': 'tertiary'}]
-  - [61, 'unicode_es__traditional_s1', 1, 'ICU', 'es_u_co_trad', {'strength': 'primary'}]
-  - [62, 'unicode_es__traditional_s2', 1, 'ICU', 'es_u_co_trad', {'strength': 'secondary'}]
-  - [63, 'unicode_es__traditional_s3', 1, 'ICU', 'es_u_co_trad', {'strength': 'tertiary'}]
-  - [64, 'unicode_et_s1', 1, 'ICU', 'et', {'strength': 'primary'}]
-  - [65, 'unicode_et_s2', 1, 'ICU', 'et', {'strength': 'secondary'}]
-  - [66, 'unicode_et_s3', 1, 'ICU', 'et', {'strength': 'tertiary'}]
-  - [67, 'unicode_fa_s1', 1, 'ICU', 'fa', {'strength': 'primary'}]
-  - [68, 'unicode_fa_s2', 1, 'ICU', 'fa', {'strength': 'secondary'}]
-  - [69, 'unicode_fa_s3', 1, 'ICU', 'fa', {'strength': 'tertiary'}]
-  - [70, 'unicode_fi_s1', 1, 'ICU', 'fi', {'strength': 'primary'}]
-  - [71, 'unicode_fi_s2', 1, 'ICU', 'fi', {'strength': 'secondary'}]
-  - [72, 'unicode_fi_s3', 1, 'ICU', 'fi', {'strength': 'tertiary'}]
-  - [73, 'unicode_fi__phonebook_s1', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'primary'}]
-  - [74, 'unicode_fi__phonebook_s2', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'secondary'}]
-  - [75, 'unicode_fi__phonebook_s3', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'tertiary'}]
-  - [76, 'unicode_fil_s1', 1, 'ICU', 'fil', {'strength': 'primary'}]
-  - [77, 'unicode_fil_s2', 1, 'ICU', 'fil', {'strength': 'secondary'}]
-  - [78, 'unicode_fil_s3', 1, 'ICU', 'fil', {'strength': 'tertiary'}]
-  - [79, 'unicode_fo_s1', 1, 'ICU', 'fo', {'strength': 'primary'}]
-  - [80, 'unicode_fo_s2', 1, 'ICU', 'fo', {'strength': 'secondary'}]
-  - [81, 'unicode_fo_s3', 1, 'ICU', 'fo', {'strength': 'tertiary'}]
-  - [82, 'unicode_fr_CA_s1', 1, 'ICU', 'fr_CA', {'strength': 'primary'}]
-  - [83, 'unicode_fr_CA_s2', 1, 'ICU', 'fr_CA', {'strength': 'secondary'}]
-  - [84, 'unicode_fr_CA_s3', 1, 'ICU', 'fr_CA', {'strength': 'tertiary'}]
-  - [85, 'unicode_gu_s1', 1, 'ICU', 'gu', {'strength': 'primary'}]
-  - [86, 'unicode_gu_s2', 1, 'ICU', 'gu', {'strength': 'secondary'}]
-  - [87, 'unicode_gu_s3', 1, 'ICU', 'gu', {'strength': 'tertiary'}]
-  - [88, 'unicode_ha_s1', 1, 'ICU', 'ha', {'strength': 'primary'}]
-  - [89, 'unicode_ha_s2', 1, 'ICU', 'ha', {'strength': 'secondary'}]
-  - [90, 'unicode_ha_s3', 1, 'ICU', 'ha', {'strength': 'tertiary'}]
-  - [91, 'unicode_haw_s1', 1, 'ICU', 'haw', {'strength': 'primary'}]
-  - [92, 'unicode_haw_s2', 1, 'ICU', 'haw', {'strength': 'secondary'}]
-  - [93, 'unicode_haw_s3', 1, 'ICU', 'haw', {'strength': 'tertiary'}]
-  - [94, 'unicode_he_s1', 1, 'ICU', 'he', {'strength': 'primary'}]
-  - [95, 'unicode_he_s2', 1, 'ICU', 'he', {'strength': 'secondary'}]
-  - [96, 'unicode_he_s3', 1, 'ICU', 'he', {'strength': 'tertiary'}]
-  - [97, 'unicode_hi_s1', 1, 'ICU', 'hi', {'strength': 'primary'}]
-  - [98, 'unicode_hi_s2', 1, 'ICU', 'hi', {'strength': 'secondary'}]
-  - [99, 'unicode_hi_s3', 1, 'ICU', 'hi', {'strength': 'tertiary'}]
-  - [100, 'unicode_hr_s1', 1, 'ICU', 'hr', {'strength': 'primary'}]
-  - [101, 'unicode_hr_s2', 1, 'ICU', 'hr', {'strength': 'secondary'}]
-  - [102, 'unicode_hr_s3', 1, 'ICU', 'hr', {'strength': 'tertiary'}]
-  - [103, 'unicode_hu_s1', 1, 'ICU', 'hu', {'strength': 'primary'}]
-  - [104, 'unicode_hu_s2', 1, 'ICU', 'hu', {'strength': 'secondary'}]
-  - [105, 'unicode_hu_s3', 1, 'ICU', 'hu', {'strength': 'tertiary'}]
-  - [106, 'unicode_hy_s1', 1, 'ICU', 'hy', {'strength': 'primary'}]
-  - [107, 'unicode_hy_s2', 1, 'ICU', 'hy', {'strength': 'secondary'}]
-  - [108, 'unicode_hy_s3', 1, 'ICU', 'hy', {'strength': 'tertiary'}]
-  - [109, 'unicode_ig_s1', 1, 'ICU', 'ig', {'strength': 'primary'}]
-  - [110, 'unicode_ig_s2', 1, 'ICU', 'ig', {'strength': 'secondary'}]
-  - [111, 'unicode_ig_s3', 1, 'ICU', 'ig', {'strength': 'tertiary'}]
-  - [112, 'unicode_is_s1', 1, 'ICU', 'is', {'strength': 'primary'}]
-  - [113, 'unicode_is_s2', 1, 'ICU', 'is', {'strength': 'secondary'}]
-  - [114, 'unicode_is_s3', 1, 'ICU', 'is', {'strength': 'tertiary'}]
-  - [115, 'unicode_ja_s1', 1, 'ICU', 'ja', {'strength': 'primary'}]
-  - [116, 'unicode_ja_s2', 1, 'ICU', 'ja', {'strength': 'secondary'}]
-  - [117, 'unicode_ja_s3', 1, 'ICU', 'ja', {'strength': 'tertiary'}]
-  - [118, 'unicode_kk_s1', 1, 'ICU', 'kk', {'strength': 'primary'}]
-  - [119, 'unicode_kk_s2', 1, 'ICU', 'kk', {'strength': 'secondary'}]
-  - [120, 'unicode_kk_s3', 1, 'ICU', 'kk', {'strength': 'tertiary'}]
-  - [121, 'unicode_kl_s1', 1, 'ICU', 'kl', {'strength': 'primary'}]
-  - [122, 'unicode_kl_s2', 1, 'ICU', 'kl', {'strength': 'secondary'}]
-  - [123, 'unicode_kl_s3', 1, 'ICU', 'kl', {'strength': 'tertiary'}]
-  - [124, 'unicode_kn_s1', 1, 'ICU', 'kn', {'strength': 'primary'}]
-  - [125, 'unicode_kn_s2', 1, 'ICU', 'kn', {'strength': 'secondary'}]
-  - [126, 'unicode_kn_s3', 1, 'ICU', 'kn', {'strength': 'tertiary'}]
-  - [127, 'unicode_ko_s1', 1, 'ICU', 'ko', {'strength': 'primary'}]
-  - [128, 'unicode_ko_s2', 1, 'ICU', 'ko', {'strength': 'secondary'}]
-  - [129, 'unicode_ko_s3', 1, 'ICU', 'ko', {'strength': 'tertiary'}]
-  - [130, 'unicode_kok_s1', 1, 'ICU', 'kok', {'strength': 'primary'}]
-  - [131, 'unicode_kok_s2', 1, 'ICU', 'kok', {'strength': 'secondary'}]
-  - [132, 'unicode_kok_s3', 1, 'ICU', 'kok', {'strength': 'tertiary'}]
-  - [133, 'unicode_ky_s1', 1, 'ICU', 'ky', {'strength': 'primary'}]
-  - [134, 'unicode_ky_s2', 1, 'ICU', 'ky', {'strength': 'secondary'}]
-  - [135, 'unicode_ky_s3', 1, 'ICU', 'ky', {'strength': 'tertiary'}]
-  - [136, 'unicode_lkt_s1', 1, 'ICU', 'lkt', {'strength': 'primary'}]
-  - [137, 'unicode_lkt_s2', 1, 'ICU', 'lkt', {'strength': 'secondary'}]
-  - [138, 'unicode_lkt_s3', 1, 'ICU', 'lkt', {'strength': 'tertiary'}]
-  - [139, 'unicode_ln_s1', 1, 'ICU', 'ln', {'strength': 'primary'}]
-  - [140, 'unicode_ln_s2', 1, 'ICU', 'ln', {'strength': 'secondary'}]
-  - [141, 'unicode_ln_s3', 1, 'ICU', 'ln', {'strength': 'tertiary'}]
-  - [142, 'unicode_lt_s1', 1, 'ICU', 'lt', {'strength': 'primary'}]
-  - [143, 'unicode_lt_s2', 1, 'ICU', 'lt', {'strength': 'secondary'}]
-  - [144, 'unicode_lt_s3', 1, 'ICU', 'lt', {'strength': 'tertiary'}]
-  - [145, 'unicode_lv_s1', 1, 'ICU', 'lv', {'strength': 'primary'}]
-  - [146, 'unicode_lv_s2', 1, 'ICU', 'lv', {'strength': 'secondary'}]
-  - [147, 'unicode_lv_s3', 1, 'ICU', 'lv', {'strength': 'tertiary'}]
-  - [148, 'unicode_mk_s1', 1, 'ICU', 'mk', {'strength': 'primary'}]
-  - [149, 'unicode_mk_s2', 1, 'ICU', 'mk', {'strength': 'secondary'}]
-  - [150, 'unicode_mk_s3', 1, 'ICU', 'mk', {'strength': 'tertiary'}]
-  - [151, 'unicode_ml_s1', 1, 'ICU', 'ml', {'strength': 'primary'}]
-  - [152, 'unicode_ml_s2', 1, 'ICU', 'ml', {'strength': 'secondary'}]
-  - [153, 'unicode_ml_s3', 1, 'ICU', 'ml', {'strength': 'tertiary'}]
-  - [154, 'unicode_mr_s1', 1, 'ICU', 'mr', {'strength': 'primary'}]
-  - [155, 'unicode_mr_s2', 1, 'ICU', 'mr', {'strength': 'secondary'}]
-  - [156, 'unicode_mr_s3', 1, 'ICU', 'mr', {'strength': 'tertiary'}]
-  - [157, 'unicode_mt_s1', 1, 'ICU', 'mt', {'strength': 'primary'}]
-  - [158, 'unicode_mt_s2', 1, 'ICU', 'mt', {'strength': 'secondary'}]
-  - [159, 'unicode_mt_s3', 1, 'ICU', 'mt', {'strength': 'tertiary'}]
-  - [160, 'unicode_nb_s1', 1, 'ICU', 'nb', {'strength': 'primary'}]
-  - [161, 'unicode_nb_s2', 1, 'ICU', 'nb', {'strength': 'secondary'}]
-  - [162, 'unicode_nb_s3', 1, 'ICU', 'nb', {'strength': 'tertiary'}]
-  - [163, 'unicode_nn_s1', 1, 'ICU', 'nn', {'strength': 'primary'}]
-  - [164, 'unicode_nn_s2', 1, 'ICU', 'nn', {'strength': 'secondary'}]
-  - [165, 'unicode_nn_s3', 1, 'ICU', 'nn', {'strength': 'tertiary'}]
-  - [166, 'unicode_nso_s1', 1, 'ICU', 'nso', {'strength': 'primary'}]
-  - [167, 'unicode_nso_s2', 1, 'ICU', 'nso', {'strength': 'secondary'}]
-  - [168, 'unicode_nso_s3', 1, 'ICU', 'nso', {'strength': 'tertiary'}]
-  - [169, 'unicode_om_s1', 1, 'ICU', 'om', {'strength': 'primary'}]
-  - [170, 'unicode_om_s2', 1, 'ICU', 'om', {'strength': 'secondary'}]
-  - [171, 'unicode_om_s3', 1, 'ICU', 'om', {'strength': 'tertiary'}]
-  - [172, 'unicode_or_s1', 1, 'ICU', 'or', {'strength': 'primary'}]
-  - [173, 'unicode_or_s2', 1, 'ICU', 'or', {'strength': 'secondary'}]
-  - [174, 'unicode_or_s3', 1, 'ICU', 'or', {'strength': 'tertiary'}]
-  - [175, 'unicode_pa_s1', 1, 'ICU', 'pa', {'strength': 'primary'}]
-  - [176, 'unicode_pa_s2', 1, 'ICU', 'pa', {'strength': 'secondary'}]
-  - [177, 'unicode_pa_s3', 1, 'ICU', 'pa', {'strength': 'tertiary'}]
-  - [178, 'unicode_pl_s1', 1, 'ICU', 'pl', {'strength': 'primary'}]
-  - [179, 'unicode_pl_s2', 1, 'ICU', 'pl', {'strength': 'secondary'}]
-  - [180, 'unicode_pl_s3', 1, 'ICU', 'pl', {'strength': 'tertiary'}]
-  - [181, 'unicode_ro_s1', 1, 'ICU', 'ro', {'strength': 'primary'}]
-  - [182, 'unicode_ro_s2', 1, 'ICU', 'ro', {'strength': 'secondary'}]
-  - [183, 'unicode_ro_s3', 1, 'ICU', 'ro', {'strength': 'tertiary'}]
-  - [184, 'unicode_sa_s1', 1, 'ICU', 'sa', {'strength': 'primary'}]
-  - [185, 'unicode_sa_s2', 1, 'ICU', 'sa', {'strength': 'secondary'}]
-  - [186, 'unicode_sa_s3', 1, 'ICU', 'sa', {'strength': 'tertiary'}]
-  - [187, 'unicode_se_s1', 1, 'ICU', 'se', {'strength': 'primary'}]
-  - [188, 'unicode_se_s2', 1, 'ICU', 'se', {'strength': 'secondary'}]
-  - [189, 'unicode_se_s3', 1, 'ICU', 'se', {'strength': 'tertiary'}]
-  - [190, 'unicode_si_s1', 1, 'ICU', 'si', {'strength': 'primary'}]
-  - [191, 'unicode_si_s2', 1, 'ICU', 'si', {'strength': 'secondary'}]
-  - [192, 'unicode_si_s3', 1, 'ICU', 'si', {'strength': 'tertiary'}]
-  - [193, 'unicode_si__dictionary_s1', 1, 'ICU', 'si_u_co_dict', {'strength': 'primary'}]
-  - [194, 'unicode_si__dictionary_s2', 1, 'ICU', 'si_u_co_dict', {'strength': 'secondary'}]
-  - [195, 'unicode_si__dictionary_s3', 1, 'ICU', 'si_u_co_dict', {'strength': 'tertiary'}]
-  - [196, 'unicode_sk_s1', 1, 'ICU', 'sk', {'strength': 'primary'}]
-  - [197, 'unicode_sk_s2', 1, 'ICU', 'sk', {'strength': 'secondary'}]
-  - [198, 'unicode_sk_s3', 1, 'ICU', 'sk', {'strength': 'tertiary'}]
-  - [199, 'unicode_sl_s1', 1, 'ICU', 'sl', {'strength': 'primary'}]
-  - [200, 'unicode_sl_s2', 1, 'ICU', 'sl', {'strength': 'secondary'}]
-  - [201, 'unicode_sl_s3', 1, 'ICU', 'sl', {'strength': 'tertiary'}]
-  - [202, 'unicode_sq_s1', 1, 'ICU', 'sq', {'strength': 'primary'}]
-  - [203, 'unicode_sq_s2', 1, 'ICU', 'sq', {'strength': 'secondary'}]
-  - [204, 'unicode_sq_s3', 1, 'ICU', 'sq', {'strength': 'tertiary'}]
-  - [205, 'unicode_sr_s1', 1, 'ICU', 'sr', {'strength': 'primary'}]
-  - [206, 'unicode_sr_s2', 1, 'ICU', 'sr', {'strength': 'secondary'}]
-  - [207, 'unicode_sr_s3', 1, 'ICU', 'sr', {'strength': 'tertiary'}]
-  - [208, 'unicode_sr_Latn_s1', 1, 'ICU', 'sr_Latn', {'strength': 'primary'}]
-  - [209, 'unicode_sr_Latn_s2', 1, 'ICU', 'sr_Latn', {'strength': 'secondary'}]
-  - [210, 'unicode_sr_Latn_s3', 1, 'ICU', 'sr_Latn', {'strength': 'tertiary'}]
-  - [211, 'unicode_sv_s1', 1, 'ICU', 'sv', {'strength': 'primary'}]
-  - [212, 'unicode_sv_s2', 1, 'ICU', 'sv', {'strength': 'secondary'}]
-  - [213, 'unicode_sv_s3', 1, 'ICU', 'sv', {'strength': 'tertiary'}]
-  - [214, 'unicode_sv__reformed_s1', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'primary'}]
-  - [215, 'unicode_sv__reformed_s2', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'secondary'}]
-  - [216, 'unicode_sv__reformed_s3', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'tertiary'}]
-  - [217, 'unicode_ta_s1', 1, 'ICU', 'ta', {'strength': 'primary'}]
-  - [218, 'unicode_ta_s2', 1, 'ICU', 'ta', {'strength': 'secondary'}]
-  - [219, 'unicode_ta_s3', 1, 'ICU', 'ta', {'strength': 'tertiary'}]
-  - [220, 'unicode_te_s1', 1, 'ICU', 'te', {'strength': 'primary'}]
-  - [221, 'unicode_te_s2', 1, 'ICU', 'te', {'strength': 'secondary'}]
-  - [222, 'unicode_te_s3', 1, 'ICU', 'te', {'strength': 'tertiary'}]
-  - [223, 'unicode_th_s1', 1, 'ICU', 'th', {'strength': 'primary'}]
-  - [224, 'unicode_th_s2', 1, 'ICU', 'th', {'strength': 'secondary'}]
-  - [225, 'unicode_th_s3', 1, 'ICU', 'th', {'strength': 'tertiary'}]
-  - [226, 'unicode_tn_s1', 1, 'ICU', 'tn', {'strength': 'primary'}]
-  - [227, 'unicode_tn_s2', 1, 'ICU', 'tn', {'strength': 'secondary'}]
-  - [228, 'unicode_tn_s3', 1, 'ICU', 'tn', {'strength': 'tertiary'}]
-  - [229, 'unicode_to_s1', 1, 'ICU', 'to', {'strength': 'primary'}]
-  - [230, 'unicode_to_s2', 1, 'ICU', 'to', {'strength': 'secondary'}]
-  - [231, 'unicode_to_s3', 1, 'ICU', 'to', {'strength': 'tertiary'}]
-  - [232, 'unicode_tr_s1', 1, 'ICU', 'tr', {'strength': 'primary'}]
-  - [233, 'unicode_tr_s2', 1, 'ICU', 'tr', {'strength': 'secondary'}]
-  - [234, 'unicode_tr_s3', 1, 'ICU', 'tr', {'strength': 'tertiary'}]
-  - [235, 'unicode_ug_Cyrl_s1', 1, 'ICU', 'ug', {'strength': 'primary'}]
-  - [236, 'unicode_ug_Cyrl_s2', 1, 'ICU', 'ug', {'strength': 'secondary'}]
-  - [237, 'unicode_ug_Cyrl_s3', 1, 'ICU', 'ug', {'strength': 'tertiary'}]
-  - [238, 'unicode_uk_s1', 1, 'ICU', 'uk', {'strength': 'primary'}]
-  - [239, 'unicode_uk_s2', 1, 'ICU', 'uk', {'strength': 'secondary'}]
-  - [240, 'unicode_uk_s3', 1, 'ICU', 'uk', {'strength': 'tertiary'}]
-  - [241, 'unicode_ur_s1', 1, 'ICU', 'ur', {'strength': 'primary'}]
-  - [242, 'unicode_ur_s2', 1, 'ICU', 'ur', {'strength': 'secondary'}]
-  - [243, 'unicode_ur_s3', 1, 'ICU', 'ur', {'strength': 'tertiary'}]
-  - [244, 'unicode_vi_s1', 1, 'ICU', 'vi', {'strength': 'primary'}]
-  - [245, 'unicode_vi_s2', 1, 'ICU', 'vi', {'strength': 'secondary'}]
-  - [246, 'unicode_vi_s3', 1, 'ICU', 'vi', {'strength': 'tertiary'}]
-  - [247, 'unicode_vo_s1', 1, 'ICU', 'vo', {'strength': 'primary'}]
-  - [248, 'unicode_vo_s2', 1, 'ICU', 'vo', {'strength': 'secondary'}]
-  - [249, 'unicode_vo_s3', 1, 'ICU', 'vo', {'strength': 'tertiary'}]
-  - [250, 'unicode_wae_s1', 1, 'ICU', 'wae', {'strength': 'primary'}]
-  - [251, 'unicode_wae_s2', 1, 'ICU', 'wae', {'strength': 'secondary'}]
-  - [252, 'unicode_wae_s3', 1, 'ICU', 'wae', {'strength': 'tertiary'}]
-  - [253, 'unicode_wo_s1', 1, 'ICU', 'wo', {'strength': 'primary'}]
-  - [254, 'unicode_wo_s2', 1, 'ICU', 'wo', {'strength': 'secondary'}]
-  - [255, 'unicode_wo_s3', 1, 'ICU', 'wo', {'strength': 'tertiary'}]
-  - [256, 'unicode_yo_s1', 1, 'ICU', 'yo', {'strength': 'primary'}]
-  - [257, 'unicode_yo_s2', 1, 'ICU', 'yo', {'strength': 'secondary'}]
-  - [258, 'unicode_yo_s3', 1, 'ICU', 'yo', {'strength': 'tertiary'}]
-  - [259, 'unicode_zh_s1', 1, 'ICU', 'zh', {'strength': 'primary'}]
-  - [260, 'unicode_zh_s2', 1, 'ICU', 'zh', {'strength': 'secondary'}]
-  - [261, 'unicode_zh_s3', 1, 'ICU', 'zh', {'strength': 'tertiary'}]
-  - [262, 'unicode_zh__big5han_s1', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'primary'}]
-  - [263, 'unicode_zh__big5han_s2', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'secondary'}]
-  - [264, 'unicode_zh__big5han_s3', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'tertiary'}]
-  - [265, 'unicode_zh__gb2312han_s1', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'primary'}]
-  - [266, 'unicode_zh__gb2312han_s2', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'secondary'}]
-  - [267, 'unicode_zh__gb2312han_s3', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'tertiary'}]
-  - [268, 'unicode_zh__pinyin_s1', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'primary'}]
-  - [269, 'unicode_zh__pinyin_s2', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'secondary'}]
-  - [270, 'unicode_zh__pinyin_s3', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'tertiary'}]
-  - [271, 'unicode_zh__stroke_s1', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'primary'}]
-  - [272, 'unicode_zh__stroke_s2', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'secondary'}]
-  - [273, 'unicode_zh__stroke_s3', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'tertiary'}]
-  - [274, 'unicode_zh__zhuyin_s1', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'primary'}]
-  - [275, 'unicode_zh__zhuyin_s2', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'secondary'}]
-  - [276, 'unicode_zh__zhuyin_s3', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'tertiary'}]
-  - [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
-box.space._collation.index.name:delete{'test'}
----
-- [277, 'test', 0, 'ICU', 'ru_RU', {}]
-...
---
--- gh-3290: expose ICU into Lua. It uses built-in collations, that
--- must work even if a collation is deleted from _collation.
---
-t = box.space._collation:delete{1}
----
-...
-utf8.cmp('abc', 'def')
----
-- -1
-...
-box.space._collation:replace(t)
----
-- [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
-...
---
--- gh-2839: allow to store custom fields in field definition.
---
-format = {}
----
-...
-format[1] = {name = 'field1', type = 'unsigned'}
----
-...
-format[2] = {'field2', 'unsigned'}
----
-...
-format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
----
-...
-s = box.schema.create_space('test', {format = format})
----
-...
-s:format()[3].custom_field
----
-- custom_value
-...
-s:drop()
----
-...
---
--- gh-2937: allow to specify collation in field definition.
---
-format = {}
----
-...
-format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
----
-...
-format[2] = {'field2', 'any', collation = 'unicode_ci'}
----
-...
-format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
----
-...
-s = box.schema.create_space('test', {format = format})
----
-...
-s:format()
----
-- [{'type': 'string', 'name': 'field1', 'collation': 1}, {'type': 'any', 'name': 'field2',
-    'collation': 2}, {'type': 'scalar', 'name': 'field3', 'collation': 1}]
-...
-s:drop()
----
-...
--- Check that collation is allowed only for stings, scalar and any types.
-format = {}
----
-...
-format[1] = {'field1', 'unsigned', collation = 'unicode'}
----
-...
-s = box.schema.create_space('test', {format = format})
----
-- error: 'Failed to create space ''test'': collation is reasonable only for string,
-    scalar and any fields'
-...
-format[1] = {'field2', 'array', collation = 'unicode_ci'}
----
-...
-s = box.schema.create_space('test', {format = format})
----
-- error: 'Failed to create space ''test'': collation is reasonable only for string,
-    scalar and any fields'
-...
--- Check that error is raised when collation doesn't exists.
-format = {}
----
-...
-format[1] = {'field1', 'unsigend', collation = 'test_coll'}
----
-...
-s = box.schema.create_space('test', {format = format})
----
-- error: 'Illegal parameters, format[1]: collation was not found by name ''test_coll'''
-...
--- Check that error is raised when collation with wrong id is used.
-_space = box.space[box.schema.SPACE_ID]
----
-...
-utils = require('utils')
----
-...
-EMPTY_MAP = utils.setmap({})
----
-...
-format = {{name = 'field1', type = 'string', collation = 666}}
----
-...
-surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
----
-...
-_space:insert(surrogate_space)
----
-- error: 'Wrong collation options (field 1): collation was not found by ID'
-...
---
--- gh-2783
--- A ddl operation shoud fail before trying to lock a ddl latch
--- in a multi-statement transaction.
--- If operation tries to lock already an locked latch then the
--- current transaction will be silently rolled back under our feet.
--- This is confusing. So check for multi-statement transaction
--- before locking the latch.
---
-test_latch = box.schema.space.create('test_latch')
----
-...
-_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
----
-...
-fiber = require('fiber')
----
-...
-c = fiber.channel(1)
----
-...
-test_run:cmd("setopt delimiter ';'")
----
-- true
-...
-_ = fiber.create(function()
-    test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
-    c:put(true)
-end);
----
-...
--- Should be Ok for now
-box.begin()
-    test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
-box.commit();
----
-...
-test_run:cmd("setopt delimiter ''");
----
-- true
-...
--- Explicitly roll back the transaction in multi-statement,
--- which hasn't finished due to DDL error
-box.rollback()
----
-...
-_ = c:get()
----
-...
-test_latch:drop() -- this is where everything stops
----
-...
diff --git a/test/box/ddl.test.lua b/test/box/ddl.test.lua
deleted file mode 100644
index 101bc6f9b..000000000
--- a/test/box/ddl.test.lua
+++ /dev/null
@@ -1,272 +0,0 @@
-env = require('test_run')
-test_run = env.new()
-
-fiber = require'fiber'
-
--- simple test for parallel ddl execution
-_ = box.schema.space.create('test'):create_index('pk')
-
-ch = fiber.channel(2)
-
-test_run:cmd("setopt delimiter ';'")
-
-function f1()
-    box.space.test:create_index('sec', {parts = {2, 'num'}})
-    ch:put(true)
-end;
-
-function f2()
-    box.space.test:create_index('third', {parts = {3, 'string'}})
-    ch:put(true)
-end;
-
-test_run:cmd("setopt delimiter ''");
-
-_ = {fiber.create(f1), fiber.create(f2)}
-
-ch:get()
-ch:get()
-
-_ = box.space.test:drop()
-
-test_run:cmd('restart server default')
-
-env = require('test_run')
-test_run = env.new()
-fiber = require'fiber'
-
-ch = fiber.channel(2)
-
---issue #928
-space = box.schema.space.create('test_trunc')
-_ = space:create_index('pk')
-_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
-_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
-
-function test_trunc() space:truncate() ch:put(true) end
-
-_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
-_ = {ch:get(), ch:get()}
-space:drop()
-
--- index should not crash after alter
-space = box.schema.space.create('test_swap')
-index = space:create_index('pk')
-space:replace({1, 2, 3})
-index:rename('primary')
-index2 = space:create_index('sec')
-space:replace({2, 3, 1})
-space:select()
-space:drop()
-
-
-ch = fiber.channel(3)
-
-_ = box.schema.space.create('test'):create_index('pk')
-
-test_run:cmd("setopt delimiter ';'")
-function add_index()
-    box.space.test:create_index('sec', {parts = {2, 'num'}})
-    ch:put(true)
-end;
-
-function insert_tuple(tuple)
-    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
-end;
-test_run:cmd("setopt delimiter ''");
-
-_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
-{ch:get(), ch:get(), ch:get()}
-
-box.space.test:select()
-
-test_run:cmd('restart server default')
-
-box.space.test:select()
-box.space.test:drop()
-
--- gh-2336 crash if format called twice during snapshot
-fiber = require'fiber'
-
-space = box.schema.space.create('test_format')
-_ = space:create_index('pk', { parts = { 1,'str' }})
-space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
-str = string.rep("t",1024)
-for i = 1, 10000 do space:insert{tostring(i), str} end
-ch = fiber.channel(3)
-_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
-format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
-for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
-
-{ch:get(), ch:get(), ch:get()}
-
-space:drop()
-
--- collation
-function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
-
-box.internal.collation.create('test')
-box.internal.collation.create('test', 'ICU')
-box.internal.collation.create(42, 'ICU', 'ru_RU')
-box.internal.collation.create('test', 42, 'ru_RU')
-box.internal.collation.create('test', 'ICU', 42)
-box.internal.collation.create('test', 'nothing', 'ru_RU')
-box.internal.collation.create('test', 'ICU', 'ru_RU', setmap{}) --ok
-box.internal.collation.create('test', 'ICU', 'ru_RU')
-box.internal.collation.drop('test')
-box.internal.collation.drop('nothing') -- allowed
-box.internal.collation.create('test', 'ICU', 'ru_RU', 42)
-box.internal.collation.create('test', 'ICU', 'ru_RU', 'options')
-box.internal.collation.create('test', 'ICU', 'ru_RU', {ping='pong'})
-box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='german'})
-box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='on'}) --ok
-box.internal.collation.drop('test') --ok
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='supervillian'})
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=42})
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=2}) --ok
-box.internal.collation.drop('test') --ok
-box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='primary'}) --ok
-box.internal.collation.drop('test') --ok
-c = box.space._collation:get{1}:totable()
-c[2] = 'unicode_test'
-box.space._collation:replace(c)
-
-box.begin() box.internal.collation.create('test2', 'ICU', 'ru_RU') box.rollback()
-
-box.internal.collation.create('test', 'ICU', 'ru_RU')
-box.internal.collation.exists('test')
-
-test_run:cmd('restart server default')
-function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
-
-box.internal.collation.exists('test')
-box.internal.collation.drop('test')
-
-box.space._collation:auto_increment{'test'}
-box.space._collation:auto_increment{'test', 0, 'ICU'}
-box.space._collation:auto_increment{'test', 'ADMIN', 'ICU', 'ru_RU'}
-box.space._collation:auto_increment{42, 0, 'ICU', 'ru_RU'}
-box.space._collation:auto_increment{'test', 0, 42, 'ru_RU'}
-box.space._collation:auto_increment{'test', 0, 'ICU', 42}
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}} --ok
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
-box.space._collation.index.name:delete{'test'} -- ok
-box.space._collation.index.name:delete{'nothing'} -- allowed
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 42}
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 'options'}
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', {ping='pong'}}
-opts = {normalization_mode='NORMAL'}
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.normalization_mode = 'OFF'
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} -- ok
-_ = box.space._collation.index.name:delete{'test'} -- ok
-opts.numeric_collation = 'PERL'
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.numeric_collation = 'ON'
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
-_ = box.space._collation.index.name:delete{'test'} -- ok
-opts.alternate_handling1 = 'ON'
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.alternate_handling1 = nil
-opts.alternate_handling = 'ON'
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.alternate_handling = 'SHIFTED'
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
-_ = box.space._collation.index.name:delete{'test'} -- ok
-opts.case_first = 'ON'
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.case_first = 'OFF'
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
-_ = box.space._collation.index.name:delete{'test'} -- ok
-opts.case_level = 'UPPER'
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
-opts.case_level = 'DEFAULT'
-_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
-_ = box.space._collation.index.name:delete{'test'} -- ok
-
-box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
-box.space._collation:select{}
-test_run:cmd('restart server default')
-box.space._collation:select{}
-box.space._collation.index.name:delete{'test'}
-
---
--- gh-3290: expose ICU into Lua. It uses built-in collations, that
--- must work even if a collation is deleted from _collation.
---
-t = box.space._collation:delete{1}
-utf8.cmp('abc', 'def')
-box.space._collation:replace(t)
-
---
--- gh-2839: allow to store custom fields in field definition.
---
-format = {}
-format[1] = {name = 'field1', type = 'unsigned'}
-format[2] = {'field2', 'unsigned'}
-format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
-s = box.schema.create_space('test', {format = format})
-s:format()[3].custom_field
-s:drop()
-
---
--- gh-2937: allow to specify collation in field definition.
---
-format = {}
-format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
-format[2] = {'field2', 'any', collation = 'unicode_ci'}
-format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
-s = box.schema.create_space('test', {format = format})
-s:format()
-s:drop()
-
--- Check that collation is allowed only for stings, scalar and any types.
-format = {}
-format[1] = {'field1', 'unsigned', collation = 'unicode'}
-s = box.schema.create_space('test', {format = format})
-format[1] = {'field2', 'array', collation = 'unicode_ci'}
-s = box.schema.create_space('test', {format = format})
-
--- Check that error is raised when collation doesn't exists.
-format = {}
-format[1] = {'field1', 'unsigend', collation = 'test_coll'}
-s = box.schema.create_space('test', {format = format})
-
--- Check that error is raised when collation with wrong id is used.
-_space = box.space[box.schema.SPACE_ID]
-utils = require('utils')
-EMPTY_MAP = utils.setmap({})
-format = {{name = 'field1', type = 'string', collation = 666}}
-surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
-_space:insert(surrogate_space)
-
---
--- gh-2783
--- A ddl operation shoud fail before trying to lock a ddl latch
--- in a multi-statement transaction.
--- If operation tries to lock already an locked latch then the
--- current transaction will be silently rolled back under our feet.
--- This is confusing. So check for multi-statement transaction
--- before locking the latch.
---
-test_latch = box.schema.space.create('test_latch')
-_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
-fiber = require('fiber')
-c = fiber.channel(1)
-test_run:cmd("setopt delimiter ';'")
-_ = fiber.create(function()
-    test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
-    c:put(true)
-end);
-
--- Should be Ok for now
-box.begin()
-    test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
-box.commit();
-test_run:cmd("setopt delimiter ''");
--- Explicitly roll back the transaction in multi-statement,
--- which hasn't finished due to DDL error
-box.rollback()
-
-_ = c:get()
-test_latch:drop() -- this is where everything stops
diff --git a/test/box/ddl_alter.result b/test/box/ddl_alter.result
new file mode 100644
index 000000000..ec370e5a3
--- /dev/null
+++ b/test/box/ddl_alter.result
@@ -0,0 +1,37 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- index should not crash after alter
+space = box.schema.space.create('test_swap')
+ | ---
+ | ...
+index = space:create_index('pk')
+ | ---
+ | ...
+space:replace({1, 2, 3})
+ | ---
+ | - [1, 2, 3]
+ | ...
+index:rename('primary')
+ | ---
+ | ...
+index2 = space:create_index('sec')
+ | ---
+ | ...
+space:replace({2, 3, 1})
+ | ---
+ | - [2, 3, 1]
+ | ...
+space:select()
+ | ---
+ | - - [1, 2, 3]
+ |   - [2, 3, 1]
+ | ...
+space:drop()
+ | ---
+ | ...
diff --git a/test/box/ddl_alter.test.lua b/test/box/ddl_alter.test.lua
new file mode 100644
index 000000000..84c25abdb
--- /dev/null
+++ b/test/box/ddl_alter.test.lua
@@ -0,0 +1,12 @@
+env = require('test_run')
+test_run = env.new()
+
+-- index should not crash after alter
+space = box.schema.space.create('test_swap')
+index = space:create_index('pk')
+space:replace({1, 2, 3})
+index:rename('primary')
+index2 = space:create_index('sec')
+space:replace({2, 3, 1})
+space:select()
+space:drop()
diff --git a/test/box/ddl_collation.result b/test/box/ddl_collation.result
new file mode 100644
index 000000000..2571ad072
--- /dev/null
+++ b/test/box/ddl_collation.result
@@ -0,0 +1,853 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- collation
+function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
+ | ---
+ | ...
+
+box.internal.collation.create('test')
+ | ---
+ | - error: Illegal parameters, type (second arg) must be a string
+ | ...
+box.internal.collation.create('test', 'ICU')
+ | ---
+ | - error: Illegal parameters, locale (third arg) must be a string
+ | ...
+box.internal.collation.create(42, 'ICU', 'ru_RU')
+ | ---
+ | - error: Illegal parameters, name (first arg) must be a string
+ | ...
+box.internal.collation.create('test', 42, 'ru_RU')
+ | ---
+ | - error: Illegal parameters, type (second arg) must be a string
+ | ...
+box.internal.collation.create('test', 'ICU', 42)
+ | ---
+ | - error: Illegal parameters, locale (third arg) must be a string
+ | ...
+box.internal.collation.create('test', 'nothing', 'ru_RU')
+ | ---
+ | - error: 'Failed to initialize collation: unknown collation type.'
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', setmap{}) --ok
+ | ---
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU')
+ | ---
+ | - error: Duplicate key exists in unique index 'name' in space '_collation'
+ | ...
+box.internal.collation.drop('test')
+ | ---
+ | ...
+box.internal.collation.drop('nothing') -- allowed
+ | ---
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', 42)
+ | ---
+ | - error: Illegal parameters, options (fourth arg) must be a table or nil
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', 'options')
+ | ---
+ | - error: Illegal parameters, options (fourth arg) must be a table or nil
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {ping='pong'})
+ | ---
+ | - error: 'Wrong collation options (field 5): unexpected option ''ping'''
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='german'})
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong french_collation option setting,
+ |     expected ON | OFF.'
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='on'}) --ok
+ | ---
+ | ...
+box.internal.collation.drop('test') --ok
+ | ---
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='supervillian'})
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong strength option setting, expected
+ |     PRIMARY | SECONDARY | TERTIARY | QUATERNARY | IDENTICAL.'
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=42})
+ | ---
+ | - error: 'Wrong collation options (field 5): ''strength'' must be enum'
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=2}) --ok
+ | ---
+ | - error: 'Wrong collation options (field 5): ''strength'' must be enum'
+ | ...
+box.internal.collation.drop('test') --ok
+ | ---
+ | ...
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='primary'}) --ok
+ | ---
+ | ...
+box.internal.collation.drop('test') --ok
+ | ---
+ | ...
+c = box.space._collation:get{1}:totable()
+ | ---
+ | ...
+c[2] = 'unicode_test'
+ | ---
+ | ...
+box.space._collation:replace(c)
+ | ---
+ | - error: collation does not support alter
+ | ...
+
+box.begin() box.internal.collation.create('test2', 'ICU', 'ru_RU') box.rollback()
+ | ---
+ | ...
+
+box.internal.collation.create('test', 'ICU', 'ru_RU')
+ | ---
+ | ...
+box.internal.collation.exists('test')
+ | ---
+ | - true
+ | ...
+
+test_run:cmd('restart server default')
+ | 
+function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
+ | ---
+ | ...
+
+box.internal.collation.exists('test')
+ | ---
+ | - true
+ | ...
+box.internal.collation.drop('test')
+ | ---
+ | ...
+
+box.space._collation:auto_increment{'test'}
+ | ---
+ | - error: Tuple field 3 required by space format is missing
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU'}
+ | ---
+ | - error: Tuple field 5 required by space format is missing
+ | ...
+box.space._collation:auto_increment{'test', 'ADMIN', 'ICU', 'ru_RU'}
+ | ---
+ | - error: 'Tuple field 3 type does not match one required by operation: expected unsigned'
+ | ...
+box.space._collation:auto_increment{42, 0, 'ICU', 'ru_RU'}
+ | ---
+ | - error: 'Tuple field 2 type does not match one required by operation: expected string'
+ | ...
+box.space._collation:auto_increment{'test', 0, 42, 'ru_RU'}
+ | ---
+ | - error: 'Tuple field 4 type does not match one required by operation: expected string'
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 42}
+ | ---
+ | - error: 'Tuple field 5 type does not match one required by operation: expected string'
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}} --ok
+ | ---
+ | - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
+ | ---
+ | - error: Duplicate key exists in unique index 'name' in space '_collation'
+ | ...
+box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
+box.space._collation.index.name:delete{'nothing'} -- allowed
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 42}
+ | ---
+ | - error: 'Tuple field 6 type does not match one required by operation: expected map'
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 'options'}
+ | ---
+ | - error: 'Tuple field 6 type does not match one required by operation: expected map'
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', {ping='pong'}}
+ | ---
+ | - error: 'Wrong collation options (field 5): unexpected option ''ping'''
+ | ...
+opts = {normalization_mode='NORMAL'}
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong normalization_mode option setting,
+ |     expected ON | OFF.'
+ | ...
+opts.normalization_mode = 'OFF'
+ | ---
+ | ...
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} -- ok
+ | ---
+ | ...
+_ = box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | ...
+opts.numeric_collation = 'PERL'
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong numeric_collation option setting,
+ |     expected ON | OFF.'
+ | ...
+opts.numeric_collation = 'ON'
+ | ---
+ | ...
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+ | ---
+ | ...
+_ = box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | ...
+opts.alternate_handling1 = 'ON'
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Wrong collation options (field 5): unexpected option ''alternate_handling1'''
+ | ...
+opts.alternate_handling1 = nil
+ | ---
+ | ...
+opts.alternate_handling = 'ON'
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong alternate_handling option setting,
+ |     expected NON_IGNORABLE | SHIFTED.'
+ | ...
+opts.alternate_handling = 'SHIFTED'
+ | ---
+ | ...
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+ | ---
+ | ...
+_ = box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | ...
+opts.case_first = 'ON'
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong case_first option setting, expected
+ |     OFF | UPPER_FIRST | LOWER_FIRST.'
+ | ...
+opts.case_first = 'OFF'
+ | ---
+ | ...
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+ | ---
+ | ...
+_ = box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | ...
+opts.case_level = 'UPPER'
+ | ---
+ | ...
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong case_level option setting, expected
+ |     ON | OFF.'
+ | ...
+opts.case_level = 'DEFAULT'
+ | ---
+ | ...
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+ | ---
+ | - error: 'Failed to initialize collation: ICU wrong case_level option setting, expected
+ |     ON | OFF.'
+ | ...
+_ = box.space._collation.index.name:delete{'test'} -- ok
+ | ---
+ | ...
+
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
+ | ---
+ | - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
+box.space._collation:select{}
+ | ---
+ | - - [0, 'none', 1, 'BINARY', '', {}]
+ |   - [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
+ |   - [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]
+ |   - [3, 'binary', 1, 'BINARY', '', {}]
+ |   - [4, 'unicode_af_s1', 1, 'ICU', 'af', {'strength': 'primary'}]
+ |   - [5, 'unicode_af_s2', 1, 'ICU', 'af', {'strength': 'secondary'}]
+ |   - [6, 'unicode_af_s3', 1, 'ICU', 'af', {'strength': 'tertiary'}]
+ |   - [7, 'unicode_am_s1', 1, 'ICU', 'am', {'strength': 'primary'}]
+ |   - [8, 'unicode_am_s2', 1, 'ICU', 'am', {'strength': 'secondary'}]
+ |   - [9, 'unicode_am_s3', 1, 'ICU', 'am', {'strength': 'tertiary'}]
+ |   - [10, 'unicode_ar_s1', 1, 'ICU', 'ar', {'strength': 'primary'}]
+ |   - [11, 'unicode_ar_s2', 1, 'ICU', 'ar', {'strength': 'secondary'}]
+ |   - [12, 'unicode_ar_s3', 1, 'ICU', 'ar', {'strength': 'tertiary'}]
+ |   - [13, 'unicode_as_s1', 1, 'ICU', 'as', {'strength': 'primary'}]
+ |   - [14, 'unicode_as_s2', 1, 'ICU', 'as', {'strength': 'secondary'}]
+ |   - [15, 'unicode_as_s3', 1, 'ICU', 'as', {'strength': 'tertiary'}]
+ |   - [16, 'unicode_az_s1', 1, 'ICU', 'az', {'strength': 'primary'}]
+ |   - [17, 'unicode_az_s2', 1, 'ICU', 'az', {'strength': 'secondary'}]
+ |   - [18, 'unicode_az_s3', 1, 'ICU', 'az', {'strength': 'tertiary'}]
+ |   - [19, 'unicode_be_s1', 1, 'ICU', 'be', {'strength': 'primary'}]
+ |   - [20, 'unicode_be_s2', 1, 'ICU', 'be', {'strength': 'secondary'}]
+ |   - [21, 'unicode_be_s3', 1, 'ICU', 'be', {'strength': 'tertiary'}]
+ |   - [22, 'unicode_bn_s1', 1, 'ICU', 'bn', {'strength': 'primary'}]
+ |   - [23, 'unicode_bn_s2', 1, 'ICU', 'bn', {'strength': 'secondary'}]
+ |   - [24, 'unicode_bn_s3', 1, 'ICU', 'bn', {'strength': 'tertiary'}]
+ |   - [25, 'unicode_bs_s1', 1, 'ICU', 'bs', {'strength': 'primary'}]
+ |   - [26, 'unicode_bs_s2', 1, 'ICU', 'bs', {'strength': 'secondary'}]
+ |   - [27, 'unicode_bs_s3', 1, 'ICU', 'bs', {'strength': 'tertiary'}]
+ |   - [28, 'unicode_bs_Cyrl_s1', 1, 'ICU', 'bs_Cyrl', {'strength': 'primary'}]
+ |   - [29, 'unicode_bs_Cyrl_s2', 1, 'ICU', 'bs_Cyrl', {'strength': 'secondary'}]
+ |   - [30, 'unicode_bs_Cyrl_s3', 1, 'ICU', 'bs_Cyrl', {'strength': 'tertiary'}]
+ |   - [31, 'unicode_ca_s1', 1, 'ICU', 'ca', {'strength': 'primary'}]
+ |   - [32, 'unicode_ca_s2', 1, 'ICU', 'ca', {'strength': 'secondary'}]
+ |   - [33, 'unicode_ca_s3', 1, 'ICU', 'ca', {'strength': 'tertiary'}]
+ |   - [34, 'unicode_cs_s1', 1, 'ICU', 'cs', {'strength': 'primary'}]
+ |   - [35, 'unicode_cs_s2', 1, 'ICU', 'cs', {'strength': 'secondary'}]
+ |   - [36, 'unicode_cs_s3', 1, 'ICU', 'cs', {'strength': 'tertiary'}]
+ |   - [37, 'unicode_cy_s1', 1, 'ICU', 'cy', {'strength': 'primary'}]
+ |   - [38, 'unicode_cy_s2', 1, 'ICU', 'cy', {'strength': 'secondary'}]
+ |   - [39, 'unicode_cy_s3', 1, 'ICU', 'cy', {'strength': 'tertiary'}]
+ |   - [40, 'unicode_da_s1', 1, 'ICU', 'da', {'strength': 'primary'}]
+ |   - [41, 'unicode_da_s2', 1, 'ICU', 'da', {'strength': 'secondary'}]
+ |   - [42, 'unicode_da_s3', 1, 'ICU', 'da', {'strength': 'tertiary'}]
+ |   - [43, 'unicode_de__phonebook_s1', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'primary'}]
+ |   - [44, 'unicode_de__phonebook_s2', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [45, 'unicode_de__phonebook_s3', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [46, 'unicode_de_AT_phonebook_s1', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'primary'}]
+ |   - [47, 'unicode_de_AT_phonebook_s2', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [48, 'unicode_de_AT_phonebook_s3', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [49, 'unicode_dsb_s1', 1, 'ICU', 'dsb', {'strength': 'primary'}]
+ |   - [50, 'unicode_dsb_s2', 1, 'ICU', 'dsb', {'strength': 'secondary'}]
+ |   - [51, 'unicode_dsb_s3', 1, 'ICU', 'dsb', {'strength': 'tertiary'}]
+ |   - [52, 'unicode_ee_s1', 1, 'ICU', 'ee', {'strength': 'primary'}]
+ |   - [53, 'unicode_ee_s2', 1, 'ICU', 'ee', {'strength': 'secondary'}]
+ |   - [54, 'unicode_ee_s3', 1, 'ICU', 'ee', {'strength': 'tertiary'}]
+ |   - [55, 'unicode_eo_s1', 1, 'ICU', 'eo', {'strength': 'primary'}]
+ |   - [56, 'unicode_eo_s2', 1, 'ICU', 'eo', {'strength': 'secondary'}]
+ |   - [57, 'unicode_eo_s3', 1, 'ICU', 'eo', {'strength': 'tertiary'}]
+ |   - [58, 'unicode_es_s1', 1, 'ICU', 'es', {'strength': 'primary'}]
+ |   - [59, 'unicode_es_s2', 1, 'ICU', 'es', {'strength': 'secondary'}]
+ |   - [60, 'unicode_es_s3', 1, 'ICU', 'es', {'strength': 'tertiary'}]
+ |   - [61, 'unicode_es__traditional_s1', 1, 'ICU', 'es_u_co_trad', {'strength': 'primary'}]
+ |   - [62, 'unicode_es__traditional_s2', 1, 'ICU', 'es_u_co_trad', {'strength': 'secondary'}]
+ |   - [63, 'unicode_es__traditional_s3', 1, 'ICU', 'es_u_co_trad', {'strength': 'tertiary'}]
+ |   - [64, 'unicode_et_s1', 1, 'ICU', 'et', {'strength': 'primary'}]
+ |   - [65, 'unicode_et_s2', 1, 'ICU', 'et', {'strength': 'secondary'}]
+ |   - [66, 'unicode_et_s3', 1, 'ICU', 'et', {'strength': 'tertiary'}]
+ |   - [67, 'unicode_fa_s1', 1, 'ICU', 'fa', {'strength': 'primary'}]
+ |   - [68, 'unicode_fa_s2', 1, 'ICU', 'fa', {'strength': 'secondary'}]
+ |   - [69, 'unicode_fa_s3', 1, 'ICU', 'fa', {'strength': 'tertiary'}]
+ |   - [70, 'unicode_fi_s1', 1, 'ICU', 'fi', {'strength': 'primary'}]
+ |   - [71, 'unicode_fi_s2', 1, 'ICU', 'fi', {'strength': 'secondary'}]
+ |   - [72, 'unicode_fi_s3', 1, 'ICU', 'fi', {'strength': 'tertiary'}]
+ |   - [73, 'unicode_fi__phonebook_s1', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'primary'}]
+ |   - [74, 'unicode_fi__phonebook_s2', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [75, 'unicode_fi__phonebook_s3', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [76, 'unicode_fil_s1', 1, 'ICU', 'fil', {'strength': 'primary'}]
+ |   - [77, 'unicode_fil_s2', 1, 'ICU', 'fil', {'strength': 'secondary'}]
+ |   - [78, 'unicode_fil_s3', 1, 'ICU', 'fil', {'strength': 'tertiary'}]
+ |   - [79, 'unicode_fo_s1', 1, 'ICU', 'fo', {'strength': 'primary'}]
+ |   - [80, 'unicode_fo_s2', 1, 'ICU', 'fo', {'strength': 'secondary'}]
+ |   - [81, 'unicode_fo_s3', 1, 'ICU', 'fo', {'strength': 'tertiary'}]
+ |   - [82, 'unicode_fr_CA_s1', 1, 'ICU', 'fr_CA', {'strength': 'primary'}]
+ |   - [83, 'unicode_fr_CA_s2', 1, 'ICU', 'fr_CA', {'strength': 'secondary'}]
+ |   - [84, 'unicode_fr_CA_s3', 1, 'ICU', 'fr_CA', {'strength': 'tertiary'}]
+ |   - [85, 'unicode_gu_s1', 1, 'ICU', 'gu', {'strength': 'primary'}]
+ |   - [86, 'unicode_gu_s2', 1, 'ICU', 'gu', {'strength': 'secondary'}]
+ |   - [87, 'unicode_gu_s3', 1, 'ICU', 'gu', {'strength': 'tertiary'}]
+ |   - [88, 'unicode_ha_s1', 1, 'ICU', 'ha', {'strength': 'primary'}]
+ |   - [89, 'unicode_ha_s2', 1, 'ICU', 'ha', {'strength': 'secondary'}]
+ |   - [90, 'unicode_ha_s3', 1, 'ICU', 'ha', {'strength': 'tertiary'}]
+ |   - [91, 'unicode_haw_s1', 1, 'ICU', 'haw', {'strength': 'primary'}]
+ |   - [92, 'unicode_haw_s2', 1, 'ICU', 'haw', {'strength': 'secondary'}]
+ |   - [93, 'unicode_haw_s3', 1, 'ICU', 'haw', {'strength': 'tertiary'}]
+ |   - [94, 'unicode_he_s1', 1, 'ICU', 'he', {'strength': 'primary'}]
+ |   - [95, 'unicode_he_s2', 1, 'ICU', 'he', {'strength': 'secondary'}]
+ |   - [96, 'unicode_he_s3', 1, 'ICU', 'he', {'strength': 'tertiary'}]
+ |   - [97, 'unicode_hi_s1', 1, 'ICU', 'hi', {'strength': 'primary'}]
+ |   - [98, 'unicode_hi_s2', 1, 'ICU', 'hi', {'strength': 'secondary'}]
+ |   - [99, 'unicode_hi_s3', 1, 'ICU', 'hi', {'strength': 'tertiary'}]
+ |   - [100, 'unicode_hr_s1', 1, 'ICU', 'hr', {'strength': 'primary'}]
+ |   - [101, 'unicode_hr_s2', 1, 'ICU', 'hr', {'strength': 'secondary'}]
+ |   - [102, 'unicode_hr_s3', 1, 'ICU', 'hr', {'strength': 'tertiary'}]
+ |   - [103, 'unicode_hu_s1', 1, 'ICU', 'hu', {'strength': 'primary'}]
+ |   - [104, 'unicode_hu_s2', 1, 'ICU', 'hu', {'strength': 'secondary'}]
+ |   - [105, 'unicode_hu_s3', 1, 'ICU', 'hu', {'strength': 'tertiary'}]
+ |   - [106, 'unicode_hy_s1', 1, 'ICU', 'hy', {'strength': 'primary'}]
+ |   - [107, 'unicode_hy_s2', 1, 'ICU', 'hy', {'strength': 'secondary'}]
+ |   - [108, 'unicode_hy_s3', 1, 'ICU', 'hy', {'strength': 'tertiary'}]
+ |   - [109, 'unicode_ig_s1', 1, 'ICU', 'ig', {'strength': 'primary'}]
+ |   - [110, 'unicode_ig_s2', 1, 'ICU', 'ig', {'strength': 'secondary'}]
+ |   - [111, 'unicode_ig_s3', 1, 'ICU', 'ig', {'strength': 'tertiary'}]
+ |   - [112, 'unicode_is_s1', 1, 'ICU', 'is', {'strength': 'primary'}]
+ |   - [113, 'unicode_is_s2', 1, 'ICU', 'is', {'strength': 'secondary'}]
+ |   - [114, 'unicode_is_s3', 1, 'ICU', 'is', {'strength': 'tertiary'}]
+ |   - [115, 'unicode_ja_s1', 1, 'ICU', 'ja', {'strength': 'primary'}]
+ |   - [116, 'unicode_ja_s2', 1, 'ICU', 'ja', {'strength': 'secondary'}]
+ |   - [117, 'unicode_ja_s3', 1, 'ICU', 'ja', {'strength': 'tertiary'}]
+ |   - [118, 'unicode_kk_s1', 1, 'ICU', 'kk', {'strength': 'primary'}]
+ |   - [119, 'unicode_kk_s2', 1, 'ICU', 'kk', {'strength': 'secondary'}]
+ |   - [120, 'unicode_kk_s3', 1, 'ICU', 'kk', {'strength': 'tertiary'}]
+ |   - [121, 'unicode_kl_s1', 1, 'ICU', 'kl', {'strength': 'primary'}]
+ |   - [122, 'unicode_kl_s2', 1, 'ICU', 'kl', {'strength': 'secondary'}]
+ |   - [123, 'unicode_kl_s3', 1, 'ICU', 'kl', {'strength': 'tertiary'}]
+ |   - [124, 'unicode_kn_s1', 1, 'ICU', 'kn', {'strength': 'primary'}]
+ |   - [125, 'unicode_kn_s2', 1, 'ICU', 'kn', {'strength': 'secondary'}]
+ |   - [126, 'unicode_kn_s3', 1, 'ICU', 'kn', {'strength': 'tertiary'}]
+ |   - [127, 'unicode_ko_s1', 1, 'ICU', 'ko', {'strength': 'primary'}]
+ |   - [128, 'unicode_ko_s2', 1, 'ICU', 'ko', {'strength': 'secondary'}]
+ |   - [129, 'unicode_ko_s3', 1, 'ICU', 'ko', {'strength': 'tertiary'}]
+ |   - [130, 'unicode_kok_s1', 1, 'ICU', 'kok', {'strength': 'primary'}]
+ |   - [131, 'unicode_kok_s2', 1, 'ICU', 'kok', {'strength': 'secondary'}]
+ |   - [132, 'unicode_kok_s3', 1, 'ICU', 'kok', {'strength': 'tertiary'}]
+ |   - [133, 'unicode_ky_s1', 1, 'ICU', 'ky', {'strength': 'primary'}]
+ |   - [134, 'unicode_ky_s2', 1, 'ICU', 'ky', {'strength': 'secondary'}]
+ |   - [135, 'unicode_ky_s3', 1, 'ICU', 'ky', {'strength': 'tertiary'}]
+ |   - [136, 'unicode_lkt_s1', 1, 'ICU', 'lkt', {'strength': 'primary'}]
+ |   - [137, 'unicode_lkt_s2', 1, 'ICU', 'lkt', {'strength': 'secondary'}]
+ |   - [138, 'unicode_lkt_s3', 1, 'ICU', 'lkt', {'strength': 'tertiary'}]
+ |   - [139, 'unicode_ln_s1', 1, 'ICU', 'ln', {'strength': 'primary'}]
+ |   - [140, 'unicode_ln_s2', 1, 'ICU', 'ln', {'strength': 'secondary'}]
+ |   - [141, 'unicode_ln_s3', 1, 'ICU', 'ln', {'strength': 'tertiary'}]
+ |   - [142, 'unicode_lt_s1', 1, 'ICU', 'lt', {'strength': 'primary'}]
+ |   - [143, 'unicode_lt_s2', 1, 'ICU', 'lt', {'strength': 'secondary'}]
+ |   - [144, 'unicode_lt_s3', 1, 'ICU', 'lt', {'strength': 'tertiary'}]
+ |   - [145, 'unicode_lv_s1', 1, 'ICU', 'lv', {'strength': 'primary'}]
+ |   - [146, 'unicode_lv_s2', 1, 'ICU', 'lv', {'strength': 'secondary'}]
+ |   - [147, 'unicode_lv_s3', 1, 'ICU', 'lv', {'strength': 'tertiary'}]
+ |   - [148, 'unicode_mk_s1', 1, 'ICU', 'mk', {'strength': 'primary'}]
+ |   - [149, 'unicode_mk_s2', 1, 'ICU', 'mk', {'strength': 'secondary'}]
+ |   - [150, 'unicode_mk_s3', 1, 'ICU', 'mk', {'strength': 'tertiary'}]
+ |   - [151, 'unicode_ml_s1', 1, 'ICU', 'ml', {'strength': 'primary'}]
+ |   - [152, 'unicode_ml_s2', 1, 'ICU', 'ml', {'strength': 'secondary'}]
+ |   - [153, 'unicode_ml_s3', 1, 'ICU', 'ml', {'strength': 'tertiary'}]
+ |   - [154, 'unicode_mr_s1', 1, 'ICU', 'mr', {'strength': 'primary'}]
+ |   - [155, 'unicode_mr_s2', 1, 'ICU', 'mr', {'strength': 'secondary'}]
+ |   - [156, 'unicode_mr_s3', 1, 'ICU', 'mr', {'strength': 'tertiary'}]
+ |   - [157, 'unicode_mt_s1', 1, 'ICU', 'mt', {'strength': 'primary'}]
+ |   - [158, 'unicode_mt_s2', 1, 'ICU', 'mt', {'strength': 'secondary'}]
+ |   - [159, 'unicode_mt_s3', 1, 'ICU', 'mt', {'strength': 'tertiary'}]
+ |   - [160, 'unicode_nb_s1', 1, 'ICU', 'nb', {'strength': 'primary'}]
+ |   - [161, 'unicode_nb_s2', 1, 'ICU', 'nb', {'strength': 'secondary'}]
+ |   - [162, 'unicode_nb_s3', 1, 'ICU', 'nb', {'strength': 'tertiary'}]
+ |   - [163, 'unicode_nn_s1', 1, 'ICU', 'nn', {'strength': 'primary'}]
+ |   - [164, 'unicode_nn_s2', 1, 'ICU', 'nn', {'strength': 'secondary'}]
+ |   - [165, 'unicode_nn_s3', 1, 'ICU', 'nn', {'strength': 'tertiary'}]
+ |   - [166, 'unicode_nso_s1', 1, 'ICU', 'nso', {'strength': 'primary'}]
+ |   - [167, 'unicode_nso_s2', 1, 'ICU', 'nso', {'strength': 'secondary'}]
+ |   - [168, 'unicode_nso_s3', 1, 'ICU', 'nso', {'strength': 'tertiary'}]
+ |   - [169, 'unicode_om_s1', 1, 'ICU', 'om', {'strength': 'primary'}]
+ |   - [170, 'unicode_om_s2', 1, 'ICU', 'om', {'strength': 'secondary'}]
+ |   - [171, 'unicode_om_s3', 1, 'ICU', 'om', {'strength': 'tertiary'}]
+ |   - [172, 'unicode_or_s1', 1, 'ICU', 'or', {'strength': 'primary'}]
+ |   - [173, 'unicode_or_s2', 1, 'ICU', 'or', {'strength': 'secondary'}]
+ |   - [174, 'unicode_or_s3', 1, 'ICU', 'or', {'strength': 'tertiary'}]
+ |   - [175, 'unicode_pa_s1', 1, 'ICU', 'pa', {'strength': 'primary'}]
+ |   - [176, 'unicode_pa_s2', 1, 'ICU', 'pa', {'strength': 'secondary'}]
+ |   - [177, 'unicode_pa_s3', 1, 'ICU', 'pa', {'strength': 'tertiary'}]
+ |   - [178, 'unicode_pl_s1', 1, 'ICU', 'pl', {'strength': 'primary'}]
+ |   - [179, 'unicode_pl_s2', 1, 'ICU', 'pl', {'strength': 'secondary'}]
+ |   - [180, 'unicode_pl_s3', 1, 'ICU', 'pl', {'strength': 'tertiary'}]
+ |   - [181, 'unicode_ro_s1', 1, 'ICU', 'ro', {'strength': 'primary'}]
+ |   - [182, 'unicode_ro_s2', 1, 'ICU', 'ro', {'strength': 'secondary'}]
+ |   - [183, 'unicode_ro_s3', 1, 'ICU', 'ro', {'strength': 'tertiary'}]
+ |   - [184, 'unicode_sa_s1', 1, 'ICU', 'sa', {'strength': 'primary'}]
+ |   - [185, 'unicode_sa_s2', 1, 'ICU', 'sa', {'strength': 'secondary'}]
+ |   - [186, 'unicode_sa_s3', 1, 'ICU', 'sa', {'strength': 'tertiary'}]
+ |   - [187, 'unicode_se_s1', 1, 'ICU', 'se', {'strength': 'primary'}]
+ |   - [188, 'unicode_se_s2', 1, 'ICU', 'se', {'strength': 'secondary'}]
+ |   - [189, 'unicode_se_s3', 1, 'ICU', 'se', {'strength': 'tertiary'}]
+ |   - [190, 'unicode_si_s1', 1, 'ICU', 'si', {'strength': 'primary'}]
+ |   - [191, 'unicode_si_s2', 1, 'ICU', 'si', {'strength': 'secondary'}]
+ |   - [192, 'unicode_si_s3', 1, 'ICU', 'si', {'strength': 'tertiary'}]
+ |   - [193, 'unicode_si__dictionary_s1', 1, 'ICU', 'si_u_co_dict', {'strength': 'primary'}]
+ |   - [194, 'unicode_si__dictionary_s2', 1, 'ICU', 'si_u_co_dict', {'strength': 'secondary'}]
+ |   - [195, 'unicode_si__dictionary_s3', 1, 'ICU', 'si_u_co_dict', {'strength': 'tertiary'}]
+ |   - [196, 'unicode_sk_s1', 1, 'ICU', 'sk', {'strength': 'primary'}]
+ |   - [197, 'unicode_sk_s2', 1, 'ICU', 'sk', {'strength': 'secondary'}]
+ |   - [198, 'unicode_sk_s3', 1, 'ICU', 'sk', {'strength': 'tertiary'}]
+ |   - [199, 'unicode_sl_s1', 1, 'ICU', 'sl', {'strength': 'primary'}]
+ |   - [200, 'unicode_sl_s2', 1, 'ICU', 'sl', {'strength': 'secondary'}]
+ |   - [201, 'unicode_sl_s3', 1, 'ICU', 'sl', {'strength': 'tertiary'}]
+ |   - [202, 'unicode_sq_s1', 1, 'ICU', 'sq', {'strength': 'primary'}]
+ |   - [203, 'unicode_sq_s2', 1, 'ICU', 'sq', {'strength': 'secondary'}]
+ |   - [204, 'unicode_sq_s3', 1, 'ICU', 'sq', {'strength': 'tertiary'}]
+ |   - [205, 'unicode_sr_s1', 1, 'ICU', 'sr', {'strength': 'primary'}]
+ |   - [206, 'unicode_sr_s2', 1, 'ICU', 'sr', {'strength': 'secondary'}]
+ |   - [207, 'unicode_sr_s3', 1, 'ICU', 'sr', {'strength': 'tertiary'}]
+ |   - [208, 'unicode_sr_Latn_s1', 1, 'ICU', 'sr_Latn', {'strength': 'primary'}]
+ |   - [209, 'unicode_sr_Latn_s2', 1, 'ICU', 'sr_Latn', {'strength': 'secondary'}]
+ |   - [210, 'unicode_sr_Latn_s3', 1, 'ICU', 'sr_Latn', {'strength': 'tertiary'}]
+ |   - [211, 'unicode_sv_s1', 1, 'ICU', 'sv', {'strength': 'primary'}]
+ |   - [212, 'unicode_sv_s2', 1, 'ICU', 'sv', {'strength': 'secondary'}]
+ |   - [213, 'unicode_sv_s3', 1, 'ICU', 'sv', {'strength': 'tertiary'}]
+ |   - [214, 'unicode_sv__reformed_s1', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'primary'}]
+ |   - [215, 'unicode_sv__reformed_s2', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'secondary'}]
+ |   - [216, 'unicode_sv__reformed_s3', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'tertiary'}]
+ |   - [217, 'unicode_ta_s1', 1, 'ICU', 'ta', {'strength': 'primary'}]
+ |   - [218, 'unicode_ta_s2', 1, 'ICU', 'ta', {'strength': 'secondary'}]
+ |   - [219, 'unicode_ta_s3', 1, 'ICU', 'ta', {'strength': 'tertiary'}]
+ |   - [220, 'unicode_te_s1', 1, 'ICU', 'te', {'strength': 'primary'}]
+ |   - [221, 'unicode_te_s2', 1, 'ICU', 'te', {'strength': 'secondary'}]
+ |   - [222, 'unicode_te_s3', 1, 'ICU', 'te', {'strength': 'tertiary'}]
+ |   - [223, 'unicode_th_s1', 1, 'ICU', 'th', {'strength': 'primary'}]
+ |   - [224, 'unicode_th_s2', 1, 'ICU', 'th', {'strength': 'secondary'}]
+ |   - [225, 'unicode_th_s3', 1, 'ICU', 'th', {'strength': 'tertiary'}]
+ |   - [226, 'unicode_tn_s1', 1, 'ICU', 'tn', {'strength': 'primary'}]
+ |   - [227, 'unicode_tn_s2', 1, 'ICU', 'tn', {'strength': 'secondary'}]
+ |   - [228, 'unicode_tn_s3', 1, 'ICU', 'tn', {'strength': 'tertiary'}]
+ |   - [229, 'unicode_to_s1', 1, 'ICU', 'to', {'strength': 'primary'}]
+ |   - [230, 'unicode_to_s2', 1, 'ICU', 'to', {'strength': 'secondary'}]
+ |   - [231, 'unicode_to_s3', 1, 'ICU', 'to', {'strength': 'tertiary'}]
+ |   - [232, 'unicode_tr_s1', 1, 'ICU', 'tr', {'strength': 'primary'}]
+ |   - [233, 'unicode_tr_s2', 1, 'ICU', 'tr', {'strength': 'secondary'}]
+ |   - [234, 'unicode_tr_s3', 1, 'ICU', 'tr', {'strength': 'tertiary'}]
+ |   - [235, 'unicode_ug_Cyrl_s1', 1, 'ICU', 'ug', {'strength': 'primary'}]
+ |   - [236, 'unicode_ug_Cyrl_s2', 1, 'ICU', 'ug', {'strength': 'secondary'}]
+ |   - [237, 'unicode_ug_Cyrl_s3', 1, 'ICU', 'ug', {'strength': 'tertiary'}]
+ |   - [238, 'unicode_uk_s1', 1, 'ICU', 'uk', {'strength': 'primary'}]
+ |   - [239, 'unicode_uk_s2', 1, 'ICU', 'uk', {'strength': 'secondary'}]
+ |   - [240, 'unicode_uk_s3', 1, 'ICU', 'uk', {'strength': 'tertiary'}]
+ |   - [241, 'unicode_ur_s1', 1, 'ICU', 'ur', {'strength': 'primary'}]
+ |   - [242, 'unicode_ur_s2', 1, 'ICU', 'ur', {'strength': 'secondary'}]
+ |   - [243, 'unicode_ur_s3', 1, 'ICU', 'ur', {'strength': 'tertiary'}]
+ |   - [244, 'unicode_vi_s1', 1, 'ICU', 'vi', {'strength': 'primary'}]
+ |   - [245, 'unicode_vi_s2', 1, 'ICU', 'vi', {'strength': 'secondary'}]
+ |   - [246, 'unicode_vi_s3', 1, 'ICU', 'vi', {'strength': 'tertiary'}]
+ |   - [247, 'unicode_vo_s1', 1, 'ICU', 'vo', {'strength': 'primary'}]
+ |   - [248, 'unicode_vo_s2', 1, 'ICU', 'vo', {'strength': 'secondary'}]
+ |   - [249, 'unicode_vo_s3', 1, 'ICU', 'vo', {'strength': 'tertiary'}]
+ |   - [250, 'unicode_wae_s1', 1, 'ICU', 'wae', {'strength': 'primary'}]
+ |   - [251, 'unicode_wae_s2', 1, 'ICU', 'wae', {'strength': 'secondary'}]
+ |   - [252, 'unicode_wae_s3', 1, 'ICU', 'wae', {'strength': 'tertiary'}]
+ |   - [253, 'unicode_wo_s1', 1, 'ICU', 'wo', {'strength': 'primary'}]
+ |   - [254, 'unicode_wo_s2', 1, 'ICU', 'wo', {'strength': 'secondary'}]
+ |   - [255, 'unicode_wo_s3', 1, 'ICU', 'wo', {'strength': 'tertiary'}]
+ |   - [256, 'unicode_yo_s1', 1, 'ICU', 'yo', {'strength': 'primary'}]
+ |   - [257, 'unicode_yo_s2', 1, 'ICU', 'yo', {'strength': 'secondary'}]
+ |   - [258, 'unicode_yo_s3', 1, 'ICU', 'yo', {'strength': 'tertiary'}]
+ |   - [259, 'unicode_zh_s1', 1, 'ICU', 'zh', {'strength': 'primary'}]
+ |   - [260, 'unicode_zh_s2', 1, 'ICU', 'zh', {'strength': 'secondary'}]
+ |   - [261, 'unicode_zh_s3', 1, 'ICU', 'zh', {'strength': 'tertiary'}]
+ |   - [262, 'unicode_zh__big5han_s1', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'primary'}]
+ |   - [263, 'unicode_zh__big5han_s2', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'secondary'}]
+ |   - [264, 'unicode_zh__big5han_s3', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'tertiary'}]
+ |   - [265, 'unicode_zh__gb2312han_s1', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'primary'}]
+ |   - [266, 'unicode_zh__gb2312han_s2', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'secondary'}]
+ |   - [267, 'unicode_zh__gb2312han_s3', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'tertiary'}]
+ |   - [268, 'unicode_zh__pinyin_s1', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'primary'}]
+ |   - [269, 'unicode_zh__pinyin_s2', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'secondary'}]
+ |   - [270, 'unicode_zh__pinyin_s3', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'tertiary'}]
+ |   - [271, 'unicode_zh__stroke_s1', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'primary'}]
+ |   - [272, 'unicode_zh__stroke_s2', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'secondary'}]
+ |   - [273, 'unicode_zh__stroke_s3', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'tertiary'}]
+ |   - [274, 'unicode_zh__zhuyin_s1', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'primary'}]
+ |   - [275, 'unicode_zh__zhuyin_s2', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'secondary'}]
+ |   - [276, 'unicode_zh__zhuyin_s3', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'tertiary'}]
+ |   - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
+test_run:cmd('restart server default')
+ | 
+box.space._collation:select{}
+ | ---
+ | - - [0, 'none', 1, 'BINARY', '', {}]
+ |   - [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
+ |   - [2, 'unicode_ci', 1, 'ICU', '', {'strength': 'primary'}]
+ |   - [3, 'binary', 1, 'BINARY', '', {}]
+ |   - [4, 'unicode_af_s1', 1, 'ICU', 'af', {'strength': 'primary'}]
+ |   - [5, 'unicode_af_s2', 1, 'ICU', 'af', {'strength': 'secondary'}]
+ |   - [6, 'unicode_af_s3', 1, 'ICU', 'af', {'strength': 'tertiary'}]
+ |   - [7, 'unicode_am_s1', 1, 'ICU', 'am', {'strength': 'primary'}]
+ |   - [8, 'unicode_am_s2', 1, 'ICU', 'am', {'strength': 'secondary'}]
+ |   - [9, 'unicode_am_s3', 1, 'ICU', 'am', {'strength': 'tertiary'}]
+ |   - [10, 'unicode_ar_s1', 1, 'ICU', 'ar', {'strength': 'primary'}]
+ |   - [11, 'unicode_ar_s2', 1, 'ICU', 'ar', {'strength': 'secondary'}]
+ |   - [12, 'unicode_ar_s3', 1, 'ICU', 'ar', {'strength': 'tertiary'}]
+ |   - [13, 'unicode_as_s1', 1, 'ICU', 'as', {'strength': 'primary'}]
+ |   - [14, 'unicode_as_s2', 1, 'ICU', 'as', {'strength': 'secondary'}]
+ |   - [15, 'unicode_as_s3', 1, 'ICU', 'as', {'strength': 'tertiary'}]
+ |   - [16, 'unicode_az_s1', 1, 'ICU', 'az', {'strength': 'primary'}]
+ |   - [17, 'unicode_az_s2', 1, 'ICU', 'az', {'strength': 'secondary'}]
+ |   - [18, 'unicode_az_s3', 1, 'ICU', 'az', {'strength': 'tertiary'}]
+ |   - [19, 'unicode_be_s1', 1, 'ICU', 'be', {'strength': 'primary'}]
+ |   - [20, 'unicode_be_s2', 1, 'ICU', 'be', {'strength': 'secondary'}]
+ |   - [21, 'unicode_be_s3', 1, 'ICU', 'be', {'strength': 'tertiary'}]
+ |   - [22, 'unicode_bn_s1', 1, 'ICU', 'bn', {'strength': 'primary'}]
+ |   - [23, 'unicode_bn_s2', 1, 'ICU', 'bn', {'strength': 'secondary'}]
+ |   - [24, 'unicode_bn_s3', 1, 'ICU', 'bn', {'strength': 'tertiary'}]
+ |   - [25, 'unicode_bs_s1', 1, 'ICU', 'bs', {'strength': 'primary'}]
+ |   - [26, 'unicode_bs_s2', 1, 'ICU', 'bs', {'strength': 'secondary'}]
+ |   - [27, 'unicode_bs_s3', 1, 'ICU', 'bs', {'strength': 'tertiary'}]
+ |   - [28, 'unicode_bs_Cyrl_s1', 1, 'ICU', 'bs_Cyrl', {'strength': 'primary'}]
+ |   - [29, 'unicode_bs_Cyrl_s2', 1, 'ICU', 'bs_Cyrl', {'strength': 'secondary'}]
+ |   - [30, 'unicode_bs_Cyrl_s3', 1, 'ICU', 'bs_Cyrl', {'strength': 'tertiary'}]
+ |   - [31, 'unicode_ca_s1', 1, 'ICU', 'ca', {'strength': 'primary'}]
+ |   - [32, 'unicode_ca_s2', 1, 'ICU', 'ca', {'strength': 'secondary'}]
+ |   - [33, 'unicode_ca_s3', 1, 'ICU', 'ca', {'strength': 'tertiary'}]
+ |   - [34, 'unicode_cs_s1', 1, 'ICU', 'cs', {'strength': 'primary'}]
+ |   - [35, 'unicode_cs_s2', 1, 'ICU', 'cs', {'strength': 'secondary'}]
+ |   - [36, 'unicode_cs_s3', 1, 'ICU', 'cs', {'strength': 'tertiary'}]
+ |   - [37, 'unicode_cy_s1', 1, 'ICU', 'cy', {'strength': 'primary'}]
+ |   - [38, 'unicode_cy_s2', 1, 'ICU', 'cy', {'strength': 'secondary'}]
+ |   - [39, 'unicode_cy_s3', 1, 'ICU', 'cy', {'strength': 'tertiary'}]
+ |   - [40, 'unicode_da_s1', 1, 'ICU', 'da', {'strength': 'primary'}]
+ |   - [41, 'unicode_da_s2', 1, 'ICU', 'da', {'strength': 'secondary'}]
+ |   - [42, 'unicode_da_s3', 1, 'ICU', 'da', {'strength': 'tertiary'}]
+ |   - [43, 'unicode_de__phonebook_s1', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'primary'}]
+ |   - [44, 'unicode_de__phonebook_s2', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [45, 'unicode_de__phonebook_s3', 1, 'ICU', 'de_DE_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [46, 'unicode_de_AT_phonebook_s1', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'primary'}]
+ |   - [47, 'unicode_de_AT_phonebook_s2', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [48, 'unicode_de_AT_phonebook_s3', 1, 'ICU', 'de_AT_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [49, 'unicode_dsb_s1', 1, 'ICU', 'dsb', {'strength': 'primary'}]
+ |   - [50, 'unicode_dsb_s2', 1, 'ICU', 'dsb', {'strength': 'secondary'}]
+ |   - [51, 'unicode_dsb_s3', 1, 'ICU', 'dsb', {'strength': 'tertiary'}]
+ |   - [52, 'unicode_ee_s1', 1, 'ICU', 'ee', {'strength': 'primary'}]
+ |   - [53, 'unicode_ee_s2', 1, 'ICU', 'ee', {'strength': 'secondary'}]
+ |   - [54, 'unicode_ee_s3', 1, 'ICU', 'ee', {'strength': 'tertiary'}]
+ |   - [55, 'unicode_eo_s1', 1, 'ICU', 'eo', {'strength': 'primary'}]
+ |   - [56, 'unicode_eo_s2', 1, 'ICU', 'eo', {'strength': 'secondary'}]
+ |   - [57, 'unicode_eo_s3', 1, 'ICU', 'eo', {'strength': 'tertiary'}]
+ |   - [58, 'unicode_es_s1', 1, 'ICU', 'es', {'strength': 'primary'}]
+ |   - [59, 'unicode_es_s2', 1, 'ICU', 'es', {'strength': 'secondary'}]
+ |   - [60, 'unicode_es_s3', 1, 'ICU', 'es', {'strength': 'tertiary'}]
+ |   - [61, 'unicode_es__traditional_s1', 1, 'ICU', 'es_u_co_trad', {'strength': 'primary'}]
+ |   - [62, 'unicode_es__traditional_s2', 1, 'ICU', 'es_u_co_trad', {'strength': 'secondary'}]
+ |   - [63, 'unicode_es__traditional_s3', 1, 'ICU', 'es_u_co_trad', {'strength': 'tertiary'}]
+ |   - [64, 'unicode_et_s1', 1, 'ICU', 'et', {'strength': 'primary'}]
+ |   - [65, 'unicode_et_s2', 1, 'ICU', 'et', {'strength': 'secondary'}]
+ |   - [66, 'unicode_et_s3', 1, 'ICU', 'et', {'strength': 'tertiary'}]
+ |   - [67, 'unicode_fa_s1', 1, 'ICU', 'fa', {'strength': 'primary'}]
+ |   - [68, 'unicode_fa_s2', 1, 'ICU', 'fa', {'strength': 'secondary'}]
+ |   - [69, 'unicode_fa_s3', 1, 'ICU', 'fa', {'strength': 'tertiary'}]
+ |   - [70, 'unicode_fi_s1', 1, 'ICU', 'fi', {'strength': 'primary'}]
+ |   - [71, 'unicode_fi_s2', 1, 'ICU', 'fi', {'strength': 'secondary'}]
+ |   - [72, 'unicode_fi_s3', 1, 'ICU', 'fi', {'strength': 'tertiary'}]
+ |   - [73, 'unicode_fi__phonebook_s1', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'primary'}]
+ |   - [74, 'unicode_fi__phonebook_s2', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'secondary'}]
+ |   - [75, 'unicode_fi__phonebook_s3', 1, 'ICU', 'fi_u_co_phonebk', {'strength': 'tertiary'}]
+ |   - [76, 'unicode_fil_s1', 1, 'ICU', 'fil', {'strength': 'primary'}]
+ |   - [77, 'unicode_fil_s2', 1, 'ICU', 'fil', {'strength': 'secondary'}]
+ |   - [78, 'unicode_fil_s3', 1, 'ICU', 'fil', {'strength': 'tertiary'}]
+ |   - [79, 'unicode_fo_s1', 1, 'ICU', 'fo', {'strength': 'primary'}]
+ |   - [80, 'unicode_fo_s2', 1, 'ICU', 'fo', {'strength': 'secondary'}]
+ |   - [81, 'unicode_fo_s3', 1, 'ICU', 'fo', {'strength': 'tertiary'}]
+ |   - [82, 'unicode_fr_CA_s1', 1, 'ICU', 'fr_CA', {'strength': 'primary'}]
+ |   - [83, 'unicode_fr_CA_s2', 1, 'ICU', 'fr_CA', {'strength': 'secondary'}]
+ |   - [84, 'unicode_fr_CA_s3', 1, 'ICU', 'fr_CA', {'strength': 'tertiary'}]
+ |   - [85, 'unicode_gu_s1', 1, 'ICU', 'gu', {'strength': 'primary'}]
+ |   - [86, 'unicode_gu_s2', 1, 'ICU', 'gu', {'strength': 'secondary'}]
+ |   - [87, 'unicode_gu_s3', 1, 'ICU', 'gu', {'strength': 'tertiary'}]
+ |   - [88, 'unicode_ha_s1', 1, 'ICU', 'ha', {'strength': 'primary'}]
+ |   - [89, 'unicode_ha_s2', 1, 'ICU', 'ha', {'strength': 'secondary'}]
+ |   - [90, 'unicode_ha_s3', 1, 'ICU', 'ha', {'strength': 'tertiary'}]
+ |   - [91, 'unicode_haw_s1', 1, 'ICU', 'haw', {'strength': 'primary'}]
+ |   - [92, 'unicode_haw_s2', 1, 'ICU', 'haw', {'strength': 'secondary'}]
+ |   - [93, 'unicode_haw_s3', 1, 'ICU', 'haw', {'strength': 'tertiary'}]
+ |   - [94, 'unicode_he_s1', 1, 'ICU', 'he', {'strength': 'primary'}]
+ |   - [95, 'unicode_he_s2', 1, 'ICU', 'he', {'strength': 'secondary'}]
+ |   - [96, 'unicode_he_s3', 1, 'ICU', 'he', {'strength': 'tertiary'}]
+ |   - [97, 'unicode_hi_s1', 1, 'ICU', 'hi', {'strength': 'primary'}]
+ |   - [98, 'unicode_hi_s2', 1, 'ICU', 'hi', {'strength': 'secondary'}]
+ |   - [99, 'unicode_hi_s3', 1, 'ICU', 'hi', {'strength': 'tertiary'}]
+ |   - [100, 'unicode_hr_s1', 1, 'ICU', 'hr', {'strength': 'primary'}]
+ |   - [101, 'unicode_hr_s2', 1, 'ICU', 'hr', {'strength': 'secondary'}]
+ |   - [102, 'unicode_hr_s3', 1, 'ICU', 'hr', {'strength': 'tertiary'}]
+ |   - [103, 'unicode_hu_s1', 1, 'ICU', 'hu', {'strength': 'primary'}]
+ |   - [104, 'unicode_hu_s2', 1, 'ICU', 'hu', {'strength': 'secondary'}]
+ |   - [105, 'unicode_hu_s3', 1, 'ICU', 'hu', {'strength': 'tertiary'}]
+ |   - [106, 'unicode_hy_s1', 1, 'ICU', 'hy', {'strength': 'primary'}]
+ |   - [107, 'unicode_hy_s2', 1, 'ICU', 'hy', {'strength': 'secondary'}]
+ |   - [108, 'unicode_hy_s3', 1, 'ICU', 'hy', {'strength': 'tertiary'}]
+ |   - [109, 'unicode_ig_s1', 1, 'ICU', 'ig', {'strength': 'primary'}]
+ |   - [110, 'unicode_ig_s2', 1, 'ICU', 'ig', {'strength': 'secondary'}]
+ |   - [111, 'unicode_ig_s3', 1, 'ICU', 'ig', {'strength': 'tertiary'}]
+ |   - [112, 'unicode_is_s1', 1, 'ICU', 'is', {'strength': 'primary'}]
+ |   - [113, 'unicode_is_s2', 1, 'ICU', 'is', {'strength': 'secondary'}]
+ |   - [114, 'unicode_is_s3', 1, 'ICU', 'is', {'strength': 'tertiary'}]
+ |   - [115, 'unicode_ja_s1', 1, 'ICU', 'ja', {'strength': 'primary'}]
+ |   - [116, 'unicode_ja_s2', 1, 'ICU', 'ja', {'strength': 'secondary'}]
+ |   - [117, 'unicode_ja_s3', 1, 'ICU', 'ja', {'strength': 'tertiary'}]
+ |   - [118, 'unicode_kk_s1', 1, 'ICU', 'kk', {'strength': 'primary'}]
+ |   - [119, 'unicode_kk_s2', 1, 'ICU', 'kk', {'strength': 'secondary'}]
+ |   - [120, 'unicode_kk_s3', 1, 'ICU', 'kk', {'strength': 'tertiary'}]
+ |   - [121, 'unicode_kl_s1', 1, 'ICU', 'kl', {'strength': 'primary'}]
+ |   - [122, 'unicode_kl_s2', 1, 'ICU', 'kl', {'strength': 'secondary'}]
+ |   - [123, 'unicode_kl_s3', 1, 'ICU', 'kl', {'strength': 'tertiary'}]
+ |   - [124, 'unicode_kn_s1', 1, 'ICU', 'kn', {'strength': 'primary'}]
+ |   - [125, 'unicode_kn_s2', 1, 'ICU', 'kn', {'strength': 'secondary'}]
+ |   - [126, 'unicode_kn_s3', 1, 'ICU', 'kn', {'strength': 'tertiary'}]
+ |   - [127, 'unicode_ko_s1', 1, 'ICU', 'ko', {'strength': 'primary'}]
+ |   - [128, 'unicode_ko_s2', 1, 'ICU', 'ko', {'strength': 'secondary'}]
+ |   - [129, 'unicode_ko_s3', 1, 'ICU', 'ko', {'strength': 'tertiary'}]
+ |   - [130, 'unicode_kok_s1', 1, 'ICU', 'kok', {'strength': 'primary'}]
+ |   - [131, 'unicode_kok_s2', 1, 'ICU', 'kok', {'strength': 'secondary'}]
+ |   - [132, 'unicode_kok_s3', 1, 'ICU', 'kok', {'strength': 'tertiary'}]
+ |   - [133, 'unicode_ky_s1', 1, 'ICU', 'ky', {'strength': 'primary'}]
+ |   - [134, 'unicode_ky_s2', 1, 'ICU', 'ky', {'strength': 'secondary'}]
+ |   - [135, 'unicode_ky_s3', 1, 'ICU', 'ky', {'strength': 'tertiary'}]
+ |   - [136, 'unicode_lkt_s1', 1, 'ICU', 'lkt', {'strength': 'primary'}]
+ |   - [137, 'unicode_lkt_s2', 1, 'ICU', 'lkt', {'strength': 'secondary'}]
+ |   - [138, 'unicode_lkt_s3', 1, 'ICU', 'lkt', {'strength': 'tertiary'}]
+ |   - [139, 'unicode_ln_s1', 1, 'ICU', 'ln', {'strength': 'primary'}]
+ |   - [140, 'unicode_ln_s2', 1, 'ICU', 'ln', {'strength': 'secondary'}]
+ |   - [141, 'unicode_ln_s3', 1, 'ICU', 'ln', {'strength': 'tertiary'}]
+ |   - [142, 'unicode_lt_s1', 1, 'ICU', 'lt', {'strength': 'primary'}]
+ |   - [143, 'unicode_lt_s2', 1, 'ICU', 'lt', {'strength': 'secondary'}]
+ |   - [144, 'unicode_lt_s3', 1, 'ICU', 'lt', {'strength': 'tertiary'}]
+ |   - [145, 'unicode_lv_s1', 1, 'ICU', 'lv', {'strength': 'primary'}]
+ |   - [146, 'unicode_lv_s2', 1, 'ICU', 'lv', {'strength': 'secondary'}]
+ |   - [147, 'unicode_lv_s3', 1, 'ICU', 'lv', {'strength': 'tertiary'}]
+ |   - [148, 'unicode_mk_s1', 1, 'ICU', 'mk', {'strength': 'primary'}]
+ |   - [149, 'unicode_mk_s2', 1, 'ICU', 'mk', {'strength': 'secondary'}]
+ |   - [150, 'unicode_mk_s3', 1, 'ICU', 'mk', {'strength': 'tertiary'}]
+ |   - [151, 'unicode_ml_s1', 1, 'ICU', 'ml', {'strength': 'primary'}]
+ |   - [152, 'unicode_ml_s2', 1, 'ICU', 'ml', {'strength': 'secondary'}]
+ |   - [153, 'unicode_ml_s3', 1, 'ICU', 'ml', {'strength': 'tertiary'}]
+ |   - [154, 'unicode_mr_s1', 1, 'ICU', 'mr', {'strength': 'primary'}]
+ |   - [155, 'unicode_mr_s2', 1, 'ICU', 'mr', {'strength': 'secondary'}]
+ |   - [156, 'unicode_mr_s3', 1, 'ICU', 'mr', {'strength': 'tertiary'}]
+ |   - [157, 'unicode_mt_s1', 1, 'ICU', 'mt', {'strength': 'primary'}]
+ |   - [158, 'unicode_mt_s2', 1, 'ICU', 'mt', {'strength': 'secondary'}]
+ |   - [159, 'unicode_mt_s3', 1, 'ICU', 'mt', {'strength': 'tertiary'}]
+ |   - [160, 'unicode_nb_s1', 1, 'ICU', 'nb', {'strength': 'primary'}]
+ |   - [161, 'unicode_nb_s2', 1, 'ICU', 'nb', {'strength': 'secondary'}]
+ |   - [162, 'unicode_nb_s3', 1, 'ICU', 'nb', {'strength': 'tertiary'}]
+ |   - [163, 'unicode_nn_s1', 1, 'ICU', 'nn', {'strength': 'primary'}]
+ |   - [164, 'unicode_nn_s2', 1, 'ICU', 'nn', {'strength': 'secondary'}]
+ |   - [165, 'unicode_nn_s3', 1, 'ICU', 'nn', {'strength': 'tertiary'}]
+ |   - [166, 'unicode_nso_s1', 1, 'ICU', 'nso', {'strength': 'primary'}]
+ |   - [167, 'unicode_nso_s2', 1, 'ICU', 'nso', {'strength': 'secondary'}]
+ |   - [168, 'unicode_nso_s3', 1, 'ICU', 'nso', {'strength': 'tertiary'}]
+ |   - [169, 'unicode_om_s1', 1, 'ICU', 'om', {'strength': 'primary'}]
+ |   - [170, 'unicode_om_s2', 1, 'ICU', 'om', {'strength': 'secondary'}]
+ |   - [171, 'unicode_om_s3', 1, 'ICU', 'om', {'strength': 'tertiary'}]
+ |   - [172, 'unicode_or_s1', 1, 'ICU', 'or', {'strength': 'primary'}]
+ |   - [173, 'unicode_or_s2', 1, 'ICU', 'or', {'strength': 'secondary'}]
+ |   - [174, 'unicode_or_s3', 1, 'ICU', 'or', {'strength': 'tertiary'}]
+ |   - [175, 'unicode_pa_s1', 1, 'ICU', 'pa', {'strength': 'primary'}]
+ |   - [176, 'unicode_pa_s2', 1, 'ICU', 'pa', {'strength': 'secondary'}]
+ |   - [177, 'unicode_pa_s3', 1, 'ICU', 'pa', {'strength': 'tertiary'}]
+ |   - [178, 'unicode_pl_s1', 1, 'ICU', 'pl', {'strength': 'primary'}]
+ |   - [179, 'unicode_pl_s2', 1, 'ICU', 'pl', {'strength': 'secondary'}]
+ |   - [180, 'unicode_pl_s3', 1, 'ICU', 'pl', {'strength': 'tertiary'}]
+ |   - [181, 'unicode_ro_s1', 1, 'ICU', 'ro', {'strength': 'primary'}]
+ |   - [182, 'unicode_ro_s2', 1, 'ICU', 'ro', {'strength': 'secondary'}]
+ |   - [183, 'unicode_ro_s3', 1, 'ICU', 'ro', {'strength': 'tertiary'}]
+ |   - [184, 'unicode_sa_s1', 1, 'ICU', 'sa', {'strength': 'primary'}]
+ |   - [185, 'unicode_sa_s2', 1, 'ICU', 'sa', {'strength': 'secondary'}]
+ |   - [186, 'unicode_sa_s3', 1, 'ICU', 'sa', {'strength': 'tertiary'}]
+ |   - [187, 'unicode_se_s1', 1, 'ICU', 'se', {'strength': 'primary'}]
+ |   - [188, 'unicode_se_s2', 1, 'ICU', 'se', {'strength': 'secondary'}]
+ |   - [189, 'unicode_se_s3', 1, 'ICU', 'se', {'strength': 'tertiary'}]
+ |   - [190, 'unicode_si_s1', 1, 'ICU', 'si', {'strength': 'primary'}]
+ |   - [191, 'unicode_si_s2', 1, 'ICU', 'si', {'strength': 'secondary'}]
+ |   - [192, 'unicode_si_s3', 1, 'ICU', 'si', {'strength': 'tertiary'}]
+ |   - [193, 'unicode_si__dictionary_s1', 1, 'ICU', 'si_u_co_dict', {'strength': 'primary'}]
+ |   - [194, 'unicode_si__dictionary_s2', 1, 'ICU', 'si_u_co_dict', {'strength': 'secondary'}]
+ |   - [195, 'unicode_si__dictionary_s3', 1, 'ICU', 'si_u_co_dict', {'strength': 'tertiary'}]
+ |   - [196, 'unicode_sk_s1', 1, 'ICU', 'sk', {'strength': 'primary'}]
+ |   - [197, 'unicode_sk_s2', 1, 'ICU', 'sk', {'strength': 'secondary'}]
+ |   - [198, 'unicode_sk_s3', 1, 'ICU', 'sk', {'strength': 'tertiary'}]
+ |   - [199, 'unicode_sl_s1', 1, 'ICU', 'sl', {'strength': 'primary'}]
+ |   - [200, 'unicode_sl_s2', 1, 'ICU', 'sl', {'strength': 'secondary'}]
+ |   - [201, 'unicode_sl_s3', 1, 'ICU', 'sl', {'strength': 'tertiary'}]
+ |   - [202, 'unicode_sq_s1', 1, 'ICU', 'sq', {'strength': 'primary'}]
+ |   - [203, 'unicode_sq_s2', 1, 'ICU', 'sq', {'strength': 'secondary'}]
+ |   - [204, 'unicode_sq_s3', 1, 'ICU', 'sq', {'strength': 'tertiary'}]
+ |   - [205, 'unicode_sr_s1', 1, 'ICU', 'sr', {'strength': 'primary'}]
+ |   - [206, 'unicode_sr_s2', 1, 'ICU', 'sr', {'strength': 'secondary'}]
+ |   - [207, 'unicode_sr_s3', 1, 'ICU', 'sr', {'strength': 'tertiary'}]
+ |   - [208, 'unicode_sr_Latn_s1', 1, 'ICU', 'sr_Latn', {'strength': 'primary'}]
+ |   - [209, 'unicode_sr_Latn_s2', 1, 'ICU', 'sr_Latn', {'strength': 'secondary'}]
+ |   - [210, 'unicode_sr_Latn_s3', 1, 'ICU', 'sr_Latn', {'strength': 'tertiary'}]
+ |   - [211, 'unicode_sv_s1', 1, 'ICU', 'sv', {'strength': 'primary'}]
+ |   - [212, 'unicode_sv_s2', 1, 'ICU', 'sv', {'strength': 'secondary'}]
+ |   - [213, 'unicode_sv_s3', 1, 'ICU', 'sv', {'strength': 'tertiary'}]
+ |   - [214, 'unicode_sv__reformed_s1', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'primary'}]
+ |   - [215, 'unicode_sv__reformed_s2', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'secondary'}]
+ |   - [216, 'unicode_sv__reformed_s3', 1, 'ICU', 'sv_u_co_reformed', {'strength': 'tertiary'}]
+ |   - [217, 'unicode_ta_s1', 1, 'ICU', 'ta', {'strength': 'primary'}]
+ |   - [218, 'unicode_ta_s2', 1, 'ICU', 'ta', {'strength': 'secondary'}]
+ |   - [219, 'unicode_ta_s3', 1, 'ICU', 'ta', {'strength': 'tertiary'}]
+ |   - [220, 'unicode_te_s1', 1, 'ICU', 'te', {'strength': 'primary'}]
+ |   - [221, 'unicode_te_s2', 1, 'ICU', 'te', {'strength': 'secondary'}]
+ |   - [222, 'unicode_te_s3', 1, 'ICU', 'te', {'strength': 'tertiary'}]
+ |   - [223, 'unicode_th_s1', 1, 'ICU', 'th', {'strength': 'primary'}]
+ |   - [224, 'unicode_th_s2', 1, 'ICU', 'th', {'strength': 'secondary'}]
+ |   - [225, 'unicode_th_s3', 1, 'ICU', 'th', {'strength': 'tertiary'}]
+ |   - [226, 'unicode_tn_s1', 1, 'ICU', 'tn', {'strength': 'primary'}]
+ |   - [227, 'unicode_tn_s2', 1, 'ICU', 'tn', {'strength': 'secondary'}]
+ |   - [228, 'unicode_tn_s3', 1, 'ICU', 'tn', {'strength': 'tertiary'}]
+ |   - [229, 'unicode_to_s1', 1, 'ICU', 'to', {'strength': 'primary'}]
+ |   - [230, 'unicode_to_s2', 1, 'ICU', 'to', {'strength': 'secondary'}]
+ |   - [231, 'unicode_to_s3', 1, 'ICU', 'to', {'strength': 'tertiary'}]
+ |   - [232, 'unicode_tr_s1', 1, 'ICU', 'tr', {'strength': 'primary'}]
+ |   - [233, 'unicode_tr_s2', 1, 'ICU', 'tr', {'strength': 'secondary'}]
+ |   - [234, 'unicode_tr_s3', 1, 'ICU', 'tr', {'strength': 'tertiary'}]
+ |   - [235, 'unicode_ug_Cyrl_s1', 1, 'ICU', 'ug', {'strength': 'primary'}]
+ |   - [236, 'unicode_ug_Cyrl_s2', 1, 'ICU', 'ug', {'strength': 'secondary'}]
+ |   - [237, 'unicode_ug_Cyrl_s3', 1, 'ICU', 'ug', {'strength': 'tertiary'}]
+ |   - [238, 'unicode_uk_s1', 1, 'ICU', 'uk', {'strength': 'primary'}]
+ |   - [239, 'unicode_uk_s2', 1, 'ICU', 'uk', {'strength': 'secondary'}]
+ |   - [240, 'unicode_uk_s3', 1, 'ICU', 'uk', {'strength': 'tertiary'}]
+ |   - [241, 'unicode_ur_s1', 1, 'ICU', 'ur', {'strength': 'primary'}]
+ |   - [242, 'unicode_ur_s2', 1, 'ICU', 'ur', {'strength': 'secondary'}]
+ |   - [243, 'unicode_ur_s3', 1, 'ICU', 'ur', {'strength': 'tertiary'}]
+ |   - [244, 'unicode_vi_s1', 1, 'ICU', 'vi', {'strength': 'primary'}]
+ |   - [245, 'unicode_vi_s2', 1, 'ICU', 'vi', {'strength': 'secondary'}]
+ |   - [246, 'unicode_vi_s3', 1, 'ICU', 'vi', {'strength': 'tertiary'}]
+ |   - [247, 'unicode_vo_s1', 1, 'ICU', 'vo', {'strength': 'primary'}]
+ |   - [248, 'unicode_vo_s2', 1, 'ICU', 'vo', {'strength': 'secondary'}]
+ |   - [249, 'unicode_vo_s3', 1, 'ICU', 'vo', {'strength': 'tertiary'}]
+ |   - [250, 'unicode_wae_s1', 1, 'ICU', 'wae', {'strength': 'primary'}]
+ |   - [251, 'unicode_wae_s2', 1, 'ICU', 'wae', {'strength': 'secondary'}]
+ |   - [252, 'unicode_wae_s3', 1, 'ICU', 'wae', {'strength': 'tertiary'}]
+ |   - [253, 'unicode_wo_s1', 1, 'ICU', 'wo', {'strength': 'primary'}]
+ |   - [254, 'unicode_wo_s2', 1, 'ICU', 'wo', {'strength': 'secondary'}]
+ |   - [255, 'unicode_wo_s3', 1, 'ICU', 'wo', {'strength': 'tertiary'}]
+ |   - [256, 'unicode_yo_s1', 1, 'ICU', 'yo', {'strength': 'primary'}]
+ |   - [257, 'unicode_yo_s2', 1, 'ICU', 'yo', {'strength': 'secondary'}]
+ |   - [258, 'unicode_yo_s3', 1, 'ICU', 'yo', {'strength': 'tertiary'}]
+ |   - [259, 'unicode_zh_s1', 1, 'ICU', 'zh', {'strength': 'primary'}]
+ |   - [260, 'unicode_zh_s2', 1, 'ICU', 'zh', {'strength': 'secondary'}]
+ |   - [261, 'unicode_zh_s3', 1, 'ICU', 'zh', {'strength': 'tertiary'}]
+ |   - [262, 'unicode_zh__big5han_s1', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'primary'}]
+ |   - [263, 'unicode_zh__big5han_s2', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'secondary'}]
+ |   - [264, 'unicode_zh__big5han_s3', 1, 'ICU', 'zh_u_co_big5han', {'strength': 'tertiary'}]
+ |   - [265, 'unicode_zh__gb2312han_s1', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'primary'}]
+ |   - [266, 'unicode_zh__gb2312han_s2', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'secondary'}]
+ |   - [267, 'unicode_zh__gb2312han_s3', 1, 'ICU', 'zh_u_co_gb2312', {'strength': 'tertiary'}]
+ |   - [268, 'unicode_zh__pinyin_s1', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'primary'}]
+ |   - [269, 'unicode_zh__pinyin_s2', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'secondary'}]
+ |   - [270, 'unicode_zh__pinyin_s3', 1, 'ICU', 'zh_u_co_pinyin', {'strength': 'tertiary'}]
+ |   - [271, 'unicode_zh__stroke_s1', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'primary'}]
+ |   - [272, 'unicode_zh__stroke_s2', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'secondary'}]
+ |   - [273, 'unicode_zh__stroke_s3', 1, 'ICU', 'zh_u_co_stroke', {'strength': 'tertiary'}]
+ |   - [274, 'unicode_zh__zhuyin_s1', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'primary'}]
+ |   - [275, 'unicode_zh__zhuyin_s2', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'secondary'}]
+ |   - [276, 'unicode_zh__zhuyin_s3', 1, 'ICU', 'zh_u_co_zhuyin', {'strength': 'tertiary'}]
+ |   - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
+box.space._collation.index.name:delete{'test'}
+ | ---
+ | - [277, 'test', 0, 'ICU', 'ru_RU', {}]
+ | ...
diff --git a/test/box/ddl_collation.test.lua b/test/box/ddl_collation.test.lua
new file mode 100644
index 000000000..ee26af9c6
--- /dev/null
+++ b/test/box/ddl_collation.test.lua
@@ -0,0 +1,90 @@
+env = require('test_run')
+test_run = env.new()
+
+-- collation
+function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
+
+box.internal.collation.create('test')
+box.internal.collation.create('test', 'ICU')
+box.internal.collation.create(42, 'ICU', 'ru_RU')
+box.internal.collation.create('test', 42, 'ru_RU')
+box.internal.collation.create('test', 'ICU', 42)
+box.internal.collation.create('test', 'nothing', 'ru_RU')
+box.internal.collation.create('test', 'ICU', 'ru_RU', setmap{}) --ok
+box.internal.collation.create('test', 'ICU', 'ru_RU')
+box.internal.collation.drop('test')
+box.internal.collation.drop('nothing') -- allowed
+box.internal.collation.create('test', 'ICU', 'ru_RU', 42)
+box.internal.collation.create('test', 'ICU', 'ru_RU', 'options')
+box.internal.collation.create('test', 'ICU', 'ru_RU', {ping='pong'})
+box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='german'})
+box.internal.collation.create('test', 'ICU', 'ru_RU', {french_collation='on'}) --ok
+box.internal.collation.drop('test') --ok
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='supervillian'})
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=42})
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength=2}) --ok
+box.internal.collation.drop('test') --ok
+box.internal.collation.create('test', 'ICU', 'ru_RU', {strength='primary'}) --ok
+box.internal.collation.drop('test') --ok
+c = box.space._collation:get{1}:totable()
+c[2] = 'unicode_test'
+box.space._collation:replace(c)
+
+box.begin() box.internal.collation.create('test2', 'ICU', 'ru_RU') box.rollback()
+
+box.internal.collation.create('test', 'ICU', 'ru_RU')
+box.internal.collation.exists('test')
+
+test_run:cmd('restart server default')
+function setmap(table) return setmetatable(table, { __serialize = 'map' }) end
+
+box.internal.collation.exists('test')
+box.internal.collation.drop('test')
+
+box.space._collation:auto_increment{'test'}
+box.space._collation:auto_increment{'test', 0, 'ICU'}
+box.space._collation:auto_increment{'test', 'ADMIN', 'ICU', 'ru_RU'}
+box.space._collation:auto_increment{42, 0, 'ICU', 'ru_RU'}
+box.space._collation:auto_increment{'test', 0, 42, 'ru_RU'}
+box.space._collation:auto_increment{'test', 0, 'ICU', 42}
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}} --ok
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
+box.space._collation.index.name:delete{'test'} -- ok
+box.space._collation.index.name:delete{'nothing'} -- allowed
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 42}
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', 'options'}
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', {ping='pong'}}
+opts = {normalization_mode='NORMAL'}
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.normalization_mode = 'OFF'
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} -- ok
+_ = box.space._collation.index.name:delete{'test'} -- ok
+opts.numeric_collation = 'PERL'
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.numeric_collation = 'ON'
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+_ = box.space._collation.index.name:delete{'test'} -- ok
+opts.alternate_handling1 = 'ON'
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.alternate_handling1 = nil
+opts.alternate_handling = 'ON'
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.alternate_handling = 'SHIFTED'
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+_ = box.space._collation.index.name:delete{'test'} -- ok
+opts.case_first = 'ON'
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.case_first = 'OFF'
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+_ = box.space._collation.index.name:delete{'test'} -- ok
+opts.case_level = 'UPPER'
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts}
+opts.case_level = 'DEFAULT'
+_ = box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', opts} --ok
+_ = box.space._collation.index.name:delete{'test'} -- ok
+
+box.space._collation:auto_increment{'test', 0, 'ICU', 'ru_RU', setmap{}}
+box.space._collation:select{}
+test_run:cmd('restart server default')
+box.space._collation:select{}
+box.space._collation.index.name:delete{'test'}
diff --git a/test/box/ddl_collation_types.result b/test/box/ddl_collation_types.result
new file mode 100644
index 000000000..92797a4d9
--- /dev/null
+++ b/test/box/ddl_collation_types.result
@@ -0,0 +1,28 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- Check that collation is allowed only for strings, scalar and any types.
+format = {}
+ | ---
+ | ...
+format[1] = {'field1', 'unsigned', collation = 'unicode'}
+ | ---
+ | ...
+s = box.schema.create_space('test', {format = format})
+ | ---
+ | - error: 'Failed to create space ''test'': collation is reasonable only for string,
+ |     scalar and any fields'
+ | ...
+format[1] = {'field2', 'array', collation = 'unicode_ci'}
+ | ---
+ | ...
+s = box.schema.create_space('test', {format = format})
+ | ---
+ | - error: 'Failed to create space ''test'': collation is reasonable only for string,
+ |     scalar and any fields'
+ | ...
diff --git a/test/box/ddl_collation_types.test.lua b/test/box/ddl_collation_types.test.lua
new file mode 100644
index 000000000..478530537
--- /dev/null
+++ b/test/box/ddl_collation_types.test.lua
@@ -0,0 +1,9 @@
+env = require('test_run')
+test_run = env.new()
+
+-- Check that collation is allowed only for strings, scalar and any types.
+format = {}
+format[1] = {'field1', 'unsigned', collation = 'unicode'}
+s = box.schema.create_space('test', {format = format})
+format[1] = {'field2', 'array', collation = 'unicode_ci'}
+s = box.schema.create_space('test', {format = format})
diff --git a/test/box/ddl_collation_wrong_id.result b/test/box/ddl_collation_wrong_id.result
new file mode 100644
index 000000000..f8a10814b
--- /dev/null
+++ b/test/box/ddl_collation_wrong_id.result
@@ -0,0 +1,28 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- Check that error is raised when collation with wrong id is used.
+_space = box.space[box.schema.SPACE_ID]
+ | ---
+ | ...
+utils = require('utils')
+ | ---
+ | ...
+EMPTY_MAP = utils.setmap({})
+ | ---
+ | ...
+format = {{name = 'field1', type = 'string', collation = 666}}
+ | ---
+ | ...
+surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
+ | ---
+ | ...
+_space:insert(surrogate_space)
+ | ---
+ | - error: 'Wrong collation options (field 1): collation was not found by ID'
+ | ...
diff --git a/test/box/ddl_collation_wrong_id.test.lua b/test/box/ddl_collation_wrong_id.test.lua
new file mode 100644
index 000000000..0aaab322d
--- /dev/null
+++ b/test/box/ddl_collation_wrong_id.test.lua
@@ -0,0 +1,10 @@
+env = require('test_run')
+test_run = env.new()
+
+-- Check that error is raised when collation with wrong id is used.
+_space = box.space[box.schema.SPACE_ID]
+utils = require('utils')
+EMPTY_MAP = utils.setmap({})
+format = {{name = 'field1', type = 'string', collation = 666}}
+surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
+_space:insert(surrogate_space)
diff --git a/test/box/ddl_no_collation.result b/test/box/ddl_no_collation.result
new file mode 100644
index 000000000..6b05f8bc3
--- /dev/null
+++ b/test/box/ddl_no_collation.result
@@ -0,0 +1,19 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- Check that error is raised when collation doesn't exists.
+format = {}
+ | ---
+ | ...
+format[1] = {'field1', 'unsigend', collation = 'test_coll'}
+ | ---
+ | ...
+s = box.schema.create_space('test', {format = format})
+ | ---
+ | - error: 'Illegal parameters, format[1]: collation was not found by name ''test_coll'''
+ | ...
diff --git a/test/box/ddl_no_collation.test.lua b/test/box/ddl_no_collation.test.lua
new file mode 100644
index 000000000..a5fdedd02
--- /dev/null
+++ b/test/box/ddl_no_collation.test.lua
@@ -0,0 +1,7 @@
+env = require('test_run')
+test_run = env.new()
+
+-- Check that error is raised when collation doesn't exists.
+format = {}
+format[1] = {'field1', 'unsigend', collation = 'test_coll'}
+s = box.schema.create_space('test', {format = format})
diff --git a/test/box/ddl_parallel.result b/test/box/ddl_parallel.result
new file mode 100644
index 000000000..dfa4a1422
--- /dev/null
+++ b/test/box/ddl_parallel.result
@@ -0,0 +1,61 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+fiber = require'fiber'
+ | ---
+ | ...
+
+-- simple test for parallel ddl execution
+_ = box.schema.space.create('test'):create_index('pk')
+ | ---
+ | ...
+
+ch = fiber.channel(2)
+ | ---
+ | ...
+
+test_run:cmd("setopt delimiter ';'")
+ | ---
+ | - true
+ | ...
+
+function f1()
+    box.space.test:create_index('sec', {parts = {2, 'num'}})
+    ch:put(true)
+end;
+ | ---
+ | ...
+
+function f2()
+    box.space.test:create_index('third', {parts = {3, 'string'}})
+    ch:put(true)
+end;
+ | ---
+ | ...
+
+test_run:cmd("setopt delimiter ''");
+ | ---
+ | - true
+ | ...
+
+_ = {fiber.create(f1), fiber.create(f2)}
+ | ---
+ | ...
+
+ch:get()
+ | ---
+ | - true
+ | ...
+ch:get()
+ | ---
+ | - true
+ | ...
+
+_ = box.space.test:drop()
+ | ---
+ | ...
diff --git a/test/box/ddl_parallel.test.lua b/test/box/ddl_parallel.test.lua
new file mode 100644
index 000000000..99c3bfdcc
--- /dev/null
+++ b/test/box/ddl_parallel.test.lua
@@ -0,0 +1,30 @@
+env = require('test_run')
+test_run = env.new()
+
+fiber = require'fiber'
+
+-- simple test for parallel ddl execution
+_ = box.schema.space.create('test'):create_index('pk')
+
+ch = fiber.channel(2)
+
+test_run:cmd("setopt delimiter ';'")
+
+function f1()
+    box.space.test:create_index('sec', {parts = {2, 'num'}})
+    ch:put(true)
+end;
+
+function f2()
+    box.space.test:create_index('third', {parts = {3, 'string'}})
+    ch:put(true)
+end;
+
+test_run:cmd("setopt delimiter ''");
+
+_ = {fiber.create(f1), fiber.create(f2)}
+
+ch:get()
+ch:get()
+
+_ = box.space.test:drop()
diff --git a/test/box/ddl_tuple.result b/test/box/ddl_tuple.result
new file mode 100644
index 000000000..6a024a833
--- /dev/null
+++ b/test/box/ddl_tuple.result
@@ -0,0 +1,67 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+fiber = require'fiber'
+ | ---
+ | ...
+ch = fiber.channel(3)
+ | ---
+ | ...
+
+_ = box.schema.space.create('test'):create_index('pk')
+ | ---
+ | ...
+
+test_run:cmd("setopt delimiter ';'")
+ | ---
+ | - true
+ | ...
+function add_index()
+    box.space.test:create_index('sec', {parts = {2, 'num'}})
+    ch:put(true)
+end;
+ | ---
+ | ...
+
+function insert_tuple(tuple)
+    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
+end;
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ''");
+ | ---
+ | - true
+ | ...
+
+_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
+ | ---
+ | ...
+{ch:get(), ch:get(), ch:get()}
+ | ---
+ | - - - false
+ |     - 'Tuple field 2 type does not match one required by operation: expected unsigned'
+ |   - - true
+ |     - [1, 2, 'a']
+ |   - true
+ | ...
+
+box.space.test:select()
+ | ---
+ | - - [1, 2, 'a']
+ | ...
+
+test_run:cmd('restart server default')
+ | 
+
+box.space.test:select()
+ | ---
+ | - - [1, 2, 'a']
+ | ...
+box.space.test:drop()
+ | ---
+ | ...
diff --git a/test/box/ddl_tuple.test.lua b/test/box/ddl_tuple.test.lua
new file mode 100644
index 000000000..1c78a00e4
--- /dev/null
+++ b/test/box/ddl_tuple.test.lua
@@ -0,0 +1,28 @@
+env = require('test_run')
+test_run = env.new()
+
+fiber = require'fiber'
+ch = fiber.channel(3)
+
+_ = box.schema.space.create('test'):create_index('pk')
+
+test_run:cmd("setopt delimiter ';'")
+function add_index()
+    box.space.test:create_index('sec', {parts = {2, 'num'}})
+    ch:put(true)
+end;
+
+function insert_tuple(tuple)
+    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
+end;
+test_run:cmd("setopt delimiter ''");
+
+_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
+{ch:get(), ch:get(), ch:get()}
+
+box.space.test:select()
+
+test_run:cmd('restart server default')
+
+box.space.test:select()
+box.space.test:drop()
diff --git a/test/box/gh-2336-ddl_call_twice.result b/test/box/gh-2336-ddl_call_twice.result
new file mode 100644
index 000000000..aa4dee54b
--- /dev/null
+++ b/test/box/gh-2336-ddl_call_twice.result
@@ -0,0 +1,51 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+-- gh-2336 crash if format called twice during snapshot
+fiber = require'fiber'
+ | ---
+ | ...
+
+space = box.schema.space.create('test_format')
+ | ---
+ | ...
+_ = space:create_index('pk', { parts = { 1,'str' }})
+ | ---
+ | ...
+space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
+ | ---
+ | ...
+str = string.rep("t",1024)
+ | ---
+ | ...
+for i = 1, 10000 do space:insert{tostring(i), str} end
+ | ---
+ | ...
+ch = fiber.channel(3)
+ | ---
+ | ...
+_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
+ | ---
+ | ...
+format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
+ | ---
+ | ...
+for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
+ | ---
+ | ...
+
+{ch:get(), ch:get(), ch:get()}
+ | ---
+ | - - true
+ |   - true
+ |   - true
+ | ...
+
+space:drop()
+ | ---
+ | ...
diff --git a/test/box/gh-2336-ddl_call_twice.test.lua b/test/box/gh-2336-ddl_call_twice.test.lua
new file mode 100644
index 000000000..cf187c1bd
--- /dev/null
+++ b/test/box/gh-2336-ddl_call_twice.test.lua
@@ -0,0 +1,19 @@
+env = require('test_run')
+test_run = env.new()
+
+-- gh-2336 crash if format called twice during snapshot
+fiber = require'fiber'
+
+space = box.schema.space.create('test_format')
+_ = space:create_index('pk', { parts = { 1,'str' }})
+space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
+str = string.rep("t",1024)
+for i = 1, 10000 do space:insert{tostring(i), str} end
+ch = fiber.channel(3)
+_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
+format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
+for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
+
+{ch:get(), ch:get(), ch:get()}
+
+space:drop()
diff --git a/test/box/gh-2783-ddl_lock.result b/test/box/gh-2783-ddl_lock.result
new file mode 100644
index 000000000..7b3ba3444
--- /dev/null
+++ b/test/box/gh-2783-ddl_lock.result
@@ -0,0 +1,62 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+--
+-- gh-2783
+-- A ddl operation shoud fail before trying to lock a ddl latch
+-- in a multi-statement transaction.
+-- If operation tries to lock already an locked latch then the
+-- current transaction will be silently rolled back under our feet.
+-- This is confusing. So check for multi-statement transaction
+-- before locking the latch.
+--
+test_latch = box.schema.space.create('test_latch')
+ | ---
+ | ...
+_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
+ | ---
+ | ...
+fiber = require('fiber')
+ | ---
+ | ...
+c = fiber.channel(1)
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ';'")
+ | ---
+ | - true
+ | ...
+_ = fiber.create(function()
+    test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
+    c:put(true)
+end);
+ | ---
+ | ...
+
+-- Should be Ok for now
+box.begin()
+    test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
+box.commit();
+ | ---
+ | ...
+test_run:cmd("setopt delimiter ''");
+ | ---
+ | - true
+ | ...
+-- Explicitly roll back the transaction in multi-statement,
+-- which hasn't finished due to DDL error
+box.rollback()
+ | ---
+ | ...
+
+_ = c:get()
+ | ---
+ | ...
+test_latch:drop() -- this is where everything stops
+ | ---
+ | ...
diff --git a/test/box/gh-2783-ddl_lock.test.lua b/test/box/gh-2783-ddl_lock.test.lua
new file mode 100644
index 000000000..953e177a7
--- /dev/null
+++ b/test/box/gh-2783-ddl_lock.test.lua
@@ -0,0 +1,33 @@
+env = require('test_run')
+test_run = env.new()
+
+--
+-- gh-2783
+-- A ddl operation shoud fail before trying to lock a ddl latch
+-- in a multi-statement transaction.
+-- If operation tries to lock already an locked latch then the
+-- current transaction will be silently rolled back under our feet.
+-- This is confusing. So check for multi-statement transaction
+-- before locking the latch.
+--
+test_latch = box.schema.space.create('test_latch')
+_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
+fiber = require('fiber')
+c = fiber.channel(1)
+test_run:cmd("setopt delimiter ';'")
+_ = fiber.create(function()
+    test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
+    c:put(true)
+end);
+
+-- Should be Ok for now
+box.begin()
+    test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
+box.commit();
+test_run:cmd("setopt delimiter ''");
+-- Explicitly roll back the transaction in multi-statement,
+-- which hasn't finished due to DDL error
+box.rollback()
+
+_ = c:get()
+test_latch:drop() -- this is where everything stops
diff --git a/test/box/gh-2839-ddl_custom_fields.result b/test/box/gh-2839-ddl_custom_fields.result
new file mode 100644
index 000000000..15307b3e0
--- /dev/null
+++ b/test/box/gh-2839-ddl_custom_fields.result
@@ -0,0 +1,33 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+--
+-- gh-2839: allow to store custom fields in field definition.
+--
+format = {}
+ | ---
+ | ...
+format[1] = {name = 'field1', type = 'unsigned'}
+ | ---
+ | ...
+format[2] = {'field2', 'unsigned'}
+ | ---
+ | ...
+format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
+ | ---
+ | ...
+s = box.schema.create_space('test', {format = format})
+ | ---
+ | ...
+s:format()[3].custom_field
+ | ---
+ | - custom_value
+ | ...
+s:drop()
+ | ---
+ | ...
diff --git a/test/box/gh-2839-ddl_custom_fields.test.lua b/test/box/gh-2839-ddl_custom_fields.test.lua
new file mode 100644
index 000000000..5f0cb243f
--- /dev/null
+++ b/test/box/gh-2839-ddl_custom_fields.test.lua
@@ -0,0 +1,13 @@
+env = require('test_run')
+test_run = env.new()
+
+--
+-- gh-2839: allow to store custom fields in field definition.
+--
+format = {}
+format[1] = {name = 'field1', type = 'unsigned'}
+format[2] = {'field2', 'unsigned'}
+format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
+s = box.schema.create_space('test', {format = format})
+s:format()[3].custom_field
+s:drop()
diff --git a/test/box/gh-2937-ddl_collation_field_def.result b/test/box/gh-2937-ddl_collation_field_def.result
new file mode 100644
index 000000000..bd3109fff
--- /dev/null
+++ b/test/box/gh-2937-ddl_collation_field_def.result
@@ -0,0 +1,34 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+--
+-- gh-2937: allow to specify collation in field definition.
+--
+format = {}
+ | ---
+ | ...
+format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
+ | ---
+ | ...
+format[2] = {'field2', 'any', collation = 'unicode_ci'}
+ | ---
+ | ...
+format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
+ | ---
+ | ...
+s = box.schema.create_space('test', {format = format})
+ | ---
+ | ...
+s:format()
+ | ---
+ | - [{'type': 'string', 'name': 'field1', 'collation': 1}, {'type': 'any', 'name': 'field2',
+ |     'collation': 2}, {'type': 'scalar', 'name': 'field3', 'collation': 1}]
+ | ...
+s:drop()
+ | ---
+ | ...
diff --git a/test/box/gh-2937-ddl_collation_field_def.test.lua b/test/box/gh-2937-ddl_collation_field_def.test.lua
new file mode 100644
index 000000000..0906afebd
--- /dev/null
+++ b/test/box/gh-2937-ddl_collation_field_def.test.lua
@@ -0,0 +1,13 @@
+env = require('test_run')
+test_run = env.new()
+
+--
+-- gh-2937: allow to specify collation in field definition.
+--
+format = {}
+format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
+format[2] = {'field2', 'any', collation = 'unicode_ci'}
+format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
+s = box.schema.create_space('test', {format = format})
+s:format()
+s:drop()
diff --git a/test/box/gh-3290-ddl_collation_deleted.result b/test/box/gh-3290-ddl_collation_deleted.result
new file mode 100644
index 000000000..09af973d1
--- /dev/null
+++ b/test/box/gh-3290-ddl_collation_deleted.result
@@ -0,0 +1,23 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+--
+-- gh-3290: expose ICU into Lua. It uses built-in collations, that
+-- must work even if a collation is deleted from _collation.
+--
+t = box.space._collation:delete{1}
+ | ---
+ | ...
+utf8.cmp('abc', 'def')
+ | ---
+ | - -1
+ | ...
+box.space._collation:replace(t)
+ | ---
+ | - [1, 'unicode', 1, 'ICU', '', {'strength': 'tertiary'}]
+ | ...
diff --git a/test/box/gh-3290-ddl_collation_deleted.test.lua b/test/box/gh-3290-ddl_collation_deleted.test.lua
new file mode 100644
index 000000000..f36838e7a
--- /dev/null
+++ b/test/box/gh-3290-ddl_collation_deleted.test.lua
@@ -0,0 +1,10 @@
+env = require('test_run')
+test_run = env.new()
+
+--
+-- gh-3290: expose ICU into Lua. It uses built-in collations, that
+-- must work even if a collation is deleted from _collation.
+--
+t = box.space._collation:delete{1}
+utf8.cmp('abc', 'def')
+box.space._collation:replace(t)
diff --git a/test/box/gh-928-ddl_truncate.result b/test/box/gh-928-ddl_truncate.result
new file mode 100644
index 000000000..83a2616fb
--- /dev/null
+++ b/test/box/gh-928-ddl_truncate.result
@@ -0,0 +1,42 @@
+-- test-run result file version 2
+env = require('test_run')
+ | ---
+ | ...
+test_run = env.new()
+ | ---
+ | ...
+
+fiber = require'fiber'
+ | ---
+ | ...
+ch = fiber.channel(2)
+ | ---
+ | ...
+
+--issue #928
+space = box.schema.space.create('test_trunc')
+ | ---
+ | ...
+_ = space:create_index('pk')
+ | ---
+ | ...
+_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
+ | ---
+ | ...
+_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
+ | ---
+ | ...
+
+function test_trunc() space:truncate() ch:put(true) end
+ | ---
+ | ...
+
+_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
+ | ---
+ | ...
+_ = {ch:get(), ch:get()}
+ | ---
+ | ...
+space:drop()
+ | ---
+ | ...
diff --git a/test/box/gh-928-ddl_truncate.test.lua b/test/box/gh-928-ddl_truncate.test.lua
new file mode 100644
index 000000000..304cc2cfc
--- /dev/null
+++ b/test/box/gh-928-ddl_truncate.test.lua
@@ -0,0 +1,17 @@
+env = require('test_run')
+test_run = env.new()
+
+fiber = require'fiber'
+ch = fiber.channel(2)
+
+--issue #928
+space = box.schema.space.create('test_trunc')
+_ = space:create_index('pk')
+_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
+_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
+
+function test_trunc() space:truncate() ch:put(true) end
+
+_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
+_ = {ch:get(), ch:get()}
+space:drop()
-- 
2.17.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test
  2020-03-16 16:19 [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test Alexander V. Tikhonov
@ 2020-03-17 15:00 ` Sergey Bronnikov
  2020-03-17 21:46   ` Oleg Piskunov
  2020-03-18 10:01   ` Alexander Tikhonov
  0 siblings, 2 replies; 4+ messages in thread
From: Sergey Bronnikov @ 2020-03-17 15:00 UTC (permalink / raw)
  To: Alexander V. Tikhonov; +Cc: Oleg Piskunov, tarantool-patches

Hi,

comments inline

On 19:19 Mon 16 Mar , Alexander V. Tikhonov wrote:
> Divided into tests:
> - box/ddl_alter.test.lua
> - box/ddl_collation.test.lua
> - box/ddl_collation_types.test.lua
> - box/ddl_collation_wrong_id.test.lua
> - box/ddl_no_collation.test.lua
> - box/ddl_parallel.test.lua
> - box/ddl_tuple.test.lua
> - box/gh-2336-ddl_call_twice.test.lua
> - box/gh-2783-ddl_lock.test.lua
> - box/gh-2839-ddl_custom_fields.test.lua
> - box/gh-2937-ddl_collation_field_def.test.lua
> - box/gh-3290-ddl_collation_deleted.test.lua
> - box/gh-928-ddl_truncate.test.lua
> ---
> 
> Github: https://github.com/tarantool/tarantool/tree/avtikhon/divide_tests

> diff --git a/test/box/ddl_alter.test.lua b/test/box/ddl_alter.test.lua
> new file mode 100644
> index 000000000..84c25abdb
> --- /dev/null
> +++ b/test/box/ddl_alter.test.lua
> @@ -0,0 +1,12 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +-- index should not crash after alter
> +space = box.schema.space.create('test_swap')
> +index = space:create_index('pk')
> +space:replace({1, 2, 3})
> +index:rename('primary')
> +index2 = space:create_index('sec')
> +space:replace({2, 3, 1})
> +space:select()
> +space:drop()

> diff --git a/test/box/ddl_collation_types.test.lua b/test/box/ddl_collation_types.test.lua
> new file mode 100644
> index 000000000..478530537
> --- /dev/null
> +++ b/test/box/ddl_collation_types.test.lua
> @@ -0,0 +1,9 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +-- Check that collation is allowed only for strings, scalar and any types.
> +format = {}
> +format[1] = {'field1', 'unsigned', collation = 'unicode'}
> +s = box.schema.create_space('test', {format = format})
> +format[1] = {'field2', 'array', collation = 'unicode_ci'}
> +s = box.schema.create_space('test', {format = format})

missed cleanup here

> diff --git a/test/box/ddl_collation_wrong_id.test.lua b/test/box/ddl_collation_wrong_id.test.lua
> new file mode 100644
> index 000000000..0aaab322d
> --- /dev/null
> +++ b/test/box/ddl_collation_wrong_id.test.lua
> @@ -0,0 +1,10 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +-- Check that error is raised when collation with wrong id is used.
> +_space = box.space[box.schema.SPACE_ID]
> +utils = require('utils')
> +EMPTY_MAP = utils.setmap({})
> +format = {{name = 'field1', type = 'string', collation = 666}}
> +surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
> +_space:insert(surrogate_space)

missed cleanup

> diff --git a/test/box/ddl_no_collation.test.lua b/test/box/ddl_no_collation.test.lua
> new file mode 100644
> index 000000000..a5fdedd02
> --- /dev/null
> +++ b/test/box/ddl_no_collation.test.lua
> @@ -0,0 +1,7 @@
> +env = require('test_run')
> +test_run = env.new()
> +
> +-- Check that error is raised when collation doesn't exists.
> +format = {}
> +format[1] = {'field1', 'unsigend', collation = 'test_coll'}
> +s = box.schema.create_space('test', {format = format})

> diff --git a/test/box/ddl_parallel.test.lua b/test/box/ddl_parallel.test.lua
> new file mode 100644
> index 000000000..99c3bfdcc
> --- /dev/null
> +++ b/test/box/ddl_parallel.test.lua
> @@ -0,0 +1,30 @@
> +env = require('test_run')
> +test_run = env.new()
> +
> +fiber = require'fiber'
> +
> +-- simple test for parallel ddl execution
> +_ = box.schema.space.create('test'):create_index('pk')
> +
> +ch = fiber.channel(2)
> +
> +test_run:cmd("setopt delimiter ';'")
> +
> +function f1()
> +    box.space.test:create_index('sec', {parts = {2, 'num'}})
> +    ch:put(true)
> +end;
> +
> +function f2()
> +    box.space.test:create_index('third', {parts = {3, 'string'}})
> +    ch:put(true)
> +end;
> +
> +test_run:cmd("setopt delimiter ''");
> +
> +_ = {fiber.create(f1), fiber.create(f2)}
> +
> +ch:get()
> +ch:get()
> +
> +_ = box.space.test:drop()
> diff --git a/test/box/ddl_tuple.result b/test/box/ddl_tuple.result
> new file mode 100644
> index 000000000..6a024a833
> --- /dev/null
> +++ b/test/box/ddl_tuple.result
> @@ -0,0 +1,67 @@
> +-- test-run result file version 2
> +env = require('test_run')
> + | ---
> + | ...
> +test_run = env.new()
> + | ---
> + | ...
> +
> +fiber = require'fiber'
> + | ---
> + | ...
> +ch = fiber.channel(3)
> + | ---
> + | ...
> +
> +_ = box.schema.space.create('test'):create_index('pk')
> + | ---
> + | ...
> +
> +test_run:cmd("setopt delimiter ';'")
> + | ---
> + | - true
> + | ...
> +function add_index()
> +    box.space.test:create_index('sec', {parts = {2, 'num'}})
> +    ch:put(true)
> +end;
> + | ---
> + | ...
> +
> +function insert_tuple(tuple)
> +    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
> +end;
> + | ---
> + | ...
> +test_run:cmd("setopt delimiter ''");
> + | ---
> + | - true
> + | ...
> +
> +_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
> + | ---
> + | ...
> +{ch:get(), ch:get(), ch:get()}
> + | ---
> + | - - - false
> + |     - 'Tuple field 2 type does not match one required by operation: expected unsigned'
> + |   - - true
> + |     - [1, 2, 'a']
> + |   - true
> + | ...
> +
> +box.space.test:select()
> + | ---
> + | - - [1, 2, 'a']
> + | ...
> +
> +test_run:cmd('restart server default')
> + | 
> +
> +box.space.test:select()
> + | ---
> + | - - [1, 2, 'a']
> + | ...
> +box.space.test:drop()
> + | ---
> + | ...
> diff --git a/test/box/ddl_tuple.test.lua b/test/box/ddl_tuple.test.lua
> new file mode 100644
> index 000000000..1c78a00e4
> --- /dev/null
> +++ b/test/box/ddl_tuple.test.lua
> @@ -0,0 +1,28 @@
> +env = require('test_run')
> +test_run = env.new()
> +
> +fiber = require'fiber'
> +ch = fiber.channel(3)
> +
> +_ = box.schema.space.create('test'):create_index('pk')
> +
> +test_run:cmd("setopt delimiter ';'")
> +function add_index()
> +    box.space.test:create_index('sec', {parts = {2, 'num'}})
> +    ch:put(true)
> +end;
> +
> +function insert_tuple(tuple)
> +    ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
> +end;
> +test_run:cmd("setopt delimiter ''");
> +
> +_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
> +{ch:get(), ch:get(), ch:get()}
> +
> +box.space.test:select()
> +
> +test_run:cmd('restart server default')
> +
> +box.space.test:select()
> +box.space.test:drop()
> diff --git a/test/box/gh-2336-ddl_call_twice.result b/test/box/gh-2336-ddl_call_twice.result
> new file mode 100644
> index 000000000..aa4dee54b
> --- /dev/null
> +++ b/test/box/gh-2336-ddl_call_twice.result
> @@ -0,0 +1,51 @@
> +-- test-run result file version 2
> +env = require('test_run')
> + | ---
> + | ...
> +test_run = env.new()
> + | ---
> + | ...
> +
> +-- gh-2336 crash if format called twice during snapshot
> +fiber = require'fiber'
> + | ---
> + | ...
> +
> +space = box.schema.space.create('test_format')
> + | ---
> + | ...
> +_ = space:create_index('pk', { parts = { 1,'str' }})
> + | ---
> + | ...
> +space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
> + | ---
> + | ...
> +str = string.rep("t",1024)
> + | ---
> + | ...
> +for i = 1, 10000 do space:insert{tostring(i), str} end
> + | ---
> + | ...
> +ch = fiber.channel(3)
> + | ---
> + | ...
> +_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
> + | ---
> + | ...
> +format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
> + | ---
> + | ...
> +for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
> + | ---
> + | ...
> +
> +{ch:get(), ch:get(), ch:get()}
> + | ---
> + | - - true
> + |   - true
> + |   - true
> + | ...
> +
> +space:drop()
> + | ---
> + | ...
> diff --git a/test/box/gh-2336-ddl_call_twice.test.lua b/test/box/gh-2336-ddl_call_twice.test.lua
> new file mode 100644
> index 000000000..cf187c1bd
> --- /dev/null
> +++ b/test/box/gh-2336-ddl_call_twice.test.lua
> @@ -0,0 +1,19 @@
> +env = require('test_run')
> +test_run = env.new()
> +
> +-- gh-2336 crash if format called twice during snapshot
> +fiber = require'fiber'
> +
> +space = box.schema.space.create('test_format')
> +_ = space:create_index('pk', { parts = { 1,'str' }})
> +space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
> +str = string.rep("t",1024)
> +for i = 1, 10000 do space:insert{tostring(i), str} end
> +ch = fiber.channel(3)
> +_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
> +format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
> +for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
> +
> +{ch:get(), ch:get(), ch:get()}
> +
> +space:drop()


> diff --git a/test/box/gh-2783-ddl_lock.test.lua b/test/box/gh-2783-ddl_lock.test.lua
> new file mode 100644
> index 000000000..953e177a7
> --- /dev/null
> +++ b/test/box/gh-2783-ddl_lock.test.lua
> @@ -0,0 +1,33 @@
> +env = require('test_run')
> +test_run = env.new()
> +
> +--
> +-- gh-2783
> +-- A ddl operation shoud fail before trying to lock a ddl latch
> +-- in a multi-statement transaction.
> +-- If operation tries to lock already an locked latch then the
> +-- current transaction will be silently rolled back under our feet.
> +-- This is confusing. So check for multi-statement transaction
> +-- before locking the latch.
> +--
> +test_latch = box.schema.space.create('test_latch')
> +_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
> +fiber = require('fiber')
> +c = fiber.channel(1)
> +test_run:cmd("setopt delimiter ';'")
> +_ = fiber.create(function()
> +    test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
> +    c:put(true)
> +end);
> +
> +-- Should be Ok for now
> +box.begin()
> +    test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
> +box.commit();
> +test_run:cmd("setopt delimiter ''");
> +-- Explicitly roll back the transaction in multi-statement,
> +-- which hasn't finished due to DDL error
> +box.rollback()
> +
> +_ = c:get()
> +test_latch:drop() -- this is where everything stops


> diff --git a/test/box/gh-2839-ddl_custom_fields.test.lua b/test/box/gh-2839-ddl_custom_fields.test.lua
> new file mode 100644
> index 000000000..5f0cb243f
> --- /dev/null
> +++ b/test/box/gh-2839-ddl_custom_fields.test.lua
> @@ -0,0 +1,13 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +-- gh-2839: allow to store custom fields in field definition.
> +--
> +format = {}
> +format[1] = {name = 'field1', type = 'unsigned'}
> +format[2] = {'field2', 'unsigned'}
> +format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
> +s = box.schema.create_space('test', {format = format})
> +s:format()[3].custom_field
> +s:drop()


> diff --git a/test/box/gh-2937-ddl_collation_field_def.test.lua b/test/box/gh-2937-ddl_collation_field_def.test.lua
> new file mode 100644
> index 000000000..0906afebd
> --- /dev/null
> +++ b/test/box/gh-2937-ddl_collation_field_def.test.lua
> @@ -0,0 +1,13 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +
> +--
> +-- gh-2937: allow to specify collation in field definition.
> +--
> +format = {}
> +format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
> +format[2] = {'field2', 'any', collation = 'unicode_ci'}
> +format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
> +s = box.schema.create_space('test', {format = format})
> +s:format()
> +s:drop()

> diff --git a/test/box/gh-3290-ddl_collation_deleted.test.lua b/test/box/gh-3290-ddl_collation_deleted.test.lua
> new file mode 100644
> index 000000000..f36838e7a
> --- /dev/null
> +++ b/test/box/gh-3290-ddl_collation_deleted.test.lua
> @@ -0,0 +1,10 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +--
> +-- gh-3290: expose ICU into Lua. It uses built-in collations, that
> +-- must work even if a collation is deleted from _collation.
> +--
> +t = box.space._collation:delete{1}
> +utf8.cmp('abc', 'def')
> +box.space._collation:replace(t)

missed cleanup


> diff --git a/test/box/gh-928-ddl_truncate.test.lua b/test/box/gh-928-ddl_truncate.test.lua
> new file mode 100644
> index 000000000..304cc2cfc
> --- /dev/null
> +++ b/test/box/gh-928-ddl_truncate.test.lua
> @@ -0,0 +1,17 @@
> +env = require('test_run')
> +test_run = env.new()

unused variables

> +fiber = require'fiber'
> +ch = fiber.channel(2)
> +
> +--issue #928
> +space = box.schema.space.create('test_trunc')
> +_ = space:create_index('pk')
> +_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
> +_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
> +
> +function test_trunc() space:truncate() ch:put(true) end
> +
> +_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
> +_ = {ch:get(), ch:get()}
> +space:drop()
> -- 
> 2.17.1
> 

-- 
sergeyb@

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test
  2020-03-17 15:00 ` Sergey Bronnikov
@ 2020-03-17 21:46   ` Oleg Piskunov
  2020-03-18 10:01   ` Alexander Tikhonov
  1 sibling, 0 replies; 4+ messages in thread
From: Oleg Piskunov @ 2020-03-17 21:46 UTC (permalink / raw)
  To: Sergey Bronnikov, Alexander V. Tikhonov; +Cc: tarantool-patches

[-- Attachment #1: Type: text/plain, Size: 802 bytes --]



Hi,
 
Agreed with everything except one place:
  
>> diff --git a/test/box/gh-3290-ddl_collation_deleted.test.lua b/test/box/gh-3290-ddl_collation_deleted.test.lua
>> new file mode 100644
>> index 000000000..f36838e7a
>> --- /dev/null
>> +++ b/test/box/gh-3290-ddl_collation_deleted.test.lua
>> @@ -0,0 +1,10 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
>
>> +--
>> +-- gh-3290: expose ICU into Lua. It uses built-in collations, that
>> +-- must work even if a collation is deleted from _collation.
>> +--
>> +t = box.space._collation:delete{1}
>> +utf8.cmp('abc', 'def')
>> +box.space._collation:replace(t)
>
>missed cleanup
> 
In this place cleanup not needed.
The last line restores the original state or «cleanup»
 
>--
>sergeyb@ 
 
 
--
Oleg Piskunov
 

[-- Attachment #2: Type: text/html, Size: 1345 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test
  2020-03-17 15:00 ` Sergey Bronnikov
  2020-03-17 21:46   ` Oleg Piskunov
@ 2020-03-18 10:01   ` Alexander Tikhonov
  1 sibling, 0 replies; 4+ messages in thread
From: Alexander Tikhonov @ 2020-03-18 10:01 UTC (permalink / raw)
  To: Sergey Bronnikov, Oleg Piskunov, tarantool-patches

[-- Attachment #1: Type: text/plain, Size: 13820 bytes --]


Hi,

Sergey, thanks for the review, I’ve made the changes as you suggested.
 
>Вторник, 17 марта 2020, 18:00 +03:00 от Sergey Bronnikov < sergeyb@tarantool.org >:
> 
>Hi,
>
>comments inline
>
>On 19:19 Mon 16 Mar , Alexander V. Tikhonov wrote:
>> Divided into tests:
>> - box/ddl_alter.test.lua
>> - box/ddl_collation.test.lua
>> - box/ddl_collation_types.test.lua
>> - box/ddl_collation_wrong_id.test.lua
>> - box/ddl_no_collation.test.lua
>> - box/ddl_parallel.test.lua
>> - box/ddl_tuple.test.lua
>> - box/gh-2336-ddl_call_twice.test.lua
>> - box/gh-2783-ddl_lock.test.lua
>> - box/gh-2839-ddl_custom_fields.test.lua
>> - box/gh-2937-ddl_collation_field_def.test.lua
>> - box/gh-3290-ddl_collation_deleted.test.lua
>> - box/gh-928-ddl_truncate.test.lua
>> ---
>>
>> Github:  https://github.com/tarantool/tarantool/tree/avtikhon/divide_tests
>
>> diff --git a/test/box/ddl_alter.test.lua b/test/box/ddl_alter.test.lua
>> new file mode 100644
>> index 000000000..84c25abdb
>> --- /dev/null
>> +++ b/test/box/ddl_alter.test.lua
>> @@ -0,0 +1,12 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>
>> +-- index should not crash after alter
>> +space = box.schema.space.create('test_swap')
>> +index = space:create_index('pk')
>> +space:replace({1, 2, 3})
>> +index:rename('primary')
>> +index2 = space:create_index('sec')
>> +space:replace({2, 3, 1})
>> +space:select()
>> +space:drop()
>
>> diff --git a/test/box/ddl_collation_types.test.lua b/test/box/ddl_collation_types.test.lua
>> new file mode 100644
>> index 000000000..478530537
>> --- /dev/null
>> +++ b/test/box/ddl_collation_types.test.lua
>> @@ -0,0 +1,9 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>> +-- Check that collation is allowed only for strings, scalar and any types.
>> +format = {}
>> +format[1] = {'field1', 'unsigned', collation = 'unicode'}
>> +s = box.schema.create_space('test', {format = format})
>> +format[1] = {'field2', 'array', collation = 'unicode_ci'}
>> +s = box.schema.create_space('test', {format = format})
>
>missed cleanup here
Not needed due to non of the spaces created.
>
>> diff --git a/test/box/ddl_collation_wrong_id.test.lua b/test/box/ddl_collation_wrong_id.test.lua
>> new file mode 100644
>> index 000000000..0aaab322d
>> --- /dev/null
>> +++ b/test/box/ddl_collation_wrong_id.test.lua
>> @@ -0,0 +1,10 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>> +-- Check that error is raised when collation with wrong id is used.
>> +_space = box.space[box.schema.SPACE_ID]
>> +utils = require('utils')
>> +EMPTY_MAP = utils.setmap({})
>> +format = {{name = 'field1', type = 'string', collation = 666}}
>> +surrogate_space = {12345, 1, 'test', 'memtx', 0, EMPTY_MAP, format}
>> +_space:insert(surrogate_space)
>
>missed cleanup
Neither the original code had cleanup neither it could be added here, because of the error:
 - error: Can't drop the primary key in a system space, space '_space'
>
>> diff --git a/test/box/ddl_no_collation.test.lua b/test/box/ddl_no_collation.test.lua
>> new file mode 100644
>> index 000000000..a5fdedd02
>> --- /dev/null
>> +++ b/test/box/ddl_no_collation.test.lua
>> @@ -0,0 +1,7 @@
>> +env = require('test_run')
>> +test_run = env.new()
>> +
>> +-- Check that error is raised when collation doesn't exists.
>> +format = {}
>> +format[1] = {'field1', 'unsigend', collation = 'test_coll'}
>> +s = box.schema.create_space('test', {format = format})
>
>> diff --git a/test/box/ddl_parallel.test.lua b/test/box/ddl_parallel.test.lua
>> new file mode 100644
>> index 000000000..99c3bfdcc
>> --- /dev/null
>> +++ b/test/box/ddl_parallel.test.lua
>> @@ -0,0 +1,30 @@
>> +env = require('test_run')
>> +test_run = env.new()
>> +
>> +fiber = require'fiber'
>> +
>> +-- simple test for parallel ddl execution
>> +_ = box.schema.space.create('test'):create_index('pk')
>> +
>> +ch = fiber.channel(2)
>> +
>> +test_run:cmd("setopt delimiter ';'")
>> +
>> +function f1()
>> + box.space.test:create_index('sec', {parts = {2, 'num'}})
>> + ch:put(true)
>> +end;
>> +
>> +function f2()
>> + box.space.test:create_index('third', {parts = {3, 'string'}})
>> + ch:put(true)
>> +end;
>> +
>> +test_run:cmd("setopt delimiter ''");
>> +
>> +_ = {fiber.create(f1), fiber.create(f2)}
>> +
>> +ch:get()
>> +ch:get()
>> +
>> +_ = box.space.test:drop()
>> diff --git a/test/box/ddl_tuple.result b/test/box/ddl_tuple.result
>> new file mode 100644
>> index 000000000..6a024a833
>> --- /dev/null
>> +++ b/test/box/ddl_tuple.result
>> @@ -0,0 +1,67 @@
>> +-- test-run result file version 2
>> +env = require('test_run')
>> + | ---
>> + | ...
>> +test_run = env.new()
>> + | ---
>> + | ...
>> +
>> +fiber = require'fiber'
>> + | ---
>> + | ...
>> +ch = fiber.channel(3)
>> + | ---
>> + | ...
>> +
>> +_ = box.schema.space.create('test'):create_index('pk')
>> + | ---
>> + | ...
>> +
>> +test_run:cmd("setopt delimiter ';'")
>> + | ---
>> + | - true
>> + | ...
>> +function add_index()
>> + box.space.test:create_index('sec', {parts = {2, 'num'}})
>> + ch:put(true)
>> +end;
>> + | ---
>> + | ...
>> +
>> +function insert_tuple(tuple)
>> + ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
>> +end;
>> + | ---
>> + | ...
>> +test_run:cmd("setopt delimiter ''");
>> + | ---
>> + | - true
>> + | ...
>> +
>> +_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
>> + | ---
>> + | ...
>> +{ch:get(), ch:get(), ch:get()}
>> + | ---
>> + | - - - false
>> + | - 'Tuple field 2 type does not match one required by operation: expected unsigned'
>> + | - - true
>> + | - [1, 2, 'a']
>> + | - true
>> + | ...
>> +
>> +box.space.test:select()
>> + | ---
>> + | - - [1, 2, 'a']
>> + | ...
>> +
>> +test_run:cmd('restart server default')
>> + |
>> +
>> +box.space.test:select()
>> + | ---
>> + | - - [1, 2, 'a']
>> + | ...
>> +box.space.test:drop()
>> + | ---
>> + | ...
>> diff --git a/test/box/ddl_tuple.test.lua b/test/box/ddl_tuple.test.lua
>> new file mode 100644
>> index 000000000..1c78a00e4
>> --- /dev/null
>> +++ b/test/box/ddl_tuple.test.lua
>> @@ -0,0 +1,28 @@
>> +env = require('test_run')
>> +test_run = env.new()
>> +
>> +fiber = require'fiber'
>> +ch = fiber.channel(3)
>> +
>> +_ = box.schema.space.create('test'):create_index('pk')
>> +
>> +test_run:cmd("setopt delimiter ';'")
>> +function add_index()
>> + box.space.test:create_index('sec', {parts = {2, 'num'}})
>> + ch:put(true)
>> +end;
>> +
>> +function insert_tuple(tuple)
>> + ch:put({pcall(box.space.test.replace, box.space.test, tuple)})
>> +end;
>> +test_run:cmd("setopt delimiter ''");
>> +
>> +_ = {fiber.create(insert_tuple, {1, 2, 'a'}), fiber.create(add_index), fiber.create(insert_tuple, {2, '3', 'b'})}
>> +{ch:get(), ch:get(), ch:get()}
>> +
>> +box.space.test:select()
>> +
>> +test_run:cmd('restart server default')
>> +
>> +box.space.test:select()
>> +box.space.test:drop()
>> diff --git a/test/box/gh-2336-ddl_call_twice.result b/test/box/gh-2336-ddl_call_twice.result
>> new file mode 100644
>> index 000000000..aa4dee54b
>> --- /dev/null
>> +++ b/test/box/gh-2336-ddl_call_twice.result
>> @@ -0,0 +1,51 @@
>> +-- test-run result file version 2
>> +env = require('test_run')
>> + | ---
>> + | ...
>> +test_run = env.new()
>> + | ---
>> + | ...
>> +
>> +-- gh-2336 crash if format called twice during snapshot
>> +fiber = require'fiber'
>> + | ---
>> + | ...
>> +
>> +space = box.schema.space.create('test_format')
>> + | ---
>> + | ...
>> +_ = space:create_index('pk', { parts = { 1,'str' }})
>> + | ---
>> + | ...
>> +space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
>> + | ---
>> + | ...
>> +str = string.rep("t",1024)
>> + | ---
>> + | ...
>> +for i = 1, 10000 do space:insert{tostring(i), str} end
>> + | ---
>> + | ...
>> +ch = fiber.channel(3)
>> + | ---
>> + | ...
>> +_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
>> + | ---
>> + | ...
>> +format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
>> + | ---
>> + | ...
>> +for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
>> + | ---
>> + | ...
>> +
>> +{ch:get(), ch:get(), ch:get()}
>> + | ---
>> + | - - true
>> + | - true
>> + | - true
>> + | ...
>> +
>> +space:drop()
>> + | ---
>> + | ...
>> diff --git a/test/box/gh-2336-ddl_call_twice.test.lua b/test/box/gh-2336-ddl_call_twice.test.lua
>> new file mode 100644
>> index 000000000..cf187c1bd
>> --- /dev/null
>> +++ b/test/box/gh-2336-ddl_call_twice.test.lua
>> @@ -0,0 +1,19 @@
>> +env = require('test_run')
>> +test_run = env.new()
>> +
>> +-- gh-2336 crash if format called twice during snapshot
>> +fiber = require'fiber'
>> +
>> +space = box.schema.space.create('test_format')
>> +_ = space:create_index('pk', { parts = { 1,'str' }})
>> +space:format({{ name ="key"; type = "string" }, { name ="dataAB"; type = "string" }})
>> +str = string.rep("t",1024)
>> +for i = 1, 10000 do space:insert{tostring(i), str} end
>> +ch = fiber.channel(3)
>> +_ = fiber.create(function() fiber.yield() box.snapshot() ch:put(true) end)
>> +format = {{name ="key"; type = "string"}, {name ="data"; type = "string"}}
>> +for i = 1, 2 do fiber.create(function() fiber.yield() space:format(format) ch:put(true) end) end
>> +
>> +{ch:get(), ch:get(), ch:get()}
>> +
>> +space:drop()
>
>
>> diff --git a/test/box/gh-2783-ddl_lock.test.lua b/test/box/gh-2783-ddl_lock.test.lua
>> new file mode 100644
>> index 000000000..953e177a7
>> --- /dev/null
>> +++ b/test/box/gh-2783-ddl_lock.test.lua
>> @@ -0,0 +1,33 @@
>> +env = require('test_run')
>> +test_run = env.new()
>> +
>> +--
>> +-- gh-2783
>> +-- A ddl operation shoud fail before trying to lock a ddl latch
>> +-- in a multi-statement transaction.
>> +-- If operation tries to lock already an locked latch then the
>> +-- current transaction will be silently rolled back under our feet.
>> +-- This is confusing. So check for multi-statement transaction
>> +-- before locking the latch.
>> +--
>> +test_latch = box.schema.space.create('test_latch')
>> +_ = test_latch:create_index('primary', {unique = true, parts = {1, 'unsigned'}})
>> +fiber = require('fiber')
>> +c = fiber.channel(1)
>> +test_run:cmd("setopt delimiter ';'")
>> +_ = fiber.create(function()
>> + test_latch:create_index("sec", {unique = true, parts = {2, 'unsigned'}})
>> + c:put(true)
>> +end);
>> +
>> +-- Should be Ok for now
>> +box.begin()
>> + test_latch:create_index("sec2", {unique = true, parts = {2, 'unsigned'}})
>> +box.commit();
>> +test_run:cmd("setopt delimiter ''");
>> +-- Explicitly roll back the transaction in multi-statement,
>> +-- which hasn't finished due to DDL error
>> +box.rollback()
>> +
>> +_ = c:get()
>> +test_latch:drop() -- this is where everything stops
>
>
>> diff --git a/test/box/gh-2839-ddl_custom_fields.test.lua b/test/box/gh-2839-ddl_custom_fields.test.lua
>> new file mode 100644
>> index 000000000..5f0cb243f
>> --- /dev/null
>> +++ b/test/box/gh-2839-ddl_custom_fields.test.lua
>> @@ -0,0 +1,13 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>
>> +-- gh-2839: allow to store custom fields in field definition.
>> +--
>> +format = {}
>> +format[1] = {name = 'field1', type = 'unsigned'}
>> +format[2] = {'field2', 'unsigned'}
>> +format[3] = {'field3', 'unsigned', custom_field = 'custom_value'}
>> +s = box.schema.create_space('test', {format = format})
>> +s:format()[3].custom_field
>> +s:drop()
>
>
>> diff --git a/test/box/gh-2937-ddl_collation_field_def.test.lua b/test/box/gh-2937-ddl_collation_field_def.test.lua
>> new file mode 100644
>> index 000000000..0906afebd
>> --- /dev/null
>> +++ b/test/box/gh-2937-ddl_collation_field_def.test.lua
>> @@ -0,0 +1,13 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>> +
>> +--
>> +-- gh-2937: allow to specify collation in field definition.
>> +--
>> +format = {}
>> +format[1] = {name = 'field1', type = 'string', collation = 'unicode'}
>> +format[2] = {'field2', 'any', collation = 'unicode_ci'}
>> +format[3] = {type = 'scalar', name = 'field3', collation = 'unicode'}
>> +s = box.schema.create_space('test', {format = format})
>> +s:format()
>> +s:drop()
>
>> diff --git a/test/box/gh-3290-ddl_collation_deleted.test.lua b/test/box/gh-3290-ddl_collation_deleted.test.lua
>> new file mode 100644
>> index 000000000..f36838e7a
>> --- /dev/null
>> +++ b/test/box/gh-3290-ddl_collation_deleted.test.lua
>> @@ -0,0 +1,10 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>> +--
>> +-- gh-3290: expose ICU into Lua. It uses built-in collations, that
>> +-- must work even if a collation is deleted from _collation.
>> +--
>> +t = box.space._collation:delete{1}
>> +utf8.cmp('abc', 'def')
>> +box.space._collation:replace(t)
>
>missed cleanup
Seems that no need in cleanup here.
>
>
>> diff --git a/test/box/gh-928-ddl_truncate.test.lua b/test/box/gh-928-ddl_truncate.test.lua
>> new file mode 100644
>> index 000000000..304cc2cfc
>> --- /dev/null
>> +++ b/test/box/gh-928-ddl_truncate.test.lua
>> @@ -0,0 +1,17 @@
>> +env = require('test_run')
>> +test_run = env.new()
>
>unused variables
Removed.
>> +fiber = require'fiber'
>> +ch = fiber.channel(2)
>> +
>> +--issue #928
>> +space = box.schema.space.create('test_trunc')
>> +_ = space:create_index('pk')
>> +_ = box.space.test_trunc:create_index('i1', {type = 'hash', parts = {2, 'STR'}})
>> +_ = box.space.test_trunc:create_index('i2', {type = 'hash', parts = {2, 'STR'}})
>> +
>> +function test_trunc() space:truncate() ch:put(true) end
>> +
>> +_ = {fiber.create(test_trunc), fiber.create(test_trunc)}
>> +_ = {ch:get(), ch:get()}
>> +space:drop()
>> --
>> 2.17.1
>>
>
>--
>sergeyb@ 
 
 
--
Alexander Tikhonov
 
 

[-- Attachment #2: Type: text/html, Size: 21654 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-03-18 10:01 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-16 16:19 [Tarantool-patches] [PATCH v1] Divide box/ddl.test.lua test Alexander V. Tikhonov
2020-03-17 15:00 ` Sergey Bronnikov
2020-03-17 21:46   ` Oleg Piskunov
2020-03-18 10:01   ` Alexander Tikhonov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox