UPDATE: next_equal also can be implemented as a flag inside enum
iterator_flags {}-- You received this bug notification because you are a member of Tarantool Development Team, which is subscribed to tarantool. https://bugs.launchpad.net/bugs/1073476 Title: box.select_range and box.select_reverse_range only use first part of compound keys / index.next API is weird Status in Tarantool - an efficient in-memory data store: New Bug description: This bug is related to https://bugs.launchpad.net/tarantool/+bug/1073457 , but have another roots of the problem. space[0].enabled = 1 space[0].index[0].type = "TREE" space[0].index[0].unique = 1 space[0].index[0].key_field[0].fieldno = 0 space[0].index[0].key_field[0].type = "NUM" space[0].index[0].key_field[1].fieldno = 1 space[0].index[0].key_field[1].type = "NUM" INSERT INTO t0 VALUES(2,1) INSERT INTO t0 VALUES(2,3) INSERT INTO t0 VALUES(2,4) INSERT INTO t0 VALUES(2,5) INSERT INTO t0 VALUES(2,6) INSERT INTO t0 VALUES(2,7) INSERT INTO t0 VALUES(2,8) localhost> lua box.select_range(0, 0, 100, 2) --- - 2: {1} - 2: {3} - 2: {4} - 2: {5} - 2: {6} - 2: {7} - 2: {8} Incorrect, works like box.select bug (see https://bugs.launchpad.net/tarantool/+bug/1073457). localhost> lua box.select_range(0, 0, 100, 2, 3) --- - 2: {1} - 2: {3} - 2: {4} - 2: {5} - 2: {6} - 2: {7} - 2: {8} Also incorrect, should select entries starting from 2: {3} (box.select works properly). box.select_range and box.select_reverse_range are implemented entirely in Lua, based on box.index methods. 01 index_mt.select_range = function(index, limit, ...) 02 local range = {} 03 for k, v in index.idx.next, index.idx, ... do 04 if #range >= limit then 05 break 06 end 07 table.insert(range, v) 08 end 09 return unpack(range) 10 end I am not Lua guru, but seems that expression in line 10 with params like "box.select_range(space_no, index_no, key0, key1, key2)" will be expanded to "for k, v in index.idx.next, index.idx, key0, key1, key2 do". According to lua manual, a for statement like for var_1, ···, var_n in explist do block end is equivalent to the code: do local f, s, var = explist while true do local var_1, ···, var_n = f(s, var) var = var_1 if var == nil then break end block end end for our case "for" is evaluated like this "local f, s, var = index.idx.next, index.idx, key0, key1, key2" As result, all keys begin from second will be ignored. I have no idea how to fix it, because current the index iteration API is definetly weird (will post another bug for that). To manage notifications about this bug go to: https://bugs.launchpad.net/tarantool/+bug/1073476/+subscriptions _______________________________________________ Mailing list: https://launchpad.net/~tarantool-developers Post to : [email protected] Unsubscribe : https://launchpad.net/~tarantool-developers More help : https://help.launchpad.net/ListHelp

