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 095BB6EC58; Wed, 4 Aug 2021 15:59:08 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 095BB6EC58 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1628081948; bh=Yo0UYyKDGhHDppMlMSiUCMIyYMy8yX3TWm0UMrNJE3Y=; 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=sEPRMVqMsAYUsoNIJTnGL1carwWroT8SC5EgUtHMotlrpdHz9bBYlgkvdwtwOV69R IaTsoCTm+PEgsTvI++SiRvrafJSSzAkI8XuKdHUmOPHzJE91ZgAZwAnDGcDClFb7Dc ftl7ykWyFi167FV46wUWYBYhTzfM020y1v5PZYmA= Received: from smtpng2.i.mail.ru (smtpng2.i.mail.ru [94.100.179.3]) (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 10DD96EC58 for ; Wed, 4 Aug 2021 15:58:39 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 10DD96EC58 Received: by smtpng2.m.smailru.net with esmtpa (envelope-from ) id 1mBGTm-0003au-EE; Wed, 04 Aug 2021 15:58:38 +0300 To: v.shpilevoy@tarantool.org Cc: tarantool-patches@dev.tarantool.org Date: Wed, 4 Aug 2021 15:58:38 +0300 Message-Id: <3f946be6c0aff87c70ac318ae7d5781350fe20f5.1628081224.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: 4F1203BC0FB41BD941C43E597735A9C351B198F4576AC7B2770D7874BA03B4AE182A05F53808504038476C427230E6711CAA31F4F0B520C299B25C1D15F1EE945108FCEEA25E1752 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE749E036A12C4E6A87EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F79006373DBA3D7E24987517EA1F7E6F0F101C6723150C8DA25C47586E58E00D9D99D84E1BDDB23E98D2D38BBCA57AF85F7723F2BF42311D0B1F5A24083E86F410408031CC7F00164DA146DAFE8445B8C89999728AA50765F7900637DCE3DBD6F8E38AFD389733CBF5DBD5E9C8A9BA7A39EFB766F5D81C698A659EA7CC7F00164DA146DA9985D098DBDEAEC8989FD0BDF65E50FBF6B57BC7E6449061A352F6E88A58FB86F5D81C698A659EA7E827F84554CEF5019E625A9149C048EE9ECD01F8117BC8BEE2021AF6380DFAD18AA50765F790063735872C767BF85DA227C277FBC8AE2E8BDC0F6C5B2EEF3D0C75ECD9A6C639B01B4E70A05D1297E1BBCB5012B2E24CD356 X-B7AD71C0: AC4F5C86D027EB782CDD5689AFBDA7A213B5FB47DCBC3458834459D11680B5058F1FF10E88993B2736B6C34281DBE748 X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975C30CE973C7F71088DE373BA084B77FADE520781378D1C226E9C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF3033054805BDE987699F904B3F4130E343918A1A30D5E7FCCB5012B2E24CD356 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D348F9E8EBB46231487409ECEBC7F48730182EE0007258BCE401F97EBFFCAB9D0543736C6E965D366FD1D7E09C32AA3244C79E923A9D04AE128D5313E52240945B9F522A1CF68F4BE05729B2BEF169E0186 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojeDyvyeZJDJGujkF/16Mnzw== X-Mailru-Sender: 689FA8AB762F7393C37E3C1AEC41BA5D37F4BD0AE87FB47E85E801518092005F83D72C36FC87018B9F80AB2734326CD2FB559BB5D741EB96352A0ABBE4FDA4210A04DAD6CC59E33667EA787935ED9F1B X-Mras: Ok Subject: [Tarantool-patches] [PATCH v2 1/6] sql: introduce sql_func_flags() 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" This function returns a set of parameters for the function with the given name. This function is used when we do not need to call a function, but we need its parameters. In addition, this function will allow us to split the parameters between those that are the same for all implementations, and the parameters, the value of which is implementation-dependent. Needed for #6105 Part of #6106 --- src/box/sql/expr.c | 9 +++------ src/box/sql/func.c | 12 ++++++++++++ src/box/sql/sqlInt.h | 10 ++++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 3772596d6..0ba42ed71 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -328,11 +328,8 @@ sql_expr_coll(Parse *parse, Expr *p, bool *is_explicit_coll, uint32_t *coll_id, if (op == TK_FUNCTION) { uint32_t arg_count = p->x.pList == NULL ? 0 : p->x.pList->nExpr; - struct func *func = - sql_func_by_signature(p->u.zToken, arg_count); - if (func == NULL) - break; - if (sql_func_flag_is_set(func, SQL_FUNC_DERIVEDCOLL) && + uint32_t flags = sql_func_flags(p->u.zToken); + if (((flags & SQL_FUNC_DERIVEDCOLL) != 0) && arg_count > 0) { /* * Now we use quite straightforward @@ -342,7 +339,7 @@ sql_expr_coll(Parse *parse, Expr *p, bool *is_explicit_coll, uint32_t *coll_id, * built-in functions: trim, upper, * lower, replace, substr. */ - assert(func->def->returns == FIELD_TYPE_STRING); + assert(p->type == FIELD_TYPE_STRING); p = p->x.pList->a->pExpr; continue; } diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 6ca852dec..28d383293 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -2655,6 +2655,18 @@ static struct { }, }; +uint32_t +sql_func_flags(const char *name) +{ + struct func *func = func_by_name(name, strlen(name)); + if (func == NULL || func->def->language != FUNC_LANGUAGE_SQL_BUILTIN) + return 0; + uint32_t flags = ((struct func_sql_builtin *)func)->flags; + if (func->def->aggregate == FUNC_AGGREGATE_GROUP) + flags |= SQL_FUNC_AGG; + return flags; +} + static struct func_vtab func_sql_builtin_vtab; struct func * diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index 115c52f96..97b7a2401 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -1186,6 +1186,8 @@ struct type_def { * SQL_FUNC_LENGTH == OPFLAG_LENGTHARG * SQL_FUNC_TYPEOF == OPFLAG_TYPEOFARG */ +/** Function is one of aggregate functions. */ +#define SQL_FUNC_AGG 0x0001 #define SQL_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ #define SQL_FUNC_NEEDCOLL 0x0020 /* sqlGetFuncCollSeq() might be called. * The flag is set when the collation @@ -4372,6 +4374,14 @@ sql_func_flag_is_set(struct func *func, uint16_t flag) struct func * sql_func_by_signature(const char *name, int argc); +/** + * Return the parameters of the function with the given name. If the function + * with the given name does not exist, or the function is not a built-in SQL + * function, 0 is returned, which means no parameters have been set. + */ +uint32_t +sql_func_flags(const char *name); + /** * Generate VDBE code to halt execution with correct error if * the object with specified key is already present (or doesn't -- 2.25.1