* [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
* [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 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
* 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 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
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
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