From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id D23877121A; Tue, 26 Oct 2021 13:38:15 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org D23877121A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1635244695; bh=NOdzqJ8feN9LrAQK1lP0UgIZDSDTYz2zIMSOW93bZhw=; h=To:Cc:Date:In-Reply-To:References:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=DX9at7YDvD1jyqlTcwVTYP3CykTnWkYJ0VSej1FCLGfDCFWOgae4Wr1GL/6OTQ5RB ifnnsNL3EFpaFkmfRtB45xljb/glaO08hoVOIasmUxy2jY+MUGODOoh612Ghah9ktG 8QyLEKPCKVolSOoBAOCAAxK7e/MqezX47Js50LMc= Received: from smtpng1.i.mail.ru (smtpng1.i.mail.ru [94.100.181.251]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 18074711B7 for ; Tue, 26 Oct 2021 13:34:19 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 18074711B7 Received: by smtpng1.m.smailru.net with esmtpa (envelope-from ) id 1mfJmb-0000ef-Tp; Tue, 26 Oct 2021 13:34:18 +0300 To: kyukhin@tarantool.org Cc: tarantool-patches@dev.tarantool.org Date: Tue, 26 Oct 2021 13:34:17 +0300 Message-Id: <11004edb51647e999db6a15bf52864f4398f95be.1635244212.git.imeevma@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-4EC0790: 10 X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD9D1D35DBD2D15487E95B7EC5918E2245194B7D4D1C7EDE589182A05F538085040FFFAB685CBBE4023FE955E395535B975E37A6CA9494DC1C4D4D934AD6C919ECC X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7E4A9B39A8BCE3A99EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637D82ED515D6052E03EA1F7E6F0F101C6723150C8DA25C47586E58E00D9D99D84E1BDDB23E98D2D38BBCA57AF85F7723F25EC7D1419AF434744C9FF1F67287C2CACC7F00164DA146DAFE8445B8C89999728AA50765F790063783E00425F71A4181389733CBF5DBD5E9C8A9BA7A39EFB766F5D81C698A659EA7CC7F00164DA146DA9985D098DBDEAEC8062BEEFFB5F8EA3EF6B57BC7E6449061A352F6E88A58FB86F5D81C698A659EA7E827F84554CEF5019E625A9149C048EE9ECD01F8117BC8BEE2021AF6380DFAD18AA50765F790063735872C767BF85DA227C277FBC8AE2E8B953A8A48A05D51F175ECD9A6C639B01B4E70A05D1297E1BBCB5012B2E24CD356 X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975C2749EEF4D85F8CCA6D575719E9050482D524AC81191C54059C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF166FC1BB2721D293DC48ACC2A39D04F89CDFB48F4795C241BDAD6C7F3747799A X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34A1AF43396E40A36FFAD1438AE5D6ABC68F93EE3FEC431F9A68C871E410B5DFDBFBF91FA0E05B67F71D7E09C32AA3244C44F882D755085A1BFC89DDBFBA1306518894E9C85370243E729B2BEF169E0186 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojNvH0qP3qm736wunUrUAFMQ== X-Mailru-Sender: 689FA8AB762F7393C37E3C1AEC41BA5DC998E3A0BF7C52090E294B418A9FC6C183D72C36FC87018B9F80AB2734326CD2FB559BB5D741EB96352A0ABBE4FDA4210A04DAD6CC59E33667EA787935ED9F1B X-Mras: Ok Subject: [Tarantool-patches] [PATCH v4 08/16] sql: refactor SUM() function X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Mergen Imeev via Tarantool-patches Reply-To: imeevma@tarantool.org Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" 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 2e84f61b5..f18f1b4d1 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 067065a97..a3d403176 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)); -- 2.25.1