From 600d3479fce67cb25a49e5cbd9aa64ff302af48c Mon Sep 17 00:00:00 2001
From: Dmitry Simonenko <pmwkaa@gmail.com>
Date: Wed, 14 Mar 2012 19:22:12 +0400
Subject: [PATCH] core-lua-i64: fixed unsigned convertation, num64 index tests
 added

---
 core/tarantool_lua.m       | 10 ++++------
 test/box/lua.result        | 16 ++++++++++++++++
 test/box/lua.test          |  4 ++++
 test/box_big/lua.result    | 22 ++++++++++++++++++++++
 test/box_big/lua.test      | 10 ++++++++++
 test/box_big/tarantool.cfg |  7 +++++++
 6 files changed, 63 insertions(+), 6 deletions(-)

diff --git a/core/tarantool_lua.m b/core/tarantool_lua.m
index 71f33d60dd..32790e1001 100644
--- a/core/tarantool_lua.m
+++ b/core/tarantool_lua.m
@@ -101,11 +101,9 @@ lua_tointeger64(struct lua_State *L, int idx)
 	case LUA_TSTRING: {
 		const char *arg = luaL_checkstring(L, idx);
 		char *arge;
-		result = strtoll(arg, &arge, 10);
-		if ((errno == ERANGE && (result == LONG_MAX || result == LONG_MIN)) ||
-		    (errno != 0 && result == 0))
-			luaL_error(L, "lua_tointeger64: ", strerror(errno));
-		if (arge == arg)
+		errno = 0;
+		result = strtoull(arg, &arge, 10);
+		if (errno != 0 || arge == arg)
 			luaL_error(L, "lua_tointeger64: bad argument");
 		break;
 	}
@@ -249,12 +247,12 @@ lbox_pack(struct lua_State *L)
 static GCcdata*
 luaL_pushcdata(struct lua_State *L, CTypeID id, int bits)
 {
-	TValue *o = L->base + 1;
 	CTState *cts = ctype_cts(L);
 	CType *ct = ctype_raw(cts, id);
 	CTSize sz;
 	lj_ctype_info(cts, id, &sz);
 	GCcdata *cd = lj_cdata_new(cts, id, bits);
+	TValue *o = L->base + 1;
 	setcdataV(L, o - 1, cd);
 	lj_cconv_ct_init(cts, ct, sz, cdataptr(cd), o, 0);
 	L->top = o;
diff --git a/test/box/lua.result b/test/box/lua.result
index 90c5843b88..706ad188af 100644
--- a/test/box/lua.result
+++ b/test/box/lua.result
@@ -920,6 +920,22 @@ lua tonumber64('9223372036854775807') - tonumber64('9223372036854775800')
 ---
  - 7
 ...
+lua tonumber64('18446744073709551615') == tonumber64('18446744073709551615')
+---
+ - true
+...
+lua tonumber64('18446744073709551615') + 1
+---
+ - 0
+...
+lua tonumber64(-1)
+---
+ - 18446744073709551615
+...
+lua tonumber64('184467440737095516155')
+---
+error: 'Lua error: lua_tointeger64: bad argument'
+...
 lua string.byte(box.pack('p', tonumber64(123)))
 ---
  - 8
diff --git a/test/box/lua.test b/test/box/lua.test
index 1595b6c029..408aca2626 100644
--- a/test/box/lua.test
+++ b/test/box/lua.test
@@ -282,4 +282,8 @@ exec admin "lua tonumber64('123')"
 exec admin "lua type(tonumber64('123')) == 'cdata'"
 exec admin "lua tonumber64('9223372036854775807') == tonumber64('9223372036854775807')"
 exec admin "lua tonumber64('9223372036854775807') - tonumber64('9223372036854775800')"
+exec admin "lua tonumber64('18446744073709551615') == tonumber64('18446744073709551615')"
+exec admin "lua tonumber64('18446744073709551615') + 1"
+exec admin "lua tonumber64(-1)"
+exec admin "lua tonumber64('184467440737095516155')"
 exec admin "lua string.byte(box.pack('p', tonumber64(123)))"
diff --git a/test/box_big/lua.result b/test/box_big/lua.result
index 9e77209833..9b60d8228a 100644
--- a/test/box_big/lua.result
+++ b/test/box_big/lua.result
@@ -73,3 +73,25 @@ Found 2 tuples:
 lua box.space[5]:truncate()
 ---
 ...
+lua box.insert('8', tonumber64('18446744073709551615'), 'magic')
+---
+ - 18446744073709551615: {'magic'}
+...
+lua tu = box.select('8', '0', tonumber64('18446744073709551615'))
+---
+...
+lua num = box.unpack('l', tu[0])
+---
+...
+lua print(num)
+---
+18446744073709551615
+...
+lua type(num) == 'cdata'
+---
+ - true
+...
+lua num == tonumber64('18446744073709551615')
+---
+ - true
+...
diff --git a/test/box_big/lua.test b/test/box_big/lua.test
index 5ffd5a9039..0c43ab7c6b 100644
--- a/test/box_big/lua.test
+++ b/test/box_big/lua.test
@@ -37,3 +37,13 @@ exec sql "insert into t5 values ('00000000', 'of', 'puppets')"
 exec sql "insert into t5 values ('00000001', 'of', 'might', 'and', 'magic')"
 exec sql "call box.select_range(5, 1, 2, 'of')"
 exec admin "lua box.space[5]:truncate()"
+
+#
+# Lua 64bit numbers support
+#
+exec admin "lua box.insert('8', tonumber64('18446744073709551615'), 'magic')"
+exec admin "lua tu = box.select('8', '0', tonumber64('18446744073709551615'))"
+exec admin "lua num = box.unpack('l', tu[0])"
+exec admin "lua print(num)"
+exec admin "lua type(num) == 'cdata'"
+exec admin "lua num == tonumber64('18446744073709551615')"
diff --git a/test/box_big/tarantool.cfg b/test/box_big/tarantool.cfg
index 6a3d5fea29..ff574b31e7 100644
--- a/test/box_big/tarantool.cfg
+++ b/test/box_big/tarantool.cfg
@@ -136,3 +136,10 @@ space[7].index[1].type = "HASH"
 space[7].index[1].unique = true
 space[7].index[1].key_field[0].fieldno = 1
 space[7].index[1].key_field[0].type = "STR"
+
+# Lua 64bit numbers
+space[8].enabled = true
+space[8].index[0].type = "TREE"
+space[8].index[0].unique = 1
+space[8].index[0].key_field[0].fieldno = 0
+space[8].index[0].key_field[0].type = "NUM64"
-- 
GitLab