From 8c8872927d4a3d459affc68792ff866d6aee3f17 Mon Sep 17 00:00:00 2001 From: Mergen Imeev <imeevma@gmail.com> Date: Thu, 9 Sep 2021 17:50:21 +0300 Subject: [PATCH] sql: refactor SUM() function Part of #4145 --- src/box/sql/func.c | 38 +++++++++++++++++++++++++------------- src/box/sql/vdbe.c | 1 - 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 2e84f61b52..f18f1b4d1e 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -53,6 +53,29 @@ static struct mh_strnptr_t *built_in_functions = NULL; static struct func_sql_builtin **functions; +/** Implementation of the SUM() function. */ +static void +step_sum(struct sql_context *ctx, int argc, struct Mem **argv) +{ + assert(argc == 1); + (void)argc; + assert(mem_is_null(ctx->pMem) || mem_is_num(ctx->pMem)); + if (mem_is_null(argv[0])) + return; + if (mem_is_null(ctx->pMem)) + return mem_copy_as_ephemeral(ctx->pMem, argv[0]); + if (mem_add(ctx->pMem, argv[0], ctx->pMem) != 0) + ctx->is_aborted = true; +} + +/** Finalizer for the SUM() function. */ +static void +fin_sum(struct sql_context *ctx) +{ + assert(mem_is_null(ctx->pMem) || mem_is_num(ctx->pMem)); + mem_copy_as_ephemeral(ctx->pOut, ctx->pMem); +} + static const unsigned char * mem_as_ustr(struct Mem *mem) { @@ -1661,17 +1684,6 @@ sum_step(struct sql_context *context, int argc, sql_value **argv) context->is_aborted = true; } -static void -sumFinalize(sql_context * context) -{ - SumCtx *p; - p = sql_aggregate_context(context, 0); - if (p == NULL || p->count == 0) - mem_set_null(context->pOut); - else - mem_copy_as_ephemeral(context->pOut, &p->mem); -} - static void avgFinalize(sql_context * context) { @@ -2120,8 +2132,8 @@ static struct sql_func_definition definitions[] = { {"SUBSTR", 3, {FIELD_TYPE_VARBINARY, FIELD_TYPE_INTEGER, FIELD_TYPE_INTEGER}, FIELD_TYPE_VARBINARY, substrFunc, NULL}, - {"SUM", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_INTEGER, sum_step, sumFinalize}, - {"SUM", 1, {FIELD_TYPE_DOUBLE}, FIELD_TYPE_DOUBLE, sum_step, sumFinalize}, + {"SUM", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_INTEGER, step_sum, fin_sum}, + {"SUM", 1, {FIELD_TYPE_DOUBLE}, FIELD_TYPE_DOUBLE, step_sum, fin_sum}, {"TOTAL", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_DOUBLE, sum_step, totalFinalize}, {"TOTAL", 1, {FIELD_TYPE_DOUBLE}, FIELD_TYPE_DOUBLE, sum_step, diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index 067065a97e..a3d403176f 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -4199,7 +4199,6 @@ case OP_AggFinal: { assert(pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor)); struct func_sql_builtin *func = (struct func_sql_builtin *)pOp->p4.func; struct Mem *pIn1 = &aMem[pOp->p1]; - assert(mem_is_null(pIn1) || mem_is_agg(pIn1)); struct sql_context ctx; memset(&ctx, 0, sizeof(ctx)); -- GitLab