diff --git a/core/tarantool_lua.m b/core/tarantool_lua.m index 71f33d60dd6996740f6a0b2d1a0232c0dfb20c72..32790e1001adf2500cc3e87e4326c929e8e8572f 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 90c5843b8819db6f2acbb5d519b23fde5f8065c6..706ad188af552a0cd12c116f55829be70830bdcb 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 1595b6c029cb2a1c9e3090698bb6331bb4edd0b5..408aca26263aea2ffc839dfd3628d88b76a7bd80 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 9e77209833fd97f5105c1744438290281af527a9..9b60d8228a1bc77d5bfeeea6eec79c9487253c8f 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 5ffd5a9039b9b72e20a8f388e3069aa6f11d2eee..0c43ab7c6b1cf0d1c50d80587cc1fa8c8102f16c 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 6a3d5fea29b623db875bf3dcaeca265310cbec5b..ff574b31e74268e76ebb80fad58b3750ceebfa1b 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"