[Tarantool-patches] [PATCH v1 06/21] sql: refactor RANDOM() function
imeevma at tarantool.org
imeevma at tarantool.org
Thu Nov 11 13:48:59 MSK 2021
Part of #4145
---
src/box/sql/func.c | 40 ++++++++++++++++------------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/src/box/sql/func.c b/src/box/sql/func.c
index 603deb44e..2d83d52f8 100644
--- a/src/box/sql/func.c
+++ b/src/box/sql/func.c
@@ -885,6 +885,21 @@ func_printf(struct sql_context *ctx, int argc, struct Mem *argv)
mem_set_str_allocated(ctx->pOut, sqlStrAccumFinish(&acc), acc.nChar);
}
+/**
+ * Implementation of the RANDOM() function.
+ *
+ * This function returns a random INT64 value.
+ */
+static void
+func_random(struct sql_context *ctx, int argc, struct Mem *argv)
+{
+ (void)argc;
+ (void)argv;
+ int64_t r;
+ sql_randomness(sizeof(r), &r);
+ mem_set_int(ctx->pOut, r, r < 0);
+}
+
static const unsigned char *
mem_as_ustr(struct Mem *mem)
{
@@ -1050,29 +1065,6 @@ contextMalloc(struct sql_context *context, i64 nByte)
return z;
}
-/*
- * Some functions like COALESCE() and IFNULL() and UNLIKELY() are implemented
- * as VDBE code so that unused argument values do not have to be computed.
- * However, we still need some kind of function implementation for this
- * routines in the function table. The noopFunc macro provides this.
- * noopFunc will never be called so it doesn't matter what the implementation
- * is. We might as well use the "version()" function as a substitute.
- */
-#define noopFunc sql_func_version /* Substitute function - never called */
-
-/*
- * Implementation of random(). Return a random integer.
- */
-static void
-randomFunc(struct sql_context *context, int argc, struct Mem *argv)
-{
- (void)argc;
- (void)argv;
- int64_t r;
- sql_randomness(sizeof(r), &r);
- sql_result_int(context, r);
-}
-
/*
* Implementation of randomblob(N). Return a random blob
* that is N bytes long.
@@ -1923,7 +1915,7 @@ static struct sql_func_definition definitions[] = {
FIELD_TYPE_INTEGER, func_position_octets, NULL},
{"PRINTF", -1, {FIELD_TYPE_ANY}, FIELD_TYPE_STRING, func_printf, NULL},
{"QUOTE", 1, {FIELD_TYPE_ANY}, FIELD_TYPE_STRING, quoteFunc, NULL},
- {"RANDOM", 0, {}, FIELD_TYPE_INTEGER, randomFunc, NULL},
+ {"RANDOM", 0, {}, FIELD_TYPE_INTEGER, func_random, NULL},
{"RANDOMBLOB", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_VARBINARY,
randomBlob, NULL},
{"REPLACE", 3,
--
2.25.1
More information about the Tarantool-patches
mailing list