[Tarantool-patches] [PATCH v1 12/21] sql: rework UUID() function
imeevma at tarantool.org
imeevma at tarantool.org
Thu Nov 11 13:49:11 MSK 2021
This patch refactors UUID() function. Also, UUID(NULL) now returns NULL.
Part of #4145
---
src/box/sql/func.c | 56 +++++++++++++++++---------------------
test/sql-tap/uuid.test.lua | 11 +++++++-
2 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/src/box/sql/func.c b/src/box/sql/func.c
index 014fd9af2..dcd0157d0 100644
--- a/src/box/sql/func.c
+++ b/src/box/sql/func.c
@@ -998,6 +998,29 @@ func_row_count(struct sql_context *ctx, int argc, struct Mem *argv)
return mem_set_uint(ctx->pOut, sql_get()->nChange);
}
+/**
+ * Implementation of the UUID() function.
+ *
+ * Returns a randomly generated UUID value.
+ */
+static void
+func_uuid(struct sql_context *ctx, int argc, struct Mem *argv)
+{
+ if (argc == 1) {
+ if (mem_is_null(&argv[0]))
+ return;
+ if (!mem_is_uint(&argv[0]) || argv[0].u.u != 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);
+}
+
static const unsigned char *
mem_as_ustr(struct Mem *mem)
{
@@ -1016,35 +1039,6 @@ 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);
-}
-
/*
* Allocate nByte bytes of space using sqlMalloc(). If the
* allocation fails, return NULL. If nByte is larger than the
@@ -1916,8 +1910,8 @@ static struct sql_func_definition definitions[] = {
NULL},
{"UPPER", 1, {FIELD_TYPE_STRING}, FIELD_TYPE_STRING, func_lower_upper,
NULL},
- {"UUID", 0, {}, FIELD_TYPE_UUID, sql_func_uuid, NULL},
- {"UUID", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_UUID, sql_func_uuid, NULL},
+ {"UUID", 0, {}, FIELD_TYPE_UUID, func_uuid, NULL},
+ {"UUID", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_UUID, func_uuid, NULL},
{"VERSION", 0, {}, FIELD_TYPE_STRING, sql_func_version, NULL},
{"ZEROBLOB", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_VARBINARY,
func_zeroblob, NULL},
diff --git a/test/sql-tap/uuid.test.lua b/test/sql-tap/uuid.test.lua
index d6c53d123..884b1daf9 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(146)
+test:plan(147)
local uuid = require("uuid")
local uuid1 = uuid.fromstr("11111111-1111-1111-1111-111111111111")
@@ -1290,6 +1290,15 @@ test:do_execsql_test(
true
})
+-- Make sure the uuid(NULL) returns NULL.
+test:do_execsql_test(
+ "uuid-16.7",
+ [[
+ SELECT uuid(NULL) IS NULL;
+ ]], {
+ true
+ })
+
-- Make sure STRING of wrong length cannot be cast to UUID.
test:do_catchsql_test(
"uuid-17.1",
--
2.25.1
More information about the Tarantool-patches
mailing list