diff --git a/src/box/box_lua.cc b/src/box/box_lua.cc index 9606f1919514829c7660adb3b3c550f990dee411..9bc7b989d9736efb0c96fb9b967d6496888481f0 100644 --- a/src/box/box_lua.cc +++ b/src/box/box_lua.cc @@ -314,7 +314,9 @@ lbox_tuple_transform(struct lua_State *L) /* * Calculate the number of operations and length of UPDATE expression */ - uint32_t op_cnt = offset < tuple->field_count ? field_count : 0; + uint32_t op_cnt = 0; + if (offset < tuple->field_count && field_count > 0) + op_cnt++; if (argc > 3) op_cnt += argc - 3; @@ -331,10 +333,13 @@ lbox_tuple_transform(struct lua_State *L) luaL_buffinit(L, &b); luaL_addlstring(&b, (char *) &op_cnt, sizeof(op_cnt)); uint32_t offset_u32 = (uint32_t) offset; - for (uint32_t i = 0; i < (uint32_t) field_count; i++) { + uint32_t field_count_u32 = (uint32_t) field_count; + if (field_count > 0) { luaL_addlstring(&b, (char *) &offset_u32, sizeof(offset_u32)); - luaL_addchar(&b, UPDATE_OP_DELETE_1_4); - luaL_addvarint32(&b, 0); /* Unused. */ + luaL_addchar(&b, UPDATE_OP_DELETE); /* multi-delete */ + luaL_addvarint32(&b, sizeof(field_count_u32)); + luaL_addlstring(&b, (char *) &field_count_u32, + sizeof(field_count_u32)); } for (int i = argc ; i > 3; i--) { diff --git a/test/big/lua.result b/test/big/lua.result index e10bb33fa784b591572a8ff333051615d6561a44..37f969d0edf5744756753b61102ec18ff052ea41 100644 --- a/test/big/lua.result +++ b/test/big/lua.result @@ -480,6 +480,22 @@ lua t:transform(0, 1, {}) --- error: 'tuple.transform(): unsupported field type ''table''' ... +lua n = 50000; +--- +... +lua tab = {}; for i=1,n,1 do table.insert(tab, i) end +--- +... +lua t = box.tuple.new(tab) +--- +... +lua t:transform(0, n - 1) +--- + - 50000: {} +... +lua t = nil +--- +... lua t=box.insert(12, 'A', '2', '3', '4', '3', '2', '5', '6', '3', '7') --- ... diff --git a/test/big/lua.test b/test/big/lua.test index 03a4bfc9835b1f2e3a13fe35d927a78514aa036b..a99d46a72e497651da371db246482996fe9dd254 100644 --- a/test/big/lua.test +++ b/test/big/lua.test @@ -175,6 +175,17 @@ exec admin "lua t:transform(0, 3, 1, 2, 3)" exec admin "lua t:transform(3, 1, tonumber64(4))" exec admin "lua t:transform(0, 1, {})" +# +# Tests for OPENTAR-64 - a limitation for the second argument to tuple:transform +# + +# 50K is enough for everyone +exec admin "lua n = 50000;" +exec admin "lua tab = {}; for i=1,n,1 do table.insert(tab, i) end" +exec admin "lua t = box.tuple.new(tab)" +exec admin "lua t:transform(0, n - 1)" +exec admin "lua t = nil" + # # Tests for lua tuple:find() and tuple:findall() #