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 46/53] sql: introduce mem_implicit_cast() Date: Tue, 23 Mar 2021 12:36:39 +0300 [thread overview] Message-ID: <b2dfbf0d7bf6e1e86bcbe70eef8cd7093a063c15.1616491731.git.imeevma@gmail.com> (raw) In-Reply-To: <cover.1616491730.git.imeevma@gmail.com> This patch introduces mem_implicit_cast(). This function is used to convert a MEM to given type according to implicit cast rules. Part of #5818 --- src/box/sql/mem.c | 275 ++++++++++++++++++++++++------------------ src/box/sql/mem.h | 55 +-------- src/box/sql/vdbe.c | 21 +--- src/box/sql/vdbeaux.c | 2 +- 4 files changed, 168 insertions(+), 185 deletions(-) diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c index 559bf6121..1baf4c482 100644 --- a/src/box/sql/mem.c +++ b/src/box/sql/mem.c @@ -943,6 +943,28 @@ mem_convert_to_string(struct Mem *mem) return -1; } +static inline int +mem_convert_double_to_unsigned(struct Mem *mem) +{ + double d = mem->u.r; + if (d >= 0 && d < (double)UINT64_MAX) { + mem_set_unsigned(mem, (uint64_t)d); + return 0; + } + return -1; +} + +static inline int +mem_convert_double_to_unsigned_lossless(struct Mem *mem) +{ + double d = mem->u.r; + if (d >= 0 && d < (double)UINT64_MAX && (double)(uint64_t)d == d) { + mem_set_unsigned(mem, (uint64_t)d); + return 0; + } + return -1; +} + static inline int mem_convert_varstring_to_unsigned(struct Mem *mem) { @@ -1071,6 +1093,140 @@ mem_explicit_cast(struct Mem *mem, enum field_type type) return -1; } +int +mem_implicit_cast(struct Mem *mem, enum field_type type) +{ + if ((mem->flags & MEM_Null) != 0) { + mem->field_type = type; + return 0; + } + switch (type) { + case FIELD_TYPE_UNSIGNED: + if ((mem->flags & MEM_UInt) != 0) + return 0; + if ((mem->flags & MEM_Real) != 0) + return mem_convert_double_to_unsigned(mem); + return -1; + case FIELD_TYPE_STRING: + if ((mem->flags & MEM_Str) != 0) + return 0; + return -1; + case FIELD_TYPE_DOUBLE: + if ((mem->flags & MEM_Real) != 0) + return 0; + if ((mem->flags & (MEM_Int | MEM_UInt)) != 0) + return mem_convert_integer_to_double(mem); + return -1; + case FIELD_TYPE_INTEGER: + if ((mem->flags & (MEM_Int | MEM_UInt)) != 0) + return 0; + if ((mem->flags & MEM_Real) != 0) + return mem_convert_double_to_integer(mem); + return -1; + case FIELD_TYPE_BOOLEAN: + if ((mem->flags & MEM_Bool) != 0) + return 0; + return -1; + case FIELD_TYPE_VARBINARY: + if ((mem->flags & MEM_Blob) != 0) + return 0; + return -1; + case FIELD_TYPE_NUMBER: + if ((mem->flags & (MEM_Int | MEM_UInt | MEM_Real)) != 0) + return 0; + return -1; + case FIELD_TYPE_MAP: + if (mem_is_map(mem)) + return 0; + return -1; + case FIELD_TYPE_ARRAY: + if (mem_is_array(mem)) + return 0; + return -1; + case FIELD_TYPE_SCALAR: + if ((mem->flags & MEM_Blob) != 0 && + (mem->flags & MEM_Subtype) != 0) + return -1; + return 0; + case FIELD_TYPE_ANY: + return 0; + default: + break; + } + return -1; +} + +int +mem_implicit_cast_old(struct Mem *mem, enum field_type type) +{ + if (mem_is_null(mem)) + return 0; + switch (type) { + case FIELD_TYPE_UNSIGNED: + if ((mem->flags & MEM_UInt) != 0) + return 0; + if ((mem->flags & MEM_Real) != 0) + return mem_convert_double_to_unsigned_lossless(mem); + if ((mem->flags & MEM_Str) != 0) + return mem_convert_varstring_to_unsigned(mem); + return -1; + case FIELD_TYPE_STRING: + if ((mem->flags & (MEM_Str | MEM_Blob)) != 0) + return 0; + if ((mem->flags & (MEM_Int | MEM_UInt)) != 0) + return mem_convert_integer_to_string(mem); + if ((mem->flags & MEM_Real) != 0) + return mem_convert_double_to_string(mem); + return -1; + case FIELD_TYPE_DOUBLE: + if ((mem->flags & MEM_Real) != 0) + return 0; + if ((mem->flags & (MEM_Int | MEM_UInt)) != 0) + return mem_convert_integer_to_double(mem); + if ((mem->flags & MEM_Str) != 0) + return mem_convert_varstring_to_double(mem); + return -1; + case FIELD_TYPE_INTEGER: + if ((mem->flags & (MEM_Int | MEM_UInt)) != 0) + return 0; + if ((mem->flags & MEM_Str) != 0) + return mem_convert_varstring_to_integer(mem); + if (mem_is_double(mem)) + return mem_convert_double_to_integer_lossless(mem); + return -1; + case FIELD_TYPE_BOOLEAN: + if ((mem->flags & MEM_Bool) != 0) + return 0; + return -1; + case FIELD_TYPE_VARBINARY: + if ((mem->flags & MEM_Blob) != 0) + return 0; + return -1; + case FIELD_TYPE_NUMBER: + if ((mem->flags & (MEM_Int | MEM_UInt | MEM_Real)) != 0) + return 0; + if ((mem->flags & MEM_Str) != 0) + return mem_convert_to_number(mem); + return -1; + case FIELD_TYPE_MAP: + if (mem_is_map(mem)) + return 0; + return -1; + case FIELD_TYPE_ARRAY: + if (mem_is_array(mem)) + return 0; + return -1; + case FIELD_TYPE_SCALAR: + if ((mem->flags & MEM_Blob) != 0 && + (mem->flags & MEM_Subtype) != 0) + return -1; + return 0; + default: + break; + } + return -1; +} + int mem_copy(struct Mem *to, const struct Mem *from) { @@ -2133,117 +2289,6 @@ sqlVdbeMemExpandBlob(Mem * pMem) return 0; } -/* - * Exported version of mem_apply_type(). This one works on sql_value*, - * not the internal Mem* type. - */ -void -sql_value_apply_type( - sql_value *pVal, - enum field_type type) -{ - mem_apply_type((Mem *) pVal, type); -} - -int -mem_apply_type(struct Mem *record, enum field_type type) -{ - if ((record->flags & MEM_Null) != 0) - return 0; - assert(type < field_type_MAX); - switch (type) { - case FIELD_TYPE_INTEGER: - case FIELD_TYPE_UNSIGNED: - if ((record->flags & (MEM_Bool | MEM_Blob)) != 0) - return -1; - if ((record->flags & MEM_UInt) == MEM_UInt) - return 0; - if ((record->flags & MEM_Real) == MEM_Real) { - double d = record->u.r; - if (d >= 0) { - if (double_compare_uint64(d, UINT64_MAX, - 1) > 0) - return 0; - if ((double)(uint64_t)d == d) - mem_set_unsigned(record, (uint64_t)d); - } else { - if (double_compare_nint64(d, INT64_MIN, 1) < 0) - return 0; - if ((double)(int64_t)d == d) { - mem_set_integer(record, (int64_t)d, - true); - } - } - return 0; - } - if ((record->flags & MEM_Str) != 0) { - bool is_neg; - int64_t i; - if (sql_atoi64(record->z, &i, &is_neg, record->n) != 0) - return -1; - mem_set_integer(record, i, is_neg); - } - if ((record->flags & MEM_Int) == MEM_Int) { - if (type == FIELD_TYPE_UNSIGNED) - return -1; - return 0; - } - return 0; - case FIELD_TYPE_BOOLEAN: - if ((record->flags & MEM_Bool) == MEM_Bool) - return 0; - return -1; - case FIELD_TYPE_NUMBER: - if ((record->flags & (MEM_Real | MEM_Int | MEM_UInt)) != 0) - return 0; - return mem_convert_to_double(record); - case FIELD_TYPE_DOUBLE: - if ((record->flags & MEM_Real) != 0) - return 0; - return mem_convert_to_double(record); - case FIELD_TYPE_STRING: - /* - * Only attempt the conversion to TEXT if there is - * an integer or real representation (BLOB and - * NULL do not get converted). - */ - if ((record->flags & MEM_Str) == 0 && - (record->flags & (MEM_Real | MEM_Int | MEM_UInt)) != 0) - mem_convert_to_string(record); - record->flags &= ~(MEM_Real | MEM_Int | MEM_UInt); - return 0; - case FIELD_TYPE_VARBINARY: - if ((record->flags & MEM_Blob) == 0) - return -1; - return 0; - case FIELD_TYPE_SCALAR: - /* Can't cast MAP and ARRAY to scalar types. */ - if ((record->flags & MEM_Subtype) != 0 && - record->subtype == SQL_SUBTYPE_MSGPACK) { - assert(mp_typeof(*record->z) == MP_MAP || - mp_typeof(*record->z) == MP_ARRAY); - return -1; - } - return 0; - case FIELD_TYPE_MAP: - if ((record->flags & MEM_Subtype) != 0 && - record->subtype == SQL_SUBTYPE_MSGPACK && - mp_typeof(*record->z) == MP_MAP) - return 0; - return -1; - case FIELD_TYPE_ARRAY: - if ((record->flags & MEM_Subtype) != 0 && - record->subtype == SQL_SUBTYPE_MSGPACK && - mp_typeof(*record->z) == MP_ARRAY) - return 0; - return -1; - case FIELD_TYPE_ANY: - return 0; - default: - return -1; - } -} - /* * Make sure pMem->z points to a writable allocation of at least * min(n,32) bytes. @@ -2769,14 +2814,6 @@ sqlMemCompare(const Mem * pMem1, const Mem * pMem2, const struct coll * pColl) return sqlBlobCompare(pMem1, pMem2); } -bool -mem_is_type_compatible(struct Mem *mem, enum field_type type) -{ - enum mp_type mp_type = mem_mp_type(mem); - assert(mp_type < MP_EXT); - return field_mp_plain_type_is_compatible(type, mp_type, true); -} - int sql_vdbemem_finalize(struct Mem *mem, struct func *func) { diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h index 922dad272..c0b9f4f99 100644 --- a/src/box/sql/mem.h +++ b/src/box/sql/mem.h @@ -339,6 +339,12 @@ mem_convert_to_string0(struct Mem *mem); int mem_explicit_cast(struct Mem *mem, enum field_type type); +int +mem_implicit_cast(struct Mem *mem, enum field_type type); + +int +mem_implicit_cast_old(struct Mem *mem, enum field_type type); + /** * Simple type to str convertor. It is used to simplify * error reporting. @@ -392,44 +398,6 @@ registerTrace(int iReg, Mem *p); int sqlVdbeMemNulTerminate(struct Mem *); int sqlVdbeMemExpandBlob(struct Mem *); #define ExpandBlob(P) (mem_is_zeroblob(P)? sqlVdbeMemExpandBlob(P) : 0) -void sql_value_apply_type(struct Mem *val, enum field_type type); - - -/** - * Processing is determined by the field type parameter: - * - * INTEGER: - * If memory holds floating point value and it can be - * converted without loss (2.0 - > 2), it's type is - * changed to INT. Otherwise, simply return success status. - * - * NUMBER: - * If memory holds INT or floating point value, - * no actions take place. - * - * STRING: - * Convert mem to a string representation. - * - * SCALAR: - * Mem is unchanged, but flag is set to BLOB in case of - * scalar-like type. Otherwise, (MAP, ARRAY) conversion - * is impossible. - * - * BOOLEAN: - * If memory holds BOOLEAN no actions take place. - * - * ANY: - * Mem is unchanged, no actions take place. - * - * MAP/ARRAY: - * These types can't be casted to scalar ones, or to each - * other. So the only valid conversion is to type itself. - * - * @param record The value to apply type to. - * @param type The type to be applied. - */ -int -mem_apply_type(struct Mem *record, enum field_type type); /** Setters = Change MEM value. */ @@ -494,17 +462,6 @@ int sqlVdbeMemTooBig(Mem *); int sqlMemCompare(const Mem *, const Mem *, const struct coll *); -/** - * Check that MEM_type of the mem is compatible with given type. - * - * @param mem The MEM that contains the value to check. - * @param type The type to check. - * @retval TRUE if the MEM_type of the value and the given type - * are compatible, FALSE otherwise. - */ -bool -mem_is_type_compatible(struct Mem *mem, enum field_type type); - /** MEM manipulate functions. */ /** diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index a567f69bd..389472941 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -2001,23 +2001,12 @@ case OP_ApplyType: { while((type = *(types++)) != field_type_MAX) { assert(pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)]); assert(memIsValid(pIn1)); - if (!mem_is_type_compatible(pIn1, type)) { - /* Implicit cast is allowed only to numeric type. */ - if (!sql_type_is_numeric(type)) - goto type_mismatch; - /* Implicit cast is allowed only from numeric type. */ - if (!mem_is_number(pIn1)) - goto type_mismatch; - /* Try to convert numeric-to-numeric. */ - if (mem_explicit_cast(pIn1, type) != 0) - goto type_mismatch; + if (mem_implicit_cast(pIn1, type) != 0) { + diag_set(ClientError, ER_SQL_TYPE_MISMATCH, + mem_str(pIn1), field_type_strs[type]); + goto abort_due_to_error; } pIn1++; - continue; -type_mismatch: - diag_set(ClientError, ER_SQL_TYPE_MISMATCH, - mem_str(pIn1), field_type_strs[type]); - goto abort_due_to_error; } break; } @@ -2076,7 +2065,7 @@ case OP_MakeRecord: { if (types != NULL) { pRec = pData0; do { - mem_apply_type(pRec++, *(types++)); + mem_implicit_cast_old(pRec++, *(types++)); } while(types[0] != field_type_MAX); } diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c index ccabf6035..59fc313d4 100644 --- a/src/box/sql/vdbeaux.c +++ b/src/box/sql/vdbeaux.c @@ -2310,7 +2310,7 @@ sqlVdbeGetBoundValue(Vdbe * v, int iVar, u8 aff) sql_value *pRet = sqlValueNew(v->db); if (pRet) { mem_copy(pRet, pMem); - sql_value_apply_type(pRet, aff); + mem_implicit_cast_old(pRet, aff); } return pRet; } -- 2.25.1
next prev parent reply other threads:[~2021-03-23 9:57 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 ` [Tarantool-patches] [PATCH v4 43/53] sql: introduce mem_convert_to_number() Mergen Imeev via Tarantool-patches 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 ` Mergen Imeev via Tarantool-patches [this message] 2021-03-29 23:08 ` [Tarantool-patches] [PATCH v4 46/53] sql: introduce mem_implicit_cast() 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=b2dfbf0d7bf6e1e86bcbe70eef8cd7093a063c15.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 46/53] sql: introduce mem_implicit_cast()' \ /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