diff --git a/src/box/lua/error.cc b/src/box/lua/error.cc index 08c2d983dd4dd8328d56b998356c8c8e1a9f02b4..b2625bf5f309ae04686086b5e68312546fbad0b2 100644 --- a/src/box/lua/error.cc +++ b/src/box/lua/error.cc @@ -114,9 +114,16 @@ luaT_error_call(lua_State *L) return luaT_error(L); return 0; } - if (lua_gettop(L) == 2 && luaL_iserror(L, 2)) - return lua_error(L); - struct error *e = luaT_error_create(L, 2); + struct error *e = NULL; + if (lua_gettop(L) == 2) { + e = luaL_iserror(L, 2); + if (e != NULL) { + /* Re-set error to diag area. */ + diag_set_error(&fiber()->diag, e); + return lua_error(L); + } + } + e = luaT_error_create(L, 2); if (e == NULL) return luaL_error(L, "box.error(): bad arguments"); diag_set_error(&fiber()->diag, e); diff --git a/test/box/error.result b/test/box/error.result index 3d07f6e64c1a2aa342e0bfc5e59801c656668262..234c26371de3b54a79a7d06c8e64ac86559b91f0 100644 --- a/test/box/error.result +++ b/test/box/error.result @@ -808,3 +808,25 @@ assert(e2.prev == e3) | --- | - true | ... + +-- gh-4829: always promote error created via box.error() to +-- diagnostic area. +e1 = box.error.new({code = 111, reason = "cause"}) + | --- + | ... +box.error({code = 111, reason = "err"}) + | --- + | - error: err + | ... +box.error.last() + | --- + | - err + | ... +box.error(e1) + | --- + | - error: cause + | ... +assert(box.error.last() == e1) + | --- + | - true + | ... diff --git a/test/box/error.test.lua b/test/box/error.test.lua index ed7eb7565498bac9b8c0e8d30b47016883b99705..41baed52d24614e5d0d365a198a0dc723ca7bbc7 100644 --- a/test/box/error.test.lua +++ b/test/box/error.test.lua @@ -221,3 +221,11 @@ e2:set_prev(e3) box.error.set(e2) assert(e1.prev == nil) assert(e2.prev == e3) + +-- gh-4829: always promote error created via box.error() to +-- diagnostic area. +e1 = box.error.new({code = 111, reason = "cause"}) +box.error({code = 111, reason = "err"}) +box.error.last() +box.error(e1) +assert(box.error.last() == e1)