Tarantool development patches archive
 help / color / mirror / Atom feed
* [tarantool-patches] [PATCH 0/2] fix yaml encode/decode
@ 2018-10-04 14:36 AKhatskevich
  2018-10-04 14:36 ` [tarantool-patches] [PATCH 1/2] lua-yaml: fix read garbage bug AKhatskevich
  2018-10-04 14:36 ` [tarantool-patches] [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring AKhatskevich
  0 siblings, 2 replies; 4+ messages in thread
From: AKhatskevich @ 2018-10-04 14:36 UTC (permalink / raw)
  To: kyukhin, tarantool-patches

Branch: https://github.com/tarantool/tarantool/tree/kh/gh-3662-yaml-1.10
Issue: https://github.com/tarantool/tarantool/issues/3583
Issue: https://github.com/tarantool/tarantool/issues/3662

AKhatskevich (2):
  lua-yaml: fix read garbage bug
  lua-yaml: fix yaml encode/decode type inferring

 test/app-tap/console.test.lua   |   25 +-
 test/app/fio.result             |    2 +-
 test/app/socket.result          |   26 +-
 test/box/access.result          |    8 +-
 test/box/misc.result            |    2 +-
 test/box/role.result            |    8 +-
 test/box/sequence.result        |    2 +-
 test/vinyl/errinj.result        |   10 +-
 test/vinyl/hermitage.result     |  122 ++---
 test/vinyl/mvcc.result          | 1062 +++++++++++++++++++--------------------
 test/vinyl/tx_conflict.result   |    4 +-
 test/vinyl/tx_conflict.test.lua |    4 +-
 test/vinyl/tx_gap_lock.result   |  186 +++----
 test/vinyl/tx_serial.result     |    4 +-
 test/vinyl/tx_serial.test.lua   |    4 +-
 test/vinyl/txn_proxy.lua        |    6 +
 third_party/lua-yaml/lyaml.cc   |   50 +-
 third_party/lua-yaml/str_type.h |   33 ++
 18 files changed, 806 insertions(+), 752 deletions(-)
 create mode 100644 third_party/lua-yaml/str_type.h

-- 
2.14.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tarantool-patches] [PATCH 1/2] lua-yaml: fix read garbage bug
  2018-10-04 14:36 [tarantool-patches] [PATCH 0/2] fix yaml encode/decode AKhatskevich
