* [tarantool-patches] [PATCH 0/2] netbox: reuse _request() to do SQL execute() @ 2018-04-05 19:28 Vladislav Shpilevoy 2018-04-05 19:28 ` [tarantool-patches] [PATCH 1/2] netbox: forbid conn:timeout():execute(...) Vladislav Shpilevoy 2018-04-05 19:28 ` [tarantool-patches] [PATCH 2/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy 0 siblings, 2 replies; 6+ messages in thread From: Vladislav Shpilevoy @ 2018-04-05 19:28 UTC (permalink / raw) To: tarantool-patches; +Cc: kostja Branch: http://github.com/tarantool/tarantool/tree/gh-3323-3322-sql-iproto-schema-change Issue: https://github.com/tarantool/tarantool/issues/3323 Issue: https://github.com/tarantool/tarantool/issues/3322 _request() is a wrapper for perform_request, that detects schema changes, and waits until it is reloaded. Lets use _request() instead of direct perform_request() for execute(). The reason why the _request() was not used earlier was my attempt to avoid multiple return values in _request(), that leads to minor fixes in non-execute methods like index.select or eval/call_16, which return the _request() directly. But diplicating schema reloading logic for execute() is worse. Vladislav Shpilevoy (2): netbox: forbid conn:timeout():execute(...) netbox: reuse _request() to do SQL execute() src/box/lua/net_box.lua | 77 +++++++++++++++++++++++------------------------ test/box/net.box.result | 5 +-- test/box/net.box.test.lua | 5 +-- test/sql/iproto.result | 45 --------------------------- test/sql/iproto.test.lua | 15 --------- 5 files changed, 44 insertions(+), 103 deletions(-) -- 2.14.3 (Apple Git-98) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tarantool-patches] [PATCH 1/2] netbox: forbid conn:timeout():execute(...) 2018-04-05 19:28 [tarantool-patches] [PATCH 0/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy @ 2018-04-05 19:28 ` Vladislav Shpilevoy 2018-04-05 20:08 ` [tarantool-patches] " Konstantin Osipov 2018-04-05 19:28 ` [tarantool-patches] [PATCH 2/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy 1 sibling, 1 reply; 6+ messages in thread From: Vladislav Shpilevoy @ 2018-04-05 19:28 UTC (permalink / raw) To: tarantool-patches; +Cc: kostja This API is deprecated in 1.7.4, so it must not be supported in new methods like execute(). --- src/box/lua/net_box.lua | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index fe65eac72..8d1955315 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -833,18 +833,6 @@ function remote_methods:wait_connected(timeout) return self._transport.wait_state('active', timeout) end -function remote_methods:request_timeout(request_opts) - local timeout = request_opts and request_opts.timeout - if timeout == nil then - -- conn:timeout(timeout):ping() - -- @deprecated since 1.7.4 - local deadline = self._deadlines[fiber_self()] - timeout = deadline and max(0, deadline - fiber_clock()) - or (request_opts and request_opts.timeout) - end - return timeout -end - function remote_methods:_request(method, opts, ...) local this_fiber = fiber_self() local transport = self._transport @@ -890,7 +878,14 @@ end function remote_methods:ping(opts) check_remote_arg(self, 'ping') - local timeout = self:request_timeout(opts) + local timeout = opts and opts.timeout + if timeout == nil then + -- conn:timeout(timeout):ping() + -- @deprecated since 1.7.4 + local deadline = self._deadlines[fiber_self()] + timeout = deadline and max(0, deadline - fiber_clock()) + or (opts and opts.timeout) + end local err = self._transport.perform_request(timeout, nil, 'ping', self.schema_version) return not err or err == E_WRONG_SCHEMA_VERSION @@ -941,13 +936,14 @@ function remote_methods:execute(query, parameters, sql_opts, netbox_opts) if sql_opts ~= nil then box.error(box.error.UNSUPPORTED, "execute", "options") end - local timeout = self:request_timeout(netbox_opts) + local timeout = netbox_opts and netbox_opts.timeout local buffer = netbox_opts and netbox_opts.buffer parameters = parameters or {} sql_opts = sql_opts or {} - local err, res, metadata, info = self._transport.perform_request(timeout, - buffer, 'execute', self.schema_version, - query, parameters, sql_opts) + local err, res, metadata, info = + self._transport.perform_request(timeout, buffer, 'execute', + self.schema_version, query, parameters, + sql_opts) if err then box.error({code = err, reason = res}) end -- 2.14.3 (Apple Git-98) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tarantool-patches] Re: [PATCH 1/2] netbox: forbid conn:timeout():execute(...) 2018-04-05 19:28 ` [tarantool-patches] [PATCH 1/2] netbox: forbid conn:timeout():execute(...) Vladislav Shpilevoy @ 2018-04-05 20:08 ` Konstantin Osipov 0 siblings, 0 replies; 6+ messages in thread From: Konstantin Osipov @ 2018-04-05 20:08 UTC (permalink / raw) To: Vladislav Shpilevoy; +Cc: tarantool-patches * Vladislav Shpilevoy <v.shpilevoy@tarantool.org> [18/04/05 22:31]: > This API is deprecated in 1.7.4, so it must not be > supported in new methods like execute(). OK to push. -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 http://tarantool.io - www.twitter.com/kostja_osipov ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tarantool-patches] [PATCH 2/2] netbox: reuse _request() to do SQL execute() 2018-04-05 19:28 [tarantool-patches] [PATCH 0/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy 2018-04-05 19:28 ` [tarantool-patches] [PATCH 1/2] netbox: forbid conn:timeout():execute(...) Vladislav Shpilevoy @ 2018-04-05 19:28 ` Vladislav Shpilevoy 2018-04-05 20:07 ` [tarantool-patches] " Konstantin Osipov 1 sibling, 1 reply; 6+ messages in thread From: Vladislav Shpilevoy @ 2018-04-05 19:28 UTC (permalink / raw) To: tarantool-patches; +Cc: kostja _request() is a wrapper for perform_request, that detects schema changes, and waits until it is reloaded. Lets use _request() instead of direct perform_request() for execute(). The reason why the _request() was not used earlier was my attempt to avoid multiple return values in _request(), that leads to minor fixes in non-execute methods like index.select or eval/call_16, which return the _request() directly. But diplicating schema reloading logic for execute() is worse. Closes #3323 Closes #3322 --- src/box/lua/net_box.lua | 57 +++++++++++++++++++++++++---------------------- test/box/net.box.result | 5 +++-- test/box/net.box.test.lua | 5 +++-- test/sql/iproto.result | 45 ------------------------------------- test/sql/iproto.test.lua | 15 ------------- 5 files changed, 36 insertions(+), 91 deletions(-) diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index 8d1955315..ccf40df06 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -848,33 +848,41 @@ function remote_methods:_request(method, opts, ...) deadline = self._deadlines[this_fiber] end local buffer = opts and opts.buffer - local err, res + local err, res, metadata, info repeat local timeout = deadline and max(0, deadline - fiber_clock()) if self.state ~= 'active' then wait_state('active', timeout) timeout = deadline and max(0, deadline - fiber_clock()) end - err, res = perform_request(timeout, buffer, method, - self.schema_version, ...) + err, res, metadata, info = + perform_request(timeout, buffer, method, self.schema_version, ...) if not err and buffer ~= nil then return res -- the length of xrow.body elseif not err then - setmetatable(res, sequence_mt) - local postproc = method ~= 'eval' and method ~= 'call_17' - if postproc then - local tnew = box.tuple.new - for i, v in pairs(res) do - res[i] = tnew(v) + -- SQL execute can return info with no data. + if res then + setmetatable(res, sequence_mt) + local postproc = method ~= 'eval' and method ~= 'call_17' + if postproc then + local tnew = box.tuple.new + for i, v in pairs(res) do + res[i] = tnew(v) + end end end - return res + return res, metadata, info elseif err == E_WRONG_SCHEMA_VERSION then err = nil end until err box.error({code = err, reason = res}) end +-- +-- Get multiple values and return the first only. Use to ignore +-- tail consisting of nils. +-- +local function first_value(arg) return arg end function remote_methods:ping(opts) check_remote_arg(self, 'ping') @@ -900,7 +908,8 @@ end -- @deprecated since 1.7.4 function remote_methods:call_16(func_name, ...) check_remote_arg(self, 'call') - return self:_request('call_16', nil, tostring(func_name), {...}) + return first_value(self:_request('call_16', nil, tostring(func_name), + {...})) end function remote_methods:call(func_name, args, opts) @@ -917,7 +926,7 @@ end -- @deprecated since 1.7.4 function remote_methods:eval_16(code, ...) check_remote_arg(self, 'eval') - return unpack(self:_request('eval', nil, code, {...})) + return unpack(first_value(self:_request('eval', nil, code, {...}))) end function remote_methods:eval(code, args, opts) @@ -936,18 +945,10 @@ function remote_methods:execute(query, parameters, sql_opts, netbox_opts) if sql_opts ~= nil then box.error(box.error.UNSUPPORTED, "execute", "options") end - local timeout = netbox_opts and netbox_opts.timeout - local buffer = netbox_opts and netbox_opts.buffer - parameters = parameters or {} - sql_opts = sql_opts or {} - local err, res, metadata, info = - self._transport.perform_request(timeout, buffer, 'execute', - self.schema_version, query, parameters, - sql_opts) - if err then - box.error({code = err, reason = res}) - end - if buffer ~= nil then + local res, metadata, info = + self:_request('execute', netbox_opts, query, parameters or {}, + sql_opts or {}) + if netbox_opts and netbox_opts.buffer then return res -- body length. Body is written to the buffer. end assert((info == nil and metadata ~= nil and res ~= nil) or @@ -1180,8 +1181,9 @@ index_metatable = function(remote) local iterator = check_iterator_type(opts, key_is_nil) local offset = tonumber(opts and opts.offset) or 0 local limit = tonumber(opts and opts.limit) or 0xFFFFFFFF - return remote:_request('select', opts, self.space.id, self.id, - iterator, offset, limit, key) + return first_value(remote:_request('select', opts, self.space.id, + self.id, iterator, offset, limit, + key)) end function methods:get(key, opts) @@ -1222,7 +1224,8 @@ index_metatable = function(remote) end local code = string.format('box.space.%s.index.%s:count', self.space.name, self.name) - return remote:_request('call_16', opts, code, { key })[1][1] + return first_value(remote:_request('call_16', opts, code, + { key }))[1][1] end function methods:delete(key, opts) diff --git a/test/box/net.box.result b/test/box/net.box.result index cf7b27f0b..1c95fe0aa 100644 --- a/test/box/net.box.result +++ b/test/box/net.box.result @@ -25,8 +25,9 @@ test_run:cmd("setopt delimiter ';'") - true ... function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts) - return cn:_request('select', opts, space_id, index_id, iterator, - offset, limit, key) + local ret = cn:_request('select', opts, space_id, index_id, iterator, + offset, limit, key) + return ret end function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end test_run:cmd("setopt delimiter ''"); diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua index 576b5cfea..03ca5cc0f 100644 --- a/test/box/net.box.test.lua +++ b/test/box/net.box.test.lua @@ -8,8 +8,9 @@ test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua...\"]:<line>: '") test_run:cmd("setopt delimiter ';'") function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts) - return cn:_request('select', opts, space_id, index_id, iterator, - offset, limit, key) + local ret = cn:_request('select', opts, space_id, index_id, iterator, + offset, limit, key) + return ret end function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end test_run:cmd("setopt delimiter ''"); diff --git a/test/sql/iproto.result b/test/sql/iproto.result index f7749cb05..39e51d84c 100644 --- a/test/sql/iproto.result +++ b/test/sql/iproto.result @@ -286,9 +286,6 @@ cn:execute('create table test2(id primary key, a, b, c)') --- - rowcount: 1 ... -cn:reload_schema() ---- -... box.space.TEST2.name --- - TEST2 @@ -307,9 +304,6 @@ cn:execute('create index test2_a_b_index on test2(a, b)') --- - rowcount: 1 ... -cn:reload_schema() ---- -... #box.space.TEST2.index --- - 1 @@ -318,9 +312,6 @@ cn:execute('drop table test2') --- - rowcount: 1 ... -cn:reload_schema() ---- -... box.space.TEST2 --- - null @@ -333,9 +324,6 @@ cn:execute('create table test3(id primary key, a, b)') ... -- Rowcount = 1, although two tuples were created: -- for _space and for _index. -cn:reload_schema() ---- -... cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') --- - rowcount: 3 @@ -350,9 +338,6 @@ cn:execute('create view test3_view(id) as select id from test3') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('create view if not exists test3_view(id) as select id from test3') --- - rowcount: 0 @@ -361,9 +346,6 @@ cn:execute('drop view test3_view') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('drop view if exists test3_view') --- - rowcount: 0 @@ -374,9 +356,6 @@ cn:execute('create index test3_sec on test3(a, b)') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('create index if not exists test3_sec on test3(a, b)') --- - rowcount: 0 @@ -385,9 +364,6 @@ cn:execute('drop index test3_sec on test3') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('drop index if exists test3_sec on test3') --- - rowcount: 0 @@ -398,9 +374,6 @@ cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;' --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('create trigger if not exists trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') --- - rowcount: 0 @@ -409,9 +382,6 @@ cn:execute('drop trigger trig') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('drop trigger if exists trig') --- - rowcount: 0 @@ -422,29 +392,17 @@ cn:execute('create index idx1 on test3(a)') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('create index idx2 on test3(b)') --- - rowcount: 1 ... -cn:reload_schema() ---- -... box.space.TEST3:truncate() --- ... -cn:reload_schema() ---- -... cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') --- - rowcount: 3 @@ -453,9 +411,6 @@ cn:execute('drop table test3') --- - rowcount: 1 ... -cn:reload_schema() ---- -... cn:execute('drop table if exists test3') --- - rowcount: 0 diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua index 64c0a56fe..faf844226 100644 --- a/test/sql/iproto.test.lua +++ b/test/sql/iproto.test.lua @@ -111,15 +111,12 @@ cn:execute('select :value', parameters) -- gh-2608 SQL iproto DDL cn:execute('create table test2(id primary key, a, b, c)') -cn:reload_schema() box.space.TEST2.name cn:execute('insert into test2 values (1, 1, 1, 1)') cn:execute('select * from test2') cn:execute('create index test2_a_b_index on test2(a, b)') -cn:reload_schema() #box.space.TEST2.index cn:execute('drop table test2') -cn:reload_schema() box.space.TEST2 -- gh-2617 DDL row_count either 0 or 1. @@ -128,50 +125,38 @@ box.space.TEST2 cn:execute('create table test3(id primary key, a, b)') -- Rowcount = 1, although two tuples were created: -- for _space and for _index. -cn:reload_schema() cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') cn:execute('create table if not exists test3(id primary key)') -- Test CREATE VIEW [IF NOT EXISTS] and -- DROP VIEW [IF EXISTS]. cn:execute('create view test3_view(id) as select id from test3') -cn:reload_schema() cn:execute('create view if not exists test3_view(id) as select id from test3') cn:execute('drop view test3_view') -cn:reload_schema() cn:execute('drop view if exists test3_view') -- Test CREATE INDEX [IF NOT EXISTS] and -- DROP INDEX [IF EXISTS]. cn:execute('create index test3_sec on test3(a, b)') -cn:reload_schema() cn:execute('create index if not exists test3_sec on test3(a, b)') cn:execute('drop index test3_sec on test3') -cn:reload_schema() cn:execute('drop index if exists test3_sec on test3') -- Test CREATE TRIGGER [IF NOT EXISTS] and -- DROP TRIGGER [IF EXISTS]. cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') -cn:reload_schema() cn:execute('create trigger if not exists trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') cn:execute('drop trigger trig') -cn:reload_schema() cn:execute('drop trigger if exists trig') -- Test DROP TABLE [IF EXISTS]. -- Create more indexes, triggers and _truncate tuple. cn:execute('create index idx1 on test3(a)') -cn:reload_schema() cn:execute('create index idx2 on test3(b)') -cn:reload_schema() box.space.TEST3:truncate() -cn:reload_schema() cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') -cn:reload_schema() cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') cn:execute('drop table test3') -cn:reload_schema() cn:execute('drop table if exists test3') -- gh-2602 obuf_alloc breaks the tuple in different slabs -- 2.14.3 (Apple Git-98) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tarantool-patches] Re: [PATCH 2/2] netbox: reuse _request() to do SQL execute() 2018-04-05 19:28 ` [tarantool-patches] [PATCH 2/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy @ 2018-04-05 20:07 ` Konstantin Osipov 2018-04-05 23:30 ` Vladislav Shpilevoy 0 siblings, 1 reply; 6+ messages in thread From: Konstantin Osipov @ 2018-04-05 20:07 UTC (permalink / raw) To: Vladislav Shpilevoy; +Cc: tarantool-patches * Vladislav Shpilevoy <v.shpilevoy@tarantool.org> [18/04/05 22:31]: Please use select(1, f()) instead of first_value(). Otherwise the patch is OK to push. > _request() is a wrapper for perform_request, that detects schema > changes, and waits until it is reloaded. Lets use _request() > instead of direct perform_request() for execute(). The reason why > the _request() was not used earlier was my attempt to avoid > multiple return values in _request(), that leads to minor fixes > in non-execute methods like index.select or eval/call_16, which > return the _request() directly. > > But diplicating schema reloading logic for execute() is worse. > > Closes #3323 > Closes #3322 > --- > src/box/lua/net_box.lua | 57 +++++++++++++++++++++++++---------------------- > test/box/net.box.result | 5 +++-- > test/box/net.box.test.lua | 5 +++-- > test/sql/iproto.result | 45 ------------------------------------- > test/sql/iproto.test.lua | 15 ------------- > 5 files changed, 36 insertions(+), 91 deletions(-) > > diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua > index 8d1955315..ccf40df06 100644 > --- a/src/box/lua/net_box.lua > +++ b/src/box/lua/net_box.lua > @@ -848,33 +848,41 @@ function remote_methods:_request(method, opts, ...) > deadline = self._deadlines[this_fiber] > end > local buffer = opts and opts.buffer > - local err, res > + local err, res, metadata, info > repeat > local timeout = deadline and max(0, deadline - fiber_clock()) > if self.state ~= 'active' then > wait_state('active', timeout) > timeout = deadline and max(0, deadline - fiber_clock()) > end > - err, res = perform_request(timeout, buffer, method, > - self.schema_version, ...) > + err, res, metadata, info = > + perform_request(timeout, buffer, method, self.schema_version, ...) > if not err and buffer ~= nil then > return res -- the length of xrow.body > elseif not err then > - setmetatable(res, sequence_mt) > - local postproc = method ~= 'eval' and method ~= 'call_17' > - if postproc then > - local tnew = box.tuple.new > - for i, v in pairs(res) do > - res[i] = tnew(v) > + -- SQL execute can return info with no data. > + if res then > + setmetatable(res, sequence_mt) > + local postproc = method ~= 'eval' and method ~= 'call_17' > + if postproc then > + local tnew = box.tuple.new > + for i, v in pairs(res) do > + res[i] = tnew(v) > + end > end > end > - return res > + return res, metadata, info > elseif err == E_WRONG_SCHEMA_VERSION then > err = nil > end > until err > box.error({code = err, reason = res}) > end > +-- > +-- Get multiple values and return the first only. Use to ignore > +-- tail consisting of nils. > +-- > +local function first_value(arg) return arg end > > function remote_methods:ping(opts) > check_remote_arg(self, 'ping') > @@ -900,7 +908,8 @@ end > -- @deprecated since 1.7.4 > function remote_methods:call_16(func_name, ...) > check_remote_arg(self, 'call') > - return self:_request('call_16', nil, tostring(func_name), {...}) > + return first_value(self:_request('call_16', nil, tostring(func_name), > + {...})) > end > > function remote_methods:call(func_name, args, opts) > @@ -917,7 +926,7 @@ end > -- @deprecated since 1.7.4 > function remote_methods:eval_16(code, ...) > check_remote_arg(self, 'eval') > - return unpack(self:_request('eval', nil, code, {...})) > + return unpack(first_value(self:_request('eval', nil, code, {...}))) > end > > function remote_methods:eval(code, args, opts) > @@ -936,18 +945,10 @@ function remote_methods:execute(query, parameters, sql_opts, netbox_opts) > if sql_opts ~= nil then > box.error(box.error.UNSUPPORTED, "execute", "options") > end > - local timeout = netbox_opts and netbox_opts.timeout > - local buffer = netbox_opts and netbox_opts.buffer > - parameters = parameters or {} > - sql_opts = sql_opts or {} > - local err, res, metadata, info = > - self._transport.perform_request(timeout, buffer, 'execute', > - self.schema_version, query, parameters, > - sql_opts) > - if err then > - box.error({code = err, reason = res}) > - end > - if buffer ~= nil then > + local res, metadata, info = > + self:_request('execute', netbox_opts, query, parameters or {}, > + sql_opts or {}) > + if netbox_opts and netbox_opts.buffer then > return res -- body length. Body is written to the buffer. > end > assert((info == nil and metadata ~= nil and res ~= nil) or > @@ -1180,8 +1181,9 @@ index_metatable = function(remote) > local iterator = check_iterator_type(opts, key_is_nil) > local offset = tonumber(opts and opts.offset) or 0 > local limit = tonumber(opts and opts.limit) or 0xFFFFFFFF > - return remote:_request('select', opts, self.space.id, self.id, > - iterator, offset, limit, key) > + return first_value(remote:_request('select', opts, self.space.id, > + self.id, iterator, offset, limit, > + key)) > end > > function methods:get(key, opts) > @@ -1222,7 +1224,8 @@ index_metatable = function(remote) > end > local code = string.format('box.space.%s.index.%s:count', > self.space.name, self.name) > - return remote:_request('call_16', opts, code, { key })[1][1] > + return first_value(remote:_request('call_16', opts, code, > + { key }))[1][1] > end > > function methods:delete(key, opts) > diff --git a/test/box/net.box.result b/test/box/net.box.result > index cf7b27f0b..1c95fe0aa 100644 > --- a/test/box/net.box.result > +++ b/test/box/net.box.result > @@ -25,8 +25,9 @@ test_run:cmd("setopt delimiter ';'") > - true > ... > function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts) > - return cn:_request('select', opts, space_id, index_id, iterator, > - offset, limit, key) > + local ret = cn:_request('select', opts, space_id, index_id, iterator, > + offset, limit, key) > + return ret > end > function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end > test_run:cmd("setopt delimiter ''"); > diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua > index 576b5cfea..03ca5cc0f 100644 > --- a/test/box/net.box.test.lua > +++ b/test/box/net.box.test.lua > @@ -8,8 +8,9 @@ test_run:cmd("push filter ".."'\\.lua.*:[0-9]+: ' to '.lua...\"]:<line>: '") > > test_run:cmd("setopt delimiter ';'") > function x_select(cn, space_id, index_id, iterator, offset, limit, key, opts) > - return cn:_request('select', opts, space_id, index_id, iterator, > - offset, limit, key) > + local ret = cn:_request('select', opts, space_id, index_id, iterator, > + offset, limit, key) > + return ret > end > function x_fatal(cn) cn._transport.perform_request(nil, nil, 'inject', nil, '\x80') end > test_run:cmd("setopt delimiter ''"); > diff --git a/test/sql/iproto.result b/test/sql/iproto.result > index f7749cb05..39e51d84c 100644 > --- a/test/sql/iproto.result > +++ b/test/sql/iproto.result > @@ -286,9 +286,6 @@ cn:execute('create table test2(id primary key, a, b, c)') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > box.space.TEST2.name > --- > - TEST2 > @@ -307,9 +304,6 @@ cn:execute('create index test2_a_b_index on test2(a, b)') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > #box.space.TEST2.index > --- > - 1 > @@ -318,9 +312,6 @@ cn:execute('drop table test2') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > box.space.TEST2 > --- > - null > @@ -333,9 +324,6 @@ cn:execute('create table test3(id primary key, a, b)') > ... > -- Rowcount = 1, although two tuples were created: > -- for _space and for _index. > -cn:reload_schema() > ---- > -... > cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') > --- > - rowcount: 3 > @@ -350,9 +338,6 @@ cn:execute('create view test3_view(id) as select id from test3') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('create view if not exists test3_view(id) as select id from test3') > --- > - rowcount: 0 > @@ -361,9 +346,6 @@ cn:execute('drop view test3_view') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('drop view if exists test3_view') > --- > - rowcount: 0 > @@ -374,9 +356,6 @@ cn:execute('create index test3_sec on test3(a, b)') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('create index if not exists test3_sec on test3(a, b)') > --- > - rowcount: 0 > @@ -385,9 +364,6 @@ cn:execute('drop index test3_sec on test3') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('drop index if exists test3_sec on test3') > --- > - rowcount: 0 > @@ -398,9 +374,6 @@ cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;' > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('create trigger if not exists trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') > --- > - rowcount: 0 > @@ -409,9 +382,6 @@ cn:execute('drop trigger trig') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('drop trigger if exists trig') > --- > - rowcount: 0 > @@ -422,29 +392,17 @@ cn:execute('create index idx1 on test3(a)') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('create index idx2 on test3(b)') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > box.space.TEST3:truncate() > --- > ... > -cn:reload_schema() > ---- > -... > cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') > --- > - rowcount: 3 > @@ -453,9 +411,6 @@ cn:execute('drop table test3') > --- > - rowcount: 1 > ... > -cn:reload_schema() > ---- > -... > cn:execute('drop table if exists test3') > --- > - rowcount: 0 > diff --git a/test/sql/iproto.test.lua b/test/sql/iproto.test.lua > index 64c0a56fe..faf844226 100644 > --- a/test/sql/iproto.test.lua > +++ b/test/sql/iproto.test.lua > @@ -111,15 +111,12 @@ cn:execute('select :value', parameters) > > -- gh-2608 SQL iproto DDL > cn:execute('create table test2(id primary key, a, b, c)') > -cn:reload_schema() > box.space.TEST2.name > cn:execute('insert into test2 values (1, 1, 1, 1)') > cn:execute('select * from test2') > cn:execute('create index test2_a_b_index on test2(a, b)') > -cn:reload_schema() > #box.space.TEST2.index > cn:execute('drop table test2') > -cn:reload_schema() > box.space.TEST2 > > -- gh-2617 DDL row_count either 0 or 1. > @@ -128,50 +125,38 @@ box.space.TEST2 > cn:execute('create table test3(id primary key, a, b)') > -- Rowcount = 1, although two tuples were created: > -- for _space and for _index. > -cn:reload_schema() > cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') > cn:execute('create table if not exists test3(id primary key)') > > -- Test CREATE VIEW [IF NOT EXISTS] and > -- DROP VIEW [IF EXISTS]. > cn:execute('create view test3_view(id) as select id from test3') > -cn:reload_schema() > cn:execute('create view if not exists test3_view(id) as select id from test3') > cn:execute('drop view test3_view') > -cn:reload_schema() > cn:execute('drop view if exists test3_view') > > -- Test CREATE INDEX [IF NOT EXISTS] and > -- DROP INDEX [IF EXISTS]. > cn:execute('create index test3_sec on test3(a, b)') > -cn:reload_schema() > cn:execute('create index if not exists test3_sec on test3(a, b)') > cn:execute('drop index test3_sec on test3') > -cn:reload_schema() > cn:execute('drop index if exists test3_sec on test3') > > -- Test CREATE TRIGGER [IF NOT EXISTS] and > -- DROP TRIGGER [IF EXISTS]. > cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') > -cn:reload_schema() > cn:execute('create trigger if not exists trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') > cn:execute('drop trigger trig') > -cn:reload_schema() > cn:execute('drop trigger if exists trig') > > -- Test DROP TABLE [IF EXISTS]. > -- Create more indexes, triggers and _truncate tuple. > cn:execute('create index idx1 on test3(a)') > -cn:reload_schema() > cn:execute('create index idx2 on test3(b)') > -cn:reload_schema() > box.space.TEST3:truncate() > -cn:reload_schema() > cn:execute('create trigger trig INSERT ON test3 BEGIN SELECT * FROM test3; END;') > -cn:reload_schema() > cn:execute('insert into test3 values (1, 1, 1), (2, 2, 2), (3, 3, 3)') > cn:execute('drop table test3') > -cn:reload_schema() > cn:execute('drop table if exists test3') > > -- gh-2602 obuf_alloc breaks the tuple in different slabs > -- > 2.14.3 (Apple Git-98) > -- Konstantin Osipov, Moscow, Russia, +7 903 626 22 32 http://tarantool.io - www.twitter.com/kostja_osipov ^ permalink raw reply [flat|nested] 6+ messages in thread
* [tarantool-patches] Re: [PATCH 2/2] netbox: reuse _request() to do SQL execute() 2018-04-05 20:07 ` [tarantool-patches] " Konstantin Osipov @ 2018-04-05 23:30 ` Vladislav Shpilevoy 0 siblings, 0 replies; 6+ messages in thread From: Vladislav Shpilevoy @ 2018-04-05 23:30 UTC (permalink / raw) To: Konstantin Osipov; +Cc: tarantool-patches 05.04.2018 23:07, Konstantin Osipov пишет: > * Vladislav Shpilevoy <v.shpilevoy@tarantool.org> [18/04/05 22:31]: > > Please use select(1, f()) instead of first_value(). > > Otherwise the patch is OK to push. I have tried it at first. See the result: tarantool> function ret() return 1, 2, 3 end --- ... tarantool> select(1, ret()) --- - 1 - 2 - 3 ... ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2018-04-05 23:30 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2018-04-05 19:28 [tarantool-patches] [PATCH 0/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy 2018-04-05 19:28 ` [tarantool-patches] [PATCH 1/2] netbox: forbid conn:timeout():execute(...) Vladislav Shpilevoy 2018-04-05 20:08 ` [tarantool-patches] " Konstantin Osipov 2018-04-05 19:28 ` [tarantool-patches] [PATCH 2/2] netbox: reuse _request() to do SQL execute() Vladislav Shpilevoy 2018-04-05 20:07 ` [tarantool-patches] " Konstantin Osipov 2018-04-05 23:30 ` Vladislav Shpilevoy
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox