Tarantool development patches archive
 help / color / mirror / Atom feed
From: imeevma@tarantool.org
To: v.shpilevoy@tarantool.org, tsafin@tarantool.org
Cc: tarantool-patches@dev.tarantool.org
Subject: [Tarantool-patches] [PATCH v2 07/10] sql: move built-in function definitions in _func
Date: Fri, 14 Aug 2020 18:05:03 +0300	[thread overview]
Message-ID: <1fc825807e36bd97b97a28756b3e9da2c270de5b.1597417321.git.imeevma@gmail.com> (raw)
In-Reply-To: <cover.1597417321.git.imeevma@gmail.com>

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

  parent reply	other threads:[~2020-08-14 15:05 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-14 15:04 [Tarantool-patches] [PATCH v2 00/10] sql: properly check arguments types of built-in functions imeevma
2020-08-14 15:04 ` [Tarantool-patches] [PATCH v2 01/10] sql: do not return UNSIGNED in " imeevma
2020-08-22 14:23   ` Vladislav Shpilevoy
2020-08-14 15:04 ` [Tarantool-patches] [PATCH v2 02/10] sql: fix functions return types imeevma
2020-08-22 14:24   ` Vladislav Shpilevoy
2020-08-14 15:04 ` [Tarantool-patches] [PATCH v2 03/10] sql: change signature of trim() imeevma
2020-08-22 14:26   ` Vladislav Shpilevoy
2020-08-14 15:04 ` [Tarantool-patches] [PATCH v2 04/10] box: add new options for functions imeevma
2020-08-22 14:28   ` Vladislav Shpilevoy
2020-08-14 15:05 ` [Tarantool-patches] [PATCH v2 05/10] sql: use has_vararg for built-in functions imeevma
2020-08-14 15:05 ` [Tarantool-patches] [PATCH v2 06/10] sql: add overloaded versions of the functions imeevma
2020-08-22 14:29   ` Vladislav Shpilevoy
2020-08-14 15:05 ` imeevma [this message]
2020-08-22 14:30   ` [Tarantool-patches] [PATCH v2 07/10] sql: move built-in function definitions in _func Vladislav Shpilevoy
2020-08-14 15:05 ` [Tarantool-patches] [PATCH v2 08/10] box: add param_list to 'struct func' imeevma
2020-08-22 14:30   ` Vladislav Shpilevoy
2020-08-14 15:05 ` [Tarantool-patches] [PATCH v2 09/10] sql: check built-in functions argument types imeevma
2020-08-14 15:05 ` [Tarantool-patches] [PATCH v2 10/10] sql: refactor sql/func.c imeevma
2020-08-22 14:31   ` Vladislav Shpilevoy
2020-08-22 14:25 ` [Tarantool-patches] [PATCH v2 00/10] sql: properly check arguments types of built-in functions Vladislav Shpilevoy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1fc825807e36bd97b97a28756b3e9da2c270de5b.1597417321.git.imeevma@gmail.com \
    --to=imeevma@tarantool.org \
    --cc=tarantool-patches@dev.tarantool.org \
    --cc=tsafin@tarantool.org \
    --cc=v.shpilevoy@tarantool.org \
    --subject='Re: [Tarantool-patches] [PATCH v2 07/10] sql: move built-in function definitions in _func' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox