From: Mergen Imeev via Tarantool-patches <tarantool-patches@dev.tarantool.org> To: v.shpilevoy@tarantool.org, tsafin@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH v4 43/53] sql: introduce mem_convert_to_number() Date: Tue, 23 Mar 2021 12:36:31 +0300 [thread overview] Message-ID: <c77be034d735446a5a7bfe02d2b4ec5b6a1d280f.1616491731.git.imeevma@gmail.com> (raw) In-Reply-To: <cover.1616491730.git.imeevma@gmail.com> This patch introduces mem_convert_to_number(). This function is used to convert MEM to MEM contains number. Part of #5818 --- src/box/sql/func.c | 2 +- src/box/sql/mem.c | 58 +++++++++++++--------------------------------- src/box/sql/mem.h | 28 +++------------------- src/box/sql/vdbe.c | 2 +- 4 files changed, 21 insertions(+), 69 deletions(-) diff --git a/src/box/sql/func.c b/src/box/sql/func.c index 1b3929259..b644c39d8 100644 --- a/src/box/sql/func.c +++ b/src/box/sql/func.c @@ -1948,7 +1948,7 @@ sum_step(struct sql_context *context, int argc, sql_value **argv) if (type == MP_NIL || p == NULL) return; if (type != MP_DOUBLE && type != MP_INT && type != MP_UINT) { - if (mem_apply_numeric_type(argv[0]) != 0) { + if (type != MP_STR || mem_convert_to_number(argv[0]) != 0) { diag_set(ClientError, ER_SQL_TYPE_MISMATCH, mem_str(argv[0]), "number"); context->is_aborted = true; diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c index 8f2c48cd5..8600b5c41 100644 --- a/src/box/sql/mem.c +++ b/src/box/sql/mem.c @@ -803,6 +803,21 @@ mem_convert_to_double(struct Mem *mem) return -1; } +int +mem_convert_to_number(struct Mem *mem) +{ + if ((mem->flags & (MEM_Int | MEM_UInt | MEM_Real)) != 0) + return 0; + if ((mem->flags & MEM_Bool) != 0) + return mem_convert_boolean_to_integer(mem); + if ((mem->flags & (MEM_Str | MEM_Blob)) != 0) { + if (mem_convert_varstring_to_integer(mem) == 0) + return 0; + return mem_convert_varstring_to_double(mem); + } + return -1; +} + int mem_copy(struct Mem *to, const struct Mem *from) { @@ -1860,47 +1875,6 @@ registerTrace(int iReg, Mem *p) { } #endif -int -mem_apply_numeric_type(struct Mem *record) -{ - if ((record->flags & MEM_Str) == 0) - return -1; - int64_t integer_value; - bool is_neg; - if (sql_atoi64(record->z, &integer_value, &is_neg, record->n) == 0) { - mem_set_integer(record, integer_value, is_neg); - return 0; - } - double float_value; - if (sqlAtoF(record->z, &float_value, record->n) == 0) - return -1; - mem_set_double(record, float_value); - return 0; -} - -int -vdbe_mem_numerify(struct Mem *mem) -{ - if ((mem->flags & (MEM_Int | MEM_UInt | MEM_Real | MEM_Null)) != 0) - return 0; - if ((mem->flags & MEM_Bool) != 0) { - mem_set_integer(mem, (int64_t)mem->u.b, false); - return 0; - } - assert((mem->flags & (MEM_Blob | MEM_Str)) != 0); - bool is_neg; - int64_t i; - if (sql_atoi64(mem->z, &i, &is_neg, mem->n) == 0) { - mem_set_integer(mem, i, is_neg); - } else { - double d; - if (sqlAtoF(mem->z, &d, mem->n) == 0) - return -1; - mem_set_double(mem, d); - } - return 0; -} - /* * Cast the datatype of the value in pMem according to the type * @type. Casting is different from applying type in that a cast @@ -1977,7 +1951,7 @@ sqlVdbeMemCast(Mem * pMem, enum field_type type) case FIELD_TYPE_DOUBLE: return mem_convert_to_double(pMem); case FIELD_TYPE_NUMBER: - return vdbe_mem_numerify(pMem); + return mem_convert_to_number(pMem); case FIELD_TYPE_VARBINARY: if ((pMem->flags & MEM_Blob) != 0) return 0; diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h index be793d08a..d5f0d7891 100644 --- a/src/box/sql/mem.h +++ b/src/box/sql/mem.h @@ -327,6 +327,9 @@ mem_convert_to_integer_lossless(struct Mem *mem); int mem_convert_to_double(struct Mem *mem); +int +mem_convert_to_number(struct Mem *mem); + /** * Simple type to str convertor. It is used to simplify * error reporting. @@ -377,31 +380,6 @@ registerTrace(int iReg, Mem *p); # define memAboutToChange(P,M) #endif -/** - * Try to convert a string value into a numeric representation - * if we can do so without loss of information. Firstly, value - * is attempted to be converted to integer, and in case of fail - - * to floating point number. Note that function is assumed to be - * called on memory cell containing string, i.e. mem->type == MEM_Str. - * - * @param record Memory cell containing value to be converted. - * @retval 0 If value can be converted to integer or number. - * @retval -1 Otherwise. - */ -int -mem_apply_numeric_type(struct Mem *record); - -/** - * Convert @a mem to NUMBER type, so that after conversion it has - * one of types MEM_Real, MEM_Int or MEM_UInt. If conversion is - * not possible, function returns -1. - * - * Beware - this function changes value and type of @a mem - * argument. - */ -int -vdbe_mem_numerify(struct Mem *mem); - int sqlVdbeMemCast(struct Mem *, enum field_type type); int sqlVdbeMemStringify(struct Mem *); int sqlVdbeMemNulTerminate(struct Mem *); diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index 3c02eae74..6799cc9aa 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -2621,7 +2621,7 @@ case OP_SeekGT: { /* jump, in3 */ if (mem_is_null(pIn3)) goto skip_truncate; if (mem_is_string(pIn3)) - mem_apply_numeric_type(pIn3); + mem_convert_to_number(pIn3); int64_t i; if (mem_is_integer(pIn3) && !mem_is_unsigned(pIn3)) { i = pIn3->u.i; -- 2.25.1
next prev parent reply other threads:[~2021-03-23 9:56 UTC|newest] Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-03-23 9:34 [Tarantool-patches] [PATCH v4 00/53] Move mem-related functions to mem.c/mem.h Mergen Imeev via Tarantool-patches 2021-03-23 9:34 ` [Tarantool-patches] [PATCH v4 01/53] sql: enchance vdbe_decode_msgpack_into_mem() Mergen Imeev via Tarantool-patches 2021-03-29 22:57 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:34 ` [Tarantool-patches] [PATCH v4 02/53] sql: disable unused code in sql/analyze.c Mergen Imeev via Tarantool-patches 2021-03-23 9:34 ` [Tarantool-patches] [PATCH v4 03/53] sql: disable unused code in sql/legacy.c Mergen Imeev via Tarantool-patches 2021-03-23 9:34 ` [Tarantool-patches] [PATCH v4 04/53] sql: remove NULL-termination in OP_ResultRow Mergen Imeev via Tarantool-patches 2021-03-23 9:34 ` [Tarantool-patches] [PATCH v4 05/53] sql: move MEM-related functions to mem.c/mem.h Mergen Imeev via Tarantool-patches 2021-03-29 22:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 06/53] sql: remove unused MEM-related functions Mergen Imeev via Tarantool-patches 2021-03-29 22:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 07/53] sql: disable unused code in sql/vdbemem.c Mergen Imeev via Tarantool-patches 2021-03-29 22:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 08/53] sql: introduce mem_str() Mergen Imeev via Tarantool-patches 2021-03-29 22:58 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 09/53] sql: introduce mem_create() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 10/53] sql: introduce mem_destroy() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 11/53] sql: introduce mem_is_*() functions() Mergen Imeev via Tarantool-patches 2021-03-29 23:01 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 12/53] sql: introduce mem_copy() Mergen Imeev via Tarantool-patches 2021-03-29 23:01 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 13/53] sql: introduce mem_copy_as_ephemeral() Mergen Imeev via Tarantool-patches 2021-03-29 23:01 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 14/53] sql: rework mem_move() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 15/53] sql: rework vdbe_decode_msgpack_into_mem() Mergen Imeev via Tarantool-patches 2021-03-29 23:02 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 16/53] sql: remove sql_column_to_messagepack() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 17/53] sql: introduce mem_concat() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 18/53] sql: introduce mem_arithmetic() Mergen Imeev via Tarantool-patches 2021-03-29 23:02 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 19/53] sql: introduce mem_compare() Mergen Imeev via Tarantool-patches 2021-03-29 23:03 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 20/53] sql: introduce mem_bitwise() Mergen Imeev via Tarantool-patches 2021-03-29 23:03 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 21/53] sql: introduce mem_bit_not() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 22/53] sql: Initialize MEM in sqlVdbeAllocUnpackedRecord() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 23/53] sql: introduce mem_set_null() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 24/53] sql: introduce mem_set_integer() Mergen Imeev via Tarantool-patches 2021-03-29 23:04 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 25/53] sql: introduce mem_set_unsigned() Mergen Imeev via Tarantool-patches 2021-03-29 23:04 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 26/53] sql: introduce mem_set_boolean() Mergen Imeev via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 27/53] sql: refactor mem_set_double() Mergen Imeev via Tarantool-patches 2021-03-29 23:04 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 28/53] sql: refactor mem_set_*_string() Mergen Imeev via Tarantool-patches 2021-03-29 23:05 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:35 ` [Tarantool-patches] [PATCH v4 29/53] sql: introduce mem_copy_string() Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 30/53] sql: introduce mem_set_*_binary() Mergen Imeev via Tarantool-patches 2021-03-29 23:05 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 31/53] sql: introduce mem_copy_binary() Mergen Imeev via Tarantool-patches 2021-03-29 23:05 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 32/53] sql: introduce mem_set_zerobinary() Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 33/53] sql: introduce mem_append_to_binary() Mergen Imeev via Tarantool-patches 2021-03-29 23:05 ` Vladislav Shpilevoy via Tarantool-patches 2021-04-09 19:52 ` Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 34/53] sql: introduce mem_set_*_map() and mem_set_*_array() Mergen Imeev via Tarantool-patches 2021-03-29 23:05 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 35/53] sql: introduce mem_set_undefined() Mergen Imeev via Tarantool-patches 2021-03-29 23:06 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 36/53] sql: introduce mem_set_pointer() Mergen Imeev via Tarantool-patches 2021-03-29 23:06 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 37/53] sql: introduce mem_set_frame() Mergen Imeev via Tarantool-patches 2021-03-29 23:06 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 38/53] sql: introduce mem_*_aggregate() Mergen Imeev via Tarantool-patches 2021-03-29 23:06 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 39/53] sql: introduce mem_set_cleared() Mergen Imeev via Tarantool-patches 2021-03-29 23:07 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 40/53] sql: move MEM flags to mem.c Mergen Imeev via Tarantool-patches 2021-03-29 23:07 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 41/53] sql: introduce mem_convert_to_integer() Mergen Imeev via Tarantool-patches 2021-03-29 23:07 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 42/53] sql: introduce mem_convert_to_double() Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` Mergen Imeev via Tarantool-patches [this message] 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 44/53] sql: introduce mem_convert_to_string() Mergen Imeev via Tarantool-patches 2021-03-29 23:07 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 45/53] sql: introduce mem_explicit_cast() Mergen Imeev via Tarantool-patches 2021-03-29 23:08 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 46/53] sql: introduce mem_implicit_cast() Mergen Imeev via Tarantool-patches 2021-03-29 23:08 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 47/53] sql: introduce mem_get_integer() Mergen Imeev via Tarantool-patches 2021-03-29 23:08 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 48/53] sql: introduce mem_get_unsigned() Mergen Imeev via Tarantool-patches 2021-03-29 23:08 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 49/53] sql: introduce mem_get_double() Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 50/53] sql: introduce mem_get_boolean() Mergen Imeev via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 51/53] sql: introduce mem_get_string0() Mergen Imeev via Tarantool-patches 2021-03-29 23:08 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 52/53] sql: introduce mem_get_binary() Mergen Imeev via Tarantool-patches 2021-03-29 23:09 ` Vladislav Shpilevoy via Tarantool-patches 2021-03-23 9:36 ` [Tarantool-patches] [PATCH v4 53/53] sql: introduce mem_get_length() Mergen Imeev via Tarantool-patches 2021-03-29 23:09 ` Vladislav Shpilevoy via Tarantool-patches
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=c77be034d735446a5a7bfe02d2b4ec5b6a1d280f.1616491731.git.imeevma@gmail.com \ --to=tarantool-patches@dev.tarantool.org \ --cc=imeevma@tarantool.org \ --cc=tsafin@tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v4 43/53] sql: introduce mem_convert_to_number()' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox