From: Nikita Pettik <korablev@tarantool.org> To: tarantool-patches@dev.tarantool.org Cc: v.shpilevoy@tarantool.org Subject: [Tarantool-patches] [PATCH 2/4] sql: refactor sqlVdbeMemNumerify() Date: Wed, 5 Feb 2020 19:19:10 +0300 [thread overview] Message-ID: <0a6143594e0279d19d3b760a75f0139dbd42dae8.1580841722.git.korablev@tarantool.org> (raw) In-Reply-To: <cover.1580841722.git.korablev@tarantool.org> In-Reply-To: <cover.1580841722.git.korablev@tarantool.org> Fix codestyle and comment; allow conversion from boolean to number (since it is legal to convert boolean to integer, and in turn number type completely includes integer type). Part of #4233 --- src/box/sql/vdbeInt.h | 12 +++++++++++- src/box/sql/vdbemem.c | 46 +++++++++++++++++++--------------------------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/box/sql/vdbeInt.h b/src/box/sql/vdbeInt.h index 1393f3fd2..a80a691e1 100644 --- a/src/box/sql/vdbeInt.h +++ b/src/box/sql/vdbeInt.h @@ -533,7 +533,17 @@ mem_value_bool(const struct Mem *mem, bool *b); int mem_apply_integer_type(Mem *); int sqlVdbeMemRealify(Mem *); -int sqlVdbeMemNumerify(Mem *); + +/** + * Convert @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 @mem argument + */ +int +vdbe_mem_numerify(struct Mem *mem); + int sqlVdbeMemCast(Mem *, enum field_type type); int sqlVdbeMemFromBtree(BtCursor *, u32, u32, Mem *); void sqlVdbeMemRelease(Mem * p); diff --git a/src/box/sql/vdbemem.c b/src/box/sql/vdbemem.c index df3f0d8b1..a533a2fe7 100644 --- a/src/box/sql/vdbemem.c +++ b/src/box/sql/vdbemem.c @@ -596,34 +596,26 @@ sqlVdbeMemRealify(Mem * pMem) return 0; } -/* - * Convert pMem so that it has types MEM_Real or MEM_Int or both. - * Invalidate any prior representations. - * - * Every effort is made to force the conversion, even if the input - * is a string that does not look completely like a number. Convert - * as much of the string as we can and ignore the rest. - */ int -sqlVdbeMemNumerify(Mem * pMem) +vdbe_mem_numerify(struct Mem *mem) { - if ((pMem->flags & (MEM_Int | MEM_UInt | MEM_Real | MEM_Null)) == 0) { - assert((pMem->flags & (MEM_Blob | MEM_Str)) != 0); - bool is_neg; - int64_t i; - if (sql_atoi64(pMem->z, &i, &is_neg, pMem->n) == 0) { - mem_set_int(pMem, i, is_neg); - } else { - double v; - if (sqlVdbeRealValue(pMem, &v)) - return -1; - pMem->u.r = v; - MemSetTypeFlag(pMem, MEM_Real); - mem_apply_integer_type(pMem); - } + if ((mem->flags & (MEM_Int | MEM_UInt | MEM_Real | MEM_Null)) != 0) + return 0; + if ((mem->flags & MEM_Bool) != 0) { + mem->u.u = mem->u.b; + MemSetTypeFlag(mem, MEM_UInt); + 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_int(mem, i, is_neg); + } else { + if (sqlAtoF(mem->z, &mem->u.r, mem->n) == 0) + return -1; + MemSetTypeFlag(mem, MEM_Real); } - assert((pMem->flags & (MEM_Int | MEM_UInt | MEM_Real | MEM_Null)) != 0); - pMem->flags &= ~(MEM_Str | MEM_Blob | MEM_Zero); return 0; } @@ -1472,7 +1464,7 @@ valueFromExpr(sql * db, /* The database connection */ if (0 == sqlValueFromExpr(db, pExpr->pLeft, type, &pVal) && pVal != 0) { - if ((rc = sqlVdbeMemNumerify(pVal)) != 0) + if ((rc = vdbe_mem_numerify(pVal)) != 0) return rc; if (pVal->flags & MEM_Real) { pVal->u.r = -pVal->u.r; @@ -1499,7 +1491,7 @@ valueFromExpr(sql * db, /* The database connection */ pVal = valueNew(db, pCtx); if (pVal == 0) goto no_mem; - if ((rc = sqlVdbeMemNumerify(pVal)) != 0) + if ((rc = vdbe_mem_numerify(pVal)) != 0) return rc; } #ifndef SQL_OMIT_BLOB_LITERAL -- 2.15.1
next prev parent reply other threads:[~2020-02-05 16:19 UTC|newest] Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-05 16:19 [Tarantool-patches] [PATCH 0/4] sql: fix NUMBER conversion issues Nikita Pettik 2020-02-05 16:19 ` [Tarantool-patches] [PATCH 1/4] sql: remove cast to INT during FP arithmetic ops Nikita Pettik 2020-02-05 16:19 ` Nikita Pettik [this message] 2020-02-10 23:25 ` [Tarantool-patches] [PATCH 2/4] sql: refactor sqlVdbeMemNumerify() Vladislav Shpilevoy 2020-02-11 14:14 ` Nikita Pettik 2020-02-11 22:17 ` Vladislav Shpilevoy 2020-02-05 16:19 ` [Tarantool-patches] [PATCH 3/4] sql: fix CAST AS NUMBER operator Nikita Pettik 2020-02-10 23:24 ` Vladislav Shpilevoy 2020-02-11 14:14 ` Nikita Pettik 2020-02-11 22:17 ` Vladislav Shpilevoy 2020-02-11 23:20 ` Nikita Pettik 2020-02-11 23:27 ` Vladislav Shpilevoy 2020-02-12 14:10 ` Nikita Pettik 2020-02-05 16:19 ` [Tarantool-patches] [PATCH 4/4] sql: do not force FP representation for NUMBER field Nikita Pettik 2020-02-10 23:24 ` Vladislav Shpilevoy 2020-02-11 14:14 ` Nikita Pettik 2020-02-09 17:39 ` [Tarantool-patches] [PATCH 0/4] sql: fix NUMBER conversion issues Vladislav Shpilevoy
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=0a6143594e0279d19d3b760a75f0139dbd42dae8.1580841722.git.korablev@tarantool.org \ --to=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 2/4] sql: refactor sqlVdbeMemNumerify()' \ /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