From f391c8476a32d994eeb8c016d5928411e6a7e9a1 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Tue, 27 Aug 2013 00:39:59 +0400 Subject: [PATCH] Make big/sql.test pass. Still some issues with Lua console to fix, but transfer big/sql.test to the new data dictionary at least. Fix a bug found in the process that when altering an index from unique to non unique the index is not rebuilt. Remove 'lua ' prefix from schema_erase/schema_fill classes. --- extra/schema_erase.lua | 18 +- extra/schema_fill.lua | 24 +-- src/box/alter.cc | 1 + test/big/sql.result | 341 ++++++++++++++++++++---------------- test/big/sql.test.py | 237 +++++++++++++------------ test/big/tarantool.cfg | 385 ----------------------------------------- 6 files changed, 342 insertions(+), 664 deletions(-) diff --git a/extra/schema_erase.lua b/extra/schema_erase.lua index eb8a1bf2d0..ce0d2f094a 100644 --- a/extra/schema_erase.lua +++ b/extra/schema_erase.lua @@ -1,11 +1,11 @@ -lua _schema = box.space[box.schema.SCHEMA_ID] -lua _space = box.space[box.schema.SPACE_ID] -lua _index = box.space[box.schema.INDEX_ID] +_schema = box.space[box.schema.SCHEMA_ID] +_space = box.space[box.schema.SPACE_ID] +_index = box.space[box.schema.INDEX_ID] -- destroy everything - save snapshot produces an empty snapshot now -lua _schema:run_triggers(false) -lua _schema:truncate() -lua _space:run_triggers(false) -lua _space:truncate() -lua _index:run_triggers(false) -lua _index:truncate() +_schema:run_triggers(false) +_schema:truncate() +_space:run_triggers(false) +_space:truncate() +_index:run_triggers(false) +_index:truncate() diff --git a/extra/schema_fill.lua b/extra/schema_fill.lua index 8e357085b8..e44fccded5 100644 --- a/extra/schema_fill.lua +++ b/extra/schema_fill.lua @@ -1,20 +1,20 @@ -lua _schema = box.space[box.schema.SCHEMA_ID] -lua _space = box.space[box.schema.SPACE_ID] -lua _index = box.space[box.schema.INDEX_ID] +_schema = box.space[box.schema.SCHEMA_ID] +_space = box.space[box.schema.SPACE_ID] +_index = box.space[box.schema.INDEX_ID] -- define schema version -lua _schema:insert('version', 1, 6) +_schema:insert('version', 1, 6) -- define system spaces -lua _space:insert(_schema.n, 0, '_schema') -lua _space:insert(_space.n, 0, '_space') -lua _space:insert(_index.n, 0, '_index') +_space:insert(_schema.n, 0, '_schema') +_space:insert(_space.n, 0, '_space') +_space:insert(_index.n, 0, '_index') -- define indexes -lua _index:insert(_schema.n, 0, 'primary', 'tree', 1, 1, 0, 'str') +_index:insert(_schema.n, 0, 'primary', 'tree', 1, 1, 0, 'str') -- space name is unique -lua _index:insert(_space.n, 0, 'primary', 'tree', 1, 1, 0, 'num') -lua _index:insert(_space.n, 1, 'name', 'tree', 1, 1, 2, 'str') +_index:insert(_space.n, 0, 'primary', 'tree', 1, 1, 0, 'num') +_index:insert(_space.n, 1, 'name', 'tree', 1, 1, 2, 'str') -- index name is unique within a space -lua _index:insert(_index.n, 0, 'primary', 'tree', 1, 2, 0, 'num', 1, 'num') -lua _index:insert(_index.n, 1, 'name', 'tree', 1, 2, 0, 'num', 2, 'str') +_index:insert(_index.n, 0, 'primary', 'tree', 1, 2, 0, 'num', 1, 'num') +_index:insert(_index.n, 1, 'name', 'tree', 1, 2, 0, 'num', 2, 'str') -- diff --git a/src/box/alter.cc b/src/box/alter.cc index 9d1c39f764..0e28b964eb 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -604,6 +604,7 @@ AddIndex::prepare(struct alter_space *alter) if (drop == NULL || drop->old_key_def->type != new_key_def->type || + drop->old_key_def->is_unique != new_key_def->is_unique || key_part_cmp(drop->old_key_def->parts, drop->old_key_def->part_count, new_key_def->parts, diff --git a/test/big/sql.result b/test/big/sql.result index a141cb16a4..a0d625e972 100644 --- a/test/big/sql.result +++ b/test/big/sql.result @@ -1,3 +1,12 @@ +box.insert(box.schema.SPACE_ID, 0, 0, 'tweedledum') +--- '0: {0, ''tweedledum''}' +... +box.insert(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'str') +--- '0: {0, ''primary'', 1752392040, 1, 1, 0, ''str''}' +... +box.insert(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 1, 1, 'str') +--- '0: {1, ''secondary'', 1701147252, 0, 1, 1, ''str''}' +... # # A test case for Bug#729758 # "SELECT fails with a disjunct and small LIMIT" @@ -27,16 +36,9 @@ Found 5 tuples: # select * from t0 where k1='Richard' or k1='Tomas' limit 0 No match -delete from t0 where k0='Doe' -Delete OK, 1 row affected -delete from t0 where k0='Roe' -Delete OK, 1 row affected -delete from t0 where k0='Woe' -Delete OK, 1 row affected -delete from t0 where k0='Major' -Delete OK, 1 row affected -delete from t0 where k0='Kytes' -Delete OK, 1 row affected +box.space[0]:truncate() +--- +... # # A test case for Bug#730593 # "Bad data if incomplete tuple" @@ -71,157 +73,187 @@ Found 1 tuple: ['Spears', 'Britney'] delete from t0 where k0='Spears' Delete OK, 1 row affected +box.space[0]:truncate() +--- +... # # Test composite keys with trees # -insert into t1 values ('key1', 'part1', 'part2') +box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 1, 2, 1, 'str', 2, 'str') +--- '0: {1, ''secondary'', 1701147252, 1, 2, 1, ''str'', 2, ''str''}' +... +insert into t0 values ('key1', 'part1', 'part2') Insert OK, 1 row affected -replace into t1 values ('key1', 'part1', 'part2') +replace into t0 values ('key1', 'part1', 'part2') Replace OK, 1 row affected -insert into t1 values ('key2', 'part1', 'part2_a') +insert into t0 values ('key2', 'part1', 'part2_a') Insert OK, 1 row affected -insert into t1 values ('key3', 'part1', 'part2_b') +insert into t0 values ('key3', 'part1', 'part2_b') Insert OK, 1 row affected -for k, v in box.space[1]:pairs() do print(v) end +return { box.space[0]:select(1) } --- -846816619: {'part1', 'part2_a'} -863593835: {'part1', 'part2_b'} -830039403: {'part1', 'part2'} +- '830039403: {''part1'', ''part2''}' +- '846816619: {''part1'', ''part2_a''}' +- '863593835: {''part1'', ''part2_b''}' ... -select * from t1 where k0='key1' +select * from t0 where k0='key1' Found 1 tuple: [830039403, 'part1', 'part2'] -select * from t1 where k0='key2' +select * from t0 where k0='key2' Found 1 tuple: [846816619, 'part1', 'part2_a'] -select * from t1 where k0='key3' +select * from t0 where k0='key3' Found 1 tuple: [863593835, 'part1', 'part2_b'] -select * from t1 where k1='part1' +select * from t0 where k1='part1' Found 3 tuples: [830039403, 'part1', 'part2'] [846816619, 'part1', 'part2_a'] [863593835, 'part1', 'part2_b'] -call box.select_range('1', '1', '100', 'part1') +call box.select_range('0', '1', '100', 'part1') Found 3 tuples: [830039403, 'part1', 'part2'] [846816619, 'part1', 'part2_a'] [863593835, 'part1', 'part2_b'] -call box.select_range('1', '0', '100', 'key2') +call box.select_range('0', '0', '100', 'key2') Found 3 tuples: [830039403, 'part1', 'part2'] [846816619, 'part1', 'part2_a'] [863593835, 'part1', 'part2_b'] -call box.select_range('1', '1', '100', 'part1', 'part2_a') +call box.select_range('0', '1', '100', 'part1', 'part2_a') Found 2 tuples: [846816619, 'part1', 'part2_a'] [863593835, 'part1', 'part2_b'] -insert into t5 values ('01234567', 'part1', 'part2') +select * from t0 where k0='key1' +Found 1 tuple: +[830039403, 'part1', 'part2'] +select * from t0 where k0='key2' +Found 1 tuple: +[846816619, 'part1', 'part2_a'] +select * from t0 where k0='key3' +Found 1 tuple: +[863593835, 'part1', 'part2_b'] +select * from t0 where k1='part1' +Found 3 tuples: +[830039403, 'part1', 'part2'] +[846816619, 'part1', 'part2_a'] +[863593835, 'part1', 'part2_b'] +delete from t0 where k0='key1' +Delete OK, 1 row affected +delete from t0 where k0='key2' +Delete OK, 1 row affected +delete from t0 where k0='key3' +Delete OK, 1 row affected +box.space[0]:truncate() +--- +... +box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'tree', 1, 1, 0, 'num64') +--- '0: {0, ''primary'', 1701147252, 1, 1, 0, ''num64''}' +... +box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 2, 1, 'str', 2, 'str') +--- '0: {1, ''secondary'', 1701147252, 0, 2, 1, ''str'', 2, ''str''}' +... +insert into t0 values ('01234567', 'part1', 'part2') Insert OK, 1 row affected -insert into t5 values ('11234567', 'part1', 'part2') +insert into t0 values ('11234567', 'part1', 'part2') Insert OK, 1 row affected -insert into t5 values ('21234567', 'part1', 'part2_a') +insert into t0 values ('21234567', 'part1', 'part2_a') Insert OK, 1 row affected -insert into t5 values ('31234567', 'part1_a', 'part2') +insert into t0 values ('31234567', 'part1_a', 'part2') Insert OK, 1 row affected -insert into t5 values ('41234567', 'part1_a', 'part2_a') +insert into t0 values ('41234567', 'part1_a', 'part2_a') Insert OK, 1 row affected -for k, v in box.space[5]:pairs() do print(v) end +l = {} --- -3978425819141910832: {'part1', 'part2'} -3978425819141910833: {'part1', 'part2'} -3978425819141910834: {'part1', 'part2_a'} -3978425819141910835: {'part1_a', 'part2'} -3978425819141910836: {'part1_a', 'part2_a'} ... -select * from t5 where k0='01234567' +for k, v in box.space[0]:pairs() do table.insert(l, v) end +--- +... +return l +--- +- '3978425819141910832: {''part1'', ''part2''}' +- '3978425819141910833: {''part1'', ''part2''}' +- '3978425819141910834: {''part1'', ''part2_a''}' +- '3978425819141910835: {''part1_a'', ''part2''}' +- '3978425819141910836: {''part1_a'', ''part2_a''}' +... +select * from t0 where k0='01234567' Found 1 tuple: ['01234567', 'part1', 'part2'] -select * from t5 where k0='11234567' +select * from t0 where k0='11234567' Found 1 tuple: ['11234567', 'part1', 'part2'] -select * from t5 where k0='21234567' +select * from t0 where k0='21234567' Found 1 tuple: ['21234567', 'part1', 'part2_a'] -select * from t5 where k1='part1' +select * from t0 where k1='part1' Found 3 tuples: ['01234567', 'part1', 'part2'] ['11234567', 'part1', 'part2'] ['21234567', 'part1', 'part2_a'] -select * from t5 where k1='part1_a' +select * from t0 where k1='part1_a' Found 2 tuples: ['31234567', 'part1_a', 'part2'] ['41234567', 'part1_a', 'part2_a'] -select * from t5 where k1='part_none' +select * from t0 where k1='part_none' No match -call box.select('5', '1', 'part1', 'part2') +call box.select('0', '1', 'part1', 'part2') Found 2 tuples: ['01234567', 'part1', 'part2'] ['11234567', 'part1', 'part2'] -insert into t7 values (1, 'hello') +select * from t0 where k1='part1' +Found 3 tuples: +['01234567', 'part1', 'part2'] +['11234567', 'part1', 'part2'] +['21234567', 'part1', 'part2_a'] +select * from t0 where k1='part2' +No match +delete from t0 where k0='01234567' +Delete OK, 1 row affected +delete from t0 where k0='11234567' +Delete OK, 1 row affected +delete from t0 where k0='21234567' +Delete OK, 1 row affected +delete from t0 where k0='31234567' +Delete OK, 1 row affected +delete from t0 where k0='41234567' +Delete OK, 1 row affected +{ box.space[0]:select(0) } +--- {} +... +box.space[0]:truncate() +--- +... +box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'num') +--- '0: {0, ''primary'', 1752392040, 1, 1, 0, ''num''}' +... +box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'hash', 1, 1, 1, 'str') +--- '0: {1, ''secondary'', 1752392040, 1, 1, 1, ''str''}' +... +insert into t0 values (1, 'hello') Insert OK, 1 row affected -insert into t7 values (2, 'brave') +insert into t0 values (2, 'brave') Insert OK, 1 row affected -insert into t7 values (3, 'new') +insert into t0 values (3, 'new') Insert OK, 1 row affected -insert into t7 values (4, 'world') +insert into t0 values (4, 'world') Insert OK, 1 row affected # # Bug#929654 - secondary hash index is not built with build_indexes() # -select * from t7 where k1='hello' +select * from t0 where k1='hello' Found 1 tuple: [1, 'hello'] -select * from t7 where k1='brave' +select * from t0 where k1='brave' Found 1 tuple: [2, 'brave'] -select * from t7 where k1='new' +select * from t0 where k1='new' Found 1 tuple: [3, 'new'] -select * from t7 where k1='world' +select * from t0 where k1='world' Found 1 tuple: [4, 'world'] -box.space[7]:truncate() ---- -... -select * from t1 where k0='key1' -Found 1 tuple: -[830039403, 'part1', 'part2'] -select * from t1 where k0='key2' -Found 1 tuple: -[846816619, 'part1', 'part2_a'] -select * from t1 where k0='key3' -Found 1 tuple: -[863593835, 'part1', 'part2_b'] -select * from t1 where k1='part1' -Found 3 tuples: -[830039403, 'part1', 'part2'] -[846816619, 'part1', 'part2_a'] -[863593835, 'part1', 'part2_b'] -delete from t1 where k0='key1' -Delete OK, 1 row affected -delete from t1 where k0='key2' -Delete OK, 1 row affected -delete from t1 where k0='key3' -Delete OK, 1 row affected -select * from t5 where k1='part1' -Found 3 tuples: -['01234567', 'part1', 'part2'] -['11234567', 'part1', 'part2'] -['21234567', 'part1', 'part2_a'] -select * from t5 where k1='part2' -No match -delete from t5 where k0='01234567' -Delete OK, 1 row affected -delete from t5 where k0='11234567' -Delete OK, 1 row affected -delete from t5 where k0='21234567' -Delete OK, 1 row affected -delete from t5 where k0='31234567' -Delete OK, 1 row affected -delete from t5 where k0='41234567' -Delete OK, 1 row affected -for k, v in box.space[5]:pairs() do print(v) end +box.space[0]:truncate() --- ... @@ -230,133 +262,140 @@ for k, v in box.space[5]:pairs() do print(v) end # Partial REPLACE corrupts index. # -insert into t4 values ('Spears', 'Britney') +box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'str') +--- '0: {0, ''primary'', 1752392040, 1, 1, 0, ''str''}' +... +box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 1, 1, 'str') +--- '0: {1, ''secondary'', 1701147252, 0, 1, 1, ''str''}' +... +insert into t0 values ('Spears', 'Britney') Insert OK, 1 row affected -select * from t4 where k0='Spears' +select * from t0 where k0='Spears' Found 1 tuple: ['Spears', 'Britney'] -select * from t4 where k1='Britney' +select * from t0 where k1='Britney' Found 1 tuple: ['Spears', 'Britney'] -replace into t4 values ('Spears') +replace into t0 values ('Spears') An error occurred: ER_ILLEGAL_PARAMS, 'Illegal parameters, tuple must have all indexed fields' -select * from t4 where k0='Spears' +select * from t0 where k0='Spears' Found 1 tuple: ['Spears', 'Britney'] -delete from t4 where k0='Spears' +delete from t0 where k0='Spears' Delete OK, 1 row affected -insert into t4 values (1, 'duplicate one') +insert into t0 values (1, 'duplicate one') Insert OK, 1 row affected -insert into t4 values (2, 'duplicate one') +insert into t0 values (2, 'duplicate one') Insert OK, 1 row affected -insert into t4 values (3, 'duplicate one') +insert into t0 values (3, 'duplicate one') Insert OK, 1 row affected -insert into t4 values (4, 'duplicate one') +insert into t0 values (4, 'duplicate one') Insert OK, 1 row affected -insert into t4 values (5, 'duplicate one') +insert into t0 values (5, 'duplicate one') Insert OK, 1 row affected -insert into t4 values (6, 'duplicate two') +insert into t0 values (6, 'duplicate two') Insert OK, 1 row affected -insert into t4 values (7, 'duplicate two') +insert into t0 values (7, 'duplicate two') Insert OK, 1 row affected -insert into t4 values (8, 'duplicate two') +insert into t0 values (8, 'duplicate two') Insert OK, 1 row affected -insert into t4 values (9, 'duplicate two') +insert into t0 values (9, 'duplicate two') Insert OK, 1 row affected -insert into t4 values (10, 'duplicate two') +insert into t0 values (10, 'duplicate two') Insert OK, 1 row affected -insert into t4 values (11, 'duplicate three') +insert into t0 values (11, 'duplicate three') Insert OK, 1 row affected -insert into t4 values (12, 'duplicate three') +insert into t0 values (12, 'duplicate three') Insert OK, 1 row affected -insert into t4 values (13, 'duplicate three') +insert into t0 values (13, 'duplicate three') Insert OK, 1 row affected -insert into t4 values (14, 'duplicate three') +insert into t0 values (14, 'duplicate three') Insert OK, 1 row affected -insert into t4 values (15, 'duplicate three') +insert into t0 values (15, 'duplicate three') Insert OK, 1 row affected -select * from t4 where k1='duplicate one' +select * from t0 where k1='duplicate one' Found 5 tuples: [1, 'duplicate one'] [2, 'duplicate one'] [3, 'duplicate one'] [4, 'duplicate one'] [5, 'duplicate one'] -select * from t4 where k1='duplicate two' +select * from t0 where k1='duplicate two' Found 5 tuples: [10, 'duplicate two'] [6, 'duplicate two'] [7, 'duplicate two'] [8, 'duplicate two'] [9, 'duplicate two'] -select * from t4 where k1='duplicate three' +select * from t0 where k1='duplicate three' Found 5 tuples: [11, 'duplicate three'] [12, 'duplicate three'] [13, 'duplicate three'] [14, 'duplicate three'] [15, 'duplicate three'] -delete from t4 where k0=1 +delete from t0 where k0=1 Delete OK, 1 row affected -delete from t4 where k0=2 +delete from t0 where k0=2 Delete OK, 1 row affected -delete from t4 where k0=3 +delete from t0 where k0=3 Delete OK, 1 row affected -delete from t4 where k0=4 +delete from t0 where k0=4 Delete OK, 1 row affected -delete from t4 where k0=5 +delete from t0 where k0=5 Delete OK, 1 row affected -delete from t4 where k0=6 +delete from t0 where k0=6 Delete OK, 1 row affected -delete from t4 where k0=7 +delete from t0 where k0=7 Delete OK, 1 row affected -delete from t4 where k0=8 +delete from t0 where k0=8 Delete OK, 1 row affected -delete from t4 where k0=9 +delete from t0 where k0=9 Delete OK, 1 row affected -delete from t4 where k0=10 +delete from t0 where k0=10 Delete OK, 1 row affected -delete from t4 where k0=11 +delete from t0 where k0=11 Delete OK, 1 row affected -delete from t4 where k0=12 +delete from t0 where k0=12 Delete OK, 1 row affected -delete from t4 where k0=13 +delete from t0 where k0=13 Delete OK, 1 row affected -delete from t4 where k0=14 +delete from t0 where k0=14 Delete OK, 1 row affected -delete from t4 where k0=15 +delete from t0 where k0=15 Delete OK, 1 row affected -insert into t4 values(1, 'Aardvark ') +insert into t0 values(1, 'Aardvark ') Insert OK, 1 row affected -insert into t4 values(2, 'Bilimbi') +insert into t0 values(2, 'Bilimbi') Insert OK, 1 row affected -insert into t4 values(3, 'Creature ') +insert into t0 values(3, 'Creature ') Insert OK, 1 row affected -for k, v in box.space[4]:pairs() do print(v) end +{ box.space[0]:select(1) } --- -2: {'Bilimbi'} -3: {'Creature '} -1: {'Aardvark '} +- '1: {''Aardvark ''}' +- '2: {''Bilimbi''}' +- '3: {''Creature ''}' ... -box.space[4].index[0].idx:min() +box.space[0].index[0].idx:min() --- -error: 'HASH does not support min()' +error: HASH does not support min() ... -box.space[4].index[0].idx:max() +box.space[0].index[0].idx:max() --- -error: 'HASH does not support max()' +error: HASH does not support max() ... -box.space[4].index[1].idx:min() ---- - - 1: {'Aardvark '} +box.space[0].index[1].idx:min() +--- '1: {''Aardvark ''}' ... -box.space[4].index[1].idx:max() ---- - - 3: {'Creature '} +box.space[0].index[1].idx:max() +--- '3: {''Creature ''}' ... -delete from t4 where k0=1 +delete from t0 where k0=1 Delete OK, 1 row affected -delete from t4 where k0=2 +delete from t0 where k0=2 Delete OK, 1 row affected -delete from t4 where k0=3 +delete from t0 where k0=3 Delete OK, 1 row affected +box.space[0]:drop() +--- +... diff --git a/test/big/sql.test.py b/test/big/sql.test.py index 07c52e97e3..08fe77d55c 100644 --- a/test/big/sql.test.py +++ b/test/big/sql.test.py @@ -2,6 +2,13 @@ # sql.sort = True +# +# Prepare spaces +# +admin("box.insert(box.schema.SPACE_ID, 0, 0, 'tweedledum')") +admin("box.insert(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'str')") +admin("box.insert(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 1, 1, 'str')") + print """# # A test case for Bug#729758 # "SELECT fails with a disjunct and small LIMIT" @@ -21,13 +28,7 @@ print """# # https://bugs.launchpad.net/tarantool/+bug/729879 #""" sql("select * from t0 where k1='Richard' or k1='Tomas' limit 0") - -# Cleanup -sql("delete from t0 where k0='Doe'") -sql("delete from t0 where k0='Roe'") -sql("delete from t0 where k0='Woe'") -sql("delete from t0 where k0='Major'") -sql("delete from t0 where k0='Kytes'") +admin("box.space[0]:truncate()") print """# # A test case for Bug#730593 @@ -48,67 +49,86 @@ sql("select * from t0 where k1='Britney'") sql("call box.select_range('0', '0', '100', 'Spears')") sql("call box.select_range('0', '1', '100', 'Britney')") sql("delete from t0 where k0='Spears'") +# Cleanup +admin("box.space[0]:truncate()") + print """# # Test composite keys with trees #""" -sql("insert into t1 values ('key1', 'part1', 'part2')") +# Redefine the second key to be composite +admin("box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 1, 2, 1, 'str', 2, 'str')") + +sql("insert into t0 values ('key1', 'part1', 'part2')") # Test a duplicate insert on unique index that once resulted in a crash (bug #926080) -sql("replace into t1 values ('key1', 'part1', 'part2')") -sql("insert into t1 values ('key2', 'part1', 'part2_a')") -sql("insert into t1 values ('key3', 'part1', 'part2_b')") -admin("for k, v in box.space[1]:pairs() do print(v) end") -sql("select * from t1 where k0='key1'") -sql("select * from t1 where k0='key2'") -sql("select * from t1 where k0='key3'") -sql("select * from t1 where k1='part1'") -sql("call box.select_range('1', '1', '100', 'part1')") -sql("call box.select_range('1', '0', '100', 'key2')") -sql("call box.select_range('1', '1', '100', 'part1', 'part2_a')") +sql("replace into t0 values ('key1', 'part1', 'part2')") +sql("insert into t0 values ('key2', 'part1', 'part2_a')") +sql("insert into t0 values ('key3', 'part1', 'part2_b')") +admin("return { box.space[0]:select(1) }") +sql("select * from t0 where k0='key1'") +sql("select * from t0 where k0='key2'") +sql("select * from t0 where k0='key3'") +sql("select * from t0 where k1='part1'") +sql("call box.select_range('0', '1', '100', 'part1')") +sql("call box.select_range('0', '0', '100', 'key2')") +sql("call box.select_range('0', '1', '100', 'part1', 'part2_a')") +sql("select * from t0 where k0='key1'") +sql("select * from t0 where k0='key2'") +sql("select * from t0 where k0='key3'") +sql("select * from t0 where k1='part1'") +sql("delete from t0 where k0='key1'") +sql("delete from t0 where k0='key2'") +sql("delete from t0 where k0='key3'") +admin("box.space[0]:truncate()") # check non-unique multipart keys -sql("insert into t5 values ('01234567', 'part1', 'part2')") -sql("insert into t5 values ('11234567', 'part1', 'part2')") -sql("insert into t5 values ('21234567', 'part1', 'part2_a')") -sql("insert into t5 values ('31234567', 'part1_a', 'part2')") -sql("insert into t5 values ('41234567', 'part1_a', 'part2_a')") -admin("for k, v in box.space[5]:pairs() do print(v) end") -sql("select * from t5 where k0='01234567'") -sql("select * from t5 where k0='11234567'") -sql("select * from t5 where k0='21234567'") -sql("select * from t5 where k1='part1'") -sql("select * from t5 where k1='part1_a'") -sql("select * from t5 where k1='part_none'") -sql("call box.select('5', '1', 'part1', 'part2')") -sql("insert into t7 values (1, 'hello')") -sql("insert into t7 values (2, 'brave')") -sql("insert into t7 values (3, 'new')") -sql("insert into t7 values (4, 'world')") +admin("box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'tree', 1, 1, 0, 'num64')") +admin("box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 2, 1, 'str', 2, 'str')") + +sql("insert into t0 values ('01234567', 'part1', 'part2')") +sql("insert into t0 values ('11234567', 'part1', 'part2')") +sql("insert into t0 values ('21234567', 'part1', 'part2_a')") +sql("insert into t0 values ('31234567', 'part1_a', 'part2')") +sql("insert into t0 values ('41234567', 'part1_a', 'part2_a')") +admin("l = {}") +admin("for k, v in box.space[0]:pairs() do table.insert(l, v) end") +admin("return l") +sql("select * from t0 where k0='01234567'") +sql("select * from t0 where k0='11234567'") +sql("select * from t0 where k0='21234567'") +sql("select * from t0 where k1='part1'") +sql("select * from t0 where k1='part1_a'") +sql("select * from t0 where k1='part_none'") +sql("call box.select('0', '1', 'part1', 'part2')") +sql("select * from t0 where k1='part1'") +sql("select * from t0 where k1='part2'") +# cleanup +sql("delete from t0 where k0='01234567'") +sql("delete from t0 where k0='11234567'") +sql("delete from t0 where k0='21234567'") +sql("delete from t0 where k0='31234567'") +sql("delete from t0 where k0='41234567'") +admin("{ box.space[0]:select(0) }") +admin("box.space[0]:truncate()") + +admin("box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'num')") +admin("box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'hash', 1, 1, 1, 'str')") + +sql("insert into t0 values (1, 'hello')") +sql("insert into t0 values (2, 'brave')") +sql("insert into t0 values (3, 'new')") +sql("insert into t0 values (4, 'world')") # Check how build_idnexes() works server.stop() server.start() print """# # Bug#929654 - secondary hash index is not built with build_indexes() #""" -sql("select * from t7 where k1='hello'") -sql("select * from t7 where k1='brave'") -sql("select * from t7 where k1='new'") -sql("select * from t7 where k1='world'") -admin("box.space[7]:truncate()") -sql("select * from t1 where k0='key1'") -sql("select * from t1 where k0='key2'") -sql("select * from t1 where k0='key3'") -sql("select * from t1 where k1='part1'") -sql("delete from t1 where k0='key1'") -sql("delete from t1 where k0='key2'") -sql("delete from t1 where k0='key3'") -sql("select * from t5 where k1='part1'") -sql("select * from t5 where k1='part2'") -# cleanup -sql("delete from t5 where k0='01234567'") -sql("delete from t5 where k0='11234567'") -sql("delete from t5 where k0='21234567'") -sql("delete from t5 where k0='31234567'") -sql("delete from t5 where k0='41234567'") -admin("for k, v in box.space[5]:pairs() do print(v) end") +sql("select * from t0 where k1='hello'") +sql("select * from t0 where k1='brave'") +sql("select * from t0 where k1='new'") +sql("select * from t0 where k1='world'") +# +admin("box.space[0]:truncate()") + print """ # @@ -117,67 +137,70 @@ print """ # """ # clean data and restart with appropriate config +admin("box.replace(box.schema.INDEX_ID, 0, 0, 'primary', 'hash', 1, 1, 0, 'str')") +admin("box.replace(box.schema.INDEX_ID, 0, 1, 'secondary', 'tree', 0, 1, 1, 'str')") -sql("insert into t4 values ('Spears', 'Britney')") -sql("select * from t4 where k0='Spears'") -sql("select * from t4 where k1='Britney'") +sql("insert into t0 values ('Spears', 'Britney')") +sql("select * from t0 where k0='Spears'") +sql("select * from t0 where k1='Britney'") # try to insert the incoplete tuple -sql("replace into t4 values ('Spears')") +sql("replace into t0 values ('Spears')") # check that nothing has been updated -sql("select * from t4 where k0='Spears'") +sql("select * from t0 where k0='Spears'") # cleanup -sql("delete from t4 where k0='Spears'") +sql("delete from t0 where k0='Spears'") # # Test retrieval of duplicates via a secondary key # -sql("insert into t4 values (1, 'duplicate one')") -sql("insert into t4 values (2, 'duplicate one')") -sql("insert into t4 values (3, 'duplicate one')") -sql("insert into t4 values (4, 'duplicate one')") -sql("insert into t4 values (5, 'duplicate one')") -sql("insert into t4 values (6, 'duplicate two')") -sql("insert into t4 values (7, 'duplicate two')") -sql("insert into t4 values (8, 'duplicate two')") -sql("insert into t4 values (9, 'duplicate two')") -sql("insert into t4 values (10, 'duplicate two')") -sql("insert into t4 values (11, 'duplicate three')") -sql("insert into t4 values (12, 'duplicate three')") -sql("insert into t4 values (13, 'duplicate three')") -sql("insert into t4 values (14, 'duplicate three')") -sql("insert into t4 values (15, 'duplicate three')") -sql("select * from t4 where k1='duplicate one'") -sql("select * from t4 where k1='duplicate two'") -sql("select * from t4 where k1='duplicate three'") -sql("delete from t4 where k0=1") -sql("delete from t4 where k0=2") -sql("delete from t4 where k0=3") -sql("delete from t4 where k0=4") -sql("delete from t4 where k0=5") -sql("delete from t4 where k0=6") -sql("delete from t4 where k0=7") -sql("delete from t4 where k0=8") -sql("delete from t4 where k0=9") -sql("delete from t4 where k0=10") -sql("delete from t4 where k0=11") -sql("delete from t4 where k0=12") -sql("delete from t4 where k0=13") -sql("delete from t4 where k0=14") -sql("delete from t4 where k0=15") +sql("insert into t0 values (1, 'duplicate one')") +sql("insert into t0 values (2, 'duplicate one')") +sql("insert into t0 values (3, 'duplicate one')") +sql("insert into t0 values (4, 'duplicate one')") +sql("insert into t0 values (5, 'duplicate one')") +sql("insert into t0 values (6, 'duplicate two')") +sql("insert into t0 values (7, 'duplicate two')") +sql("insert into t0 values (8, 'duplicate two')") +sql("insert into t0 values (9, 'duplicate two')") +sql("insert into t0 values (10, 'duplicate two')") +sql("insert into t0 values (11, 'duplicate three')") +sql("insert into t0 values (12, 'duplicate three')") +sql("insert into t0 values (13, 'duplicate three')") +sql("insert into t0 values (14, 'duplicate three')") +sql("insert into t0 values (15, 'duplicate three')") +sql("select * from t0 where k1='duplicate one'") +sql("select * from t0 where k1='duplicate two'") +sql("select * from t0 where k1='duplicate three'") +sql("delete from t0 where k0=1") +sql("delete from t0 where k0=2") +sql("delete from t0 where k0=3") +sql("delete from t0 where k0=4") +sql("delete from t0 where k0=5") +sql("delete from t0 where k0=6") +sql("delete from t0 where k0=7") +sql("delete from t0 where k0=8") +sql("delete from t0 where k0=9") +sql("delete from t0 where k0=10") +sql("delete from t0 where k0=11") +sql("delete from t0 where k0=12") +sql("delete from t0 where k0=13") +sql("delete from t0 where k0=14") +sql("delete from t0 where k0=15") # # Check min() and max() functions # -sql("insert into t4 values(1, 'Aardvark ')") -sql("insert into t4 values(2, 'Bilimbi')") -sql("insert into t4 values(3, 'Creature ')") -admin("for k, v in box.space[4]:pairs() do print(v) end") -admin("box.space[4].index[0].idx:min()") -admin("box.space[4].index[0].idx:max()") -admin("box.space[4].index[1].idx:min()") -admin("box.space[4].index[1].idx:max()") -sql("delete from t4 where k0=1") -sql("delete from t4 where k0=2") -sql("delete from t4 where k0=3") +sql("insert into t0 values(1, 'Aardvark ')") +sql("insert into t0 values(2, 'Bilimbi')") +sql("insert into t0 values(3, 'Creature ')") +admin("{ box.space[0]:select(1) }") +admin("box.space[0].index[0].idx:min()") +admin("box.space[0].index[0].idx:max()") +admin("box.space[0].index[1].idx:min()") +admin("box.space[0].index[1].idx:max()") +sql("delete from t0 where k0=1") +sql("delete from t0 where k0=2") +sql("delete from t0 where k0=3") +admin("box.space[0]:drop()") sql.sort = False # vim: syntax=python diff --git a/test/big/tarantool.cfg b/test/big/tarantool.cfg index 58def14511..5d669baffa 100644 --- a/test/big/tarantool.cfg +++ b/test/big/tarantool.cfg @@ -9,388 +9,3 @@ secondary_port = 33014 admin_port = 33015 rows_per_wal = 50 - -space[0].enabled = 1 -space[0].index[0].type = "HASH" -space[0].index[0].unique = 1 -space[0].index[0].key_field[0].fieldno = 0 -space[0].index[0].key_field[0].type = "STR" -space[0].index[1].type = "TREE" -space[0].index[1].unique = 0 -space[0].index[1].key_field[0].fieldno = 1 -space[0].index[1].key_field[0].type = "STR" - -space[1].enabled = 1 -space[1].index[0].type = "HASH" -space[1].index[0].unique = 1 -space[1].index[0].key_field[0].fieldno = 0 -space[1].index[0].key_field[0].type = "STR" -space[1].index[1].type = "TREE" -space[1].index[1].unique = 1 -space[1].index[1].key_field[0].fieldno = 1 -space[1].index[1].key_field[0].type = "STR" -space[1].index[1].key_field[1].fieldno = 2 -space[1].index[1].key_field[1].type = "STR" - -space[2].enabled = 1 -space[2].index[0].type = "TREE" -space[2].index[0].unique = 1 -space[2].index[0].key_field[0].fieldno = 0 -space[2].index[0].key_field[0].type = "NUM" - -space[3].enabled = 1 -space[3].index[0].type = "TREE" -space[3].index[0].unique = 1 -space[3].index[0].key_field[0].fieldno = 0 -space[3].index[0].key_field[0].type = "STR" - -space[4].enabled = 1 -space[4].index[0].type = "HASH" -space[4].index[0].unique = 1 -space[4].index[0].key_field[0].fieldno = 0 -space[4].index[0].key_field[0].type = "STR" -space[4].index[1].type = "TREE" -space[4].index[1].unique = 0 -space[4].index[1].key_field[0].fieldno = 1 -space[4].index[1].key_field[0].type = "STR" - -space[5].enabled = 1 -space[5].index[0].type = "TREE" -space[5].index[0].unique = 1 -space[5].index[0].key_field[0].fieldno = 0 -space[5].index[0].key_field[0].type = "NUM64" -space[5].index[1].type = "TREE" -space[5].index[1].unique = 0 -space[5].index[1].key_field[0].fieldno = 1 -space[5].index[1].key_field[0].type = "STR" -space[5].index[1].key_field[1].fieldno = 2 -space[5].index[1].key_field[1].type = "STR" - - -# -# Tree index variants -# -# Tuple fields: -# -# 0: NUM, 1: NUM64, 2: NUM64, 3: STR, 4: STR, 5: STR, 6: STR, 7: *, 8: NUM -# - -space[6].enabled = 1 - -space[6].index[0].type = "TREE" -space[6].index[0].unique = 1 -space[6].index[0].key_field[0].fieldno = 0 -space[6].index[0].key_field[0].type = "NUM" - -space[6].index[1].type = "TREE" -space[6].index[1].unique = 1 -space[6].index[1].key_field[0].fieldno = 1 -space[6].index[1].key_field[0].type = "NUM64" - -space[6].index[2].type = "TREE" -space[6].index[2].unique = 0 -space[6].index[2].key_field[0].fieldno = 2 -space[6].index[2].key_field[0].type = "NUM64" - -space[6].index[3].type = "TREE" -space[6].index[3].unique = 0 -space[6].index[3].key_field[0].fieldno = 3 -space[6].index[3].key_field[0].type = "STR" -space[6].index[3].key_field[1].fieldno = 4 -space[6].index[3].key_field[1].type = "STR" - -space[6].index[4].type = "TREE" -space[6].index[4].unique = 0 -space[6].index[4].key_field[0].fieldno = 6 -space[6].index[4].key_field[0].type = "STR" -space[6].index[4].key_field[1].fieldno = 5 -space[6].index[4].key_field[1].type = "STR" - -space[6].index[5].type = "TREE" -space[6].index[5].unique = 0 -space[6].index[5].key_field[0].fieldno = 8 -space[6].index[5].key_field[0].type = "NUM" - -space[6].index[6].type = "TREE" -space[6].index[6].unique = 1 -space[6].index[6].key_field[0].fieldno = 6 -space[6].index[6].key_field[0].type = "STR" -space[6].index[6].key_field[1].fieldno = 5 -space[6].index[6].key_field[1].type = "STR" -space[6].index[6].key_field[2].fieldno = 3 -space[6].index[6].key_field[2].type = "STR" -space[6].index[6].key_field[3].fieldno = 4 -space[6].index[6].key_field[3].type = "STR" -space[6].index[6].key_field[4].fieldno = 8 -space[6].index[6].key_field[4].type = "NUM" - -# Space #7, https://bugs.launchpad.net/tarantool/+bug/929654 -space[7].enabled = true - -space[7].index[0].type = "HASH" -space[7].index[0].unique = true -space[7].index[0].key_field[0].fieldno = 0 -space[7].index[0].key_field[0].type = "NUM" - -space[7].index[1].type = "HASH" -space[7].index[1].unique = true -space[7].index[1].key_field[0].fieldno = 1 -space[7].index[1].key_field[0].type = "STR" - -# Lua 64bit numbers -space[8].enabled = true -space[8].index[0].type = "TREE" -space[8].index[0].unique = 1 -space[8].index[0].key_field[0].fieldno = 0 -space[8].index[0].key_field[0].type = "NUM64" - - -space[9].enabled = true -# Multipart primary key (sender nickname, receiver nickname, message id) -space[9].index[0].type = "TREE" -space[9].index[0].unique = 1 -# Sender user nickname -space[9].index[0].key_field[0].fieldno = 0 -space[9].index[0].key_field[0].type = "STR" -# Receiver user nickname -space[9].index[0].key_field[1].fieldno = 1 -space[9].index[0].key_field[1].type = "STR" -# Message id -space[9].index[0].key_field[2].fieldno = 2 -space[9].index[0].key_field[2].type = "NUM" - -# First space for hash_i32 tests -space[10].enabled = 1 -space[10].index[0].type = "HASH" -space[10].index[0].unique = 1 -space[10].index[0].key_field[0].fieldno = 0 -space[10].index[0].key_field[0].type = "NUM" - -# Second space for hash_i64 tests -space[11].enabled = 1 -space[11].index[0].type = "HASH" -space[11].index[0].unique = 1 -space[11].index[0].key_field[0].fieldno = 0 -space[11].index[0].key_field[0].type = "NUM64" - -# First space for hash_str tests -space[12].enabled = 1 -space[12].index[0].type = "HASH" -space[12].index[0].unique = 1 -space[12].index[0].key_field[0].fieldno = 0 -space[12].index[0].key_field[0].type = "STR" - -# lua select_reverse_range() testing -# https://blueprints.launchpad.net/tarantool/+spec/backward-tree-index-iterator -space[14].enabled = true -space[14].index[0].type = "TREE" -space[14].index[0].unique = 1 -space[14].index[0].key_field[0].fieldno = 0 -space[14].index[0].key_field[0].type = "NUM" -space[14].index[1].type = "TREE" -space[14].index[1].unique = 1 -space[14].index[1].key_field[0].fieldno = 1 -space[14].index[1].key_field[0].type = "NUM" -space[14].index[1].key_field[1].fieldno = 0 -space[14].index[1].key_field[1].type = "NUM" - -space[15].enabled = true -space[15].index[0].type = "TREE" -space[15].index[0].unique = true -space[15].index[0].key_field[0].fieldno = 0 -space[15].index[0].key_field[0].type = "STR" - -# Tests for box.index iterators (old) -space[16].enabled = true -space[16].index[0].type = "TREE" -space[16].index[0].unique = 1 -space[16].index[0].key_field[0].fieldno = 0 -space[16].index[0].key_field[0].type = "STR" -space[16].index[1].type = "TREE" -space[16].index[1].unique = 1 -space[16].index[1].key_field[0].fieldno = 1 -space[16].index[1].key_field[0].type = "STR" -space[16].index[1].key_field[1].fieldno = 2 -space[16].index[1].key_field[1].type = "STR" - -# lua index.idx:count() testing -# https://blueprints.launchpad.net/tarantool/+spec/lua-builtin-size-of-subtree -space[17].enabled = true -space[17].index[0].type = "HASH" -space[17].index[0].unique = 1 -space[17].index[0].key_field[0].fieldno = 0 -space[17].index[0].key_field[0].type = "NUM" -space[17].index[1].type = "TREE" -space[17].index[1].unique = 0 -space[17].index[1].key_field[0].fieldno = 1 -space[17].index[1].key_field[0].type = "NUM" -space[17].index[1].key_field[1].fieldno = 2 -space[17].index[1].key_field[1].type = "NUM" - -# lua box.auto_increment() testing -# http://bugs.launchpad.net/tarantool/+bug/1006354 -space[18].enabled = 1 -space[18].index[0].type = "TREE" -space[18].index[0].unique = 1 -space[18].index[0].key_field[0].fieldno = 0 -space[18].index[0].key_field[0].type = "NUM" - -# Space #19, https://bugs.launchpad.net/tarantool/+bug/1082356 -space[19].enabled = 1 -space[19].index[0].type = "TREE" -space[19].index[0].unique = 1 -space[19].index[0].key_field[0].fieldno = 0 -space[19].index[0].key_field[0].type = "NUM" -space[19].index[0].key_field[1].fieldno = 2 -space[19].index[0].key_field[1].type = "NUM" - -# -# Tests for box.index iterators (new) -# - -# Tree single-part unique -space[20].enabled = true -space[20].index[0].type = "TREE" -space[20].index[0].unique = 1 -space[20].index[0].key_field[0].fieldno = 0 -space[20].index[0].key_field[0].type = "STR" - -# Tree single-part non-unique -space[20].index[1].type = "TREE" -space[20].index[1].unique = 0 -space[20].index[1].key_field[0].fieldno = 1 -space[20].index[1].key_field[0].type = "STR" - -# Tree multi-part unique -space[20].index[2].type = "TREE" -space[20].index[2].unique = 1 -space[20].index[2].key_field[0].fieldno = 1 -space[20].index[2].key_field[0].type = "STR" -space[20].index[2].key_field[1].fieldno = 2 -space[20].index[2].key_field[1].type = "STR" - -# Tree multi-part non-unique -space[20].index[3].type = "TREE" -space[20].index[3].unique = 0 -space[20].index[3].key_field[0].fieldno = 2 -space[20].index[3].key_field[0].type = "STR" -space[20].index[3].key_field[1].fieldno = 3 -space[20].index[3].key_field[1].type = "STR" - -# Hash single-part unique -space[20].index[4].type = "HASH" -space[20].index[4].unique = 1 -space[20].index[4].key_field[0].fieldno = 0 -space[20].index[4].key_field[0].type = "STR" - -# Hash multi-part unique -space[20].index[5].type = "HASH" -space[20].index[5].unique = 1 -space[20].index[5].key_field[0].fieldno = 1 -space[20].index[5].key_field[0].type = "STR" -space[20].index[5].key_field[1].fieldno = 2 -space[20].index[5].key_field[1].type = "STR" - -# hash::replace -space[21].enabled = true - -space[21].index[0].type = "HASH" -space[21].index[0].unique = true -space[21].index[0].key_field[0].fieldno = 0 -space[21].index[0].key_field[0].type = "NUM" - -space[21].index[1].type = "HASH" -space[21].index[1].unique = true -space[21].index[1].key_field[0].fieldno = 1 -space[21].index[1].key_field[0].type = "NUM" - -space[21].index[2].type = "HASH" -space[21].index[2].unique = true -space[21].index[2].key_field[0].fieldno = 2 -space[21].index[2].key_field[0].type = "NUM" - -space[21].index[3].type = "HASH" -space[21].index[3].unique = true -space[21].index[3].key_field[0].fieldno = 3 -space[21].index[3].key_field[0].type = "NUM" - -# tree::replace test -space[22].enabled = true - -space[22].index[0].type = "TREE" -space[22].index[0].unique = true -space[22].index[0].key_field[0].fieldno = 0 -space[22].index[0].key_field[0].type = "NUM" - -space[22].index[1].type = "TREE" -space[22].index[1].unique = true -space[22].index[1].key_field[0].fieldno = 1 -space[22].index[1].key_field[0].type = "NUM" - -space[22].index[2].type = "TREE" -space[22].index[2].unique = false -space[22].index[2].key_field[0].fieldno = 2 -space[22].index[2].key_field[0].type = "NUM" - -space[22].index[3].type = "TREE" -space[22].index[3].unique = true -space[22].index[3].key_field[0].fieldno = 3 -space[22].index[3].key_field[0].type = "NUM" - -# Space #23, https://bugs.launchpad.net/tarantool/+bug/1042798 -space[23].enabled = 1 -space[23].index[0].type = "TREE" -space[23].index[0].unique = 1 -space[23].index[0].key_field[0].fieldno = 2 -space[23].index[0].key_field[0].type = "NUM" -space[23].index[0].key_field[1].fieldno = 1 -space[23].index[0].key_field[1].type = "NUM" - -# bitset::replace test -space[24].enabled = true -space[24].index[0].type = "HASH" -space[24].index[0].unique = true -space[24].index[0].key_field[0].fieldno = 0 -space[24].index[0].key_field[0].type = "NUM" - -space[24].index[1].type = "BITSET" -space[24].index[1].unique = false -space[24].index[1].key_field[0].fieldno = 1 -space[24].index[1].key_field[0].type = "NUM" - -# lua box.auto_increment() with NUM64 keys testing -space[25].enabled = 1 -space[25].index[0].type = "TREE" -space[25].index[0].unique = 1 -space[25].index[0].key_field[0].fieldno = 0 -space[25].index[0].key_field[0].type = "NUM64" -# index:random test -space[26].enabled = true -space[26].index[0].type = "TREE" -space[26].index[0].unique = true -space[26].index[0].key_field[0].fieldno = 0 -space[26].index[0].key_field[0].type = "NUM" - -space[26].index[1].type = "HASH" -space[26].index[1].unique = true -space[26].index[1].key_field[0].fieldno = 0 -space[26].index[1].key_field[0].type = "NUM" - -# Multi-part hash -space[27].enabled = 1 - -space[27].index[0].type = HASH -space[27].index[0].unique = 1 -space[27].index[0].key_field[0].fieldno = 0 -space[27].index[0].key_field[0].type = NUM -space[27].index[0].key_field[1].fieldno = 1 -space[27].index[0].key_field[1].type = STR -space[27].index[0].key_field[2].fieldno = 2 -space[27].index[0].key_field[2].type = NUM - -space[27].index[1].type = HASH -space[27].index[1].unique = 1 -space[27].index[1].key_field[0].fieldno = 2 -space[27].index[1].key_field[0].type = NUM -space[27].index[1].key_field[1].fieldno = 4 -space[27].index[1].key_field[1].type = NUM -- GitLab