@ 2018-10-04 14:36 ` AKhatskevich
  2018-10-04 14:36 ` [tarantool-patches] [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring AKhatskevich
  1 sibling, 0 replies; 4+ messages in thread
From: AKhatskevich @ 2018-10-04 14:36 UTC (permalink / raw)
  To: kyukhin, tarantool-patches

Add argc check for yaml encode and decode functions.
---
 third_party/lua-yaml/lyaml.cc | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/third_party/lua-yaml/lyaml.cc b/third_party/lua-yaml/lyaml.cc
index c6d118a79..9b07992d8 100644
--- a/third_party/lua-yaml/lyaml.cc
+++ b/third_party/lua-yaml/lyaml.cc
@@ -400,7 +400,8 @@ static void load(struct lua_yaml_loader *loader) {
  */
 static int l_load(lua_State *L) {
    struct lua_yaml_loader loader;
-   if (! lua_isstring(L, 1)) {
+   int top = lua_gettop(L);
+   if (!(top == 1 || top == 2) || !lua_isstring(L, 1)) {
 usage_error:
       return luaL_error(L, "Usage: yaml.decode(document, "\
                         "[{tag_only = boolean}])");
@@ -416,7 +417,7 @@ usage_error:
       return luaL_error(L, OOM_ERRMSG);
    yaml_parser_set_input_string(&loader.parser, (yaml_char_t *) document, len);
    bool tag_only;
-   if (lua_gettop(L) > 1) {
+   if (lua_gettop(L) == 2) {
       if (! lua_istable(L, 2))
          goto usage_error;
       lua_getfield(L, 2, "tag_only");
@@ -794,7 +795,7 @@ error:
 static int l_dump(lua_State *L) {
    struct luaL_serializer *serializer = luaL_checkserializer(L);
    int top = lua_gettop(L);
-   if (top > 2) {
+   if (!(top == 1 || top == 2)) {
 usage_error:
       return luaL_error(L, "Usage: encode(object, {tag_prefix = <string>, "\
                         "tag_handle = <string>})");
-- 
2.14.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tarantool-patches] [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring
  2018-10-04 14:36 [tarantool-patches] [PATCH 0/2] fix yaml encode/decode AKhatskevich
  2018-10-04 14:36 ` [tarantool-patches] [PATCH 1/2] lua-yaml: fix read garbage bug AKhatskevich
@ 2018-10-04 14:36 ` AKhatskevich
  2019-01-22  2:08   ` [tarantool-patches] " Alexander Turenko
  1 sibling, 1 reply; 4+ messages in thread
From: AKhatskevich @ 2018-10-04 14:36 UTC (permalink / raw)
  To: kyukhin, tarantool-patches

Changes:
* encode boolean values in single-quoted style
* encode/decode nulls as '', '~', 'null', 'Null', "NULL", according
  to the yaml 1.0/1.1/1.2 standard
* fix affected tests

Related to #3476
Closes #3662 #3583
---
 test/app-tap/console.test.lua   |   25 +-
 test/app/fio.result             |    2 +-
 test/app/socket.result          |   26 +-
 test/box/access.result          |    8 +-
 test/box/misc.result            |    2 +-
 test/box/role.result            |    8 +-
 test/box/sequence.result        |    2 +-
 test/vinyl/errinj.result        |   10 +-
 test/vinyl/hermitage.result     |  122 ++---
 test/vinyl/mvcc.result          | 1062 +++++++++++++++++++--------------------
 test/vinyl/tx_conflict.result   |    4 +-
 test/vinyl/tx_conflict.test.lua |    4 +-
 test/vinyl/tx_gap_lock.result   |  186 +++----
 test/vinyl/tx_serial.result     |    4 +-
 test/vinyl/tx_serial.test.lua   |    4 +-
 test/vinyl/txn_proxy.lua        |    6 +
 third_party/lua-yaml/lyaml.cc   |   43 +-
 third_party/lua-yaml/str_type.h |   33 ++
 18 files changed, 802 insertions(+), 749 deletions(-)
 create mode 100644 third_party/lua-yaml/str_type.h

diff --git a/test/app-tap/console.test.lua b/test/app-tap/console.test.lua
index 1c76072aa..43b9b599f 100755
--- a/test/app-tap/console.test.lua
+++ b/test/app-tap/console.test.lua
@@ -21,7 +21,7 @@ local EOL = "\n...\n"
 
 test = tap.test("console")
 
-test:plan(57)
+test:plan(68)
 
 -- Start console and connect to it
 local server = console.listen(CONSOLE_SOCKET)
@@ -60,20 +60,33 @@ client_info = nil
 
 -- Check console.delimiter()
 client:write("require('console').delimiter(';')\n")
-test:is(yaml.decode(client:read(EOL)), '', "set delimiter to ';'")
+test:is(yaml.decode(client:read(EOL)), nil, "set delimiter to ';'")
 test:is(state.delimiter, ';', "state.delimiter is ';'")
 client:write("require('console').delimiter();\n")
 test:is(yaml.decode(client:read(EOL))[1], ';', "get delimiter is ';'")
 client:write("require('console').delimiter('');\n")
-test:is(yaml.decode(client:read(EOL)), '', "clear delimiter")
+test:is(yaml.decode(client:read(EOL)), nil, "clear delimiter")
 
 --
 -- gh-3476: yaml.encode encodes 'false' and 'true' incorrectly.
+-- gh-3662: yaml.encode encodes booleans with multiline format.
+-- gh-3583: yaml.encode encodes null incorrectly.
 --
-test:is(type(yaml.decode(yaml.encode('false'))), 'string')
-test:is(type(yaml.decode(yaml.encode('true'))), 'string')
-test:is(type(yaml.decode(yaml.encode({a = 'false'})).a), 'string')
+local function decoded_to(values, ethalon)
+    for _, val in ipairs(values) do
+        test:is(yaml.decode(val), ethalon, val)
+    end
+end
+
 test:is(type(yaml.decode(yaml.encode({a = 'false'})).a), 'string')
+test:is((yaml.encode('false')), "--- 'false'\n...\n")
+test:is((yaml.encode(false)), "--- false\n...\n")
+decoded_to({ 'false', 'no' }, false)
+test:is((yaml.encode('true')), "--- 'true'\n...\n")
+test:is((yaml.encode(true)), "--- true\n...\n")
+decoded_to({ 'true', 'yes' }, true)
+decoded_to({ '---', '~', 'null', 'Null', 'NULL' }, nil)
+test:is((yaml.encode(nil)), "--- null\n...\n")
 
 box.cfg{
     listen=IPROTO_SOCKET;
diff --git a/test/app/fio.result b/test/app/fio.result
index b7a1f65c6..c47a2d8ca 100644
--- a/test/app/fio.result
+++ b/test/app/fio.result
@@ -69,7 +69,7 @@ err:match("basename") ~= nil
 ...
 fio.basename('/')
 ---
-- 
+- ''
 ...
 fio.basename('abc')
 ---
diff --git a/test/app/socket.result b/test/app/socket.result
index 729c1eb3f..62967e281 100644
--- a/test/app/socket.result
+++ b/test/app/socket.result
@@ -1231,7 +1231,7 @@ c:error()
 ...
 x, type(x), #x
 ---
-- 
+- ''
 - string
 - 0
 ...
@@ -1244,7 +1244,7 @@ c:error()
 ...
 x, type(x), #x
 ---
-- 
+- ''
 - string
 - 0
 ...
@@ -1281,7 +1281,7 @@ c:error()
 ...
 x, type(x), #x
 ---
-- 
+- ''
 - string
 - 0
 ...
@@ -1294,7 +1294,7 @@ c:error()
 ...
 x, type(x), #x
 ---
-- 
+- ''
 - string
 - 0
 ...
@@ -1307,7 +1307,7 @@ c:error()
 ...
 x, type(x), #x
 ---
-- 
+- ''
 - string
 - 0
 ...
@@ -1973,7 +1973,7 @@ c:receive(4)
 ...
 c:receive("*l")
 ---
-- 
+- ''
 ...
 wch:put("Fu")
 ---
@@ -1997,19 +1997,19 @@ c:receive()
 ---
 - null
 - closed
-- 
+- ''
 ...
 c:receive(10)
 ---
 - null
 - closed
-- 
+- ''
 ...
 c:receive("*a")
 ---
 - null
 - closed
-- 
+- ''
 ...
 c:close()
 ---
@@ -2343,7 +2343,7 @@ received_message == '' -- expected true
 ...
 received_message
 ---
-- 
+- ''
 ...
 e == 0 -- expected true
 ---
@@ -2366,7 +2366,7 @@ received_message == '' -- expected true
 ...
 received_message
 ---
-- 
+- ''
 ...
 from ~= nil -- expected true
 ---
@@ -2443,7 +2443,7 @@ received_message == '' -- expected true
 ...
 received_message
 ---
-- 
+- ''
 ...
 e == 0 -- expected true
 ---
@@ -2466,7 +2466,7 @@ received_message == '' -- expected true
 ...
 received_message
 ---
-- 
+- ''
 ...
 from ~= nil -- expected true
 ---
diff --git a/test/box/access.result b/test/box/access.result
index 4e49680d0..c3f48c23b 100644
--- a/test/box/access.result
+++ b/test/box/access.result
@@ -975,7 +975,7 @@ box.schema.user.info('test_user')
     - test_space
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - test_user
@@ -1008,7 +1008,7 @@ box.schema.user.info('test_user')
     - public
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - test_user
@@ -1326,7 +1326,7 @@ e.type, e.access_type, e.object_type, e.message
 obj_type, obj_name, op_type
 ---
 - universe
-- 
+- ''
 - Usage
 ...
 euid, auid
@@ -1346,7 +1346,7 @@ c = (require 'net.box').connect(LISTEN.host, LISTEN.service, {user="test_user",
 obj_type, obj_name, op_type
 ---
 - universe
-- 
+- ''
 - Session
 ...
 euid, auid
diff --git a/test/box/misc.result b/test/box/misc.result
index 4ee4797d0..fe35f0460 100644
--- a/test/box/misc.result
+++ b/test/box/misc.result
@@ -55,7 +55,7 @@ t = {} for n in pairs(box) do table.insert(t, tostring(n)) end table.sort(t)
 ...
 t
 ---
-- - NULL
+- - 'NULL'
   - atomic
   - backup
   - begin
diff --git a/test/box/role.result b/test/box/role.result
index 3a54e2460..9b044667a 100644
--- a/test/box/role.result
+++ b/test/box/role.result
@@ -28,7 +28,7 @@ box.schema.role.info('iddqd')
 ---
 - - - execute
     - universe
-    - 
+    - ''
 ...
 box.schema.role.revoke('iddqd', 'execute', 'universe')
 ---
@@ -48,7 +48,7 @@ box.schema.user.info('tester')
     - public
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - tester
@@ -66,7 +66,7 @@ box.schema.user.info('tester')
     - iddqd
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - tester
@@ -940,7 +940,7 @@ box.schema.user.info('test_user')
     - public
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - test_user
diff --git a/test/box/sequence.result b/test/box/sequence.result
index b3907659f..f429d7dae 100644
--- a/test/box/sequence.result
+++ b/test/box/sequence.result
@@ -1361,7 +1361,7 @@ box.schema.user.info()
     - _priv
   - - session,usage
     - universe
-    - 
+    - ''
   - - alter
     - user
     - user
diff --git a/test/vinyl/errinj.result b/test/vinyl/errinj.result
index 8badb47af..01e6e05cc 100644
--- a/test/vinyl/errinj.result
+++ b/test/vinyl/errinj.result
@@ -641,28 +641,28 @@ c0 = txn_proxy.new()
 ...
 c0:begin()
 ---
-- 
+- []
 ...
 c1 = txn_proxy.new()
 ---
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2 = txn_proxy.new()
 ---
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3 = txn_proxy.new()
 ---
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 --
 -- Prepared transactions
@@ -770,7 +770,7 @@ c3('s:select{3}') -- c2 is not visible
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 s:drop()
 ---
diff --git a/test/vinyl/hermitage.result b/test/vinyl/hermitage.result
index 23495fde1..3d26e5b0f 100644
--- a/test/vinyl/hermitage.result
+++ b/test/vinyl/hermitage.result
@@ -51,11 +51,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 11}")
 ---
@@ -71,7 +71,7 @@ c1("t:replace{2, 21}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2("t:replace{2, 22}")
 ---
@@ -79,7 +79,7 @@ c2("t:replace{2, 22}")
 ...
 c2:commit() -- success, the last writer wins
 ---
-- 
+- []
 ...
 t:get{1} -- {1, 12}
 ---
@@ -107,11 +107,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:update(1, {{'=', 2, 11}})")
 ---
@@ -127,7 +127,7 @@ c1("t:update(2, {{'=', 2, 21}})")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2("t:update(2, {{'=', 2, 22}})")
 ---
@@ -163,11 +163,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 101}")
 ---
@@ -179,7 +179,7 @@ c2("t:replace{1, 10}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 10}
 ---
@@ -187,7 +187,7 @@ c2("t:get{1}") -- {1, 10}
 ...
 c2:commit() -- true
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
@@ -207,11 +207,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 101}")
 ---
@@ -227,7 +227,7 @@ c1("t:replace{1, 11}")
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 10}
 ---
@@ -235,7 +235,7 @@ c2("t:get{1}") -- {1, 10}
 ...
 c2:commit() -- ok
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
@@ -255,11 +255,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 11}")
 ---
@@ -279,7 +279,7 @@ c2("t:get{1}") -- {1, 10}
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2:commit() -- rollback (@fixme: not necessary)
 ---
@@ -303,15 +303,15 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 11}")
 ---
@@ -327,7 +327,7 @@ c2("t:replace{1, 12}")
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 11}
 ---
@@ -343,7 +343,7 @@ c3("t:get{2}") -- {2, 19}
 ...
 c2:commit() -- write only transaction - OK to commit
 ---
-- 
+- []
 ...
 c3("t:get{2}") -- {2, 19}
 ---
@@ -355,7 +355,7 @@ c3("t:get{1}") -- {1, 11}
 ...
 c3:commit() -- read only transaction - OK to commit, stays with its read view
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
@@ -375,11 +375,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:select()") -- {1, 10}, {2, 20}
 ---
@@ -391,7 +391,7 @@ c2("t:replace{3, 30}")
 ...
 c2:commit() -- ok
 ---
-- 
+- []
 ...
 c1("t:select()") -- still {1, 10}, {2, 20}
 ---
@@ -399,7 +399,7 @@ c1("t:select()") -- still {1, 10}, {2, 20}
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
@@ -419,11 +419,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 20}")
 ---
@@ -443,11 +443,11 @@ c2("t:get{2}") -- {2, 20}
 ...
 c2("t:delete{2}")
 ---
-- 
+- []
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 10}
 ---
@@ -483,11 +483,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -507,7 +507,7 @@ c2("t:replace{1, 12}")
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2:commit() -- rollback -- conflict
 ---
@@ -531,11 +531,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -559,7 +559,7 @@ c2("t:replace{2, 18}")
 ...
 c2:commit() -- ok
 ---
-- 
+- []
 ...
 c1("t:get{2}") -- {2, 20}
 ---
@@ -567,7 +567,7 @@ c1("t:get{2}") -- {2, 20}
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
@@ -587,11 +587,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -615,15 +615,15 @@ c2("t:replace{2, 18}")
 ...
 c2:commit() -- T2
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 c1("t:get{2}") -- finds nothing
 ---
-- 
+- []
 ...
 c1:commit() -- rollback
 ---
@@ -647,11 +647,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -679,7 +679,7 @@ c2("t:replace{1, 21}")
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2:commit() -- rollback -- conflict
 ---
@@ -703,11 +703,11 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 -- select * from test where value % 3 = 0
 c1("t:select()") -- {1, 10}, {2, 20}
@@ -728,7 +728,7 @@ c2("t:replace{4, 42}")
 ...
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 c2:commit() -- rollback
 ---
@@ -752,7 +752,7 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -764,7 +764,7 @@ c1("t:get{2}") -- {2, 20}
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{2, 25}")
 ---
@@ -772,11 +772,11 @@ c2("t:replace{2, 25}")
 ...
 c2:commit() -- ok
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 10}
 ---
@@ -788,7 +788,7 @@ c3("t:get{2}") -- {2, 25}
 ...
 c3:commit() -- ok
 ---
-- 
+- []
 ...
 c1("t:replace{1, 0}")
 ---
@@ -816,7 +816,7 @@ t:replace{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -828,7 +828,7 @@ c1("t:get{2}") -- {2, 20}
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{2, 25}")
 ---
@@ -836,11 +836,11 @@ c2("t:replace{2, 25}")
 ...
 c2:commit() -- ok
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 10}
 ---
@@ -852,12 +852,12 @@ c3("t:get{2}") -- {2, 25}
 ...
 c3:commit() -- ok
 ---
-- 
+- []
 ...
 -- c1("t:replace{1, 0)")
 c1:commit() -- ok
 ---
-- 
+- []
 ...
 -- teardown
 t:truncate()
diff --git a/test/vinyl/mvcc.result b/test/vinyl/mvcc.result
index 1941744b9..1d354b3ea 100644
--- a/test/vinyl/mvcc.result
+++ b/test/vinyl/mvcc.result
@@ -41,29 +41,29 @@ t = box.space.test
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- empty transaction rollback
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 -- single-statement transaction commit
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1}")
 ---
@@ -71,7 +71,7 @@ c1("t:replace{1}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
@@ -80,14 +80,14 @@ c1("t:get{1}")
 -- cleanup
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- single-statement transaction rollback
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1}")
 ---
@@ -95,18 +95,18 @@ c1("t:replace{1}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- basic effects: if a transaction is rolled back, it has no effect
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -118,15 +118,15 @@ c1("t:get{1}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 c2("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- multi-statement transaction
@@ -137,7 +137,7 @@ test_run:cmd("setopt delimiter ';'")
 ...
 c1:begin();
 ---
-- 
+- []
 ...
 for i = 1,100 do
     c1(string.format("t:insert{%d}", i))
@@ -147,7 +147,7 @@ end;
 ...
 c1:commit();
 ---
-- 
+- []
 ...
 for i = 1,100 do
     c1(string.format("t:delete{%d}", i))
@@ -172,7 +172,7 @@ test_run:cmd("setopt delimiter ';'")
 ...
 c1:begin();
 ---
-- 
+- []
 ...
 for i = 1,100 do
     c1(string.format("t:insert{%d}", i))
@@ -182,7 +182,7 @@ end;
 ...
 c1:rollback();
 ---
-- 
+- []
 ...
 for i = 1,100 do
     assert(#c1(string.format("t:get{%d}", i)) == 0)
@@ -196,7 +196,7 @@ test_run:cmd("setopt delimiter ''");
 -- transaction_set_set_get_commit(void)
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 1}")
 ---
@@ -212,7 +212,7 @@ c1("t:get{1}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
@@ -220,12 +220,12 @@ c1("t:get{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- transaction_set_set_commit_get(void)
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1}")
 ---
@@ -237,11 +237,11 @@ c1("t:replace{1, 2}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:get{1}")
 ---
@@ -249,16 +249,16 @@ c2("t:get{1}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- transaction_set_set_rollback_get(void)
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1}")
 ---
@@ -270,24 +270,24 @@ c1("t:replace{1, 2}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:get{1}")
 ---
-- 
+- []
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 -- transaction_set_delete_get_commit(void)
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -295,20 +295,20 @@ c1("t:insert{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 -- transaction_set_delete_get_commit_get(void)
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -316,26 +316,26 @@ c1("t:insert{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- transaction_set_delete_set_commit_get(void)
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1, 1}")
 ---
@@ -343,7 +343,7 @@ c1("t:insert{1, 1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:insert{1, 2}")
 ---
@@ -355,7 +355,7 @@ c1("t:get{1}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2("t:get{1}")
 ---
@@ -366,14 +366,14 @@ c2("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- transaction_set_delete_commit_get_set(void)
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -381,15 +381,15 @@ c1("t:insert{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -401,22 +401,22 @@ c1("t:get{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- transaction_p_set_commit(void)
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:replace{1, 10}")
 ---
@@ -424,7 +424,7 @@ c1("t:replace{1, 10}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2("t:replace{2, 15}");
 ---
@@ -432,7 +432,7 @@ c2("t:replace{2, 15}");
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
@@ -444,11 +444,11 @@ c1("t:get{2}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 --
 -- no dirty reads: if a transaction is not committed, its effects are not
@@ -456,7 +456,7 @@ c1("t:delete{2}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1}")
 ---
@@ -471,11 +471,11 @@ c1("t:get{1}")
 --
 c2("t:get{1}")
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- become visible in c2 after c1 commits (c2 runs in autocommit)
@@ -491,7 +491,7 @@ c2("t:get{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}")
 ---
@@ -510,7 +510,7 @@ c1("t:get{1}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 -- still not visible, even though c2 has committed
@@ -522,7 +522,7 @@ c1("t:get{1}")
 -- commits ok since is a read only transaction
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- now visible
@@ -533,7 +533,7 @@ c1("t:get{1}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- *******************************
 -- tx manager tests  from sophia *
@@ -544,19 +544,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:replace{1, 10}")
 ---
@@ -569,7 +569,7 @@ c1("t:get{1}") -- {1, 10}
 --
 c1:commit()
 ---
-- 
+- []
 ...
 --
 --
@@ -585,18 +585,18 @@ c2("t:get{2}") -- {2, 15}
 --
 c2:commit()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -605,19 +605,19 @@ c1("t:delete{2}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -627,7 +627,7 @@ c1("t:replace{1, 10}")
 --
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{2, 15}")
@@ -636,12 +636,12 @@ c2("t:replace{2, 15}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -654,18 +654,18 @@ c1("t:get{2}") -- {2, 15}
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_p_set_commit_get1(void)
@@ -673,19 +673,19 @@ c1("t:delete{2}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}")
 ---
-- 
+- []
 ...
 c2("t:get{200}")
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -694,7 +694,7 @@ c2("t:replace{1, 10}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 -- try writing an unrelated key
@@ -705,12 +705,12 @@ c1("t:replace{2, 15}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 10}
 ---
@@ -718,37 +718,37 @@ c2("t:get{1}") -- {1, 10}
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 -- --
 --  now try the same key
 -- --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}")
 ---
-- 
+- []
 ...
 c2("t:get{200}")
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -757,7 +757,7 @@ c2("t:replace{1, 10}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -766,12 +766,12 @@ c1("t:replace{1, 15}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 15}
 ---
@@ -779,14 +779,14 @@ c2("t:get{1}") -- {1, 15}
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_p_set_commit_get2(void)
@@ -794,19 +794,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}")
 ---
-- 
+- []
 ...
 c2("t:get{200}")
 ---
-- 
+- []
 ...
 --
 --
@@ -816,7 +816,7 @@ c1("t:replace{2, 15}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 --
@@ -826,12 +826,12 @@ c2("t:replace{1, 10}")
 ...
 c2:commit() -- commits successfully
 ---
-- 
+- []
 ...
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- {1, 10}
 ---
@@ -844,18 +844,18 @@ c1("t:get{2}") -- {2, 15}
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_p_set_rollback_get0(void)
@@ -863,19 +863,19 @@ c1("t:delete{2}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}")
 ---
-- 
+- []
 ...
 c2("t:get{200}")
 ---
-- 
+- []
 ...
 --
 --
@@ -885,7 +885,7 @@ c1("t:replace{1, 10}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{2, 15}")
@@ -894,24 +894,24 @@ c2("t:replace{2, 15}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- finds nothing
 ---
-- 
+- []
 ...
 c3("t:get{2}") -- finds nothing
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_p_set_rollback_get1(void)
@@ -920,19 +920,19 @@ c3:rollback()
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -941,7 +941,7 @@ c2("t:replace{1, 10}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{2, 15}")
@@ -950,24 +950,24 @@ c1("t:replace{2, 15}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- finds nothing
 ---
-- 
+- []
 ...
 c3("t:get{2}") -- finds nothing
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -976,19 +976,19 @@ c3:rollback()
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -998,7 +998,7 @@ c2("t:replace{1, 10}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1007,29 +1007,29 @@ c1("t:replace{1, 15}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- finds nothing
 ---
-- 
+- []
 ...
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -1039,7 +1039,7 @@ c2("t:replace{1, 10}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1048,7 +1048,7 @@ c1("t:replace{1, 15}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 15}
@@ -1060,7 +1060,7 @@ c3("t:get{1}") -- {1, 15}
 --
 c3("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit0(void)
@@ -1068,19 +1068,19 @@ c3("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:replace{1, 10}")
 ---
@@ -1088,7 +1088,7 @@ c1("t:replace{1, 10}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1097,7 +1097,7 @@ c2("t:replace{1, 15}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}")  -- {1,15}
@@ -1108,7 +1108,7 @@ c2("t:get{1}")  -- {1,15}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit1(void)
@@ -1116,19 +1116,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -1137,7 +1137,7 @@ c2("t:replace{1, 10}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1146,7 +1146,7 @@ c1("t:replace{1, 15}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 15}
@@ -1158,7 +1158,7 @@ c3("t:get{1}") -- {1, 15}
 --
 c3("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit2(void)
@@ -1166,19 +1166,19 @@ c3("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1193,11 +1193,11 @@ c2("t:replace{1, 10}")
 --
 c2:commit()
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 15}
@@ -1209,24 +1209,24 @@ c3("t:get{1}") -- {1, 15}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1242,11 +1242,11 @@ c2("t:replace{1, 10}")
 -- sic: commit order
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit() -- write after write is ok, the last writer to commit wins
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 10}
@@ -1258,7 +1258,7 @@ c3("t:get{1}") -- {1, 10}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit_rollback_a0(void)
@@ -1266,19 +1266,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -1288,7 +1288,7 @@ c2("t:replace{1, 10}")
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1298,7 +1298,7 @@ c1("t:replace{1, 15}")
 --
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -1310,26 +1310,26 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 --
 -- statement order is irrelevant, rollback order is important
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1343,11 +1343,11 @@ c2("t:replace{1, 15}")
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -1359,7 +1359,7 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit_rollback_a1(void)
@@ -1367,19 +1367,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -1393,37 +1393,37 @@ c1("t:replace{1, 15}")
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- statements in different order now
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1437,18 +1437,18 @@ c2("t:replace{1, 15}")
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1457,19 +1457,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -1478,7 +1478,7 @@ c2("t:replace{1, 10}")
 ...
 c2:commit() -- success
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 15}")
@@ -1487,7 +1487,7 @@ c1("t:replace{1, 15}")
 ...
 c1:rollback() -- success
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -1498,7 +1498,7 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_c_set_commit_rollback_b1(void)
@@ -1506,19 +1506,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1532,11 +1532,11 @@ c1("t:replace{1, 10}")
 --
 c2:commit()
 ---
-- 
+- []
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -1548,26 +1548,26 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- now commit the second transaction
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1581,11 +1581,11 @@ c1("t:replace{1, 10}")
 --
 c2:commit()
 ---
-- 
+- []
 ...
 c1:commit() -- ok, the last committer wins
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 10}
@@ -1597,7 +1597,7 @@ c3("t:get{1}") -- {1, 10}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1606,19 +1606,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1627,7 +1627,7 @@ c2("t:replace{1, 15}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1636,38 +1636,38 @@ c1("t:replace{1, 10}")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- now commit the second transaction
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1676,7 +1676,7 @@ c2("t:replace{1, 15}")
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1685,7 +1685,7 @@ c1("t:replace{1, 10}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -1697,7 +1697,7 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1706,19 +1706,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 10}")
@@ -1732,23 +1732,23 @@ c1("t:replace{1, 15}")
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c2("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1757,19 +1757,19 @@ c2("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -1784,11 +1784,11 @@ c1("t:replace{1, 10}")
 --
 c1:commit() -- success
 ---
-- 
+- []
 ...
 c2:commit() -- success, the last writer wins
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}") -- {1, 15}
@@ -1800,7 +1800,7 @@ c2("t:get{1}") -- {1, 15}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1809,19 +1809,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1836,18 +1836,18 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- success, the last writer wins
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c2("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1856,19 +1856,19 @@ c2("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1883,18 +1883,18 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1903,19 +1903,19 @@ c1("t:delete{1}")
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1930,18 +1930,18 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1950,19 +1950,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -1977,18 +1977,18 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -1997,19 +1997,19 @@ c1("t:delete{1}")
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2024,18 +2024,18 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:rollback() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2044,19 +2044,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2071,22 +2071,22 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c2:rollback() -- not in transaction
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2095,19 +2095,19 @@ c1("t:delete{1}")
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2122,26 +2122,26 @@ c2("t:replace{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c2:rollback() -- not in transaction
 ---
-- 
+- []
 ...
 c1:commit() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2150,27 +2150,27 @@ c1("t:delete{2}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2191,23 +2191,23 @@ c3("t:replace{1, 20}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c3:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- success, the last committer wins
 ---
-- 
+- []
 ...
 c2:commit() -- not in transaction
 ---
-- 
+- []
 ...
 c3:commit() -- not in transaction
 ---
-- 
+- []
 ...
 --
 c3:get{1} -- {1, 20}
@@ -2219,7 +2219,7 @@ c3:get{1} -- {1, 20}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2228,27 +2228,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2269,15 +2269,15 @@ c3("t:replace{1, 30}")
 --
 c1:commit() -- success
 ---
-- 
+- []
 ...
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c3:commit() -- success
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- {1, 30}
@@ -2288,7 +2288,7 @@ c3("t:get{1}") -- {1, 30}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2297,27 +2297,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2338,22 +2338,22 @@ c3("t:replace{1, 20}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c3:commit() -- rollback
 ---
-- 
+- []
 ...
 c1:rollback() -- success
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2362,27 +2362,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2403,30 +2403,30 @@ c3("t:replace{1, 20}")
 --
 c2:commit()  -- success
 ---
-- 
+- []
 ...
 c3:commit() -- rollback
 ---
-- 
+- []
 ...
 c2:rollback() -- success, not in transaction in tarantool
 ---
-- 
+- []
 ...
 c3:commit() -- success, not in transaction in tarantool
 ---
-- 
+- []
 ...
 c1:commit() -- rollback
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2435,27 +2435,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2476,22 +2476,22 @@ c3("t:replace{1, 20}")
 --
 c3:rollback()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2500,27 +2500,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2540,22 +2540,22 @@ c3("t:replace{1, 20}")
 --
 c2:commit()
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2564,27 +2564,27 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{300}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 --
@@ -2605,22 +2605,22 @@ c3("t:replace{1, 20}")
 --
 c2:commit()
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2629,19 +2629,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2650,7 +2650,7 @@ c1("t:replace{1, 10}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}") -- find newest {1, 10}
@@ -2664,12 +2664,12 @@ c2("t:replace{1, 15}")
 ...
 c2:commit() -- rollback
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 10}
 ---
@@ -2677,14 +2677,14 @@ c3("t:get{1}") -- {1, 10}
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2693,19 +2693,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -2715,12 +2715,12 @@ c1("t:replace{1, 10}")
 --
 c1:rollback()
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}") -- finds nothing
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 15}")
@@ -2729,12 +2729,12 @@ c2("t:replace{1, 15}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 15}
 ---
@@ -2742,14 +2742,14 @@ c3("t:get{1}") -- {1, 15}
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2758,15 +2758,15 @@ c1("t:delete{1}")
 --
 c7:begin()
 ---
-- 
+- []
 ...
 c7("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 1}")
@@ -2776,7 +2776,7 @@ c1("t:replace{1, 1}")
 --
 c2:begin()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 2}")
@@ -2786,7 +2786,7 @@ c2("t:replace{1, 2}")
 --
 c4:begin()
 ---
-- 
+- []
 ...
 c4("t:replace{1, 4}")
 ---
@@ -2795,7 +2795,7 @@ c4("t:replace{1, 4}")
 --
 c5:begin()
 ---
-- 
+- []
 ...
 c5("t:replace{1, 5}")
 ---
@@ -2804,11 +2804,11 @@ c5("t:replace{1, 5}")
 --
 c6:begin()
 ---
-- 
+- []
 ...
 c6("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- {1, 1}
@@ -2833,62 +2833,62 @@ c5("t:get{1}") -- {1, 5}
 --
 c6("t:get{1}") --  nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") --  nothing
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1:rollback()
 ---
-- 
+- []
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 c4:rollback()
 ---
-- 
+- []
 ...
 c5:rollback()
 ---
-- 
+- []
 ...
 c6:rollback()
 ---
-- 
+- []
 ...
 c7:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -2897,24 +2897,24 @@ c1("t:delete{1}")
 --
 c7:begin()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c7("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:get{1}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:replace{1, 3}")
 ---
@@ -2922,24 +2922,24 @@ c3("t:replace{1, 3}")
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c2("t:get{500}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{600}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{1}") -- {1, 3}
 ---
@@ -2952,16 +2952,16 @@ c3("t:replace{1, 6}")
 ...
 c3:commit() -- c2 goes to read view now
 ---
-- 
+- []
 ...
 --
 c4:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 --
 c3("t:replace{1, 9}")
@@ -2970,24 +2970,24 @@ c3("t:replace{1, 9}")
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 c5:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c5("t:get{800}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c3("t:get{900}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c3("t:replace{1, 12}")
@@ -2996,16 +2996,16 @@ c3("t:replace{1, 12}")
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 c6:begin()
 ---
-- 
+- []
 ...
 c6("t:get{1000}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}") -- {1, 3}
@@ -3030,7 +3030,7 @@ c6("t:get{1}") -- {1, 12}
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3038,12 +3038,12 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") -- {1, 12}
@@ -3053,7 +3053,7 @@ c7("t:get{1}") -- {1, 12}
 --
 c2:rollback()
 ---
-- 
+- []
 ...
 --
 c4("t:get{1}") -- {1, 12}
@@ -3073,7 +3073,7 @@ c6("t:get{1}") -- {1, 12}
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3081,12 +3081,12 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") -- {1, 12}
@@ -3096,7 +3096,7 @@ c7("t:get{1}") -- {1, 12}
 --
 c4:rollback()
 ---
-- 
+- []
 ...
 --
 c5("t:get{1}") -- {1, 12}
@@ -3111,7 +3111,7 @@ c6("t:get{1}") -- {1, 12}
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3119,12 +3119,12 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") -- {1, 12}
@@ -3134,7 +3134,7 @@ c7("t:get{1}") -- {1, 12}
 --
 c5:rollback()
 ---
-- 
+- []
 ...
 --
 c6("t:get{1}") -- {1, 12}
@@ -3144,7 +3144,7 @@ c6("t:get{1}") -- {1, 12}
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3152,12 +3152,12 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") -- {1, 12}
@@ -3167,12 +3167,12 @@ c7("t:get{1}") -- {1, 12}
 --
 c6:rollback()
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3180,12 +3180,12 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- nothing
 ---
-- 
+- []
 ...
 --
 c7("t:get{1}") -- {1, 12}
@@ -3195,16 +3195,16 @@ c7("t:get{1}") -- {1, 12}
 --
 c1:rollback()
 ---
-- 
+- []
 ...
 c7:rollback()
 ---
-- 
+- []
 ...
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}") -- {1, 12}
 ---
@@ -3212,14 +3212,14 @@ c3("t:get{1}") -- {1, 12}
 ...
 c3:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -3228,19 +3228,19 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:get{100}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c2("t:get{200}") -- start transaction in the engine
 ---
-- 
+- []
 ...
 c1("t:replace{1, 10}")
 ---
@@ -3253,7 +3253,7 @@ c2("t:replace{1, 15}")
 --
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 20}") -- should not reset conflict flag
@@ -3263,7 +3263,7 @@ c2("t:replace{1, 20}") -- should not reset conflict flag
 --
 c2:commit() --  rollback
 ---
-- 
+- []
 ...
 --
 c3("t:get{1}")
@@ -3275,7 +3275,7 @@ c3("t:get{1}")
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -3284,7 +3284,7 @@ c1("t:delete{1}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{1, 10}")
@@ -3301,7 +3301,7 @@ c2("t:replace{1, 15}")
 --
 c1:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:get{1}") -- {1, 10}
@@ -3311,7 +3311,7 @@ c2("t:get{1}") -- {1, 10}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- transaction_sc_get(void)
@@ -3324,7 +3324,7 @@ c1("t:replace{1, 7}")
 --
 c2:begin()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{1, 8}")
@@ -3339,7 +3339,7 @@ c1("t:get{1}") -- {1, 7}
 --
 c2:commit()
 ---
-- 
+- []
 ...
 --
 c1("t:get{1}") -- {1, 8}
@@ -3356,18 +3356,18 @@ c3("t:get{1}") -- {1, 8}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 -- --------------------------------------------------------------------------
 -- two conflicting inserts
 -- --------------------------------------------------------------------------
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 --
 c1("t:insert{1, 10}")
@@ -3382,7 +3382,7 @@ c2("t:insert{1, 15}")
 --
 c1:commit() -- success
 ---
-- 
+- []
 ...
 c2:commit() -- rollback, c2 reads {1} before writing it
 ---
@@ -3399,16 +3399,16 @@ c3("t:get{1}") -- {1, 10}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 --
 c1("t:insert{1, 10}")
@@ -3423,7 +3423,7 @@ c2("t:insert{1, 15}")
 --
 c2:commit() -- success
 ---
-- 
+- []
 ...
 c1:commit() -- rollback, c1 reads {1} before writing it
 ---
@@ -3440,7 +3440,7 @@ c3("t:get{1}") -- {1, 15}
 --
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 --
 -- --------------------------------------------------------------------------
@@ -3456,7 +3456,7 @@ t:insert{2, 20}
 ...
 c7:begin()
 ---
-- 
+- []
 ...
 c7("t:insert{8, 800}")
 ---
@@ -3464,7 +3464,7 @@ c7("t:insert{8, 800}")
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:get{1}")
 ---
@@ -3472,15 +3472,15 @@ c3("t:get{1}")
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 --
 c1("t:replace{4, 40}")
@@ -3495,7 +3495,7 @@ c2("t:get{1}")
 --
 c3:begin()
 ---
-- 
+- []
 ...
 c3("t:insert{3, 30}")
 ---
@@ -3503,7 +3503,7 @@ c3("t:insert{3, 30}")
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 --
 c2("t:replace{5, 50}")
@@ -3516,15 +3516,15 @@ c1("t:get{1}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c7:rollback()
 ---
-- 
+- []
 ...
 --
 -- cleanup
@@ -3557,11 +3557,11 @@ t:insert{2, 20}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:select{}")
 ---
@@ -3581,7 +3581,7 @@ c2("t:replace{2, 'new'}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit() -- rollback
 ---
@@ -3593,7 +3593,7 @@ c2:commit() -- rollback
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:select{}")
 ---
@@ -3645,7 +3645,7 @@ c1("t:select({3}, {iterator='eq'})")
 ...
 c1("t:delete{3}")
 ---
-- 
+- []
 ...
 c1("t:select({3}, {iterator='ge'})")
 ---
@@ -3669,7 +3669,7 @@ c1("t:replace{3}")
 ...
 c1("t:delete{2}")
 ---
-- 
+- []
 ...
 c1("t:select({3}, {iterator='lt'})")
 ---
@@ -3685,7 +3685,7 @@ c1("t:replace{2}")
 ...
 c1("t:delete{1}")
 ---
-- 
+- []
 ...
 c1("t:select({3}, {iterator='lt'})")
 ---
@@ -3697,7 +3697,7 @@ c1("t:select({3}, {iterator='le'})")
 ...
 c1("t:delete{3}")
 ---
-- 
+- []
 ...
 c1("t:select({3}, {iterator='lt'})")
 ---
@@ -3709,7 +3709,7 @@ c1("t:select({3}, {iterator='le'})")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c1("t:select{}")
 ---
@@ -3722,7 +3722,7 @@ c1("t:select{}")
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:select{1}")
 ---
@@ -3734,11 +3734,11 @@ c1("for k, v in box.space.test:pairs() do box.commit() end")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:select{1}")
 ---
@@ -3750,7 +3750,7 @@ c1("for k, v in box.space.test:pairs() do box.rollback() end")
 ...
 c1:rollback()
 ---
-- 
+- []
 ...
 t:truncate()
 ---
@@ -3764,7 +3764,7 @@ t:replace{1}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t.index.pk:max()") -- {1}
 ---
@@ -3780,7 +3780,7 @@ c1("t.index.pk:count()") -- 1
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{2}") -- conflicts with c1 so c1 starts using a read view
 ---
@@ -3788,7 +3788,7 @@ c2("t:replace{2}") -- conflicts with c1 so c1 starts using a read view
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1("t.index.pk:max()") -- {1}
 ---
@@ -3804,7 +3804,7 @@ c1("t.index.pk:count()") -- 1
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 --
 -- Convert the reader to a read view: in this test we have
@@ -3813,7 +3813,7 @@ c1:commit()
 --
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t.index.pk:max()") -- {2}
 ---
@@ -3829,7 +3829,7 @@ c1("t.index.pk:count()") -- 2
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{1, 'new'}") -- conflits with c1 so c1 starts using a read view
 ---
@@ -3841,7 +3841,7 @@ c2("t:replace{3}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1("t.index.pk:max()") -- {2}
 ---
@@ -3857,7 +3857,7 @@ c1("t.index.pk:count()") -- 2
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 t:truncate()
 ---
@@ -3876,7 +3876,7 @@ t:replace{2}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c1("t:select({}, {limit = 0})") -- none
 ---
@@ -3884,7 +3884,7 @@ c1("t:select({}, {limit = 0})") -- none
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{1, 'new'}")
 ---
@@ -3892,7 +3892,7 @@ c2("t:replace{1, 'new'}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1("t:select({}, {limit = 1})") -- {1, 'new'}
 ---
@@ -3900,7 +3900,7 @@ c1("t:select({}, {limit = 1})") -- {1, 'new'}
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c2("t:replace{2, 'new'}")
 ---
@@ -3908,7 +3908,7 @@ c2("t:replace{2, 'new'}")
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c1("t:select()") -- {1, 'new'}, {2, 'new'}
 ---
@@ -3916,7 +3916,7 @@ c1("t:select()") -- {1, 'new'}, {2, 'new'}
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 t:truncate()
 ---
@@ -3929,11 +3929,11 @@ _ = t:create_index('sk', {parts = {2, 'unsigned'}, unique = true})
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("t:insert{1, 2}")
 ---
@@ -3945,7 +3945,7 @@ c2("t:insert{2, 2}")
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit() -- rollback
 ---
@@ -4034,19 +4034,19 @@ c4 = txn_proxy.new()
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 box.stat.vinyl().tx.read_views -- 0 (no read views needed)
 ---
@@ -4094,7 +4094,7 @@ box.stat.vinyl().tx.transactions -- 4
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 box.stat.vinyl().tx.read_views -- 1 (one read view for all TXs)
 ---
@@ -4106,7 +4106,7 @@ box.stat.vinyl().tx.transactions -- 3
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 box.stat.vinyl().tx.read_views -- 1 (one read view for all TXs)
 ---
@@ -4118,7 +4118,7 @@ box.stat.vinyl().tx.transactions -- 2
 ...
 c2:rollback()
 ---
-- 
+- []
 ...
 box.stat.vinyl().tx.read_views -- 1 (one read view for all TXs)
 ---
@@ -4130,7 +4130,7 @@ box.stat.vinyl().tx.transactions -- 1
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 box.stat.vinyl().tx.read_views -- 0 (no read views needed)
 ---
diff --git a/test/vinyl/tx_conflict.result b/test/vinyl/tx_conflict.result
index 03cc62a49..25e5b154d 100644
--- a/test/vinyl/tx_conflict.result
+++ b/test/vinyl/tx_conflict.result
@@ -185,8 +185,8 @@ function apply(t, k, op)
         tx.ended = true
         table.insert(order_of_commit, t)
         num_committed = num_committed + 1
-        local res = tx.con:commit()
-        if res ~= "" and res[1]['error'] then
+        local res = tx.con:commit()[1]
+        if res ~= nil and res['error'] then
             tx.conflicted = true
         else
             tx.select_all = s1:select{}
diff --git a/test/vinyl/tx_conflict.test.lua b/test/vinyl/tx_conflict.test.lua
index 9208c256e..923f060b6 100644
--- a/test/vinyl/tx_conflict.test.lua
+++ b/test/vinyl/tx_conflict.test.lua
@@ -152,8 +152,8 @@ function apply(t, k, op)
         tx.ended = true
         table.insert(order_of_commit, t)
         num_committed = num_committed + 1
-        local res = tx.con:commit()
-        if res ~= "" and res[1]['error'] then
+        local res = tx.con:commit()[1]
+        if res ~= nil and res['error'] then
             tx.conflicted = true
         else
             tx.select_all = s1:select{}
diff --git a/test/vinyl/tx_gap_lock.result b/test/vinyl/tx_gap_lock.result
index a456c017e..8e9bd126d 100644
--- a/test/vinyl/tx_gap_lock.result
+++ b/test/vinyl/tx_gap_lock.result
@@ -42,7 +42,7 @@ _ = s:insert{3}
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select()") -- {1}, {3}
 ---
@@ -57,7 +57,7 @@ c("s:select()") -- {1}, {3}
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -71,7 +71,7 @@ _ = s:insert{2}
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select()") -- {1}, {2}
 ---
@@ -86,7 +86,7 @@ c("s:select()") -- {1}, {2}
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -100,7 +100,7 @@ _ = s:insert{3}
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select()") -- {2}, {3}
 ---
@@ -115,7 +115,7 @@ c("s:select()") -- {2}, {3}
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -126,11 +126,11 @@ _ = s:insert{123}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("s:select({}, {iterator = 'GT'})") -- {123}
 ---
@@ -153,11 +153,11 @@ c2("s:select({}, {iterator = 'LT'})") -- {123}
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -176,27 +176,27 @@ _ = s:insert{30}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 c5:begin()
 ---
-- 
+- []
 ...
 c6:begin()
 ---
-- 
+- []
 ...
 c1("s:select({10}, {iterator = 'GE'})") -- {10}, {20}, {30}
 ---
@@ -254,11 +254,11 @@ _ = s:replace{15, 2} -- send c2 and c3 to read view
 ...
 c2("s:get(15)") -- none
 ---
-- 
+- []
 ...
 c3("s:get(15)") -- none
 ---
-- 
+- []
 ...
 c4("s:get(15)") -- {15, 2}
 ---
@@ -277,39 +277,39 @@ _ = s:replace{35, 3} -- send c4, c5, and c6 to read view
 ...
 c4("s:get(35)") -- none
 ---
-- 
+- []
 ...
 c5("s:get(35)") -- none
 ---
-- 
+- []
 ...
 c6("s:get(35)") -- none
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 c5:commit()
 ---
-- 
+- []
 ...
 c6:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -328,27 +328,27 @@ _ = s:insert{30}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 c5:begin()
 ---
-- 
+- []
 ...
 c6:begin()
 ---
-- 
+- []
 ...
 c1("s:select({30}, {iterator = 'LE'})") -- {30}, {20}, {10}
 ---
@@ -406,11 +406,11 @@ _ = s:replace{25, 2} -- send c2 and c3 to read view
 ...
 c2("s:get(25)") -- none
 ---
-- 
+- []
 ...
 c3("s:get(25)") -- none
 ---
-- 
+- []
 ...
 c4("s:get(25)") -- {25, 2}
 ---
@@ -429,39 +429,39 @@ _ = s:replace{5, 3} -- send c4, c5, and c6 to read view
 ...
 c4("s:get(5)") -- none
 ---
-- 
+- []
 ...
 c5("s:get(5)") -- none
 ---
-- 
+- []
 ...
 c6("s:get(5)") -- none
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 c5:commit()
 ---
-- 
+- []
 ...
 c6:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -474,19 +474,19 @@ for i = 1, 9 do s:insert{i * 10} end
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 c1("s:select({20}, {iterator = 'GE', limit = 3})") -- {20}, {30}, {40}
 ---
@@ -562,7 +562,7 @@ _ = s:replace{25, 4} -- send c3 to read view
 ...
 c3("s:get(25)") -- none
 ---
-- 
+- []
 ...
 c4("s:get(25)") -- {25, 4}
 ---
@@ -573,23 +573,23 @@ _ = s:replace{75, 5} -- send c4 to read view
 ...
 c4("s:get(75)") -- none
 ---
-- 
+- []
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 s:drop()
 ---
@@ -620,11 +620,11 @@ _ = s:insert{3, 3}
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c1("s:select({2}, {iterator = 'EQ'})")  -- {2, 1}, {2, 2}, {2, 3}
 ---
@@ -669,11 +669,11 @@ c2("s:select({2}, {iterator = 'REQ'})") -- {2, 3}, {2, 2}, {2, 1}
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 s:drop()
 ---
@@ -708,7 +708,7 @@ gap_lock_count() -- 0
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select({10}, {iterator = 'GE', limit = 4})") -- locks [10, 40]
 ---
@@ -769,11 +769,11 @@ _ = s:insert{25} -- send c to read view
 ...
 c("s:get(25)") -- none
 ---
-- 
+- []
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -797,7 +797,7 @@ gap_lock_count() -- 0
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select({1},  {iterator = 'GT', limit = 1})") -- locks  (1, 10]
 ---
@@ -842,11 +842,11 @@ _ = s:insert{5} -- send c to read view
 ...
 c("s:get(5)") -- none
 ---
-- 
+- []
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -861,7 +861,7 @@ gap_lock_count() -- 0
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select({100}, {iterator = 'GT'})") -- locks (100, +inf)
 ---
@@ -888,11 +888,11 @@ _ = s:insert{1000} -- send c to read view
 ...
 c("s:get(1000)") -- none
 ---
-- 
+- []
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -916,7 +916,7 @@ gap_lock_count() -- 0
 ...
 c:begin()
 ---
-- 
+- []
 ...
 c("s:select({1}, {iterator = 'GE', limit = 2})") -- locks [1, 2]
 ---
@@ -932,7 +932,7 @@ gap_lock_count() -- 1
 ...
 c:commit()
 ---
-- 
+- []
 ...
 s:drop()
 ---
@@ -950,19 +950,19 @@ gap_lock_count() -- 0
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 c1("s:select({100}, {iterator = 'GE'})") -- c1: locks [{100}, +inf)
 ---
@@ -1005,11 +1005,11 @@ _ = s:insert{100, 50} -- send c1 and c2 to read view
 ...
 c1("s:get({100, 50})") -- none
 ---
-- 
+- []
 ...
 c2("s:get({100, 50})") -- none
 ---
-- 
+- []
 ...
 c3("s:get({100, 50})") -- {100, 50}
 ---
@@ -1028,7 +1028,7 @@ _ = s:insert{100, 100} -- send c3 to read view
 ...
 c3("s:get({100, 100})") -- none
 ---
-- 
+- []
 ...
 c4("s:get({100, 100})") -- {100, 100}
 ---
@@ -1043,7 +1043,7 @@ _ = s:insert{100, 101} -- send c4 to read view
 ...
 c4("s:get({100, 101})") -- none
 ---
-- 
+- []
 ...
 gap_lock_count() -- 6
 ---
@@ -1051,19 +1051,19 @@ gap_lock_count() -- 6
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 s:truncate()
 ---
@@ -1075,19 +1075,19 @@ gap_lock_count() -- 0
 ...
 c1:begin()
 ---
-- 
+- []
 ...
 c2:begin()
 ---
-- 
+- []
 ...
 c3:begin()
 ---
-- 
+- []
 ...
 c4:begin()
 ---
-- 
+- []
 ...
 c1("s:select({100}, {iterator = 'LE'})") -- c1: locks (-inf, {100}]
 ---
@@ -1130,11 +1130,11 @@ _ = s:insert{100, 150} -- send c1 and c2 to read view
 ...
 c1("s:get({100, 150})") -- none
 ---
-- 
+- []
 ...
 c2("s:get({100, 150})") -- none
 ---
-- 
+- []
 ...
 c3("s:get({100, 150})") -- {100, 150}
 ---
@@ -1153,7 +1153,7 @@ _ = s:insert{100, 100} -- send c3 to read view
 ...
 c3("s:get({100, 100})") -- none
 ---
-- 
+- []
 ...
 c4("s:get({100, 100})") -- {100, 100}
 ---
@@ -1168,7 +1168,7 @@ _ = s:insert{100, 99} -- send c4 to read view
 ...
 c4("s:get({100, 99})") -- none
 ---
-- 
+- []
 ...
 gap_lock_count() -- 6
 ---
@@ -1176,19 +1176,19 @@ gap_lock_count() -- 6
 ...
 c1:commit()
 ---
-- 
+- []
 ...
 c2:commit()
 ---
-- 
+- []
 ...
 c3:commit()
 ---
-- 
+- []
 ...
 c4:commit()
 ---
-- 
+- []
 ...
 s:drop()
 ---
diff --git a/test/vinyl/tx_serial.result b/test/vinyl/tx_serial.result
index 37c3f4467..4d464f7eb 100644
--- a/test/vinyl/tx_serial.result
+++ b/test/vinyl/tx_serial.result
@@ -151,8 +151,8 @@ function apply(t, k, op)
         tx.ended = true
         table.insert(order_of_commit, t)
         num_committed = num_committed + 1
-        local res = tx.con:commit()
-        if res ~= "" and res[1]['error'] then
+        local res = tx.con:commit()[1]
+        if res ~= nil and res['error'] then
             tx.conflicted = true
         else
             tx.select_all = s1:select{}
diff --git a/test/vinyl/tx_serial.test.lua b/test/vinyl/tx_serial.test.lua
index 0a695a7e5..9d07dd013 100644
--- a/test/vinyl/tx_serial.test.lua
+++ b/test/vinyl/tx_serial.test.lua
@@ -122,8 +122,8 @@ function apply(t, k, op)
         tx.ended = true
         table.insert(order_of_commit, t)
         num_committed = num_committed + 1
-        local res = tx.con:commit()
-        if res ~= "" and res[1]['error'] then
+        local res = tx.con:commit()[1]
+        if res ~= nil and res['error'] then
             tx.conflicted = true
         else
             tx.select_all = s1:select{}
diff --git a/test/vinyl/txn_proxy.lua b/test/vinyl/txn_proxy.lua
index 7a4d0b865..e043ca277 100644
--- a/test/vinyl/txn_proxy.lua
+++ b/test/vinyl/txn_proxy.lua
@@ -23,6 +23,12 @@ local mt = {
     __call = function(self, code_str)
         self.c1:put(code_str)
         local res = yaml.decode(self.c2:get())
+        -- Get returns 0 arguments in case nothing found.
+        -- This value is encoded by console as "---" which is nil.
+        -- Tests using this file expect "{nil}" instead.
+        if res == nil then
+            res = {}
+        end
         return type(res) == 'table' and setmetatable(res, array_mt) or res
     end,
     __index = {
diff --git a/third_party/lua-yaml/lyaml.cc b/third_party/lua-yaml/lyaml.cc
index 9b07992d8..dd79e3c0c 100644
--- a/third_party/lua-yaml/lyaml.cc
+++ b/third_party/lua-yaml/lyaml.cc
@@ -27,6 +27,7 @@
  */
 
 #include "lyaml.h"
+#include "str_type.h"
 
 #include "trivia/util.h"
 
@@ -209,7 +210,7 @@ static void load_scalar(struct lua_yaml_loader *loader) {
          lua_pushnumber(loader->L, dval);
          return;
       } else if (!strcmp(tag, "bool")) {
-         lua_pushboolean(loader->L, !strcmp(str, "true") || !strcmp(str, "yes"));
+         lua_pushboolean(loader->L, yaml_get_bool(str, length) == YAML_TRUE);
          return;
       } else if (!strcmp(tag, "binary")) {
          frombase64(loader->L, (const unsigned char *)str, length);
@@ -218,20 +219,15 @@ static void load_scalar(struct lua_yaml_loader *loader) {
    }
 
    if (loader->event.data.scalar.style == YAML_PLAIN_SCALAR_STYLE) {
-      if (!strcmp(str, "~")) {
+      yaml_type type;
+      if (yaml_get_null(str, length) == YAML_NULL){
          luaL_pushnull(loader->L);
          return;
-      } else if (!strcmp(str, "true") || !strcmp(str, "yes")) {
-         lua_pushboolean(loader->L, 1);
-         return;
-      } else if (!strcmp(str, "false") || !strcmp(str, "no")) {
-         lua_pushboolean(loader->L, 0);
-         return;
-      } else if (!strcmp(str, "null")) {
-         luaL_pushnull(loader->L);
-         return;
-      } else if (!length) {
-         lua_pushliteral(loader->L, "");
+      } else if ((type = yaml_get_bool(str, length)) != YAML_NO_MATCH){
+         if (type == YAML_TRUE)
+            lua_pushboolean(loader->L, 1);
+         else
+            lua_pushboolean(loader->L, 0);
          return;
       }
 
@@ -367,8 +363,13 @@ static void load(struct lua_yaml_loader *loader) {
       if (!do_parse(loader))
          return;
 
-      if (loader->event.type == YAML_STREAM_END_EVENT)
+      if (loader->event.type == YAML_STREAM_END_EVENT) {
+         if (loader->document_count == 0) {
+            loader->document_count++;
+            luaL_pushnull(loader->L);
+         }
          return;
+      }
 
       loader->document_count++;
       if (load_node(loader) != 1)
@@ -548,7 +549,6 @@ static int yaml_is_flow_mode(struct lua_yaml_dumper *dumper) {
                (evp->type == YAML_MAPPING_START_EVENT &&
                 evp->data.mapping_start.style == YAML_FLOW_MAPPING_STYLE)) {
             return 1;
-            break;
          }
       }
    }
@@ -597,8 +597,11 @@ static int dump_node(struct lua_yaml_dumper *dumper)
       return dump_table(dumper, &field);
    case MP_STR:
       str = lua_tolstring(dumper->L, -1, &len);
-      if (lua_isnumber(dumper->L, -1)) {
-         /* string is convertible to number, quote it to preserve type */
+      if ((yaml_get_null(str, len) == YAML_NULL)
+         || (yaml_get_bool(str, len) != YAML_NO_MATCH)
+         || (lua_isnumber(dumper->L, -1))) {
+         /* string is convertible to non-string scalar type,
+          * quote it to preserve type */
          style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
          break;
       }
@@ -606,12 +609,10 @@ static int dump_node(struct lua_yaml_dumper *dumper)
       if (utf8_check_printable(str, len)) {
          if (yaml_is_flow_mode(dumper)) {
             style = YAML_SINGLE_QUOTED_SCALAR_STYLE;
-         } else if (strstr(str, "\n\n") != NULL || strcmp(str, "true") == 0 ||
-		    strcmp(str, "false") == 0) {
+         } else if (strstr(str, "\n\n") != 0) {
             /*
              * Tarantool-specific: use literal style for string
-             * with empty lines and strings representing boolean
-             * types.
+             * with empty lines.
              * Useful for tutorial().
              */
             style = YAML_LITERAL_SCALAR_STYLE;
diff --git a/third_party/lua-yaml/str_type.h b/third_party/lua-yaml/str_type.h
new file mode 100644
index 000000000..9bb4b7db8
--- /dev/null
+++ b/third_party/lua-yaml/str_type.h
@@ -0,0 +1,33 @@
+#include <string.h>
+
+enum yaml_type{YAML_NO_MATCH = 0, YAML_FALSE, YAML_TRUE, YAML_NULL};
+
+/*
+ * This implementation uses a subset of yaml 1.1 keywords
+ * which represents boolean.
+ */
+static yaml_type
+yaml_get_bool(const char *str, const size_t len){
+	if (len > 5)
+		return YAML_NO_MATCH;
+	if (strcmp(str, "false") == 0 ||
+	    strcmp(str, "no") == 0)
+		return YAML_FALSE;
+	if (strcmp(str, "true") == 0 ||
+	    strcmp(str, "yes") == 0)
+		return YAML_TRUE;
+	return YAML_NO_MATCH;
+}
+
+static yaml_type
+yaml_get_null(const char *str, const size_t len){
+	if (len == 0 || (len == 1 && str[0] == '~'))
+		return YAML_NULL;
+	if (len == 4) {
+		if ((strcmp(str, "null") == 0)
+		    || (strcmp(str, "Null") == 0)
+		    || (strcmp(str, "NULL") == 0))
+			return YAML_NULL;
+	}
+	return YAML_NO_MATCH;
+}
-- 
2.14.1

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [tarantool-patches] Re: [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring
  2018-10-04 14:36 ` [tarantool-patches] [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring AKhatskevich
@ 2019-01-22  2:08   ` Alexander Turenko
  0 siblings, 0 replies; 4+ messages in thread
From: Alexander Turenko @ 2019-01-22  2:08 UTC (permalink / raw)
  To: Alex Khatskevich; +Cc: kyukhin, tarantool-patches

Changes I made:

* Moved str_type.h to lyaml.cc.
* Simplified cases in app-tap/console.test.lua, added more.
* Extracted an empty document / value treatment change into a separate
  commit.
* Removed hacking around console.eval() result in
  test/vinyl/txn_proxy.lua.
* Rebased at top of 2.1.
* Better describe changes in commit messages.

I'll push the patchset to kh/gh-3662-yaml-2.1 and will resend it as v2.

WBR, Alexander Turenko.

On Thu, Oct 04, 2018 at 05:36:14PM +0300, AKhatskevich wrote:
> Changes:
> * encode boolean values in single-quoted style
> * encode/decode nulls as '', '~', 'null', 'Null', "NULL", according
>   to the yaml 1.0/1.1/1.2 standard
> * fix affected tests
> 
> Related to #3476
> Closes #3662 #3583
> ---
>  test/app-tap/console.test.lua   |   25 +-
>  test/app/fio.result             |    2 +-
>  test/app/socket.result          |   26 +-
>  test/box/access.result          |    8 +-
>  test/box/misc.result            |    2 +-
>  test/box/role.result            |    8 +-
>  test/box/sequence.result        |    2 +-
>  test/vinyl/errinj.result        |   10 +-
>  test/vinyl/hermitage.result     |  122 ++---
>  test/vinyl/mvcc.result          | 1062 +++++++++++++++++++--------------------
>  test/vinyl/tx_conflict.result   |    4 +-
>  test/vinyl/tx_conflict.test.lua |    4 +-
>  test/vinyl/tx_gap_lock.result   |  186 +++----
>  test/vinyl/tx_serial.result     |    4 +-
>  test/vinyl/tx_serial.test.lua   |    4 +-
>  test/vinyl/txn_proxy.lua        |    6 +
>  third_party/lua-yaml/lyaml.cc   |   43 +-
>  third_party/lua-yaml/str_type.h |   33 ++
>  18 files changed, 802 insertions(+), 749 deletions(-)
>  create mode 100644 third_party/lua-yaml/str_type.h

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-01-22  2:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-04 14:36 [tarantool-patches] [PATCH 0/2] fix yaml encode/decode AKhatskevich
2018-10-04 14:36 ` [tarantool-patches] [PATCH 1/2] lua-yaml: fix read garbage bug AKhatskevich
2018-10-04 14:36 ` [tarantool-patches] [PATCH 2/2] lua-yaml: fix yaml encode/decode type inferring AKhatskevich
2019-01-22  2:08   ` [tarantool-patches] " Alexander Turenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox