[Tarantool-patches] [PATCH 2/2] sql: introduce SQL built-in function UUID()

Mergen Imeev imeevma at tarantool.org
Fri May 28 12:52:52 MSK 2021


Hi! Sorry, I missed one fix in old tests. Fixed. Branch updated. Diff:

diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
index ed7accea3..b2328487c 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, 7, 1]
+  - ['version', 2, 9, 1]
 ...
 box.space._cluster:select{}
 ---

On Thu, May 27, 2021 at 07:43:06PM +0300, Mergen Imeev via Tarantool-patches wrote:
> This patch introduces a new SQL built-in function UUID().
> 
> Closes #5886
> 
> @TarantoolBot document
> Title: SQL built-in function UUID()
> 
> SQL built-in function UUID() takes zero or one argument. If no argument
> is specified, a UUID v4 is generated. If the version of the UUID to
> generate is specified as an argument, the function returns the new UUID
> of the given version. Currently only version 4 of UUID is supported.
> ---
>  src/box/bootstrap.snap         | Bin 5991 -> 6016 bytes
>  src/box/lua/upgrade.lua        |  19 ++++++++++++
>  src/box/sql/func.c             |  39 +++++++++++++++++++++++++
>  src/box/sql/parse.y            |   2 +-
>  test/box-py/bootstrap.result   |   1 +
>  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/sql-tap/uuid.test.lua     |  52 ++++++++++++++++++++++++++++++++-
>  test/wal_off/func_max.result   |   8 ++---
>  13 files changed, 126 insertions(+), 17 deletions(-)
> 
> diff --git a/src/box/bootstrap.snap b/src/box/bootstrap.snap
> index c4a70297aad138d426a24ee4447af485e3597536..57374decc0f9de140772d9809a227e3ba4ce61eb 100644
> 
> diff --git a/src/box/lua/upgrade.lua b/src/box/lua/upgrade.lua
> index 6fba260bd..97afc0b4d 100644
> --- a/src/box/lua/upgrade.lua
> +++ b/src/box/lua/upgrade.lua
> @@ -1000,6 +1000,24 @@ local function upgrade_to_2_7_1()
>      function_access()
>  end
>  
> +--------------------------------------------------------------------------------
> +-- Tarantool 2.9.1
> +--------------------------------------------------------------------------------
> +local function sql_builtin_function_uuid()
> +    local _func = box.space._func
> +    local _priv = box.space._priv
> +    local datetime = os.date("%Y-%m-%d %H:%M:%S")
> +    local t = _func:auto_increment({ADMIN, 'UUID', 1, 'SQL_BUILTIN', '',
> +                                    'function', {}, 'any', 'none', 'none',
> +                                    false, false, true, {}, setmap({}), '',
> +                                    datetime, datetime})
> +    _priv:replace{ADMIN, PUBLIC, 'function', t.id, box.priv.X}
> +end
> +
> +local function upgrade_to_2_9_1()
> +    sql_builtin_function_uuid()
> +end
> +
>  --------------------------------------------------------------------------------
>  
>  local handlers = {
> @@ -1015,6 +1033,7 @@ local handlers = {
>      {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, 7, 1), func = upgrade_to_2_7_1, auto = true},
> +    {version = mkversion(2, 9, 1), func = upgrade_to_2_9_1, auto = true},
>  }
>  
>  -- Schema version of the snapshot.
> diff --git a/src/box/sql/func.c b/src/box/sql/func.c
> index 9c4480a92..f93ae867d 100644
> --- a/src/box/sql/func.c
> +++ b/src/box/sql/func.c
> @@ -66,6 +66,35 @@ mem_as_bin(struct Mem *mem)
>  	return s;
>  }
>  
> +static void
> +sql_func_uuid(struct sql_context *ctx, int argc, struct Mem **argv)
> +{
> +	if (argc > 1) {
> +		diag_set(ClientError, ER_FUNC_WRONG_ARG_COUNT, "UUID",
> +			 "one or zero", argc);
> +		ctx->is_aborted = true;
> +		return;
> +	}
> +	if (argc == 1) {
> +		uint64_t version;
> +		if (mem_get_uint(argv[0], &version) != 0) {
> +			diag_set(ClientError, ER_SQL_TYPE_MISMATCH,
> +				 mem_str(argv[0]), "integer");
> +			ctx->is_aborted = true;
> +			return;
> +		}
> +		if (version != 4) {
> +			diag_set(ClientError, ER_UNSUPPORTED, "Function UUID",
> +				 "versions other than 4");
> +			ctx->is_aborted = true;
> +			return;
> +		}
> +	}
> +	struct tt_uuid uuid;
> +	tt_uuid_create(&uuid);
> +	mem_set_uuid(ctx->pOut, &uuid);
> +}
> +
>  /*
>   * Return the collating function associated with a function.
>   */
> @@ -2544,6 +2573,16 @@ static struct {
>  	 .call = UpperICUFunc,
>  	 .finalize = NULL,
>  	 .export_to_sql = true,
> +	}, {
> +	 .name = "UUID",
> +	 .param_count = -1,
> +	 .returns = FIELD_TYPE_UUID,
> +	 .aggregate = FUNC_AGGREGATE_NONE,
> +	 .is_deterministic = false,
> +	 .flags = 0,
> +	 .call = sql_func_uuid,
> +	 .finalize = NULL,
> +	 .export_to_sql = true,
>  	}, {
>  	 .name = "VERSION",
>  	 .param_count = 0,
> diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y
> index 4c9cf475e..bd041e862 100644
> --- a/src/box/sql/parse.y
> +++ b/src/box/sql/parse.y
> @@ -268,7 +268,7 @@ columnlist ::= tcons.
>    CONFLICT DEFERRED END ENGINE FAIL
>    IGNORE INITIALLY INSTEAD NO MATCH PLAN
>    QUERY KEY OFFSET RAISE RELEASE REPLACE RESTRICT
> -  RENAME CTIME_KW IF ENABLE DISABLE
> +  RENAME CTIME_KW IF ENABLE DISABLE UUID
>    .
>  %wildcard ANY.
>  
> diff --git a/test/box-py/bootstrap.result b/test/box-py/bootstrap.result
> index ed7accea3..7fd4fd64d 100644
> --- a/test/box-py/bootstrap.result
> +++ b/test/box-py/bootstrap.result
> @@ -242,6 +242,7 @@ 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, '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 27e636122..1a8730f1a 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(69)
>  ---
>  - false
>  ...
> diff --git a/test/box/access.test.lua b/test/box/access.test.lua
> index a62f87ad8..2bf772b7b 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(69)
>  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..aeb8b3bd8 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(69)[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..954266858 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(69)[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 6468a0709..d7a7b7534 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
> +- 83
>  ...
>  #box.space._vfunc:select{}
>  ---
> -- 67
> +- 68
>  ...
>  #box.space._vcollation:select{}
>  ---
> @@ -290,11 +290,11 @@ box.session.su('guest')
>  ...
>  #box.space._vpriv:select{}
>  ---
> -- 82
> +- 83
>  ...
>  #box.space._vfunc:select{}
>  ---
> -- 67
> +- 68
>  ...
>  #box.space._vsequence:select{}
>  ---
> diff --git a/test/box/function1.result b/test/box/function1.result
> index 928cd5758..0166c828f 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: 69
>    setuid: false
>    is_multikey: false
>    is_deterministic: false
> @@ -593,7 +593,7 @@ func
>    exports:
>      lua: true
>      sql: false
> -  id: 68
> +  id: 69
>    setuid: false
>    is_multikey: false
>    is_deterministic: false
> @@ -665,7 +665,7 @@ func
>    exports:
>      lua: true
>      sql: false
> -  id: 68
> +  id: 69
>    setuid: false
>    is_multikey: false
>    is_deterministic: false
> diff --git a/test/sql-tap/uuid.test.lua b/test/sql-tap/uuid.test.lua
> index 4287f0921..83fcc3d0e 100755
> --- a/test/sql-tap/uuid.test.lua
> +++ b/test/sql-tap/uuid.test.lua
> @@ -3,7 +3,7 @@ local build_path = os.getenv("BUILDDIR")
>  package.cpath = build_path..'/test/sql-tap/?.so;'..build_path..'/test/sql-tap/?.dylib;'..package.cpath
>  
>  local test = require("sqltester")
> -test:plan(139)
> +test:plan(145)
>  
>  local uuid = require("uuid")
>  local uuid1 = uuid.fromstr("11111111-1111-1111-1111-111111111111")
> @@ -1266,6 +1266,56 @@ test:do_execsql_test(
>          3,2,1
>      })
>  
> +-- Check function uuid().
> +test:do_execsql_test(
> +    "uuid-16.1",
> +    [[
> +        SELECT typeof(uuid());
> +    ]], {
> +        "uuid"
> +    })
> +
> +test:do_execsql_test(
> +    "uuid-16.2",
> +    [[
> +        SELECT typeof(uuid(4));
> +    ]], {
> +        "uuid"
> +    })
> +
> +test:do_catchsql_test(
> +    "uuid-16.3",
> +    [[
> +        SELECT uuid(1);
> +    ]], {
> +        1, "Function UUID does not support versions other than 4"
> +    })
> +
> +test:do_catchsql_test(
> +    "uuid-16.4",
> +    [[
> +        SELECT uuid('asd');
> +    ]], {
> +        1, "Type mismatch: can not convert asd to integer"
> +    })
> +
> +test:do_catchsql_test(
> +    "uuid-16.5",
> +    [[
> +        SELECT uuid(4, 5);
> +    ]], {
> +        1, "Wrong number of arguments is passed to UUID(): expected one or zero, got 2"
> +    })
> +
> +-- Make sure the uuid() function generates a new UUID each time when called.
> +test:do_execsql_test(
> +    "uuid-16.6",
> +    [[
> +        SELECT uuid() != uuid();
> +    ]], {
> +        true
> +    })
> +
>  test:execsql([[
>      DROP TRIGGER t;
>      DROP VIEW v;
> diff --git a/test/wal_off/func_max.result b/test/wal_off/func_max.result
> index 78db38d6b..cc5bcc141 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 ''func31933'': function id is too big'
>  ...
>  drop_limit_func()
>  ---
> -- error: Function 'func31934' does not exist
> +- error: Function 'func31933' 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 ''func31933'': function id is too big'
>  ...
>  drop_limit_func()
>  ---
> -- error: Function 'func31934' does not exist
> +- error: Function 'func31933' does not exist
>  ...
>  session.su('admin')
>  ---
> -- 
> 2.25.1
> 


More information about the Tarantool-patches mailing list