Tarantool development patches archive
 help / color / mirror / Atom feed
From: Chris Sosnin <k.sosnin@tarantool.org>
To: tarantool-patches@dev.tarantool.org
Subject: [Tarantool-patches] [PATCH] box: frommap() bug fix
Date: Tue, 14 Jan 2020 13:49:45 +0300	[thread overview]
Message-ID: <20200114104945.43008-1-k.sosnin@tarantool.org> (raw)

(backport version for 1.10)
This patch is almost the same as the one I've sent
for 2.3, the only difference is that here it is needed
to change tuple interface to make it possible to borrow
the error message after the luaT_tuple_new call.

- If an optional argument is provided for
  space_object:frommap() (which is {table = true|false}),
  type match for first arguments is omitted, which is
  incorrect. We should return the result only after making
  sure it is possible to build a tuple.

- If there is a type mismatch, however, frommap() does not
  return nil, err as it is mentioned in the description, so we
  change it to be this way.

Closes #4262
---
branch: https://github.com/tarantool/tarantool/tree/ksosnin/gh-4262-frommap-fix-1-10
issue: https://github.com/tarantool/tarantool/issues/4262

 src/box/lua/space.cc    | 14 +++++++++++---
 src/box/lua/tuple.c     | 13 ++++++++-----
 src/box/lua/tuple.h     |  2 +-
 test/box/tuple.result   | 10 ++++++++--
 test/box/tuple.test.lua |  1 +
 5 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc
index 9162de21d..94e895148 100644
--- a/src/box/lua/space.cc
+++ b/src/box/lua/space.cc
@@ -461,6 +461,7 @@ lbox_space_frommap(struct lua_State *L)
 	struct tuple_dictionary *dict = NULL;
 	uint32_t id = 0;
 	struct space *space = NULL;
+	struct tuple *tuple = NULL;
 	int argc = lua_gettop(L);
 	bool table = false;
 	if (argc < 2 || argc > 3 || !lua_istable(L, 2))
@@ -503,12 +504,19 @@ lbox_space_frommap(struct lua_State *L)
 		}
 		lua_rawseti(L, -3, fieldno+1);
 	}
-	if (table)
-		return 1;
 
 	lua_replace(L, 1);
 	lua_settop(L, 1);
-	return luaT_tuple_new(L, space->format);
+	tuple = luaT_tuple_new(L, space->format);
+	if (tuple == NULL) {
+		struct error *e = diag_last_error(diag_get());
+		lua_pushnil(L);
+		lua_pushstring(L, e->errmsg);
+		return 2;
+	}
+	if (!table)
+		luaT_pushtuple(L, tuple);
+	return 1;
 usage_error:
 	return luaL_error(L, "Usage: space:frommap(map, opts)");
 }
diff --git a/src/box/lua/tuple.c b/src/box/lua/tuple.c
index 44ed38382..cff0beca5 100644
--- a/src/box/lua/tuple.c
+++ b/src/box/lua/tuple.c
@@ -97,7 +97,7 @@ luaT_istuple(struct lua_State *L, int narg)
 	return *(struct tuple **) data;
 }
 
-int
+struct tuple *
 luaT_tuple_new(struct lua_State *L, struct tuple_format *format)
 {
 	int argc = lua_gettop(L);
@@ -127,17 +127,20 @@ luaT_tuple_new(struct lua_State *L, struct tuple_format *format)
 	struct tuple *tuple = box_tuple_new(format, buf->buf,
 					   buf->buf + ibuf_used(buf));
 	if (tuple == NULL)
-		return luaT_error(L);
+		return NULL;
 	/* box_tuple_new() doesn't leak on exception, see public API doc */
-	luaT_pushtuple(L, tuple);
 	ibuf_reinit(tarantool_lua_ibuf);
-	return 1;
+	return tuple;
 }
 
 static int
 lbox_tuple_new(lua_State *L)
 {
-	return luaT_tuple_new(L, box_tuple_format_default());
+	struct tuple *tuple = luaT_tuple_new(L, box_tuple_format_default());
+	if (tuple == NULL)
+		return luaT_error(L);
+	luaT_pushtuple(L, tuple);
+	return 1;
 }
 
 static int
diff --git a/src/box/lua/tuple.h b/src/box/lua/tuple.h
index ba7f01f4b..48b630969 100644
--- a/src/box/lua/tuple.h
+++ b/src/box/lua/tuple.h
@@ -67,7 +67,7 @@ luaT_istuple(struct lua_State *L, int idx);
 
 /** \endcond public */
 
-int
+struct tuple *
 luaT_tuple_new(struct lua_State *L, struct tuple_format *format);
 
 static inline int
diff --git a/test/box/tuple.result b/test/box/tuple.result
index bc59dcf05..acc5ffa28 100644
--- a/test/box/tuple.result
+++ b/test/box/tuple.result
@@ -1121,8 +1121,14 @@ s:frommap()
 ...
 s:frommap({})
 ---
-- error: Tuple field count 0 is less than required by space format or defined indexes
-    (expected at least 1)
+- null
+- Tuple field count 0 is less than required by space format or defined indexes (expected
+  at least 1)
+...
+s:frommap({ddd = 'fail', aaa = 2, ccc = 3, bbb = 4}, {table=true})
+---
+- null
+- 'Tuple field 4 type does not match one required by operation: expected unsigned'
 ...
 s:frommap({ddd = 1, aaa = 2, ccc = 3, bbb = 4}, {table = true})
 ---
diff --git a/test/box/tuple.test.lua b/test/box/tuple.test.lua
index 8dd15a0a1..3a77c43ed 100644
--- a/test/box/tuple.test.lua
+++ b/test/box/tuple.test.lua
@@ -373,6 +373,7 @@ s:frommap({ddd = 1, aaa = 2, bbb = 3})
 s:frommap({ddd = 1, aaa = 2, ccc = 3, eee = 4})
 s:frommap()
 s:frommap({})
+s:frommap({ddd = 'fail', aaa = 2, ccc = 3, bbb = 4}, {table=true})
 s:frommap({ddd = 1, aaa = 2, ccc = 3, bbb = 4}, {table = true})
 s:frommap({ddd = 1, aaa = 2, ccc = 3, bbb = 4}, {table = false})
 s:frommap({ddd = 1, aaa = 2, ccc = 3, bbb = box.NULL})
-- 
2.21.0 (Apple Git-122.2)

             reply	other threads:[~2020-01-14 10:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-14 10:49 Chris Sosnin [this message]
2020-01-14 11:38 ` Kirill Yukhin
  -- strict thread matches above, loose matches on Subject: below --
2020-01-10  7:31 Chris Sosnin
2019-11-24 21:18 Chris Sosnin
2019-11-26 21:01 ` Vladislav Shpilevoy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200114104945.43008-1-k.sosnin@tarantool.org \
    --to=k.sosnin@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH] box: frommap() bug fix' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

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