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

Timur Safin tsafin at tarantool.org
Wed Jun 2 23:13:05 MSK 2021


LGTM

: From: imeevma at tarantool.org <imeevma at tarantool.org>
: Sent: Wednesday, June 2, 2021 11:03 AM
: To: tsafin at tarantool.org
: Cc: tarantool-patches at dev.tarantool.org
: Subject: [PATCH v2 2/2] sql: introduce SQL built-in function UUID()
: 
: 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.
: ---
:  .../unreleased/introduce-uuid-to-sql.md       |   3 +
:  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                  |   3 +-
:  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 +--
:  14 files changed, 130 insertions(+), 18 deletions(-)
:  create mode 100644 changelogs/unreleased/introduce-uuid-to-sql.md
: 
: diff --git a/changelogs/unreleased/introduce-uuid-to-sql.md
: b/changelogs/unreleased/introduce-uuid-to-sql.md
: new file mode 100644
: index 000000000..642ac94fb
: --- /dev/null
: +++ b/changelogs/unreleased/introduce-uuid-to-sql.md
: @@ -0,0 +1,3 @@
: +## feature/core
: +
: + * Field type UUID is now available in SQL, and new UUID can be generated
: using new SQL built-in function uuid() (gh-5886).
: 
...
: 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..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{}
:  ---
: @@ -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