From 3136f5e0ecc580a5735739f4b3077d7b68da3fb0 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk <roman@tsisyk.com> Date: Thu, 9 Jun 2016 13:03:38 +0300 Subject: [PATCH] Fix #1467: iterator types are not validated in request Regression introduced by 9036eeeb80702cff55eaaf1a61a5b78cf9e3c015 --- src/box/memtx_bitset.cc | 3 ++- src/box/memtx_rtree.cc | 2 +- src/box/sophia_index.cc | 2 +- test/box/bitset.result | 24 ++++++++++++++++++++++++ test/box/bitset.test.lua | 12 ++++++++++++ test/box/hash.result | 15 +++++++++++++++ test/box/hash.test.lua | 6 ++++++ test/box/rtree_misc.result | 6 ++++++ test/box/rtree_misc.test.lua | 3 +++ test/engine/iterator.result | 23 +++++++++++++++++++++++ test/engine/iterator.test.lua | 9 +++++++++ 11 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/box/memtx_bitset.cc b/src/box/memtx_bitset.cc index c3eff30fcd..4c4b956332 100644 --- a/src/box/memtx_bitset.cc +++ b/src/box/memtx_bitset.cc @@ -368,7 +368,8 @@ MemtxBitset::initIterator(struct iterator *iterator, enum iterator_type type, bitset_key_size); break; default: - return initIterator(iterator, type, key, part_count); + return Index::initIterator(iterator, type, key, + part_count); } if (rc != 0) { diff --git a/src/box/memtx_rtree.cc b/src/box/memtx_rtree.cc index e4d590236d..5a3c9c98d4 100644 --- a/src/box/memtx_rtree.cc +++ b/src/box/memtx_rtree.cc @@ -277,7 +277,7 @@ MemtxRTree::initIterator(struct iterator *iterator, enum iterator_type type, op = SOP_NEIGHBOR; break; default: - return initIterator(iterator, type, key, part_count); + return Index::initIterator(iterator, type, key, part_count); } rtree_search(&m_tree, &rect, op, &it->impl); } diff --git a/src/box/sophia_index.cc b/src/box/sophia_index.cc index 122d81b9e7..8f4f07efb8 100644 --- a/src/box/sophia_index.cc +++ b/src/box/sophia_index.cc @@ -733,7 +733,7 @@ SophiaIndex::initIterator(struct iterator *ptr, case ITER_LT: compare = "<"; break; default: - return initIterator(ptr, type, key, part_count); + return Index::initIterator(ptr, type, key, part_count); } it->cursor = sp_cursor(env); if (it->cursor == NULL) diff --git a/test/box/bitset.result b/test/box/bitset.result index 09c0523e9b..1538452a86 100644 --- a/test/box/bitset.result +++ b/test/box/bitset.result @@ -1838,3 +1838,27 @@ dump(box.index.BITS_ANY_SET, 113) drop_space() --- ... +------------------------------------------------------------------------------ +-- Misc +------------------------------------------------------------------------------ +-- gh-1467: invalid iterator type +space = box.schema.space.create('test') +--- +... +_ = space:create_index('primary', { type = 'hash', parts = {1, 'num'}, unique = true }) +--- +... +_ = space:create_index('bitset', { type = 'bitset', parts = {2, 'num'}, unique = false }) +--- +... +space.index.bitset:select({1}, { iterator = 'OVERLAPS'}) +--- +- error: Index 'bitset' (BITSET) of space 'test' (memtx) does not support requested + iterator type +... +space:drop() +--- +... +space = nil +--- +... diff --git a/test/box/bitset.test.lua b/test/box/bitset.test.lua index 237f5646fd..ad745156d8 100644 --- a/test/box/bitset.test.lua +++ b/test/box/bitset.test.lua @@ -95,3 +95,15 @@ dump(box.index.BITS_ANY_SET, 84) dump(box.index.BITS_ANY_SET, 113) drop_space() + +------------------------------------------------------------------------------ +-- Misc +------------------------------------------------------------------------------ + +-- gh-1467: invalid iterator type +space = box.schema.space.create('test') +_ = space:create_index('primary', { type = 'hash', parts = {1, 'num'}, unique = true }) +_ = space:create_index('bitset', { type = 'bitset', parts = {2, 'num'}, unique = false }) +space.index.bitset:select({1}, { iterator = 'OVERLAPS'}) +space:drop() +space = nil diff --git a/test/box/hash.result b/test/box/hash.result index fb8ec35fe5..1d7618a4e6 100644 --- a/test/box/hash.result +++ b/test/box/hash.result @@ -717,3 +717,18 @@ box.space.test:insert{1} box.space.test:drop() --- ... +-- gh-1467: invalid iterator type +space = box.schema.space.create('test') +--- +... +index = space:create_index('primary', { type = 'hash' }) +--- +... +space:select({1}, {iterator = 'BITS_ALL_SET' } ) +--- +- error: Index 'primary' (HASH) of space 'test' (memtx) does not support requested + iterator type +... +space:drop() +--- +... diff --git a/test/box/hash.test.lua b/test/box/hash.test.lua index 7fb2cb7c01..ec157b926f 100644 --- a/test/box/hash.test.lua +++ b/test/box/hash.test.lua @@ -307,3 +307,9 @@ _ = box.schema.create_space('test') _ = box.space.test:create_index('i',{parts={1,'STR'}}) box.space.test:insert{1} box.space.test:drop() + +-- gh-1467: invalid iterator type +space = box.schema.space.create('test') +index = space:create_index('primary', { type = 'hash' }) +space:select({1}, {iterator = 'BITS_ALL_SET' } ) +space:drop() diff --git a/test/box/rtree_misc.result b/test/box/rtree_misc.result index 785976aec7..625b2670c2 100644 --- a/test/box/rtree_misc.result +++ b/test/box/rtree_misc.result @@ -690,6 +690,12 @@ i:select({0, 0, 0}, {iterator = 'neighbor'}) - - [2, [2, 0, 0]] - [1, [1, 1, 1]] ... +-- gh-1467: invalid iterator type +i:select({1, 2, 3, 4, 5, 6}, {iterator = 'BITS_ALL_SET' } ) +--- +- error: Index 's' (RTREE) of space 's' (memtx) does not support requested iterator + type +... s:drop() --- ... diff --git a/test/box/rtree_misc.test.lua b/test/box/rtree_misc.test.lua index cf061a77ce..3493f06550 100644 --- a/test/box/rtree_misc.test.lua +++ b/test/box/rtree_misc.test.lua @@ -241,4 +241,7 @@ i:select({0, 0, 0}, {iterator = 'neighbor'}) i:alter{distance = 'manhattan' } i:select({0, 0, 0}, {iterator = 'neighbor'}) +-- gh-1467: invalid iterator type +i:select({1, 2, 3, 4, 5, 6}, {iterator = 'BITS_ALL_SET' } ) + s:drop() diff --git a/test/engine/iterator.result b/test/engine/iterator.result index 4658f20940..e2d72ecaad 100644 --- a/test/engine/iterator.result +++ b/test/engine/iterator.result @@ -7,6 +7,10 @@ inspector = test_run.new() engine = inspector:get_cfg('engine') --- ... +inspector:cmd("push filter '"..engine.."' to 'engine'") +--- +- true +... -- iterator (str) space = box.schema.space.create('test', { engine = engine }) --- @@ -2927,3 +2931,22 @@ t space:drop() --- ... +-- gh-1467: invalid iterator type +space = box.schema.space.create('test', { engine = engine }) +--- +... +index = space:create_index('primary') +--- +... +space:select({}, {iterator = 'BITS_ALL_SET' } ) +--- +- error: Index 'primary' (TREE) of space 'test' (engine) does not support requested + iterator type +... +space:drop() +--- +... +inspector:cmd("clear filter") +--- +- true +... diff --git a/test/engine/iterator.test.lua b/test/engine/iterator.test.lua index 7e24852141..b5c424b05e 100644 --- a/test/engine/iterator.test.lua +++ b/test/engine/iterator.test.lua @@ -1,6 +1,7 @@ test_run = require('test_run') inspector = test_run.new() engine = inspector:get_cfg('engine') +inspector:cmd("push filter '"..engine.."' to 'engine'") -- iterator (str) space = box.schema.space.create('test', { engine = engine }) @@ -91,3 +92,11 @@ t t = {} for state, v in index:pairs(box.tuple.new(tostring(77)), {iterator = 'LT'}) do table.insert(t, v) end t space:drop() + +-- gh-1467: invalid iterator type +space = box.schema.space.create('test', { engine = engine }) +index = space:create_index('primary') +space:select({}, {iterator = 'BITS_ALL_SET' } ) +space:drop() + +inspector:cmd("clear filter") -- GitLab