* [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" @ 2020-03-19 9:14 Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release Chris Sosnin ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Chris Sosnin @ 2020-03-19 9:14 UTC (permalink / raw) To: v.shpilevoy, korablev, tarantool-patches First patch allows performing schema upgrades within one release. Second patch updates _vfunc format in 2.3.1.1 (the last number is not visible to users). branch:https://github.com/tarantool/tarantool/tree/ksosnin/gh-4666-select-from-vfunc issue #1:https://github.com/tarantool/tarantool/issues/4804 issue #2:https://github.com/tarantool/tarantool/issues/4666 Chris Sosnin (2): box: allow schema upgrades within a release sql: fix assertion fault in SELECT * FROM "_vfunc" src/box/bootstrap.snap | Bin 5976 -> 5970 bytes src/box/lua/upgrade.lua | 17 ++++++++++++++--- test/box-py/bootstrap.result | 11 +++++++++-- test/sql/engine.cfg | 1 + test/sql/gh-4666-sql-select-from-vfunc.result | 7 +++++++ .../gh-4666-sql-select-from-vfunc.test.lua | 4 ++++ 6 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.result create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.test.lua -- 2.21.1 (Apple Git-122.3) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release 2020-03-19 9:14 [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin @ 2020-03-19 9:14 ` Chris Sosnin 2020-03-22 19:43 ` Vladislav Shpilevoy 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin 2020-03-27 23:37 ` [Tarantool-patches] [PATCH 0/2] " Vladislav Shpilevoy 2 siblings, 1 reply; 9+ messages in thread From: Chris Sosnin @ 2020-03-19 9:14 UTC (permalink / raw) To: v.shpilevoy, korablev, tarantool-patches To avoid cases when a user has an incorrectly upgraded schema, we introduce new versioning, which can be used to perform upgrades within a single release. Closes #4804 Needed for #4666 --- src/box/lua/upgrade.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua index 075cc236e..92c3b460e 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -27,12 +27,14 @@ local mkversion = {} mkversion.__index = mkversion setmetatable(mkversion, {__call = function(c, ...) return c.new(...) end}) -function mkversion.new(major, minor, patch) +function mkversion.new(major, minor, patch, build) local self = setmetatable({}, mkversion) self.major = major self.minor = minor self.patch = patch + self.build = build or 0 self.id = bit.bor(bit.lshift(bit.bor(bit.lshift(major, 8), minor), 8), patch) + self.id = bit.bor(bit.lshift(self.id, 8), self.build) return self end @@ -982,8 +984,9 @@ local function get_version() local major = version[2] local minor = version[3] local patch = version[4] or 0 + local build = version[5] or 0 - return mkversion(major, minor, patch) + return mkversion(major, minor, patch, build) end local function upgrade(options) @@ -1025,7 +1028,8 @@ local function upgrade(options) box.space._schema:replace({'version', handler.version.major, handler.version.minor, - handler.version.patch}) + handler.version.patch, + handler.version.build}) ::continue:: end end -- 2.21.1 (Apple Git-122.3) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release Chris Sosnin @ 2020-03-22 19:43 ` Vladislav Shpilevoy 2020-03-25 19:10 ` Chris Sosnin 0 siblings, 1 reply; 9+ messages in thread From: Vladislav Shpilevoy @ 2020-03-22 19:43 UTC (permalink / raw) To: Chris Sosnin, korablev, tarantool-patches Thanks for the patch! On 19/03/2020 10:14, Chris Sosnin wrote: > To avoid cases when a user has an incorrectly upgraded schema, we > introduce new versioning, which can be used to perform upgrades > within a single release. > > Closes #4804 > Needed for #4666 > --- > src/box/lua/upgrade.lua | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua > index 075cc236e..92c3b460e 100644 > --- a/src/box/lua/upgrade.lua > +++ b/src/box/lua/upgrade.lua > @@ -27,12 +27,14 @@ local mkversion = {} > mkversion.__index = mkversion > setmetatable(mkversion, {__call = function(c, ...) return c.new(...) end}) > > -function mkversion.new(major, minor, patch) > +function mkversion.new(major, minor, patch, build) > local self = setmetatable({}, mkversion) > self.major = major > self.minor = minor > self.patch = patch > + self.build = build or 0 > self.id = bit.bor(bit.lshift(bit.bor(bit.lshift(major, 8), minor), 8), patch) > + self.id = bit.bor(bit.lshift(self.id, 8), self.build) > return self > end Since we don't update mkversion.__tostring(), user during upgrade will see his logs as > set schema version to 2.3.1 > set schema version to 2.3.1 > set schema version to 2.3.1 ... depending on how many schema versions we have within release. Perhaps, it is worth adding the build version to __tostring() method. So as not to confuse the user, and simplify debug so as user could tell between which builds the upgrade failed. It does not affect version visibility - box.info.version() is reported differently. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release 2020-03-22 19:43 ` Vladislav Shpilevoy @ 2020-03-25 19:10 ` Chris Sosnin 0 siblings, 0 replies; 9+ messages in thread From: Chris Sosnin @ 2020-03-25 19:10 UTC (permalink / raw) To: Vladislav Shpilevoy; +Cc: tarantool-patches Hi! Thank you for the review! > On 22 Mar 2020, at 22:43, Vladislav Shpilevoy <v.shpilevoy@tarantool.org> wrote: > > Thanks for the patch! > > On 19/03/2020 10:14, Chris Sosnin wrote: >> To avoid cases when a user has an incorrectly upgraded schema, we >> introduce new versioning, which can be used to perform upgrades >> within a single release. >> >> Closes #4804 >> Needed for #4666 >> --- >> src/box/lua/upgrade.lua | 10 +++++++--- >> 1 file changed, 7 insertions(+), 3 deletions(-) >> >> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua >> index 075cc236e..92c3b460e 100644 >> --- a/src/box/lua/upgrade.lua >> +++ b/src/box/lua/upgrade.lua >> @@ -27,12 +27,14 @@ local mkversion = {} >> mkversion.__index = mkversion >> setmetatable(mkversion, {__call = function(c, ...) return c.new(...) end}) >> >> -function mkversion.new(major, minor, patch) >> +function mkversion.new(major, minor, patch, build) >> local self = setmetatable({}, mkversion) >> self.major = major >> self.minor = minor >> self.patch = patch >> + self.build = build or 0 >> self.id = bit.bor(bit.lshift(bit.bor(bit.lshift(major, 8), minor), 8), patch) >> + self.id = bit.bor(bit.lshift(self.id, 8), self.build) >> return self >> end > > Since we don't update mkversion.__tostring(), user during upgrade > will see his logs as > >> set schema version to 2.3.1 >> set schema version to 2.3.1 >> set schema version to 2.3.1 > ... depending on how many schema versions we have within > release. > > Perhaps, it is worth adding the build version to __tostring() > method. So as not to confuse the user, and simplify debug so > as user could tell between which builds the upgrade failed. > > It does not affect version visibility - box.info.version() is > reported differently. Thank you for clarification, I didn’t touch it on purpose and I was wrong. Fixed. ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" 2020-03-19 9:14 [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release Chris Sosnin @ 2020-03-19 9:14 ` Chris Sosnin 2020-03-22 19:42 ` Vladislav Shpilevoy 2020-03-27 23:37 ` [Tarantool-patches] [PATCH 0/2] " Vladislav Shpilevoy 2 siblings, 1 reply; 9+ messages in thread From: Chris Sosnin @ 2020-03-19 9:14 UTC (permalink / raw) To: v.shpilevoy, korablev, tarantool-patches It fails because it was forgotten to update _vfunc format along with _func in 2.2.1. This leads to bad allocation of vdbe cursor and setting wrong memory to 0. Closes #4666 --- src/box/bootstrap.snap | Bin 5976 -> 5970 bytes src/box/lua/upgrade.lua | 7 +++++++ test/box-py/bootstrap.result | 11 +++++++++-- test/sql/engine.cfg | 1 + test/sql/gh-4666-sql-select-from-vfunc.result | 7 +++++++ .../gh-4666-sql-select-from-vfunc.test.lua | 4 ++++ 6 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.result create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.test.lua diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index 8bd4f7ce24216a8bcced6aa97c20c83eb7a02c77..ad952a8cba39aeb0e3c2d1ef23b5786de5f83034 100644 GIT binary patch delta 5462 <snipped> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua index 92c3b460e..2fea6f943 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -974,6 +974,12 @@ local function upgrade_to_2_3_1() create_session_settings_space() end +local function upgrade_to_2_3_1_1() + local _func = box.space[box.schema.FUNC_ID] + local _vfunc = box.space[box.schema.VFUNC_ID] + _vfunc:format(_func:format()) +end + -------------------------------------------------------------------------------- local function get_version() @@ -1011,6 +1017,7 @@ local function upgrade(options) {version = mkversion(2, 2, 1), func = upgrade_to_2_2_1, auto = true}, {version = mkversion(2, 3, 0), func = upgrade_to_2_3_0, auto = true}, {version = mkversion(2, 3, 1), func = upgrade_to_2_3_1, auto = true}, + {version = mkversion(2, 3, 1, 1), func = upgrade_to_2_3_1_1, auto = true}, } for _, handler in ipairs(handlers) do diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result index 0876e77a6..6fb10d88c 100644 --- a/test/box-py/bootstrap.result +++ b/test/box-py/bootstrap.result @@ -4,7 +4,7 @@ box.internal.bootstrap() box.space._schema:select{} --- - - ['max_id', 511] - - ['version', 2, 3, 1] + - ['version', 2, 3, 1, 1] ... box.space._cluster:select{} --- @@ -63,7 +63,14 @@ box.space._space:select{} 'type': 'string'}, {'name': 'last_altered', 'type': 'string'}]] - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid', - 'type': 'unsigned'}]] + 'type': 'unsigned'}, {'name': 'language', 'type': 'string'}, {'name': 'body', + 'type': 'string'}, {'name': 'routine_type', 'type': 'string'}, {'name': 'param_list', + 'type': 'array'}, {'name': 'returns', 'type': 'string'}, {'name': 'aggregate', + 'type': 'string'}, {'name': 'sql_data_access', 'type': 'string'}, {'name': 'is_deterministic', + 'type': 'boolean'}, {'name': 'is_sandboxed', 'type': 'boolean'}, {'name': 'is_null_call', + 'type': 'boolean'}, {'name': 'exports', 'type': 'array'}, {'name': 'opts', + 'type': 'map'}, {'name': 'comment', 'type': 'string'}, {'name': 'created', + 'type': 'string'}, {'name': 'last_altered', 'type': 'string'}]] - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type', 'type': 'string'}, {'name': 'auth', 'type': 'map'}]] diff --git a/test/sql/engine.cfg b/test/sql/engine.cfg index 1e9f08c6a..22ea90043 100644 --- a/test/sql/engine.cfg +++ b/test/sql/engine.cfg @@ -2,6 +2,7 @@ "vinyl-opts.test.lua" : { "vinyl": {"engine": "vinyl"} }, + "gh-4666-sql-select-from-vfunc.test.lua": { }, "bind.test.lua": { "remote": {"remote": "true"}, "local": {"remote": "false"} diff --git a/test/sql/gh-4666-sql-select-from-vfunc.result b/test/sql/gh-4666-sql-select-from-vfunc.result new file mode 100644 index 000000000..5e5ea8aaf --- /dev/null +++ b/test/sql/gh-4666-sql-select-from-vfunc.result @@ -0,0 +1,7 @@ +-- test-run result file version 2 +-- +-- Make sure assertion does not fail. +-- +_ = box.execute([[select * from "_vfunc";]]) + | --- + | ... diff --git a/test/sql/gh-4666-sql-select-from-vfunc.test.lua b/test/sql/gh-4666-sql-select-from-vfunc.test.lua new file mode 100644 index 000000000..3ac0aadc5 --- /dev/null +++ b/test/sql/gh-4666-sql-select-from-vfunc.test.lua @@ -0,0 +1,4 @@ +-- +-- Make sure assertion does not fail. +-- +_ = box.execute([[select * from "_vfunc";]]) -- 2.21.1 (Apple Git-122.3) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin @ 2020-03-22 19:42 ` Vladislav Shpilevoy 2020-03-25 19:18 ` Chris Sosnin 0 siblings, 1 reply; 9+ messages in thread From: Vladislav Shpilevoy @ 2020-03-22 19:42 UTC (permalink / raw) To: Chris Sosnin, korablev, tarantool-patches > diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua > index 92c3b460e..2fea6f943 100644 > --- a/src/box/lua/upgrade.lua > +++ b/src/box/lua/upgrade.lua > @@ -974,6 +974,12 @@ local function upgrade_to_2_3_1() > create_session_settings_space() > end > > +local function upgrade_to_2_3_1_1() > + local _func = box.space[box.schema.FUNC_ID] > + local _vfunc = box.space[box.schema.VFUNC_ID] > + _vfunc:format(_func:format()) It is worth adding a comment why such a trivial thing should be done. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" 2020-03-22 19:42 ` Vladislav Shpilevoy @ 2020-03-25 19:18 ` Chris Sosnin 0 siblings, 0 replies; 9+ messages in thread From: Chris Sosnin @ 2020-03-25 19:18 UTC (permalink / raw) To: Vladislav Shpilevoy; +Cc: tarantool-patches Hi! Thank you for the review! > On 22 Mar 2020, at 22:42, Vladislav Shpilevoy <v.shpilevoy@tarantool.org> wrote: > >> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua >> index 92c3b460e..2fea6f943 100644 >> --- a/src/box/lua/upgrade.lua >> +++ b/src/box/lua/upgrade.lua >> @@ -974,6 +974,12 @@ local function upgrade_to_2_3_1() >> create_session_settings_space() >> end >> >> +local function upgrade_to_2_3_1_1() >> + local _func = box.space[box.schema.FUNC_ID] >> + local _vfunc = box.space[box.schema.VFUNC_ID] >> + _vfunc:format(_func:format()) > > It is worth adding a comment why such a trivial thing should be done. I added the following one: +local function upgrade_to_2_3_1_1() + -- Formats must be equal in order to avoid crashes in SQL + -- caused by incorrectly allocated cursor. + local _func = box.space[box.schema.FUNC_ID] + local _vfunc = box.space[box.schema.VFUNC_ID] + _vfunc:format(_func:format()) +end + ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" 2020-03-19 9:14 [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin @ 2020-03-27 23:37 ` Vladislav Shpilevoy 2 siblings, 0 replies; 9+ messages in thread From: Vladislav Shpilevoy @ 2020-03-27 23:37 UTC (permalink / raw) To: Chris Sosnin, korablev, tarantool-patches Hi! Thanks for the patchset! LGTM. On 19/03/2020 10:14, Chris Sosnin wrote: > First patch allows performing schema upgrades within one release. > > Second patch updates _vfunc format in 2.3.1.1 (the last number is not > visible to users). > > branch:https://github.com/tarantool/tarantool/tree/ksosnin/gh-4666-select-from-vfunc > issue #1:https://github.com/tarantool/tarantool/issues/4804 > issue #2:https://github.com/tarantool/tarantool/issues/4666 > > Chris Sosnin (2): > box: allow schema upgrades within a release > sql: fix assertion fault in SELECT * FROM "_vfunc" > > src/box/bootstrap.snap | Bin 5976 -> 5970 bytes > src/box/lua/upgrade.lua | 17 ++++++++++++++--- > test/box-py/bootstrap.result | 11 +++++++++-- > test/sql/engine.cfg | 1 + > test/sql/gh-4666-sql-select-from-vfunc.result | 7 +++++++ > .../gh-4666-sql-select-from-vfunc.test.lua | 4 ++++ > 6 files changed, 35 insertions(+), 5 deletions(-) > create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.result > create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.test.lua > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" @ 2020-04-24 10:14 Chris Sosnin 2020-04-24 10:14 ` [Tarantool-patches] [PATCH 2/2] sql: " Chris Sosnin 0 siblings, 1 reply; 9+ messages in thread From: Chris Sosnin @ 2020-04-24 10:14 UTC (permalink / raw) To: tarantool-patches, kyukhin First patch allows performing schema upgrades within one release Second patch updates _vfunc format in 2.3.1.1. branch: https://github.com/tarantool/tarantool/tree/ksosnin/gh-4666-select-from-vfunc issue#1: https://github.com/tarantool/tarantool/issues/4804 issue#2: https://github.com/tarantool/tarantool/issues/4666 This branch is already reviewed by Vlad, I rebased it and regenerated snap file just in case. Chris Sosnin (2): box: allow schema upgrades within a release sql: fix assertion fault in SELECT * FROM "_vfunc" src/box/bootstrap.snap | Bin 5976 -> 5968 bytes src/box/lua/upgrade.lua | 25 +++++++++++++++--- test/box-py/bootstrap.result | 11 ++++++-- test/sql/engine.cfg | 1 + test/sql/gh-4666-sql-select-from-vfunc.result | 7 +++++ .../gh-4666-sql-select-from-vfunc.test.lua | 4 +++ 6 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.result create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.test.lua -- 2.21.1 (Apple Git-122.3) ^ permalink raw reply [flat|nested] 9+ messages in thread
* [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" 2020-04-24 10:14 Chris Sosnin @ 2020-04-24 10:14 ` Chris Sosnin 0 siblings, 0 replies; 9+ messages in thread From: Chris Sosnin @ 2020-04-24 10:14 UTC (permalink / raw) To: tarantool-patches, kyukhin It fails because it was forgotten to update _vfunc format along with _func in 2.2.1. This leads to bad allocation of vdbe cursor and setting wrong memory to 0. Closes #4666 --- src/box/bootstrap.snap | Bin 5976 -> 5968 bytes src/box/lua/upgrade.lua | 9 +++++++++ test/box-py/bootstrap.result | 11 +++++++++-- test/sql/engine.cfg | 1 + test/sql/gh-4666-sql-select-from-vfunc.result | 7 +++++++ .../gh-4666-sql-select-from-vfunc.test.lua | 4 ++++ 6 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.result create mode 100644 test/sql/gh-4666-sql-select-from-vfunc.test.lua diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index 8bd4f7ce24216a8bcced6aa97c20c83eb7a02c77..5b495eac552ade8c6096ad090ea7f01ede5613ce 100644 GIT binary patch delta 5223 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 delta 5207 zcmV-d6sYUaF4!)R6@N1>FfB4UGA(B^G&M3}W-$s$ZgX^DZewLSAT=;#G+{G0GA%M= zIW{dcW-&4?Vly&0EjTq}F)?CcIAJ$4WC~V8Y;R+0Iv{&}3JTS_3%bn~-~i5DFleEr z0000004TLD{QywCwg3vzY%fU=XshY~Up&AU5Aemiejv;qX%XThfyB100S_ca97ZGJ z<m)Ywr6zym0_Os<0&o6rW96j44V&ehpbcjwpn$UxOu$*rLLk8d5zw9vKmbN$kwo^{ zzymb~8~`Ia7ia*C=v07#S^{7T(AX#d))JA=H3@*#)UW{~rU6?6Mnpgj7?J2aAPpEN z8h`*Naw3`oSYiPNu*51fERiK13m_7ys)$7A)RBLfMRXde@|kxkpZUgoCZF-I-~Ib7 z<^A^C?Ze$l4L5g(d$^13ab@{&B^HnCaXrJn>n6VIdgfi<b-346xUQ=nuB%fOu4}5- zHK?x6oN7%#P-`@6Jpci<rvNDJ8NdKjc|}g;^$CCg>uM%|bu9zHx;n|2d52@lyhAZ$ z-r;{c1dgfI`H7*`@d1^#8`_0+dOx8sj87<x>It2^Fzj;|MSDW=*eygpb-UUZ7^p4$ zqT50``zr@#3!lDhp_kkiZlSZwlTe8BA{07x5el6*-2Y8Z|J!c=JGnH~_H40f;iBgL zz3$4q-G8gOe-!n4PnIoMv}k=Li`G`Kw3>hEN~@Qww7S(*n6##{r1g|4T05ms3HoPk zO3*)PQi5JZ2K`g1R@;+AqwR^J^s_1bY<r+2)xMrYp?x`lLTpp?MR883R=tRA8`QjA zT@=+{O`c?xiIc1%HOXpLkC+^nARUiNj*iD9OFR-K-XBTgy%8iib<U3D)M;cSr&)hF zbrzY`yo!uyUPOv8*?zov4Jq<Mh<G1li1$Q7_)rkefe>;2V@L;m0MS9AA3CUmJ$zJE z@er!2+R>w`Du{>oI(B%UBglIkI(om6qjwuPdarS#SfpX2Se#L#Sj<itG-@$ssJu<J z*P_9YA<S7y9u;QP`69-#XTF0=AQ*qe-CgER(Jk2vAX$vfvFH7}{>}9dx$fUL)yx6j za!9PzHr@PXVyu}E5Rfd!Ce55OJ=-qVw8WaXJQ>592?5DsY%q|Fx7&AZWWvEfvKX5` zI85CrRW2^AW<fX>^AogY1sry?QP$XCYvF|~wkAv?%7uLdadQ#rzuP8r+OmI3_xQW! zQ>`)!i?{n{mTgmX3kwnT(QGiY?8{NVx%A6sqw>fzlFd;Qkwd=w_sca_X<}5rsEf*6 z)NATdCJw@3x%aHptowc?_bgJ?e7HS-o7z48q`Fa^X4f}$G4te_H(1@M`?h`9R1?!| zyAspP2DS9ptX5G~_pXInMcIEN-$oP<#yBj_YzT<Zj~+hWwTg$(jvhfgG_md9>)27d zlOu?B2ZxS*<lDV-BS-Da1`gU+jT=vzQjHcIe$lW|!!x4>O$H9bVQUqgyiOVJAc`l( zjI|1ejJ4`TjJ0a50)kPK;V>LV!#E7+c#PpN99H`ShBXtyVN+AiE@FQ;Y|6>SpW1Va zE@)3JxX4q;JoU_Ci`IyR7OnA$ELvl0v;vE5tm2Aoq{51A+{P)Y=&ux1^f!tr`rBV9 zq<G&aqIh2?pm?24JW=yv!U>w!5>0@;S;N;$2`2haVu}8dP@@0-k4WNwBaryNh$H@Y z5@E#uLlp79QwSomoI!sKv3?+gSpN?}tbhGJ0P%khKm5;w5C1!N=pla{c*sA89rDi~ z2OVm8ZpeX_#|9jXzK*Jky%p+?qDG&mh8w)6!3OVVsKGmBprPg!!wfVp7-V4ntV6r^ zdLf4HU4Wr`KQDCOeV7YU9?XxFZy`*|OL-Q+ykDUO?^R&I`xJjx@E!#fygwlY?=%60 znw~x<(Dd*zA>FF)>giTdbbCD|^x2*SKHHB_!uH#XK!WxmjG#RTB51Gu2O(s?2ZZeP ze2{(iUwhh~M^D@Fe6_vpck-~V2Y6VwgFCFtx?Ub+*G>o7t>cy5?9#E*+h?8LI_dPb zw_VR-%jGP#TU}hmw%BTMHMd&NnOb0;BmHyP<Vq&z$tCAVWsqkjgPa3okO%pktiJ&V z|7$Sk{|q+h7--P@1sU{i0S2s`3s|-S3s^Re9AXixf~z>hBC!Yu%V>OaWwe50G`b0s zoCY;Ks5He2ZHkpDN=8hyCp4ueOiD?#4(6n>0d+_>efaRvylul@VRMcRs6*mb$TyU( z{R;&ORU7mG;~udclMM%VC&LF1Q5l-zLyC_Y#xx<Nn3bD8`jy)JU8>Q#|70u(hhfc( zl6Xe;ldA_B0o0Sm2QeE|&gVP#?|GY|L?Qabs*~&{m0fc^ME&mKx}uX32u6Ro>e|0X zbcvOctpCkdUHcbR;v^(+QvM2!=n^9x>H4!7{XVl@KkJ?{b+Oo{%+{sSOqR_l%Caw4 zHB}o_dG@H^UFrUQ^Ih!vYZdjoj@N0LQC7;+`FW`OaG13`@9)>0={JiObI<M;s`>tJ z+q;fx8%z%KJLH*dzF+$uu^oR>{t8hgJ~D!3M45Ot>)BOqBo>uc`9_!6$ViS6-NHph zepb;ZCQ`(+X4^K%rboS|IaU6izgJRazKh7Nhx+r)boKX1Ib6R|+M`-{2$48Ol!=Lk z{9Np<a5>DZQ2F`Wrl`v5E#%^R$n`P~y2L|5rt~)YqYp*8z+7+v+Cr042~2-v2PZl- z$$<$DNH-kWu%rehG$fe;i3~?#FapEu1tS-V_$dk_0yd-tAuI%0fk=g+6o8=c;{+cj z2=(c~heruJNC+B1hX^@BzyZRI4{YqIp@+uTj65>%#JB^)gBKkDdCBZx8NQk=;jlk{ z{`kRkhGN=xZQT5AK3~XU_-cQ)<m}pgy%HDcN;m83&V_-vG~4!My4m3CF0t%tmb8V# z_%5nhiSgAeNh`}xxVlHr+Q4*4n}ji=r;fXy<bs*f#?=UdQeOQNH?OIdny&qu{9eC9 zC5~OqlA1Q0PKj?!UlTVibzyu+D>o|FMo33UYHr!1-?jJI$OuWRZF+ws1qYk*Z@#%C zSO2<CyaoC75dHakl$G+R6Kl!Z0h>4r2TP1)4(}<a!-2`^w(yk=oOVE-kBO~l;Pc^h zOU#tP&xY%HVd5nWc)ldAa>32k`;oyhF%=7bz8o3c5>JuS!->Huv6KpYIGv4mYvNiQ z8x#`LuyRmHtaQce;miayaT1)99}9T_tCN`vQ~{rp?h9uLSOzhNxTu4JE0bId8b!k7 zQfMR;2x1s0lU0-<1Aw6b0+2ueNN50D9hCubUzk=eTWMHeEeQ&&B|(90jA<`P9Ct&e zz~Rer*3`U!r6X+ry+u2dybM);R6Jci8k8niGsf3Nrrw5(3?4)kg3YMeXbNE}MyPcx zl_H}!5o7*%K2cd=DL+BF_I?ac8zl_b7RUJyK;Y)SkBSFEXDbrRVVaKLbN^^{x}ya2 z+@?-5g-E<EKic;xtB$sBI!gQuHg5yJDD(y%L81-VkyLjV=lj~HL<*sQms0^Veo$FN zG9_{HVB12IACUv5#L1D+WDJ8VimHj)MNwheCI<_JBg>zG6CoF&93d!0*n_nd?LDdv zi0g!)gr0Bd6nzMDc7%LM<sjvJEgvTju!~SAVd+}Tdsz!2BF1h(!_b#fCk5AQ$4P~8 z6z@n$JLoW*OYH80aVQplL)sMKb$1K+fymrWGl6Idzc#K*jC0ZL4qb{K&uc}whvBY> zB$7(k{c`BAu{p=>shV1O<p!1t<ITa%38=yi+i#+HFMPTFW|fa+j9piviSAPGrzwSB zyS)pHUIIHb_7tTE#k&{q_2ZoQ@)T)5z2ow`K5}9tlF-L{E>F*Y{SsgIH!!%(Oy|gW zR&$NtMEhtA<q_-Se(rgZHzM7#r(eiaCke9KH(R#AKwypJwJ}?28)vPC_(RVSDG~p! z!<zutAeF&>Q>Tj=s!~}2w#RhrmqJugPmi9H54!aD#D~)UqNwqlhSVQ_R*0A(s2;Mx z@9jW*_wkW0FOYhFH*~SVaYkE%j9&zy$CC{&f?DHDh896A8S;>OGHwY$d22uTiKJ8G zc*79IVe}R7pXiqap=WvzqYq>WLDgzM0t06h-8>n$NK6E!$D0f<BnX}!Pc|DMkIc<5 z=`Ap1%wbZ)<secMHs9moI0KJ)=3lv2>y=<M-PnItIlp{=11QRbP!$Fh2cPP5q_};L z4EXUWUj|03mi1JOrh@DF7uU>UCVgAa3x5sjGIZ#fK&fo`6|1<4!G9HtW!L0BnmN^# zk552kR^~~^uG;!d@;<ZPOgcy4kSq$ea0*J>ZwB0Yt_{F^{@N>7;EiZ45pXcA?ws_= z1?{Z4>QOa+dSd}_v9~!|FzTdc^UfqMs6Mzx5SubnI8GhPdV_}+8B1SM@;6iV5Zt_r zK6nNB8Nn@~RGlI8HC@_#HRh~gOgzIHL-hQZr>3zxq%G;}dx@Q)Ko;$d<A1yDgstl` z%1S~^_&1r!W;JO<xrq#-Y1wCqWkoYCV43)b6!!>!zn_5HV~43rTh&D&x(&8MQw)S{ z)_+^+_&SB0n2>Pp;9cXypU9119Or{K6#Snl7Aom5-AwZ~ZEh=nWjfJ^Zk;1X@#VI# z)q>E6!*aaUA;z&9q~oc-aJbt<m)v*l**R<{{RYyTg$r#Vjye~wghrn*C34uIzsjtF z%Se}h*-{aduU5{>OB~PDa?l!BIjO|YWsYNxiU}~LqZXVO3DcoQt+J@#+9X5~)3KOy zYz&s}+bNdFoFhIW?cA;V{#kUw+zHS4`Jf*KCnxX@ml7h77D^eSU>PfF<0d@pDd~iA zB@pz#hy`=(RHXp1&LzsL_GAjL1_8JHc%~VDIYkq=@IQX@X%x-TMJTDIORdhcxK@Rh z0BqP7dy;xIS#w7SUR>ZwI|j|^`Ox@D65h=Bx*mjAo5;DEt~WIb^CPD<Mqm#2F2x(9 zxZUDX#`;f7GiJEZ{z9U`A2K`=w`Rt^)*pmBNes%+hyjBctb4jHU@m^AjFFN7fs_w_ zJS-z%(Mc}d^rh_bnZ7i4Q@1*(QbtN)SkOI)Zg7Ch^LbTcP)*A6H>c?T(S>dYk>9}6 zACUkdABz4(=cb{_zKHDvNlH<O(g8Q5j6#!&`zn+?C5eUhGy)|O)_bDI3#u-F+?pJO z=rvk6Gt4@AMo?N@LuxreI2avCqK=_|AGaWX>|A>^M2A*;Km}y+-@2hUZP4ZCguLCX z8=3>tY$K{AB{Cq4%M6ClMPkG3lLI%zPn}Z_gQ>yRfUp2f{JUoKw_R(p5F)YI@KIY_ zO`kofQI-|~k8TkUcHTY=uOf>jp+Y*?Z{N`O<}JhlhFwIoxMdilugGFa=u6{&(RdGD z(r8v=`ki-7w|%_V$HdvHbMm5n=n1vt1|9sjZshBBd{Ab??H#_-W48OovM!<J9YPIj zjiNvN4-rf4*}xFdg0+%{MMfV83!5rPKPE^gqfNQsCG?ZbVgvs^mzlQSqGIUPS(6LR zC)SRL(t5X9=9c$gp)YrD`|Rj{XuF@pYG(em3vdzTOoN#a(}7Se*ehq)I(XqwT2w)r zF~B-CdP;?Up&zy&9%#IKHC%^Qdq4$2kfnq^OAY+7qZ~@hC`cm)m`x2&iO@f^gBQdD zjd!nx>(FWss2~Wkl+b6Xfj@SXLunZWX~Y1tso^OR`iFK{kl0Rvhx`YBvJY6g09c2q z_63`e!b%q?3n~Nq(eXv&K>Us^P7I3(z5$fhI!M`28M%+oD{|Q(`<Ix1c|39V7Wtou z{72^(*@^HaT4uKy`94vk>s*D>E8X1nr};#)r)_^i!ocrIrYZgtBv3Yq&w)@q*ez%5 z8hG&_Su`@!q}X}!(DZnJqzMU(M%+6KCnM#86yw5n>p8j&A@Vrl!^l>qwi`DL6y8>$ z<9S?)b~56i5yNXGE0Kh|@94+M91R4>2Pz1SBMD>`ePVqy|1*+9I$mxBT2(L%O4wE8 z`~8?Uz{p=-w1xPg&xGs-lZN3}Otq5m<rJZD@?8?`rvxPzCTA3XIk;9x6o##dYJs_7 z@Fh}CBWgK2TrZ*sWYC{4cp*H{vIc5Hr(t*%QB6q{IXL<+q8KnRhm~$id~7q}tHDI( z>$hn#eOLS<!<y3StCW!UYroB7<a>i&7ziwME9JV7BfxSeuj7p-GA73~&_OGx44B{s zu3^x|{pRLOqy=Yx#y(CbN<{A1N|9)SgzgV88Be)RxS~=DmdFh1f;NMLhix~=wQM*D zEW-|s#mgK&$Fex+HW5}(j=?pi*}i2FcCXTg7#tl`5m3wT;Q{x{+a(T<sO<oFg_W{c z6NgF$Uvgq^MAi{SiXKZGcu9Hnbx!?f|AQPNWIB^vSOe;RSp1lS<?Fw;FahfYjpyZ- zFXeDJp+1?PRPAqNC9P$8OJIH;`z@Zn>vOUjbBi=q2z{K6o*$_;3+h)n{XZ&x#0;LY zAq?Fctb?l!U>tgWQWt!BU?>VvPZ)?+)s0;?+xNJ@I$^gyS{&6WC9$#&T@5*;6Lzq4 z{ViDkm(vD+2SIEwa1$Upf0HRn60Q*$wz7cW9arM~hz7x))w9&YK*0L)fwmmLBLRRM z^peXOG~YSUf<65R0q|HF;)k=Vuwrp5A?KEnP?BIW%{$pyGacGv5ZfA?JOjDjxA}5n zZ90&J0sz=<eo&1Y_#g-|?|)+SVscm_W{+2jN{4V(Cn!66<vDNi9!Z(WEzNP0_ejc2 zZfTC2yhl=Ia!WmvrZX<T<ZNpQ`mb0<wuJQ8{T!=OE4Ins?2qWwoiB(5`V>i2ujD*V RcJ>e^DZi!Rhd$L1t?g-?(oX;Y diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua index bd9a881b0..eeda155ad 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -978,6 +978,14 @@ local function upgrade_to_2_3_1() create_session_settings_space() end +local function upgrade_to_2_3_1_1() + -- Formats must be equal in order to avoid crashes in SQL + -- caused by incorrectly allocated cursor. + local _func = box.space[box.schema.FUNC_ID] + local _vfunc = box.space[box.schema.VFUNC_ID] + _vfunc:format(_func:format()) +end + -------------------------------------------------------------------------------- local function get_version() @@ -1015,6 +1023,7 @@ local function upgrade(options) {version = mkversion(2, 2, 1), func = upgrade_to_2_2_1, auto = true}, {version = mkversion(2, 3, 0), func = upgrade_to_2_3_0, auto = true}, {version = mkversion(2, 3, 1), func = upgrade_to_2_3_1, auto = true}, + {version = mkversion(2, 3, 1, 1), func = upgrade_to_2_3_1_1, auto = true}, } for _, handler in ipairs(handlers) do diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result index 0876e77a6..6fb10d88c 100644 --- a/test/box-py/bootstrap.result +++ b/test/box-py/bootstrap.result @@ -4,7 +4,7 @@ box.internal.bootstrap() box.space._schema:select{} --- - - ['max_id', 511] - - ['version', 2, 3, 1] + - ['version', 2, 3, 1, 1] ... box.space._cluster:select{} --- @@ -63,7 +63,14 @@ box.space._space:select{} 'type': 'string'}, {'name': 'last_altered', 'type': 'string'}]] - [297, 1, '_vfunc', 'sysview', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'setuid', - 'type': 'unsigned'}]] + 'type': 'unsigned'}, {'name': 'language', 'type': 'string'}, {'name': 'body', + 'type': 'string'}, {'name': 'routine_type', 'type': 'string'}, {'name': 'param_list', + 'type': 'array'}, {'name': 'returns', 'type': 'string'}, {'name': 'aggregate', + 'type': 'string'}, {'name': 'sql_data_access', 'type': 'string'}, {'name': 'is_deterministic', + 'type': 'boolean'}, {'name': 'is_sandboxed', 'type': 'boolean'}, {'name': 'is_null_call', + 'type': 'boolean'}, {'name': 'exports', 'type': 'array'}, {'name': 'opts', + 'type': 'map'}, {'name': 'comment', 'type': 'string'}, {'name': 'created', + 'type': 'string'}, {'name': 'last_altered', 'type': 'string'}]] - [304, 1, '_user', 'memtx', 0, {}, [{'name': 'id', 'type': 'unsigned'}, {'name': 'owner', 'type': 'unsigned'}, {'name': 'name', 'type': 'string'}, {'name': 'type', 'type': 'string'}, {'name': 'auth', 'type': 'map'}]] diff --git a/test/sql/engine.cfg b/test/sql/engine.cfg index 1e9f08c6a..22ea90043 100644 --- a/test/sql/engine.cfg +++ b/test/sql/engine.cfg @@ -2,6 +2,7 @@ "vinyl-opts.test.lua" : { "vinyl": {"engine": "vinyl"} }, + "gh-4666-sql-select-from-vfunc.test.lua": { }, "bind.test.lua": { "remote": {"remote": "true"}, "local": {"remote": "false"} diff --git a/test/sql/gh-4666-sql-select-from-vfunc.result b/test/sql/gh-4666-sql-select-from-vfunc.result new file mode 100644 index 000000000..5e5ea8aaf --- /dev/null +++ b/test/sql/gh-4666-sql-select-from-vfunc.result @@ -0,0 +1,7 @@ +-- test-run result file version 2 +-- +-- Make sure assertion does not fail. +-- +_ = box.execute([[select * from "_vfunc";]]) + | --- + | ... diff --git a/test/sql/gh-4666-sql-select-from-vfunc.test.lua b/test/sql/gh-4666-sql-select-from-vfunc.test.lua new file mode 100644 index 000000000..3ac0aadc5 --- /dev/null +++ b/test/sql/gh-4666-sql-select-from-vfunc.test.lua @@ -0,0 +1,4 @@ +-- +-- Make sure assertion does not fail. +-- +_ = box.execute([[select * from "_vfunc";]]) -- 2.21.1 (Apple Git-122.3) ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-04-24 10:14 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-03-19 9:14 [Tarantool-patches] [PATCH 0/2] fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 1/2] box: allow schema upgrades within a release Chris Sosnin 2020-03-22 19:43 ` Vladislav Shpilevoy 2020-03-25 19:10 ` Chris Sosnin 2020-03-19 9:14 ` [Tarantool-patches] [PATCH 2/2] sql: fix assertion fault in SELECT * FROM "_vfunc" Chris Sosnin 2020-03-22 19:42 ` Vladislav Shpilevoy 2020-03-25 19:18 ` Chris Sosnin 2020-03-27 23:37 ` [Tarantool-patches] [PATCH 0/2] " Vladislav Shpilevoy 2020-04-24 10:14 Chris Sosnin 2020-04-24 10:14 ` [Tarantool-patches] [PATCH 2/2] sql: " Chris Sosnin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox