<HTML><BODY><div><div>Hi,</div><div> </div><div>Sergey, need to change cleanup for most splitted tests.</div><div>Please chenge «truncate()» to «drop()»</div><div> </div><div>Regards,</div><div>Oleg</div><div> </div><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">Среда, 18 марта 2020, 11:00 +03:00 от Sergey Bronnikov <sergeyb@tarantool.org>:<br> <div id=""><div class="js-helper js-readmsg-msg"><style type="text/css"></style><div><div id="style_15845184370277555792_BODY">CCed: A. Tikhonov, A. Turenko and O. Piskunov<br><br>On 18:11 Tue 17 Mar , Sergey Bronnikov wrote:<div class="mail-quote-collapse">> Splitted single hash.test.lua to a set of small independent tests.<br>><br>> GitHub branch: <a href="https://github.com/tarantool/tarantool/tree/ligurio/hash_test_split" target="_blank">https://github.com/tarantool/tarantool/tree/ligurio/hash_test_split</a><br>><br>> ---<br>> test/box/hash.result | 873 --------------------------<br>> test/box/hash.test.lua | 364 -----------<br>> test/box/hash_32bit_delete.result | 70 +++<br>> test/box/hash_32bit_delete.test.lua | 29 +<br>> test/box/hash_32bit_insert.result | 38 ++<br>> test/box/hash_32bit_insert.test.lua | 16 +<br>> test/box/hash_32bit_replace.result | 56 ++<br>> test/box/hash_32bit_replace.test.lua | 25 +<br>> test/box/hash_32bit_select.result | 70 +++<br>> test/box/hash_32bit_select.test.lua | 29 +<br>> test/box/hash_64bit_delete.result | 111 ++++<br>> test/box/hash_64bit_delete.test.lua | 42 ++<br>> test/box/hash_64bit_insert.result | 54 ++<br>> test/box/hash_64bit_insert.test.lua | 20 +<br>> test/box/hash_64bit_replace.result | 68 ++<br>> test/box/hash_64bit_replace.test.lua | 28 +<br>> test/box/hash_64bit_select.result | 94 +++<br>> test/box/hash_64bit_select.test.lua | 37 ++<br>> test/box/hash_collation.result | 62 ++<br>> test/box/hash_collation.test.lua | 22 +<br>> test/box/hash_gh-1467.result | 17 +<br>> test/box/hash_gh-1467.test.lua | 6 +<br>> test/box/hash_gh-3907.result | 48 ++<br>> test/box/hash_gh-3907.test.lua | 15 +<br>> test/box/hash_gh-616.result | 17 +<br>> test/box/hash_gh-616.test.lua | 7 +<br>> test/box/hash_iterate.result | 21 +<br>> test/box/hash_iterate.test.lua | 6 +<br>> test/box/hash_not_a_multikey.result | 17 +<br>> test/box/hash_not_a_multikey.test.lua | 6 +<br>> test/box/hash_replace.result | 256 ++++++++<br>> test/box/hash_replace.test.lua | 88 +++<br>> test/box/hash_string_delete.result | 66 ++<br>> test/box/hash_string_delete.test.lua | 26 +<br>> test/box/hash_string_insert.result | 32 +<br>> test/box/hash_string_insert.test.lua | 13 +<br>> test/box/hash_string_replace.result | 47 ++<br>> test/box/hash_string_replace.test.lua | 19 +<br>> test/box/hash_string_select.result | 63 ++<br>> test/box/hash_string_select.test.lua | 25 +<br>> test/box/hash_with_function.result | 26 +<br>> test/box/hash_with_function.test.lua | 9 +<br>> 42 files changed, 1701 insertions(+), 1237 deletions(-)<br>> delete mode 100644 test/box/hash.result<br>> delete mode 100644 test/box/hash.test.lua<br>> create mode 100644 test/box/hash_32bit_delete.result<br>> create mode 100644 test/box/hash_32bit_delete.test.lua<br>> create mode 100644 test/box/hash_32bit_insert.result<br>> create mode 100644 test/box/hash_32bit_insert.test.lua<br>> create mode 100644 test/box/hash_32bit_replace.result<br>> create mode 100644 test/box/hash_32bit_replace.test.lua<br>> create mode 100644 test/box/hash_32bit_select.result<br>> create mode 100644 test/box/hash_32bit_select.test.lua<br>> create mode 100644 test/box/hash_64bit_delete.result<br>> create mode 100644 test/box/hash_64bit_delete.test.lua<br>> create mode 100644 test/box/hash_64bit_insert.result<br>> create mode 100644 test/box/hash_64bit_insert.test.lua<br>> create mode 100644 test/box/hash_64bit_replace.result<br>> create mode 100644 test/box/hash_64bit_replace.test.lua<br>> create mode 100644 test/box/hash_64bit_select.result<br>> create mode 100644 test/box/hash_64bit_select.test.lua<br>> create mode 100644 test/box/hash_collation.result<br>> create mode 100644 test/box/hash_collation.test.lua<br>> create mode 100644 test/box/hash_gh-1467.result<br>> create mode 100644 test/box/hash_gh-1467.test.lua<br>> create mode 100644 test/box/hash_gh-3907.result<br>> create mode 100644 test/box/hash_gh-3907.test.lua<br>> create mode 100644 test/box/hash_gh-616.result<br>> create mode 100644 test/box/hash_gh-616.test.lua<br>> create mode 100644 test/box/hash_iterate.result<br>> create mode 100644 test/box/hash_iterate.test.lua<br>> create mode 100644 test/box/hash_not_a_multikey.result<br>> create mode 100644 test/box/hash_not_a_multikey.test.lua<br>> create mode 100644 test/box/hash_replace.result<br>> create mode 100644 test/box/hash_replace.test.lua<br>> create mode 100644 test/box/hash_string_delete.result<br>> create mode 100644 test/box/hash_string_delete.test.lua<br>> create mode 100644 test/box/hash_string_insert.result<br>> create mode 100644 test/box/hash_string_insert.test.lua<br>> create mode 100644 test/box/hash_string_replace.result<br>> create mode 100644 test/box/hash_string_replace.test.lua<br>> create mode 100644 test/box/hash_string_select.result<br>> create mode 100644 test/box/hash_string_select.test.lua<br>> create mode 100644 test/box/hash_with_function.result<br>> create mode 100644 test/box/hash_with_function.test.lua<br>><br>> diff --git a/test/box/hash.result b/test/box/hash.result<br>> deleted file mode 100644<br>> index 5e1441ecc..000000000<br>> --- a/test/box/hash.result<br>> +++ /dev/null<br>> @@ -1,873 +0,0 @@<br>> ---=============================================================================<br>> --- 32-bit hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash insert fields tests<br>> --------------------------------------------------------------------------------<br>> -hash = box.schema.space.create('tweedledum')<br>> ----<br>> -...<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -bsize = tmp:bsize()<br>> ----<br>> -...<br>> --- Insert valid fields<br>> -hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [1, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [2, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [3, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -tmp:bsize() > bsize<br>> ----<br>> -- true<br>> -...<br>> --- Insert invalid fields<br>> -hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> --- Replace valid fields<br>> -hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> --- Replace invalid fields<br>> -hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash select fields test<br>> --------------------------------------------------------------------------------<br>> --- select by valid keys<br>> -hash.index['primary']:get{0}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash.index['primary']:get{1}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash.index['primary']:get{2}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash.index['primary']:get{3}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash.index['primary']:get{4}<br>> ----<br>> -...<br>> -hash.index['primary']:get{5}<br>> ----<br>> -...<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'invalid key'}<br>> ----<br>> -- error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> -...<br>> -hash.index['primary']:get{1, 2}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash delete fields test<br>> --------------------------------------------------------------------------------<br>> --- delete by valid keys<br>> -hash:delete{0}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{1}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:delete{2}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash:delete{3}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:delete{4}<br>> ----<br>> -...<br>> -hash:delete{5}<br>> ----<br>> -...<br>> --- delete by invalid keys<br>> -hash:delete{'invalid key'}<br>> ----<br>> -- error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> -...<br>> -hash:delete{1, 2}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> -hash:truncate()<br>> ----<br>> -...<br>> ---=============================================================================<br>> --- 64-bit hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash inset fields tests<br>> --------------------------------------------------------------------------------<br>> --- Insert valid fields<br>> -hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [1, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [2, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [3, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> --- Insert invalid fields<br>> -hash:insert{100, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [100, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{101, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [101, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{102, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [102, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{103, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [103, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> --- Replace valid fields<br>> -hash:replace{3ULL, 'value1 v1.31', 'value2 1.12'}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:replace{1ULL, 'value1 v1.32', 'value2 1.72'}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:replace{2ULL, 'value1 v1.43', 'value2 1.92'}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> --- Replace invalid fields<br>> -hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash select fields test<br>> --------------------------------------------------------------------------------<br>> --- select by valid keys<br>> -hash.index['primary']:get{0ULL}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash.index['primary']:get{1ULL}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash.index['primary']:get{2ULL}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash.index['primary']:get{3ULL}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash.index['primary']:get{4ULL}<br>> ----<br>> -...<br>> -hash.index['primary']:get{5ULL}<br>> ----<br>> -...<br>> --- select by valid NUM keys<br>> -hash.index['primary']:get{0}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash.index['primary']:get{1}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash.index['primary']:get{2}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash.index['primary']:get{3}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash.index['primary']:get{4}<br>> ----<br>> -...<br>> -hash.index['primary']:get{5}<br>> ----<br>> -...<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'invalid key'}<br>> ----<br>> -- error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> -...<br>> -hash.index['primary']:get{'00000001', '00000002'}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash delete fields test<br>> --------------------------------------------------------------------------------<br>> --- delete by valid keys<br>> -hash:delete{0ULL}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{1ULL}<br>> ----<br>> -- [1, 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:delete{2ULL}<br>> ----<br>> -- [2, 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash:delete{3ULL}<br>> ----<br>> -- [3, 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:delete{4ULL}<br>> ----<br>> -...<br>> -hash:delete{5ULL}<br>> ----<br>> -...<br>> -hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [1, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [2, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- [3, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> --- delete by valid NUM keys<br>> -hash:delete{0}<br>> ----<br>> -- [0, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{1}<br>> ----<br>> -- [1, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{2}<br>> ----<br>> -- [2, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{3}<br>> ----<br>> -- [3, 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{4}<br>> ----<br>> -...<br>> -hash:delete{5}<br>> ----<br>> -...<br>> --- delete by invalid keys<br>> -hash:delete{'invalid key'}<br>> ----<br>> -- error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> -...<br>> -hash:delete{'00000001', '00000002'}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> -hash:truncate()<br>> ----<br>> -...<br>> ---=============================================================================<br>> --- String hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- String hash inset fields tests<br>> --------------------------------------------------------------------------------<br>> -hash.index['primary']:drop()<br>> ----<br>> -...<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> ----<br>> -...<br>> --- Insert valid fields<br>> -hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> ----<br>> -- ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- String hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> --- Replace valid fields<br>> -hash:replace{'key 3', 'value1 v1.31', 'value2 1.12'}<br>> ----<br>> -- ['key 3', 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:replace{'key 1', 'value1 v1.32', 'value2 1.72'}<br>> ----<br>> -- ['key 1', 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:replace{'key 2', 'value1 v1.43', 'value2 1.92'}<br>> ----<br>> -- ['key 2', 'value1 v1.43', 'value2 1.92']<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- String hash select fields test<br>> --------------------------------------------------------------------------------<br>> --- select by valid keys<br>> -hash.index['primary']:get{'key 0'}<br>> ----<br>> -- ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash.index['primary']:get{'key 1'}<br>> ----<br>> -- ['key 1', 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash.index['primary']:get{'key 2'}<br>> ----<br>> -- ['key 2', 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash.index['primary']:get{'key 3'}<br>> ----<br>> -- ['key 3', 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash.index['primary']:get{'key 4'}<br>> ----<br>> -...<br>> -hash.index['primary']:get{'key 5'}<br>> ----<br>> -...<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'key 1', 'key 2'}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- String hash delete fields test<br>> --------------------------------------------------------------------------------<br>> --- delete by valid keys<br>> -hash:delete{'key 0'}<br>> ----<br>> -- ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> -...<br>> -hash:delete{'key 1'}<br>> ----<br>> -- ['key 1', 'value1 v1.32', 'value2 1.72']<br>> -...<br>> -hash:delete{'key 2'}<br>> ----<br>> -- ['key 2', 'value1 v1.43', 'value2 1.92']<br>> -...<br>> -hash:delete{'key 3'}<br>> ----<br>> -- ['key 3', 'value1 v1.31', 'value2 1.12']<br>> -...<br>> -hash:delete{'key 4'}<br>> ----<br>> -...<br>> -hash:delete{'key 5'}<br>> ----<br>> -...<br>> --- delete by invalid keys<br>> -hash:delete{'key 1', 'key 2'}<br>> ----<br>> -- error: Invalid key part count in an exact match (expected 1, got 2)<br>> -...<br>> -hash:truncate()<br>> ----<br>> -...<br>> --------------------------------------------------------------------------------<br>> --- Collation test<br>> --------------------------------------------------------------------------------<br>> -hash.index['primary']:drop()<br>> ----<br>> -...<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {{1, 'string', collation = 'unicode_ci'}}, unique = true})<br>> ----<br>> -...<br>> -tmp = hash:create_index('secondary', { type = 'hash', parts = {{2, 'scalar', collation = 'unicode_ci'}}, unique = true})<br>> ----<br>> -...<br>> -hash:insert{'Ёж', 'Hedgehog'}<br>> ----<br>> -- ['Ёж', 'Hedgehog']<br>> -...<br>> -hash:insert{'Ёлка', 'Spruce'}<br>> ----<br>> -- ['Ёлка', 'Spruce']<br>> -...<br>> -hash:insert{'Jogurt', 'Йогурт'}<br>> ----<br>> -- ['Jogurt', 'Йогурт']<br>> -...<br>> -hash:insert{'Один', 1}<br>> ----<br>> -- ['Один', 1]<br>> -...<br>> -hash.index.primary:get('ёж')<br>> ----<br>> -- ['Ёж', 'Hedgehog']<br>> -...<br>> -hash.index.primary:get('елка')<br>> ----<br>> -- ['Ёлка', 'Spruce']<br>> -...<br>> -hash.index.secondary:get('spruce')<br>> ----<br>> -- ['Ёлка', 'Spruce']<br>> -...<br>> -hash.index.secondary:get('йогурт')<br>> ----<br>> -- ['Jogurt', 'Йогурт']<br>> -...<br>> -hash.index.secondary:get(1)<br>> ----<br>> -- ['Один', 1]<br>> -...<br>> -hash.index.secondary:get('иогурт')<br>> ----<br>> -...<br>> -hash.index.secondary:get(2)<br>> ----<br>> -...<br>> -------------------------<br>> --- hash::replace tests<br>> -------------------------<br>> -hash.index['secondary']:drop()<br>> ----<br>> -...<br>> -hash.index['primary']:drop()<br>> ----<br>> -...<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -tmp = hash:create_index('field1', { type = 'hash', parts = {2, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -tmp = hash:create_index('field2', { type = 'hash', parts = {3, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -tmp = hash:create_index('field3', { type = 'hash', parts = {4, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -hash:insert{0, 0, 0, 0}<br>> ----<br>> -- [0, 0, 0, 0]<br>> -...<br>> -hash:insert{1, 1, 1, 1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> -hash:insert{2, 2, 2, 2}<br>> ----<br>> -- [2, 2, 2, 2]<br>> -...<br>> --- OK<br>> -hash:replace{1, 1, 1, 1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -...<br>> -hash.index['primary']:get{1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> -hash.index['field1']:get{1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> -hash.index['field2']:get{1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> -hash.index['field3']:get{1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> --- OK<br>> -hash:insert{10, 10, 10, 10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash:delete{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -...<br>> --- TupleFound (primary key)<br>> -hash:insert{1, 10, 10, 10}<br>> ----<br>> -- error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -...<br>> -hash.index['primary']:get{1}<br>> ----<br>> -- [1, 1, 1, 1]<br>> -...<br>> --- TupleNotFound (primary key)<br>> -hash:replace{10, 10, 10, 10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> --- TupleFound (key --1)<br>> -hash:insert{10, 0, 10, 10}<br>> ----<br>> -- error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{0}<br>> ----<br>> -- [0, 0, 0, 0]<br>> -...<br>> --- TupleFound (key --1)<br>> --- hash:replace_if_exists(2, 0, 10, 10)<br>> -hash.index['primary']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{0}<br>> ----<br>> -- [0, 0, 0, 0]<br>> -...<br>> --- TupleFound (key --3)<br>> -hash:insert{10, 10, 10, 0}<br>> ----<br>> -- error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> -...<br>> -hash.index['primary']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{0}<br>> ----<br>> -- [0, 0, 0, 0]<br>> -...<br>> --- TupleFound (key --3)<br>> --- hash:replace_if_exists(2, 10, 10, 0)<br>> -hash.index['primary']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field1']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field2']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{10}<br>> ----<br>> -- [10, 10, 10, 10]<br>> -...<br>> -hash.index['field3']:get{0}<br>> ----<br>> -- [0, 0, 0, 0]<br>> -...<br>> -hash:drop()<br>> ----<br>> -...<br>> -hash = box.schema.space.create('tweedledum')<br>> ----<br>> -...<br>> -hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> ----<br>> -...<br>> -hash:insert{0}<br>> ----<br>> -- [0]<br>> -...<br>> -hash:insert{16}<br>> ----<br>> -- [16]<br>> -...<br>> -for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> ----<br>> -...<br>> -hash:drop()<br>> ----<br>> -...<br>> ---<br>> --- gh-616 "1-based indexing and 0-based error message<br>> ---<br>> -_ = box.schema.create_space('test')<br>> ----<br>> -...<br>> -_ = box.space.test:create_index('i',{parts={1,'string'}})<br>> ----<br>> -...<br>> -box.space.test:insert{1}<br>> ----<br>> -- error: 'Tuple field 1 type does not match one required by operation: expected string'<br>> -...<br>> -box.space.test:drop()<br>> ----<br>> -...<br>> --- gh-1467: invalid iterator type<br>> -space = box.schema.space.create('test')<br>> ----<br>> -...<br>> -index = space:create_index('primary', { type = 'hash' })<br>> ----<br>> -...<br>> -space:select({1}, {iterator = 'BITS_ALL_SET' } )<br>> ----<br>> -- error: Index 'primary' (HASH) of space 'test' (memtx) does not support requested<br>> - iterator type<br>> -...<br>> -space:drop()<br>> ----<br>> -...<br>> --- gh-3907: check that integer numbers stored as MP_FLOAT/MP_DOUBLE<br>> --- are hashed as MP_INT/MP_UINT.<br>> -ffi = require('ffi')<br>> ----<br>> -...<br>> -s = box.schema.space.create('test')<br>> ----<br>> -...<br>> -_ = s:create_index('primary', {type = 'hash', parts = {1, 'number'}})<br>> ----<br>> -...<br>> -s:insert{ffi.new('double', 0)}<br>> ----<br>> -- [0]<br>> -...<br>> -s:insert{ffi.new('double', -1)}<br>> ----<br>> -- [-1]<br>> -...<br>> -s:insert{ffi.new('double', 9007199254740992)}<br>> ----<br>> -- [9007199254740992]<br>> -...<br>> -s:insert{ffi.new('double', -9007199254740994)}<br>> ----<br>> -- [-9007199254740994]<br>> -...<br>> -s:get(0LL)<br>> ----<br>> -- [0]<br>> -...<br>> -s:get(-1LL)<br>> ----<br>> -- [-1]<br>> -...<br>> -s:get(9007199254740992LL)<br>> ----<br>> -- [9007199254740992]<br>> -...<br>> -s:get(-9007199254740994LL)<br>> ----<br>> -- [-9007199254740994]<br>> -...<br>> -s:drop()<br>> ----<br>> -...<br>> --- Hash index cannot be multikey.<br>> -s = box.schema.space.create('test')<br>> ----<br>> -...<br>> -_ = s:create_index('primary')<br>> ----<br>> -...<br>> -_ = s:create_index('hash', {type = 'hash', parts = {{'[2][*]', 'unsigned'}}})<br>> ----<br>> -- error: 'Can''t create or modify index ''hash'' in space ''test'': HASH index cannot<br>> - be multikey'<br>> -...<br>> -s:drop()<br>> ----<br>> -...<br>> --- Hash index can not use function.<br>> -s = box.schema.space.create('withdata')<br>> ----<br>> -...<br>> -lua_code = [[function(tuple) return tuple[1] + tuple[2] end]]<br>> ----<br>> -...<br>> -box.schema.func.create('s', {body = lua_code, is_deterministic = true, is_sandboxed = true})<br>> ----<br>> -...<br>> -_ = s:create_index('pk')<br>> ----<br>> -...<br>> -_ = s:create_index('idx', {type = 'hash', func = box.func.s.id, parts = {{1, 'unsigned'}}})<br>> ----<br>> -- error: 'Can''t create or modify index ''idx'' in space ''withdata'': HASH index<br>> - can not use a function'<br>> -...<br>> -s:drop()<br>> ----<br>> -...<br>> -box.schema.func.drop('s')<br>> ----<br>> -...<br>> diff --git a/test/box/hash.test.lua b/test/box/hash.test.lua<br>> deleted file mode 100644<br>> index 78c831f77..000000000<br>> --- a/test/box/hash.test.lua<br>> +++ /dev/null<br>> @@ -1,364 +0,0 @@<br>> ---=============================================================================<br>> --- 32-bit hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash insert fields tests<br>> --------------------------------------------------------------------------------<br>> -hash = box.schema.space.create('tweedledum')<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> -<br>> -bsize = tmp:bsize()<br>> -<br>> --- Insert valid fields<br>> -hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> -tmp:bsize() > bsize<br>> -<br>> --- Insert invalid fields<br>> -hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> -<br>> --- Replace valid fields<br>> -hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> -hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> -hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> -<br>> --- Replace invalid fields<br>> -hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash select fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- select by valid keys<br>> -hash.index['primary']:get{0}<br>> -hash.index['primary']:get{1}<br>> -hash.index['primary']:get{2}<br>> -hash.index['primary']:get{3}<br>> -hash.index['primary']:get{4}<br>> -hash.index['primary']:get{5}<br>> -<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'invalid key'}<br>> -hash.index['primary']:get{1, 2}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 32-bit hash delete fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- delete by valid keys<br>> -hash:delete{0}<br>> -hash:delete{1}<br>> -hash:delete{2}<br>> -hash:delete{3}<br>> -hash:delete{4}<br>> -hash:delete{5}<br>> -<br>> --- delete by invalid keys<br>> -hash:delete{'invalid key'}<br>> -hash:delete{1, 2}<br>> -<br>> -hash:truncate()<br>> -<br>> ---=============================================================================<br>> --- 64-bit hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash inset fields tests<br>> --------------------------------------------------------------------------------<br>> -<br>> --- Insert valid fields<br>> -hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --- Insert invalid fields<br>> -hash:insert{100, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{101, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{102, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{103, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> -<br>> --- Replace valid fields<br>> -hash:replace{3ULL, 'value1 v1.31', 'value2 1.12'}<br>> -hash:replace{1ULL, 'value1 v1.32', 'value2 1.72'}<br>> -hash:replace{2ULL, 'value1 v1.43', 'value2 1.92'}<br>> -<br>> --- Replace invalid fields<br>> -hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> -hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> -hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> -hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash select fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- select by valid keys<br>> -hash.index['primary']:get{0ULL}<br>> -hash.index['primary']:get{1ULL}<br>> -hash.index['primary']:get{2ULL}<br>> -hash.index['primary']:get{3ULL}<br>> -hash.index['primary']:get{4ULL}<br>> -hash.index['primary']:get{5ULL}<br>> -<br>> --- select by valid NUM keys<br>> -hash.index['primary']:get{0}<br>> -hash.index['primary']:get{1}<br>> -hash.index['primary']:get{2}<br>> -hash.index['primary']:get{3}<br>> -hash.index['primary']:get{4}<br>> -hash.index['primary']:get{5}<br>> -<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'invalid key'}<br>> -hash.index['primary']:get{'00000001', '00000002'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- 64-bit hash delete fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- delete by valid keys<br>> -hash:delete{0ULL}<br>> -hash:delete{1ULL}<br>> -hash:delete{2ULL}<br>> -hash:delete{3ULL}<br>> -hash:delete{4ULL}<br>> -hash:delete{5ULL}<br>> -<br>> -hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --- delete by valid NUM keys<br>> -hash:delete{0}<br>> -hash:delete{1}<br>> -hash:delete{2}<br>> -hash:delete{3}<br>> -hash:delete{4}<br>> -hash:delete{5}<br>> -<br>> --- delete by invalid keys<br>> -hash:delete{'invalid key'}<br>> -hash:delete{'00000001', '00000002'}<br>> -hash:truncate()<br>> -<br>> ---=============================================================================<br>> --- String hash tests<br>> ---=============================================================================<br>> --------------------------------------------------------------------------------<br>> --- String hash inset fields tests<br>> --------------------------------------------------------------------------------<br>> -hash.index['primary']:drop()<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> -<br>> --- Insert valid fields<br>> -hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> -hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- String hash replace fields tests<br>> --------------------------------------------------------------------------------<br>> -<br>> --- Replace valid fields<br>> -hash:replace{'key 3', 'value1 v1.31', 'value2 1.12'}<br>> -hash:replace{'key 1', 'value1 v1.32', 'value2 1.72'}<br>> -hash:replace{'key 2', 'value1 v1.43', 'value2 1.92'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- String hash select fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- select by valid keys<br>> -hash.index['primary']:get{'key 0'}<br>> -hash.index['primary']:get{'key 1'}<br>> -hash.index['primary']:get{'key 2'}<br>> -hash.index['primary']:get{'key 3'}<br>> -hash.index['primary']:get{'key 4'}<br>> -hash.index['primary']:get{'key 5'}<br>> -<br>> --- select by invalid keys<br>> -hash.index['primary']:get{'key 1', 'key 2'}<br>> -<br>> --------------------------------------------------------------------------------<br>> --- String hash delete fields test<br>> --------------------------------------------------------------------------------<br>> -<br>> --- delete by valid keys<br>> -hash:delete{'key 0'}<br>> -hash:delete{'key 1'}<br>> -hash:delete{'key 2'}<br>> -hash:delete{'key 3'}<br>> -hash:delete{'key 4'}<br>> -hash:delete{'key 5'}<br>> -<br>> --- delete by invalid keys<br>> -hash:delete{'key 1', 'key 2'}<br>> -hash:truncate()<br>> -<br>> --------------------------------------------------------------------------------<br>> --- Collation test<br>> --------------------------------------------------------------------------------<br>> -hash.index['primary']:drop()<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {{1, 'string', collation = 'unicode_ci'}}, unique = true})<br>> -tmp = hash:create_index('secondary', { type = 'hash', parts = {{2, 'scalar', collation = 'unicode_ci'}}, unique = true})<br>> -<br>> -hash:insert{'Ёж', 'Hedgehog'}<br>> -hash:insert{'Ёлка', 'Spruce'}<br>> -hash:insert{'Jogurt', 'Йогурт'}<br>> -hash:insert{'Один', 1}<br>> -<br>> -hash.index.primary:get('ёж')<br>> -hash.index.primary:get('елка')<br>> -hash.index.secondary:get('spruce')<br>> -hash.index.secondary:get('йогурт')<br>> -hash.index.secondary:get(1)<br>> -hash.index.secondary:get('иогурт')<br>> -hash.index.secondary:get(2)<br>> -<br>> -------------------------<br>> --- hash::replace tests<br>> -------------------------<br>> -hash.index['secondary']:drop()<br>> -hash.index['primary']:drop()<br>> -tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> -tmp = hash:create_index('field1', { type = 'hash', parts = {2, 'unsigned'}, unique = true })<br>> -tmp = hash:create_index('field2', { type = 'hash', parts = {3, 'unsigned'}, unique = true })<br>> -tmp = hash:create_index('field3', { type = 'hash', parts = {4, 'unsigned'}, unique = true })<br>> -<br>> -hash:insert{0, 0, 0, 0}<br>> -hash:insert{1, 1, 1, 1}<br>> -hash:insert{2, 2, 2, 2}<br>> -<br>> --- OK<br>> -hash:replace{1, 1, 1, 1}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['primary']:get{1}<br>> -hash.index['field1']:get{1}<br>> -hash.index['field2']:get{1}<br>> -hash.index['field3']:get{1}<br>> -<br>> --- OK<br>> -hash:insert{10, 10, 10, 10}<br>> -hash:delete{10}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -<br>> --- TupleFound (primary key)<br>> -hash:insert{1, 10, 10, 10}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['primary']:get{1}<br>> -<br>> --- TupleNotFound (primary key)<br>> -hash:replace{10, 10, 10, 10}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -<br>> --- TupleFound (key --1)<br>> -hash:insert{10, 0, 10, 10}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['field1']:get{0}<br>> -<br>> --- TupleFound (key --1)<br>> --- hash:replace_if_exists(2, 0, 10, 10)<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['field1']:get{0}<br>> -<br>> --- TupleFound (key --3)<br>> -hash:insert{10, 10, 10, 0}<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['field3']:get{0}<br>> -<br>> --- TupleFound (key --3)<br>> --- hash:replace_if_exists(2, 10, 10, 0)<br>> -hash.index['primary']:get{10}<br>> -hash.index['field1']:get{10}<br>> -hash.index['field2']:get{10}<br>> -hash.index['field3']:get{10}<br>> -hash.index['field3']:get{0}<br>> -<br>> -hash:drop()<br>> -<br>> -hash = box.schema.space.create('tweedledum')<br>> -hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> -hash:insert{0}<br>> -hash:insert{16}<br>> -for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> -hash:drop()<br>> -<br>> ---<br>> --- gh-616 "1-based indexing and 0-based error message<br>> ---<br>> -_ = box.schema.create_space('test')<br>> -_ = box.space.test:create_index('i',{parts={1,'string'}})<br>> -box.space.test:insert{1}<br>> -box.space.test:drop()<br>> -<br>> --- gh-1467: invalid iterator type<br>> -space = box.schema.space.create('test')<br>> -index = space:create_index('primary', { type = 'hash' })<br>> -space:select({1}, {iterator = 'BITS_ALL_SET' } )<br>> -space:drop()<br>> -<br>> --- gh-3907: check that integer numbers stored as MP_FLOAT/MP_DOUBLE<br>> --- are hashed as MP_INT/MP_UINT.<br>> -ffi = require('ffi')<br>> -s = box.schema.space.create('test')<br>> -_ = s:create_index('primary', {type = 'hash', parts = {1, 'number'}})<br>> -s:insert{ffi.new('double', 0)}<br>> -s:insert{ffi.new('double', -1)}<br>> -s:insert{ffi.new('double', 9007199254740992)}<br>> -s:insert{ffi.new('double', -9007199254740994)}<br>> -s:get(0LL)<br>> -s:get(-1LL)<br>> -s:get(9007199254740992LL)<br>> -s:get(-9007199254740994LL)<br>> -s:drop()<br>> -<br>> --- Hash index cannot be multikey.<br>> -s = box.schema.space.create('test')<br>> -_ = s:create_index('primary')<br>> -_ = s:create_index('hash', {type = 'hash', parts = {{'[2][*]', 'unsigned'}}})<br>> -s:drop()<br>> -<br>> --- Hash index can not use function.<br>> -s = box.schema.space.create('withdata')<br>> -lua_code = [[function(tuple) return tuple[1] + tuple[2] end]]<br>> -box.schema.func.create('s', {body = lua_code, is_deterministic = true, is_sandboxed = true})<br>> -_ = s:create_index('pk')<br>> -_ = s:create_index('idx', {type = 'hash', func = box.func.s.id, parts = {{1, 'unsigned'}}})<br>> -s:drop()<br>> -box.schema.func.drop('s')<br>> diff --git a/test/box/hash_32bit_delete.result b/test/box/hash_32bit_delete.result<br>> new file mode 100644<br>> index 000000000..d26a9a03d<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_delete.result<br>> @@ -0,0 +1,70 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{0}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{1}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{2}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{3}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{4}<br>> + | ---<br>> + | ...<br>> +hash:delete{5}<br>> + | ---<br>> + | ...<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'invalid key'}<br>> + | ---<br>> + | - error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> + | ...<br>> +hash:delete{1, 2}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_32bit_delete.test.lua b/test/box/hash_32bit_delete.test.lua<br>> new file mode 100644<br>> index 000000000..aabfd4d38<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_delete.test.lua<br>> @@ -0,0 +1,29 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{0}<br>> +hash:delete{1}<br>> +hash:delete{2}<br>> +hash:delete{3}<br>> +hash:delete{4}<br>> +hash:delete{5}<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'invalid key'}<br>> +hash:delete{1, 2}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_32bit_insert.result b/test/box/hash_32bit_insert.result<br>> new file mode 100644<br>> index 000000000..3badfe032<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_insert.result<br>> @@ -0,0 +1,38 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-- Insert invalid fields<br>> +hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_32bit_insert.test.lua b/test/box/hash_32bit_insert.test.lua<br>> new file mode 100644<br>> index 000000000..1067e5e73<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_insert.test.lua<br>> @@ -0,0 +1,16 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-- Insert invalid fields<br>> +hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_32bit_replace.result b/test/box/hash_32bit_replace.result<br>> new file mode 100644<br>> index 000000000..6f8577199<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_replace.result<br>> @@ -0,0 +1,56 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> + | ---<br>> + | - [3, 'value1 v1.31', 'value2 1.12']<br>> + | ...<br>> +hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> + | ---<br>> + | - [1, 'value1 v1.32', 'value2 1.72']<br>> + | ...<br>> +hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> + | ---<br>> + | - [2, 'value1 v1.43', 'value2 1.92']<br>> + | ...<br>> +<br>> +-- Replace invalid fields<br>> +hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_32bit_replace.test.lua b/test/box/hash_32bit_replace.test.lua<br>> new file mode 100644<br>> index 000000000..f7a567c9c<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_replace.test.lua<br>> @@ -0,0 +1,25 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> +hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> +hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> +<br>> +-- Replace invalid fields<br>> +hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_32bit_select.result b/test/box/hash_32bit_select.result<br>> new file mode 100644<br>> index 000000000..2ecd06233<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_select.result<br>> @@ -0,0 +1,70 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{0}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{1}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{2}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{3}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{4}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{5}<br>> + | ---<br>> + | ...<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'invalid key'}<br>> + | ---<br>> + | - error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> + | ...<br>> +hash.index['primary']:get{1, 2}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_32bit_select.test.lua b/test/box/hash_32bit_select.test.lua<br>> new file mode 100644<br>> index 000000000..e9eb463b3<br>> --- /dev/null<br>> +++ b/test/box/hash_32bit_select.test.lua<br>> @@ -0,0 +1,29 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 32-bit hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{0}<br>> +hash.index['primary']:get{1}<br>> +hash.index['primary']:get{2}<br>> +hash.index['primary']:get{3}<br>> +hash.index['primary']:get{4}<br>> +hash.index['primary']:get{5}<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'invalid key'}<br>> +hash.index['primary']:get{1, 2}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_64bit_delete.result b/test/box/hash_64bit_delete.result<br>> new file mode 100644<br>> index 000000000..2202f9408<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_delete.result<br>> @@ -0,0 +1,111 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{0ULL}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{1ULL}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{2ULL}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{3ULL}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{4ULL}<br>> + | ---<br>> + | ...<br>> +hash:delete{5ULL}<br>> + | ---<br>> + | ...<br>> +<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-- delete by valid NUM keys<br>> +hash:delete{0}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{1}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{2}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{3}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{4}<br>> + | ---<br>> + | ...<br>> +hash:delete{5}<br>> + | ---<br>> + | ...<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'invalid key'}<br>> + | ---<br>> + | - error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> + | ...<br>> +hash:delete{'00000001', '00000002'}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_64bit_delete.test.lua b/test/box/hash_64bit_delete.test.lua<br>> new file mode 100644<br>> index 000000000..2b4e608c4<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_delete.test.lua<br>> @@ -0,0 +1,42 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{0ULL}<br>> +hash:delete{1ULL}<br>> +hash:delete{2ULL}<br>> +hash:delete{3ULL}<br>> +hash:delete{4ULL}<br>> +hash:delete{5ULL}<br>> +<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-- delete by valid NUM keys<br>> +hash:delete{0}<br>> +hash:delete{1}<br>> +hash:delete{2}<br>> +hash:delete{3}<br>> +hash:delete{4}<br>> +hash:delete{5}<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'invalid key'}<br>> +hash:delete{'00000001', '00000002'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_64bit_insert.result b/test/box/hash_64bit_insert.result<br>> new file mode 100644<br>> index 000000000..fafc73530<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_insert.result<br>> @@ -0,0 +1,54 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-- Insert invalid fields<br>> +hash:insert{100, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [100, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{101, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [101, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{102, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [102, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{103, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [103, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_64bit_insert.test.lua b/test/box/hash_64bit_insert.test.lua<br>> new file mode 100644<br>> index 000000000..deab22e9f<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_insert.test.lua<br>> @@ -0,0 +1,20 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-- Insert invalid fields<br>> +hash:insert{100, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{101, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{102, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{103, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_64bit_replace.result b/test/box/hash_64bit_replace.result<br>> new file mode 100644<br>> index 000000000..d4bc537dc<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_replace.result<br>> @@ -0,0 +1,68 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{3ULL, 'value1 v1.31', 'value2 1.12'}<br>> + | ---<br>> + | - [3, 'value1 v1.31', 'value2 1.12']<br>> + | ...<br>> +hash:replace{1ULL, 'value1 v1.32', 'value2 1.72'}<br>> + | ---<br>> + | - [1, 'value1 v1.32', 'value2 1.72']<br>> + | ...<br>> +hash:replace{2ULL, 'value1 v1.43', 'value2 1.92'}<br>> + | ---<br>> + | - [2, 'value1 v1.43', 'value2 1.92']<br>> + | ...<br>> +<br>> +-- Replace invalid fields<br>> +hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> + | ---<br>> + | - [3, 'value1 v1.31', 'value2 1.12']<br>> + | ...<br>> +hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> + | ---<br>> + | - [1, 'value1 v1.32', 'value2 1.72']<br>> + | ...<br>> +hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> + | ---<br>> + | - [2, 'value1 v1.43', 'value2 1.92']<br>> + | ...<br>> +hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - error: 'Tuple field 1 type does not match one required by operation: expected unsigned'<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_64bit_replace.test.lua b/test/box/hash_64bit_replace.test.lua<br>> new file mode 100644<br>> index 000000000..79a4e3430<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_replace.test.lua<br>> @@ -0,0 +1,28 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{3ULL, 'value1 v1.31', 'value2 1.12'}<br>> +hash:replace{1ULL, 'value1 v1.32', 'value2 1.72'}<br>> +hash:replace{2ULL, 'value1 v1.43', 'value2 1.92'}<br>> +<br>> +-- Replace invalid fields<br>> +hash:replace{3, 'value1 v1.31', 'value2 1.12'}<br>> +hash:replace{1, 'value1 v1.32', 'value2 1.72'}<br>> +hash:replace{2, 'value1 v1.43', 'value2 1.92'}<br>> +hash:replace{'invalid key', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_64bit_select.result b/test/box/hash_64bit_select.result<br>> new file mode 100644<br>> index 000000000..051da2dec<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_select.result<br>> @@ -0,0 +1,94 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{0ULL}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{1ULL}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{2ULL}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{3ULL}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{4ULL}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{5ULL}<br>> + | ---<br>> + | ...<br>> +<br>> +-- select by valid NUM keys<br>> +hash.index['primary']:get{0}<br>> + | ---<br>> + | - [0, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{1}<br>> + | ---<br>> + | - [1, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{2}<br>> + | ---<br>> + | - [2, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{3}<br>> + | ---<br>> + | - [3, 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{4}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{5}<br>> + | ---<br>> + | ...<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'invalid key'}<br>> + | ---<br>> + | - error: 'Supplied key type of part 0 does not match index part type: expected unsigned'<br>> + | ...<br>> +hash.index['primary']:get{'00000001', '00000002'}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_64bit_select.test.lua b/test/box/hash_64bit_select.test.lua<br>> new file mode 100644<br>> index 000000000..804fcc462<br>> --- /dev/null<br>> +++ b/test/box/hash_64bit_select.test.lua<br>> @@ -0,0 +1,37 @@<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash insert fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{0ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{1ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{2ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{3ULL, 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- 64-bit hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{0ULL}<br>> +hash.index['primary']:get{1ULL}<br>> +hash.index['primary']:get{2ULL}<br>> +hash.index['primary']:get{3ULL}<br>> +hash.index['primary']:get{4ULL}<br>> +hash.index['primary']:get{5ULL}<br>> +<br>> +-- select by valid NUM keys<br>> +hash.index['primary']:get{0}<br>> +hash.index['primary']:get{1}<br>> +hash.index['primary']:get{2}<br>> +hash.index['primary']:get{3}<br>> +hash.index['primary']:get{4}<br>> +hash.index['primary']:get{5}<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'invalid key'}<br>> +hash.index['primary']:get{'00000001', '00000002'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_collation.result b/test/box/hash_collation.result<br>> new file mode 100644<br>> index 000000000..6ec04f490<br>> --- /dev/null<br>> +++ b/test/box/hash_collation.result<br>> @@ -0,0 +1,62 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- Collation test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {{1, 'string', collation = 'unicode_ci'}}, unique = true})<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('secondary', { type = 'hash', parts = {{2, 'scalar', collation = 'unicode_ci'}}, unique = true})<br>> + | ---<br>> + | ...<br>> +<br>> +hash:insert{'Ёж', 'Hedgehog'}<br>> + | ---<br>> + | - ['Ёж', 'Hedgehog']<br>> + | ...<br>> +hash:insert{'Ёлка', 'Spruce'}<br>> + | ---<br>> + | - ['Ёлка', 'Spruce']<br>> + | ...<br>> +hash:insert{'Jogurt', 'Йогурт'}<br>> + | ---<br>> + | - ['Jogurt', 'Йогурт']<br>> + | ...<br>> +hash:insert{'Один', 1}<br>> + | ---<br>> + | - ['Один', 1]<br>> + | ...<br>> +<br>> +hash.index.primary:get('ёж')<br>> + | ---<br>> + | - ['Ёж', 'Hedgehog']<br>> + | ...<br>> +hash.index.primary:get('елка')<br>> + | ---<br>> + | - ['Ёлка', 'Spruce']<br>> + | ...<br>> +hash.index.secondary:get('spruce')<br>> + | ---<br>> + | - ['Ёлка', 'Spruce']<br>> + | ...<br>> +hash.index.secondary:get('йогурт')<br>> + | ---<br>> + | - ['Jogurt', 'Йогурт']<br>> + | ...<br>> +hash.index.secondary:get(1)<br>> + | ---<br>> + | - ['Один', 1]<br>> + | ...<br>> +hash.index.secondary:get('иогурт')<br>> + | ---<br>> + | ...<br>> +hash.index.secondary:get(2)<br>> + | ---<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_collation.test.lua b/test/box/hash_collation.test.lua<br>> new file mode 100644<br>> index 000000000..1f7a16bb2<br>> --- /dev/null<br>> +++ b/test/box/hash_collation.test.lua<br>> @@ -0,0 +1,22 @@<br>> +-------------------------------------------------------------------------------<br>> +-- Collation test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {{1, 'string', collation = 'unicode_ci'}}, unique = true})<br>> +tmp = hash:create_index('secondary', { type = 'hash', parts = {{2, 'scalar', collation = 'unicode_ci'}}, unique = true})<br>> +<br>> +hash:insert{'Ёж', 'Hedgehog'}<br>> +hash:insert{'Ёлка', 'Spruce'}<br>> +hash:insert{'Jogurt', 'Йогурт'}<br>> +hash:insert{'Один', 1}<br>> +<br>> +hash.index.primary:get('ёж')<br>> +hash.index.primary:get('елка')<br>> +hash.index.secondary:get('spruce')<br>> +hash.index.secondary:get('йогурт')<br>> +hash.index.secondary:get(1)<br>> +hash.index.secondary:get('иогурт')<br>> +hash.index.secondary:get(2)<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_gh-1467.result b/test/box/hash_gh-1467.result<br>> new file mode 100644<br>> index 000000000..a2c736a11<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-1467.result<br>> @@ -0,0 +1,17 @@<br>> +-- test-run result file version 2<br>> +-- gh-1467: invalid iterator type<br>> +<br>> +space = box.schema.space.create('test')<br>> + | ---<br>> + | ...<br>> +index = space:create_index('primary', { type = 'hash' })<br>> + | ---<br>> + | ...<br>> +space:select({1}, {iterator = 'BITS_ALL_SET' } )<br>> + | ---<br>> + | - error: Index 'primary' (HASH) of space 'test' (memtx) does not support requested<br>> + | iterator type<br>> + | ...<br>> +space:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_gh-1467.test.lua b/test/box/hash_gh-1467.test.lua<br>> new file mode 100644<br>> index 000000000..d98c31734<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-1467.test.lua<br>> @@ -0,0 +1,6 @@<br>> +-- gh-1467: invalid iterator type<br>> +<br>> +space = box.schema.space.create('test')<br>> +index = space:create_index('primary', { type = 'hash' })<br>> +space:select({1}, {iterator = 'BITS_ALL_SET' } )<br>> +space:drop()<br>> diff --git a/test/box/hash_gh-3907.result b/test/box/hash_gh-3907.result<br>> new file mode 100644<br>> index 000000000..4ce7e40f4<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-3907.result<br>> @@ -0,0 +1,48 @@<br>> +-- test-run result file version 2<br>> +-- gh-3907: check that integer numbers stored as MP_FLOAT/MP_DOUBLE<br>> +-- are hashed as MP_INT/MP_UINT.<br>> +<br>> +ffi = require('ffi')<br>> + | ---<br>> + | ...<br>> +s = box.schema.space.create('test')<br>> + | ---<br>> + | ...<br>> +_ = s:create_index('primary', {type = 'hash', parts = {1, 'number'}})<br>> + | ---<br>> + | ...<br>> +s:insert{ffi.new('double', 0)}<br>> + | ---<br>> + | - [0]<br>> + | ...<br>> +s:insert{ffi.new('double', -1)}<br>> + | ---<br>> + | - [-1]<br>> + | ...<br>> +s:insert{ffi.new('double', 9007199254740992)}<br>> + | ---<br>> + | - [9007199254740992]<br>> + | ...<br>> +s:insert{ffi.new('double', -9007199254740994)}<br>> + | ---<br>> + | - [-9007199254740994]<br>> + | ...<br>> +s:get(0LL)<br>> + | ---<br>> + | - [0]<br>> + | ...<br>> +s:get(-1LL)<br>> + | ---<br>> + | - [-1]<br>> + | ...<br>> +s:get(9007199254740992LL)<br>> + | ---<br>> + | - [9007199254740992]<br>> + | ...<br>> +s:get(-9007199254740994LL)<br>> + | ---<br>> + | - [-9007199254740994]<br>> + | ...<br>> +s:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_gh-3907.test.lua b/test/box/hash_gh-3907.test.lua<br>> new file mode 100644<br>> index 000000000..2bef03b0d<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-3907.test.lua<br>> @@ -0,0 +1,15 @@<br>> +-- gh-3907: check that integer numbers stored as MP_FLOAT/MP_DOUBLE<br>> +-- are hashed as MP_INT/MP_UINT.<br>> +<br>> +ffi = require('ffi')<br>> +s = box.schema.space.create('test')<br>> +_ = s:create_index('primary', {type = 'hash', parts = {1, 'number'}})<br>> +s:insert{ffi.new('double', 0)}<br>> +s:insert{ffi.new('double', -1)}<br>> +s:insert{ffi.new('double', 9007199254740992)}<br>> +s:insert{ffi.new('double', -9007199254740994)}<br>> +s:get(0LL)<br>> +s:get(-1LL)<br>> +s:get(9007199254740992LL)<br>> +s:get(-9007199254740994LL)<br>> +s:drop()<br>> diff --git a/test/box/hash_gh-616.result b/test/box/hash_gh-616.result<br>> new file mode 100644<br>> index 000000000..d5ee1eed9<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-616.result<br>> @@ -0,0 +1,17 @@<br>> +-- test-run result file version 2<br>> +--<br>> +-- gh-616 "1-based indexing and 0-based error message<br>> +--<br>> +_ = box.schema.create_space('test')<br>> + | ---<br>> + | ...<br>> +_ = box.space.test:create_index('i',{parts={1,'string'}})<br>> + | ---<br>> + | ...<br>> +box.space.test:insert{1}<br>> + | ---<br>> + | - error: 'Tuple field 1 type does not match one required by operation: expected string'<br>> + | ...<br>> +box.space.test:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_gh-616.test.lua b/test/box/hash_gh-616.test.lua<br>> new file mode 100644<br>> index 000000000..8ea5f725a<br>> --- /dev/null<br>> +++ b/test/box/hash_gh-616.test.lua<br>> @@ -0,0 +1,7 @@<br>> +--<br>> +-- gh-616 "1-based indexing and 0-based error message<br>> +--<br>> +_ = box.schema.create_space('test')<br>> +_ = box.space.test:create_index('i',{parts={1,'string'}})<br>> +box.space.test:insert{1}<br>> +box.space.test:drop()<br>> diff --git a/test/box/hash_iterate.result b/test/box/hash_iterate.result<br>> new file mode 100644<br>> index 000000000..64660ad6d<br>> --- /dev/null<br>> +++ b/test/box/hash_iterate.result<br>> @@ -0,0 +1,21 @@<br>> +-- test-run result file version 2<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +hash:insert{0}<br>> + | ---<br>> + | - [0]<br>> + | ...<br>> +hash:insert{16}<br>> + | ---<br>> + | - [16]<br>> + | ...<br>> +for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> + | ---<br>> + | ...<br>> +hash:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_iterate.test.lua b/test/box/hash_iterate.test.lua<br>> new file mode 100644<br>> index 000000000..1ee758a66<br>> --- /dev/null<br>> +++ b/test/box/hash_iterate.test.lua<br>> @@ -0,0 +1,6 @@<br>> +hash = box.schema.space.create('tweedledum')<br>> +hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +hash:insert{0}<br>> +hash:insert{16}<br>> +for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> +hash:drop()<br>> diff --git a/test/box/hash_not_a_multikey.result b/test/box/hash_not_a_multikey.result<br>> new file mode 100644<br>> index 000000000..334aa676d<br>> --- /dev/null<br>> +++ b/test/box/hash_not_a_multikey.result<br>> @@ -0,0 +1,17 @@<br>> +-- test-run result file version 2<br>> +-- Hash index cannot be multikey.<br>> +<br>> +s = box.schema.space.create('test')<br>> + | ---<br>> + | ...<br>> +_ = s:create_index('primary')<br>> + | ---<br>> + | ...<br>> +_ = s:create_index('hash', {type = 'hash', parts = {{'[2][*]', 'unsigned'}}})<br>> + | ---<br>> + | - error: 'Can''t create or modify index ''hash'' in space ''test'': HASH index cannot<br>> + | be multikey'<br>> + | ...<br>> +s:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_not_a_multikey.test.lua b/test/box/hash_not_a_multikey.test.lua<br>> new file mode 100644<br>> index 000000000..bd82dfb83<br>> --- /dev/null<br>> +++ b/test/box/hash_not_a_multikey.test.lua<br>> @@ -0,0 +1,6 @@<br>> +-- Hash index cannot be multikey.<br>> +<br>> +s = box.schema.space.create('test')<br>> +_ = s:create_index('primary')<br>> +_ = s:create_index('hash', {type = 'hash', parts = {{'[2][*]', 'unsigned'}}})<br>> +s:drop()<br>> diff --git a/test/box/hash_replace.result b/test/box/hash_replace.result<br>> new file mode 100644<br>> index 000000000..1b45f7914<br>> --- /dev/null<br>> +++ b/test/box/hash_replace.result<br>> @@ -0,0 +1,256 @@<br>> +-- test-run result file version 2<br>> +------------------------<br>> +-- hash::replace tests<br>> +------------------------<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('field1', { type = 'hash', parts = {2, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('field2', { type = 'hash', parts = {3, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('field3', { type = 'hash', parts = {4, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +hash:insert{0, 0, 0, 0}<br>> + | ---<br>> + | - [0, 0, 0, 0]<br>> + | ...<br>> +hash:insert{1, 1, 1, 1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +hash:insert{2, 2, 2, 2}<br>> + | ---<br>> + | - [2, 2, 2, 2]<br>> + | ...<br>> +<br>> +-- OK<br>> +hash:replace{1, 1, 1, 1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +hash.index['field1']:get{1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +hash.index['field2']:get{1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +hash.index['field3']:get{1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +<br>> +-- OK<br>> +hash:insert{10, 10, 10, 10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash:delete{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | ...<br>> +<br>> +-- TupleFound (primary key)<br>> +hash:insert{1, 10, 10, 10}<br>> + | ---<br>> + | - error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{1}<br>> + | ---<br>> + | - [1, 1, 1, 1]<br>> + | ...<br>> +<br>> +-- TupleNotFound (primary key)<br>> +hash:replace{10, 10, 10, 10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +<br>> +-- TupleFound (key --1)<br>> +hash:insert{10, 0, 10, 10}<br>> + | ---<br>> + | - error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{0}<br>> + | ---<br>> + | - [0, 0, 0, 0]<br>> + | ...<br>> +<br>> +-- TupleFound (key --1)<br>> +-- hash:replace_if_exists(2, 0, 10, 10)<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{0}<br>> + | ---<br>> + | - [0, 0, 0, 0]<br>> + | ...<br>> +<br>> +-- TupleFound (key --3)<br>> +hash:insert{10, 10, 10, 0}<br>> + | ---<br>> + | - error: Duplicate key exists in unique index 'primary' in space 'tweedledum'<br>> + | ...<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{0}<br>> + | ---<br>> + | - [0, 0, 0, 0]<br>> + | ...<br>> +<br>> +-- TupleFound (key --3)<br>> +-- hash:replace_if_exists(2, 10, 10, 0)<br>> +hash.index['primary']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field1']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field2']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{10}<br>> + | ---<br>> + | - [10, 10, 10, 10]<br>> + | ...<br>> +hash.index['field3']:get{0}<br>> + | ---<br>> + | - [0, 0, 0, 0]<br>> + | ...<br>> +<br>> +hash:drop()<br>> + | ---<br>> + | ...<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> + | ---<br>> + | ...<br>> +hash:insert{0}<br>> + | ---<br>> + | - [0]<br>> + | ...<br>> +hash:insert{16}<br>> + | ---<br>> + | - [16]<br>> + | ...<br>> +for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> + | ---<br>> + | ...<br>> +hash:drop()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_replace.test.lua b/test/box/hash_replace.test.lua<br>> new file mode 100644<br>> index 000000000..d876f1f12<br>> --- /dev/null<br>> +++ b/test/box/hash_replace.test.lua<br>> @@ -0,0 +1,88 @@<br>> +------------------------<br>> +-- hash::replace tests<br>> +------------------------<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +tmp = hash:create_index('field1', { type = 'hash', parts = {2, 'unsigned'}, unique = true })<br>> +tmp = hash:create_index('field2', { type = 'hash', parts = {3, 'unsigned'}, unique = true })<br>> +tmp = hash:create_index('field3', { type = 'hash', parts = {4, 'unsigned'}, unique = true })<br>> +<br>> +hash:insert{0, 0, 0, 0}<br>> +hash:insert{1, 1, 1, 1}<br>> +hash:insert{2, 2, 2, 2}<br>> +<br>> +-- OK<br>> +hash:replace{1, 1, 1, 1}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['primary']:get{1}<br>> +hash.index['field1']:get{1}<br>> +hash.index['field2']:get{1}<br>> +hash.index['field3']:get{1}<br>> +<br>> +-- OK<br>> +hash:insert{10, 10, 10, 10}<br>> +hash:delete{10}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +<br>> +-- TupleFound (primary key)<br>> +hash:insert{1, 10, 10, 10}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['primary']:get{1}<br>> +<br>> +-- TupleNotFound (primary key)<br>> +hash:replace{10, 10, 10, 10}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +<br>> +-- TupleFound (key --1)<br>> +hash:insert{10, 0, 10, 10}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['field1']:get{0}<br>> +<br>> +-- TupleFound (key --1)<br>> +-- hash:replace_if_exists(2, 0, 10, 10)<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['field1']:get{0}<br>> +<br>> +-- TupleFound (key --3)<br>> +hash:insert{10, 10, 10, 0}<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['field3']:get{0}<br>> +<br>> +-- TupleFound (key --3)<br>> +-- hash:replace_if_exists(2, 10, 10, 0)<br>> +hash.index['primary']:get{10}<br>> +hash.index['field1']:get{10}<br>> +hash.index['field2']:get{10}<br>> +hash.index['field3']:get{10}<br>> +hash.index['field3']:get{0}<br>> +<br>> +hash:drop()<br>> +<br>> +hash = box.schema.space.create('tweedledum')<br>> +hi = hash:create_index('primary', { type = 'hash', parts = {1, 'unsigned'}, unique = true })<br>> +hash:insert{0}<br>> +hash:insert{16}<br>> +for _, tuple in hi:pairs(nil, {iterator = box.index.ALL}) do hash:delete{tuple[1]} end<br>> +hash:drop()<br>> diff --git a/test/box/hash_string_delete.result b/test/box/hash_string_delete.result<br>> new file mode 100644<br>> index 000000000..8cffb9ba7<br>> --- /dev/null<br>> +++ b/test/box/hash_string_delete.result<br>> @@ -0,0 +1,66 @@<br>> +-- test-run result file version 2<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{'key 0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{'key 1'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{'key 2'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{'key 3'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:delete{'key 4'}<br>> + | ---<br>> + | ...<br>> +hash:delete{'key 5'}<br>> + | ---<br>> + | ...<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'key 1', 'key 2'}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_string_delete.test.lua b/test/box/hash_string_delete.test.lua<br>> new file mode 100644<br>> index 000000000..e862d87c3<br>> --- /dev/null<br>> +++ b/test/box/hash_string_delete.test.lua<br>> @@ -0,0 +1,26 @@<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash delete fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- delete by valid keys<br>> +hash:delete{'key 0'}<br>> +hash:delete{'key 1'}<br>> +hash:delete{'key 2'}<br>> +hash:delete{'key 3'}<br>> +hash:delete{'key 4'}<br>> +hash:delete{'key 5'}<br>> +<br>> +-- delete by invalid keys<br>> +hash:delete{'key 1', 'key 2'}<br>> +hash:truncate()<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_string_insert.result b/test/box/hash_string_insert.result<br>> new file mode 100644<br>> index 000000000..fcd0b3a32<br>> --- /dev/null<br>> +++ b/test/box/hash_string_insert.result<br>> @@ -0,0 +1,32 @@<br>> +-- test-run result file version 2<br>> +-------------------------------------------------------------------------------<br>> +-- String hash inset fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_string_insert.test.lua b/test/box/hash_string_insert.test.lua<br>> new file mode 100644<br>> index 000000000..0778ccb1d<br>> --- /dev/null<br>> +++ b/test/box/hash_string_insert.test.lua<br>> @@ -0,0 +1,13 @@<br>> +-------------------------------------------------------------------------------<br>> +-- String hash inset fields tests<br>> +-------------------------------------------------------------------------------<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_string_replace.result b/test/box/hash_string_replace.result<br>> new file mode 100644<br>> index 000000000..487e37e3a<br>> --- /dev/null<br>> +++ b/test/box/hash_string_replace.result<br>> @@ -0,0 +1,47 @@<br>> +-- test-run result file version 2<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{'key 3', 'value1 v1.31', 'value2 1.12'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.31', 'value2 1.12']<br>> + | ...<br>> +hash:replace{'key 1', 'value1 v1.32', 'value2 1.72'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.32', 'value2 1.72']<br>> + | ...<br>> +hash:replace{'key 2', 'value1 v1.43', 'value2 1.92'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.43', 'value2 1.92']<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_string_replace.test.lua b/test/box/hash_string_replace.test.lua<br>> new file mode 100644<br>> index 000000000..95226ae43<br>> --- /dev/null<br>> +++ b/test/box/hash_string_replace.test.lua<br>> @@ -0,0 +1,19 @@<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash replace fields tests<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- Replace valid fields<br>> +hash:replace{'key 3', 'value1 v1.31', 'value2 1.12'}<br>> +hash:replace{'key 1', 'value1 v1.32', 'value2 1.72'}<br>> +hash:replace{'key 2', 'value1 v1.43', 'value2 1.92'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_string_select.result b/test/box/hash_string_select.result<br>> new file mode 100644<br>> index 000000000..ed45b99c3<br>> --- /dev/null<br>> +++ b/test/box/hash_string_select.result<br>> @@ -0,0 +1,63 @@<br>> +-- test-run result file version 2<br>> +hash = box.schema.space.create('tweedledum')<br>> + | ---<br>> + | ...<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> + | ---<br>> + | ...<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{'key 0'}<br>> + | ---<br>> + | - ['key 0', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{'key 1'}<br>> + | ---<br>> + | - ['key 1', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{'key 2'}<br>> + | ---<br>> + | - ['key 2', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{'key 3'}<br>> + | ---<br>> + | - ['key 3', 'value1 v1.0', 'value2 v1.0']<br>> + | ...<br>> +hash.index['primary']:get{'key 4'}<br>> + | ---<br>> + | ...<br>> +hash.index['primary']:get{'key 5'}<br>> + | ---<br>> + | ...<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'key 1', 'key 2'}<br>> + | ---<br>> + | - error: Invalid key part count in an exact match (expected 1, got 2)<br>> + | ...<br>> +<br>> +hash:truncate()<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_string_select.test.lua b/test/box/hash_string_select.test.lua<br>> new file mode 100644<br>> index 000000000..b7db916f0<br>> --- /dev/null<br>> +++ b/test/box/hash_string_select.test.lua<br>> @@ -0,0 +1,25 @@<br>> +hash = box.schema.space.create('tweedledum')<br>> +tmp = hash:create_index('primary', { type = 'hash', parts = {1, 'string'}, unique = true })<br>> +<br>> +-- Insert valid fields<br>> +hash:insert{'key 0', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 1', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 2', 'value1 v1.0', 'value2 v1.0'}<br>> +hash:insert{'key 3', 'value1 v1.0', 'value2 v1.0'}<br>> +<br>> +-------------------------------------------------------------------------------<br>> +-- String hash select fields test<br>> +-------------------------------------------------------------------------------<br>> +<br>> +-- select by valid keys<br>> +hash.index['primary']:get{'key 0'}<br>> +hash.index['primary']:get{'key 1'}<br>> +hash.index['primary']:get{'key 2'}<br>> +hash.index['primary']:get{'key 3'}<br>> +hash.index['primary']:get{'key 4'}<br>> +hash.index['primary']:get{'key 5'}<br>> +<br>> +-- select by invalid keys<br>> +hash.index['primary']:get{'key 1', 'key 2'}<br>> +<br>> +hash:truncate()<br>> diff --git a/test/box/hash_with_function.result b/test/box/hash_with_function.result<br>> new file mode 100644<br>> index 000000000..cac268281<br>> --- /dev/null<br>> +++ b/test/box/hash_with_function.result<br>> @@ -0,0 +1,26 @@<br>> +-- test-run result file version 2<br>> +-- Hash index can not use function.<br>> +<br>> +s = box.schema.space.create('withdata')<br>> + | ---<br>> + | ...<br>> +lua_code = [[function(tuple) return tuple[1] + tuple[2] end]]<br>> + | ---<br>> + | ...<br>> +box.schema.func.create('s', {body = lua_code, is_deterministic = true, is_sandboxed = true})<br>> + | ---<br>> + | ...<br>> +_ = s:create_index('pk')<br>> + | ---<br>> + | ...<br>> +_ = s:create_index('idx', {type = 'hash', func = box.func.s.id, parts = {{1, 'unsigned'}}})<br>> + | ---<br>> + | - error: 'Can''t create or modify index ''idx'' in space ''withdata'': HASH index<br>> + | can not use a function'<br>> + | ...<br>> +s:drop()<br>> + | ---<br>> + | ...<br>> +box.schema.func.drop('s')<br>> + | ---<br>> + | ...<br>> diff --git a/test/box/hash_with_function.test.lua b/test/box/hash_with_function.test.lua<br>> new file mode 100644<br>> index 000000000..9653de68e<br>> --- /dev/null<br>> +++ b/test/box/hash_with_function.test.lua<br>> @@ -0,0 +1,9 @@<br>> +-- Hash index can not use function.<br>> +<br>> +s = box.schema.space.create('withdata')<br>> +lua_code = [[function(tuple) return tuple[1] + tuple[2] end]]<br>> +box.schema.func.create('s', {body = lua_code, is_deterministic = true, is_sandboxed = true})<br>> +_ = s:create_index('pk')<br>> +_ = s:create_index('idx', {type = 'hash', func = box.func.s.id, parts = {{1, 'unsigned'}}})<br>> +s:drop()<br>> +box.schema.func.drop('s')<br>> --<br>> 2.23.0<br>><br>><br>> --<br>> sergeyb@</div><br>--<br>sergeyb@</div></div></div></div></blockquote> <div> </div><div data-signature-widget="container"><div data-signature-widget="content"><div>--<br>Oleg Piskunov</div></div></div><div> </div></div></BODY></HTML>