From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 22588430410 for ; Fri, 14 Aug 2020 18:05:05 +0300 (MSK) From: imeevma@tarantool.org Date: Fri, 14 Aug 2020 18:05:03 +0300 Message-Id: <1fc825807e36bd97b97a28756b3e9da2c270de5b.1597417321.git.imeevma@gmail.com> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v2 07/10] sql: move built-in function definitions in _func List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org, tsafin@tarantool.org Cc: tarantool-patches@dev.tarantool.org This patch moves SQL built-in function definitions to _func. This helps create an unified way to check the types of arguments. It also allows users to see these definitions. Also, this patch enables overloading for length(), trim(), position() and substr() functions. Part of #4159 --- src/box/bootstrap.snap | Bin 5976 -> 6446 bytes src/box/lua/upgrade.lua | 192 +++++++++++++++++++++++++++++++++ src/box/sql/func.c | 6 -- test/box-py/bootstrap.result | 6 +- test/box/access.result | 2 +- test/box/access.test.lua | 2 +- test/box/access_bin.result | 2 +- test/box/access_bin.test.lua | 2 +- test/box/access_sysview.result | 8 +- test/box/function1.result | 6 +- test/wal_off/func_max.result | 8 +- 11 files changed, 212 insertions(+), 22 deletions(-) diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap index 8bd4f7ce24216a8bcced6aa97c20c83eb7a02c77..17e5e2c65ea977620fae969da73b5449c9227078 100644 GIT binary patch literal 6446 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 IAJq`8?W$`(1ONa4 literal 5976 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 G5UuU4uRFp3 diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua index add791cd7..290741940 100644 --- a/src/box/lua/upgrade.lua +++ b/src/box/lua/upgrade.lua @@ -971,6 +971,197 @@ local function upgrade_to_2_3_1() create_session_settings_space() end +-------------------------------------------------------------------------------- +-- Tarantool 2.5.2 +-------------------------------------------------------------------------------- + +local function update_sql_builtin_functions() + local _func = box.space[box.schema.FUNC_ID] + local _priv = box.space[box.schema.PRIV_ID] + local updates + local datetime = os.date("%Y-%m-%d %H:%M:%S") + local overloaded_function_list = { + "LENGTH_VARBINARY", "POSITION_VARBINARY", "TRIM_VARBINARY", + "SUBSTR_VARBINARY", + } + + for _, v in pairs(overloaded_function_list) do + local t = _func:auto_increment({ADMIN, v, 1, 'SQL_BUILTIN', '', + 'function', {}, 'any', 'none', 'none', + false, false, true, {}, setmap({}), '', + datetime, datetime}) + _priv:replace{ADMIN, PUBLIC, 'function', t.id, box.priv.X} + end + + _func:run_triggers(false) + updates = {{'=', 'param_list', {'number'}}, {'=', 'returns', 'number'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('ABS', updates) + + updates = {{'=', 'param_list', {'number'}}, {'=', 'returns', 'number'}, + {'=', 'aggregate', 'group'}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('AVG', updates) + _func.index[2]:update('SUM', updates) + _func.index[2]:update('TOTAL', updates) + + updates = {{'=', 'param_list', {'unsigned'}}, {'=', 'returns', 'string'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('CHAR', updates) + + updates = {{'=', 'param_list', {'string'}}, {'=', 'returns', 'integer'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('CHARACTER_LENGTH', updates) + _func.index[2]:update('CHAR_LENGTH', updates) + + updates = {{'=', 'param_list', {'string'}}, {'=', 'returns', 'integer'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_overload = true}}} + _func.index[2]:update('LENGTH', updates) + + updates = {{'=', 'param_list', {'varbinary'}}, {'=', 'returns', 'integer'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {is_overloaded = true}}} + _func.index[2]:update('LENGTH_VARBINARY', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'scalar'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('COALESCE', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'integer'}, + {'=', 'aggregate', 'group'}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('COUNT', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'scalar'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('GREATEST', updates) + _func.index[2]:update('LEAST', updates) + + updates = {{'=', 'param_list', {'scalar', 'scalar'}}, + {'=', 'returns', 'string'}, {'=', 'aggregate', 'group'}, + {'=', 'exports', {'SQL'}}, {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('GROUP_CONCAT', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'string'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('HEX', updates) + + updates = {{'=', 'param_list', {'scalar', 'scalar'}}, + {'=', 'returns', 'scalar'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('IFNULL', updates) + _func.index[2]:update('NULLIF', updates) + + updates = {{'=', 'param_list', {'string', 'string', 'string'}}, + {'=', 'returns', 'boolean'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('LIKE', updates) + + updates = {{'=', 'param_list', {'scalar', 'double'}}, + {'=', 'returns', 'scalar'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('LIKELIHOOD', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'scalar'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('LIKELY', updates) + _func.index[2]:update('UNLIKELY', updates) + + updates = {{'=', 'param_list', {'string'}}, {'=', 'returns', 'string'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('LOWER', updates) + _func.index[2]:update('SOUNDEX', updates) + _func.index[2]:update('UNICODE', updates) + _func.index[2]:update('UPPER', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'string'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('QUOTE', updates) + _func.index[2]:update('TYPEOF', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'scalar'}, + {'=', 'aggregate', 'group'}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('MAX', updates) + _func.index[2]:update('MIN', updates) + + updates = {{'=', 'param_list', {'string', 'string'}}, + {'=', 'returns', 'integer'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, {'=', 'opts', {has_overload = true}}} + _func.index[2]:update('POSITION', updates) + + updates = {{'=', 'param_list', {'varbinary', 'varbinary'}}, + {'=', 'returns', 'integer'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, {'=', 'opts', {is_overloaded = true}}} + _func.index[2]:update('POSITION_VARBINARY', updates) + + updates = {{'=', 'param_list', {'scalar'}}, {'=', 'returns', 'string'}, + {'=', 'is_deterministic', true}, {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('PRINTF', updates) + + updates = {{'=', 'param_list', {'string', 'unsigned', 'string'}}, + {'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true, has_overload = true}}} + _func.index[2]:update('TRIM', updates) + + updates = {{'=', 'param_list', {'varbinary', 'unsigned', 'varbinary'}}, + {'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true, is_overloaded = true}}} + _func.index[2]:update('TRIM_VARBINARY', updates) + + updates = {{'=', 'returns', 'integer'}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('RANDOM', updates) + + updates = {{'=', 'returns', 'integer'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('ROW_COUNT', updates) + + updates = {{'=', 'param_list', {'unsigned'}}, + {'=', 'returns', 'varbinary'}, {'=', 'exports', {'SQL'}}} + _func.index[2]:update('RANDOMBLOB', updates) + + updates = {{'=', 'param_list', {'unsigned'}}, + {'=', 'returns', 'varbinary'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('ZEROBLOB', updates) + + updates = {{'=', 'param_list', {'string', 'string', 'string'}}, + {'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('REPLACE', updates) + + updates = {{'=', 'param_list', {'double', 'unsigned'}}, + {'=', 'returns', 'double'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, {'=', 'opts', {has_vararg = true}}} + _func.index[2]:update('ROUND', updates) + + updates = {{'=', 'param_list', {'string', 'integer', 'integer'}}, + {'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true, has_overload = true}}} + _func.index[2]:update('SUBSTR', updates) + + updates = {{'=', 'param_list', {'varbinary', 'integer', 'integer'}}, + {'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}, + {'=', 'opts', {has_vararg = true, is_overloaded = true}}} + _func.index[2]:update('SUBSTR_VARBINARY', updates) + + updates = {{'=', 'returns', 'string'}, {'=', 'is_deterministic', true}, + {'=', 'exports', {'SQL'}}} + _func.index[2]:update('VERSION', updates) + _func:run_triggers(true) +end + +local function upgrade_to_2_5_2() + update_sql_builtin_functions() +end + -------------------------------------------------------------------------------- local function get_version() @@ -1007,6 +1198,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, 5, 2), func = upgrade_to_2_5_2, auto = true}, } for _, handler in ipairs(handlers) do diff --git a/src/box/sql/func.c b/src/box/sql/func.c index ae1842824..1fbffa535 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -2971,12 +2971,6 @@ func_sql_builtin_new(struct func_def *def) func->flags = sql_builtins[idx].flags; func->call = sql_builtins[idx].call; func->finalize = sql_builtins[idx].finalize; - def->param_count = sql_builtins[idx].param_count; - def->is_deterministic = sql_builtins[idx].is_deterministic; - def->returns = sql_builtins[idx].returns; - def->aggregate = sql_builtins[idx].aggregate; - def->exports.sql = sql_builtins[idx].export_to_sql; - def->opts.has_vararg = sql_builtins[idx].param_count == -1; return &func->base; } diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result index 0876e77a6..289289443 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, 5, 2] ... box.space._cluster:select{} --- @@ -242,6 +242,10 @@ box.space._priv:select{} - [1, 2, 'function', 65, 4] - [1, 2, 'function', 66, 4] - [1, 2, 'function', 67, 4] + - [1, 2, 'function', 68, 4] + - [1, 2, 'function', 69, 4] + - [1, 2, 'function', 70, 4] + - [1, 2, 'function', 71, 4] - [1, 2, 'space', 276, 2] - [1, 2, 'space', 277, 1] - [1, 2, 'space', 281, 1] diff --git a/test/box/access.result b/test/box/access.result index 20b1b8b35..b72fa8b02 100644 --- a/test/box/access.result +++ b/test/box/access.result @@ -703,7 +703,7 @@ box.schema.func.exists(1) --- - true ... -box.schema.func.exists(68) +box.schema.func.exists(72) --- - false ... diff --git a/test/box/access.test.lua b/test/box/access.test.lua index 3e083a383..759d0a94f 100644 --- a/test/box/access.test.lua +++ b/test/box/access.test.lua @@ -282,7 +282,7 @@ box.schema.user.exists{} box.schema.func.exists('nosuchfunc') box.schema.func.exists('guest') box.schema.func.exists(1) -box.schema.func.exists(68) +box.schema.func.exists(72) box.schema.func.exists('box.schema.user.info') box.schema.func.exists() box.schema.func.exists(nil) diff --git a/test/box/access_bin.result b/test/box/access_bin.result index c58f331d3..d345e5996 100644 --- a/test/box/access_bin.result +++ b/test/box/access_bin.result @@ -298,7 +298,7 @@ box.schema.user.grant('guest', 'execute', 'universe') function f1() return box.space._func:get(1)[4] end --- ... -function f2() return box.space._func:get(68)[4] end +function f2() return box.space._func:get(72)[4] end --- ... box.schema.func.create('f1') diff --git a/test/box/access_bin.test.lua b/test/box/access_bin.test.lua index 41d5f4245..13d8041a9 100644 --- a/test/box/access_bin.test.lua +++ b/test/box/access_bin.test.lua @@ -112,7 +112,7 @@ test:drop() -- notice that guest can execute stuff, but can't read space _func box.schema.user.grant('guest', 'execute', 'universe') function f1() return box.space._func:get(1)[4] end -function f2() return box.space._func:get(68)[4] end +function f2() return box.space._func:get(72)[4] end box.schema.func.create('f1') box.schema.func.create('f2',{setuid=true}) c = net.connect(box.cfg.listen) diff --git a/test/box/access_sysview.result b/test/box/access_sysview.result index 799d19f03..f9ffae127 100644 --- a/test/box/access_sysview.result +++ b/test/box/access_sysview.result @@ -258,11 +258,11 @@ box.session.su('guest') ... #box.space._vpriv:select{} --- -- 82 +- 86 ... #box.space._vfunc:select{} --- -- 67 +- 71 ... #box.space._vcollation:select{} --- @@ -290,11 +290,11 @@ box.session.su('guest') ... #box.space._vpriv:select{} --- -- 82 +- 86 ... #box.space._vfunc:select{} --- -- 67 +- 71 ... #box.space._vsequence:select{} --- diff --git a/test/box/function1.result b/test/box/function1.result index 928cd5758..3cce0f4e2 100644 --- a/test/box/function1.result +++ b/test/box/function1.result @@ -97,7 +97,7 @@ box.func["function1.args"] exports: lua: true sql: false - id: 68 + id: 72 setuid: false is_multikey: false is_deterministic: false @@ -593,7 +593,7 @@ func exports: lua: true sql: false - id: 68 + id: 72 setuid: false is_multikey: false is_deterministic: false @@ -665,7 +665,7 @@ func exports: lua: true sql: false - id: 68 + id: 72 setuid: false is_multikey: false is_deterministic: false diff --git a/test/wal_off/func_max.result b/test/wal_off/func_max.result index 78db38d6b..1aef99c66 100644 --- a/test/wal_off/func_max.result +++ b/test/wal_off/func_max.result @@ -42,11 +42,11 @@ test_run:cmd("setopt delimiter ''"); ... func_limit() --- -- error: 'Failed to create function ''func31934'': function id is too big' +- error: 'Failed to create function ''func31930'': function id is too big' ... drop_limit_func() --- -- error: Function 'func31934' does not exist +- error: Function 'func31930' does not exist ... box.schema.user.create('testuser') --- @@ -62,11 +62,11 @@ session.su('testuser') ... func_limit() --- -- error: 'Failed to create function ''func31934'': function id is too big' +- error: 'Failed to create function ''func31930'': function id is too big' ... drop_limit_func() --- -- error: Function 'func31934' does not exist +- error: Function 'func31930' does not exist ... session.su('admin') --- -- 2.25.1