diff --git a/changelogs/unreleased/gh-6167-select-with-dict.md b/changelogs/unreleased/gh-6167-select-with-dict.md new file mode 100644 index 0000000000000000000000000000000000000000..edf2d1047b1e192f817773799b2715c7b3ae2715 --- /dev/null +++ b/changelogs/unreleased/gh-6167-select-with-dict.md @@ -0,0 +1,3 @@ +## bugfix/memtx + +* Now memtx will raise an error if "clear" dictionary was passed to s:select() (gh-6167) diff --git a/src/box/lua/tuple.lua b/src/box/lua/tuple.lua index f47b5926d695968d157de85956714b1d1915f593..98f3f8de63ca430bb56fc89b286e640617a0b722 100644 --- a/src/box/lua/tuple.lua +++ b/src/box/lua/tuple.lua @@ -79,8 +79,13 @@ local tuple_encode = function(tmpbuf, obj) elseif is_tuple(obj) then encode_r(tmpbuf, obj, 1) elseif type(obj) == "table" then - encode_array(tmpbuf, #obj) - for i = 1, #obj, 1 do + local obj_size = #obj + if obj_size == 0 and not rawequal(next(obj), nil) then + -- dictionary cannot represent a tuple + return box.error(box.error.TUPLE_NOT_ARRAY) + end + encode_array(tmpbuf, obj_size) + for i = 1, obj_size, 1 do encode_r(tmpbuf, obj[i], 1) end else diff --git a/test/box/gh-6167-select-with-dict.result b/test/box/gh-6167-select-with-dict.result new file mode 100644 index 0000000000000000000000000000000000000000..249c18f99b71cd331dec6b0bae8c5736da754cb6 --- /dev/null +++ b/test/box/gh-6167-select-with-dict.result @@ -0,0 +1,26 @@ +-- test-run result file version 2 +s = box.schema.create_space('test') + | --- + | ... +_ = s:create_index('pk') + | --- + | ... +dict = {key = 'value'} + | --- + | ... +-- There must be errors saying tuple must be array +s:select(dict) + | --- + | - error: Tuple/Key must be MsgPack array + | ... +s:pairs(dict) + | --- + | - error: Tuple/Key must be MsgPack array + | ... +s:get(dict) + | --- + | - error: Tuple/Key must be MsgPack array + | ... +s:drop() + | --- + | ... diff --git a/test/box/gh-6167-select-with-dict.test.lua b/test/box/gh-6167-select-with-dict.test.lua new file mode 100644 index 0000000000000000000000000000000000000000..2c440a6c5de5446040d3f251d4675bff2f703123 --- /dev/null +++ b/test/box/gh-6167-select-with-dict.test.lua @@ -0,0 +1,8 @@ +s = box.schema.create_space('test') +_ = s:create_index('pk') +dict = {key = 'value'} +-- There must be errors saying tuple must be array +s:select(dict) +s:pairs(dict) +s:get(dict) +s:drop()