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 2ED5C6EC40; Sat, 25 Sep 2021 14:17:27 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 2ED5C6EC40 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1632568647; bh=W6TBUrxTa+0Z+q6PWwm/XkselRR65qBr2KhHP+wnMIM=; h=Date:To:Cc:References:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=pNWqjRy/oSX8QLpf1/ngcrR0lAgQyOYT76Z2oj8dNDbrZGeGlfHYQfaVPPnn0qYH8 stgylS80iAIiVELoNbNaQ7/oLsAqjcDXbT2+eKvPdJ/CzdPt4KEjT1b4qm4YhLllb3 1Ha3GPXmgr8aYCEOrBTqCZfr5m9Er/5Ej9VG2KHk= 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 4A6A36EC40 for ; Sat, 25 Sep 2021 14:17:26 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 4A6A36EC40 Received: by smtpng1.m.smailru.net with esmtpa (envelope-from ) id 1mU5gL-0007QM-GC; Sat, 25 Sep 2021 14:17:25 +0300 Date: Sat, 25 Sep 2021 14:17:24 +0300 To: Vladislav Shpilevoy Cc: tarantool-patches@dev.tarantool.org Message-ID: <20210925111724.GD290467@tarantool.org> References: <2db7d1a625d267ce15bcd1779b732bfdc4421694.1632220375.git.imeevma@gmail.com> <9b2da985-d8f1-306e-d442-5b13b1991bd5@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <9b2da985-d8f1-306e-d442-5b13b1991bd5@tarantool.org> X-4EC0790: 10 X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD96A58C36AA2E9964976B67DC8394C8DABD1B03AE5D5AF08AA182A05F538085040C8BCC0678353B7FB67C3E663BEA4A0BC3744E93A5A0D67972641D46BB34D745E X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE74FC9C1E089083C84EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F790063725D748B084CAA27D8638F802B75D45FF36EB9D2243A4F8B5A6FCA7DBDB1FC311F39EFFDF887939037866D6147AF826D8F4660B7C8E170368622D7149050F5D99117882F4460429724CE54428C33FAD305F5C1EE8F4F765FCF1175FABE1C0F9B6A471835C12D1D9774AD6D5ED66289B52BA9C0B312567BB23117882F446042972877693876707352033AC447995A7AD182CC0D3CB04F14752D2E47CDBA5A96583BA9C0B312567BB231DD303D21008E29813377AFFFEAFD269A417C69337E82CC2E827F84554CEF50127C277FBC8AE2E8BA83251EDC214901ED5E8D9A59859A8B62CFFCC7B69C47339089D37D7C0E48F6C5571747095F342E88FB05168BE4CE3AF X-C1DE0DAB: 0D63561A33F958A5B493BB03E3D4B1B5C92AA1ED20B979E5D36ED7AD47FC988DD59269BC5F550898D99A6476B3ADF6B47008B74DF8BB9EF7333BD3B22AA88B938A852937E12ACA75BFC02AB3DF06BA5A410CA545F18667F91A7EA1CDA0B5A7A0 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D342B8615F5CFAD9D0257577A70BE8E16B0E725F8653C779698A7B9618AE311BAB9590CABD0132B5FD21D7E09C32AA3244C2B2119C9B66F8BD9A50EF8A19B23F77795A9E0DC41E9A4CF729B2BEF169E0186 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojqHUEAOTxd4iNdjWP4D2eKA== X-Mailru-Sender: 689FA8AB762F7393C37E3C1AEC41BA5D4631ECEE8EAB40D4FB436DD60F38EDE283D72C36FC87018B9F80AB2734326CD2FB559BB5D741EB96352A0ABBE4FDA4210A04DAD6CC59E33667EA787935ED9F1B X-Mras: Ok Subject: Re: [Tarantool-patches] [PATCH v2 07/15] sql: rework SUM() 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: Mergen Imeev Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" Thank you for the review! My answer, diff and new patch below. On Thu, Sep 23, 2021 at 12:48:13AM +0200, Vladislav Shpilevoy wrote: > Thanks for the patch! > > > diff --git a/src/box/sql/func.c b/src/box/sql/func.c > > index b4461c6ee..b06955302 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(ctx->pMem->type == MEM_TYPE_NULL || mem_is_num(ctx->pMem)); > > + if (argv[0]->type == MEM_TYPE_NULL) > > Probably we should use mem_is_null() where possible. To avoid > Mem members manual touch out of Mem.h and Mem.c. Here and in other > places, other commits. Sorry I didn't notice it before. Fixed here and in all similar patches. I will try to follow this rule in all following patches. Diff: diff --git a/src/box/sql/func.c b/src/box/sql/func.c index b06955302..4cc6f378b 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -59,10 +59,10 @@ step_sum(struct sql_context *ctx, int argc, struct Mem **argv) { assert(argc == 1); (void)argc; - assert(ctx->pMem->type == MEM_TYPE_NULL || mem_is_num(ctx->pMem)); - if (argv[0]->type == MEM_TYPE_NULL) + assert(mem_is_null(ctx->pMem) || mem_is_num(ctx->pMem)); + if (mem_is_null(argv[0])) return; - if (ctx->pMem->type == MEM_TYPE_NULL) + 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; @@ -72,7 +72,7 @@ step_sum(struct sql_context *ctx, int argc, struct Mem **argv) static void fin_sum(struct sql_context *ctx) { - assert(ctx->pMem->type == MEM_TYPE_NULL || mem_is_num(ctx->pMem)); + assert(mem_is_null(ctx->pMem) || mem_is_num(ctx->pMem)); mem_copy_as_ephemeral(ctx->pOut, ctx->pMem); } New patch: commit 4e8b6f54349e1cfb53fab5dd39b41e77f9a7350a Author: Mergen Imeev Date: Thu Sep 9 17:50:21 2021 +0300 sql: rework SUM() This patch makes SUM() accept DOUBLE values by default. Also, after this patch SUM() will be able to work with DECIMAL values. Part of #4145 Part of #6355 diff --git a/src/box/sql/func.c b/src/box/sql/func.c index b4461c6ee..4cc6f378b 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) { @@ -1654,17 +1677,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) { @@ -2113,8 +2125,9 @@ 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_DOUBLE}, FIELD_TYPE_DOUBLE, step_sum, fin_sum}, + {"SUM", 1, {FIELD_TYPE_INTEGER}, FIELD_TYPE_INTEGER, step_sum, fin_sum}, + {"SUM", 1, {FIELD_TYPE_DECIMAL}, FIELD_TYPE_DECIMAL, 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 b101fc6c2..66ac2c4f3 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -4207,7 +4207,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)); diff --git a/test/sql-tap/built-in-functions.test.lua b/test/sql-tap/built-in-functions.test.lua index 6fae811dc..8daf41c1d 100755 --- a/test/sql-tap/built-in-functions.test.lua +++ b/test/sql-tap/built-in-functions.test.lua @@ -1,6 +1,8 @@ #!/usr/bin/env tarantool local test = require("sqltester") -test:plan(52) +test:plan(55) + +local dec = require('decimal') -- -- Make sure that number of arguments check is checked properly for SQL built-in @@ -455,7 +457,7 @@ test:do_test( local res = {pcall(box.execute, [[SELECT SUM(?);]], {'1'})} return {tostring(res[3])} end, { - "Type mismatch: can not convert string('1') to integer" + "Type mismatch: can not convert string('1') to double" }) test:do_catchsql_test( @@ -545,4 +547,33 @@ test:do_test( {name = "COLUMN_2", type = "scalar"}, }) +-- Make sure SUM() accepts and returns DOUBLE by default. +test:do_test( + "builtins-4.1.1", + function() + return box.execute([[SELECT SUM(?);]], {1}).metadata + end, { + {name = "COLUMN_1", type = "double"}, + }) + +test:do_test( + "builtins-4.1.2", + function() + local res = {pcall(box.execute, [[SELECT SUM(?);]], {-1ULL})} + return {tostring(res[3])} + end, { + "Type mismatch: can not convert integer(18446744073709551615) to double" + }) + +-- Make sure SUM() works with DECIMAL properly. +test:do_execsql_test( + "builtins-4.1.3", + [[ + SELECT SUM(cast(column_2 as DECIMAL)) from (values(1), (123.432)); + ]], + { + dec.new(124.432) + } +) + test:finish_test()