Tarantool development patches archive
 help / color / mirror / Atom feed
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 12/53] sql: introduce mem_copy()
Date: Tue, 23 Mar 2021 12:35:20 +0300	[thread overview]
Message-ID: <36c5f57f22e685be0fbd657c6aa13ac5a807a7d0.1616491731.git.imeevma@gmail.com> (raw)
In-Reply-To: <cover.1616491730.git.imeevma@gmail.com>

This patch introduces mem_copy(). This function copies value from source
MEM to destination MEM. In case value is string or binary and have not
static allocation type, it is copied to newly allocated memory.

Part of #5818
---
 src/box/sql/func.c    |  4 ++--
 src/box/sql/mem.c     | 54 +++++++++++++++++++++++++------------------
 src/box/sql/mem.h     |  9 +++++++-
 src/box/sql/vdbeapi.c |  2 +-
 src/box/sql/vdbeaux.c |  2 +-
 5 files changed, 44 insertions(+), 27 deletions(-)

diff --git a/src/box/sql/func.c b/src/box/sql/func.c
index 81b537d9b..6b6081150 100644
--- a/src/box/sql/func.c
+++ b/src/box/sql/func.c
@@ -2079,13 +2079,13 @@ minmaxStep(sql_context * context, int NotUsed, sql_value ** argv)
 		bool is_max = (func->flags & SQL_FUNC_MAX) != 0;
 		cmp = sqlMemCompare(pBest, pArg, pColl);
 		if ((is_max && cmp < 0) || (!is_max && cmp > 0)) {
-			sqlVdbeMemCopy(pBest, pArg);
+			mem_copy(pBest, pArg);
 		} else {
 			sqlSkipAccumulatorLoad(context);
 		}
 	} else {
 		pBest->db = sql_context_db_handle(context);
-		sqlVdbeMemCopy(pBest, pArg);
+		mem_copy(pBest, pArg);
 	}
 }
 
diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c
index abc9291ef..f12441d7c 100644
--- a/src/box/sql/mem.c
+++ b/src/box/sql/mem.c
@@ -257,6 +257,38 @@ mem_destroy(struct Mem *mem)
 	mem->zMalloc = NULL;
 }
 
+int
+mem_copy(struct Mem *to, const struct Mem *from)
+{
+	mem_clear(to);
+	to->u = from->u;
+	to->flags = from->flags;
+	to->subtype = from->subtype;
+	to->field_type = from->field_type;
+	to->n = from->n;
+	to->z = from->z;
+	if ((to->flags & (MEM_Str | MEM_Blob)) == 0)
+		return 0;
+	if ((to->flags & MEM_Static) != 0)
+		return 0;
+	if ((to->flags & (MEM_Zero | MEM_Blob)) == (MEM_Zero | MEM_Blob)) {
+		if (sqlVdbeMemExpandBlob(to) != 0)
+			return -1;
+		return 0;
+	}
+	if (to->szMalloc == 0)
+		to->zMalloc = sqlDbMallocRaw(to->db, to->n);
+	else
+		to->zMalloc = sqlDbReallocOrFree(to->db, to->zMalloc, to->n);
+	if (to->zMalloc == NULL)
+		return -1;
+	to->szMalloc = sqlDbMallocSize(to->db, to->zMalloc);
+	memcpy(to->zMalloc, to->z, to->n);
+	to->z = to->zMalloc;
+	to->flags &= (MEM_Str | MEM_Blob | MEM_Term | MEM_Subtype);
+	return 0;
+}
+
 static inline bool
 mem_has_msgpack_subtype(struct Mem *mem)
 {
@@ -1993,28 +2025,6 @@ vdbe_mem_alloc_blob_region(struct Mem *vdbe_mem, uint32_t size)
 	return 0;
 }
 
-/*
- * Make a full copy of pFrom into pTo.  Prior contents of pTo are
- * freed before the copy is made.
- */
-int
-sqlVdbeMemCopy(Mem * pTo, const Mem * pFrom)
-{
-	int rc = 0;
-
-	mem_clear(pTo);
-	memcpy(pTo, pFrom, MEMCELLSIZE);
-	pTo->flags &= ~MEM_Dyn;
-	if (pTo->flags & (MEM_Str | MEM_Blob)) {
-		if (0 == (pFrom->flags & MEM_Static)) {
-			pTo->flags |= MEM_Ephem;
-			rc = sqlVdbeMemMakeWriteable(pTo);
-		}
-	}
-
-	return rc;
-}
-
 void
 sqlVdbeMemShallowCopy(Mem * pTo, const Mem * pFrom, int srcType)
 {
diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h
index 19920af3a..fb649891a 100644
--- a/src/box/sql/mem.h
+++ b/src/box/sql/mem.h
@@ -169,6 +169,14 @@ mem_create(struct Mem *mem);
 void
 mem_destroy(struct Mem *mem);
 
+/**
+ * Copy content of MEM from one MEM to another. In case source MEM contains
+ * string or binary and allocation type is not STATIC, this value is copied to
+ * newly allocated by destination MEM memory.
+ */
+int
+mem_copy(struct Mem *to, const struct Mem *from);
+
 /* One or more of the following flags are set to indicate the validOK
  * representations of the value stored in the Mem struct.
  *
@@ -485,7 +493,6 @@ mem_is_type_compatible(struct Mem *mem, enum field_type type);
 
 int
 vdbe_mem_alloc_blob_region(struct Mem *vdbe_mem, uint32_t size);
-int sqlVdbeMemCopy(Mem *, const Mem *);
 void sqlVdbeMemShallowCopy(Mem *, const Mem *, int);
 void sqlVdbeMemMove(Mem *, Mem *);
 int sqlVdbeMemMakeWriteable(Mem *);
diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c
index 8a9573c57..b13385647 100644
--- a/src/box/sql/vdbeapi.c
+++ b/src/box/sql/vdbeapi.c
@@ -229,7 +229,7 @@ sql_result_text64(sql_context * pCtx,
 void
 sql_result_value(sql_context * pCtx, sql_value * pValue)
 {
-	sqlVdbeMemCopy(pCtx->pOut, pValue);
+	mem_copy(pCtx->pOut, pValue);
 }
 
 void
diff --git a/src/box/sql/vdbeaux.c b/src/box/sql/vdbeaux.c
index 11304b5bc..21ac84099 100644
--- a/src/box/sql/vdbeaux.c
+++ b/src/box/sql/vdbeaux.c
@@ -2309,7 +2309,7 @@ sqlVdbeGetBoundValue(Vdbe * v, int iVar, u8 aff)
 		if (!mem_is_null(pMem)) {
 			sql_value *pRet = sqlValueNew(v->db);
 			if (pRet) {
-				sqlVdbeMemCopy((Mem *) pRet, pMem);
+				mem_copy(pRet, pMem);
 				sql_value_apply_type(pRet, aff);
 			}
 			return pRet;
-- 
2.25.1


  parent reply	other threads:[~2021-03-23  9:40 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 ` Mergen Imeev via Tarantool-patches [this message]
2021-03-29 23:01   ` [Tarantool-patches] [PATCH v4 12/53] sql: introduce mem_copy() 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 ` [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=36c5f57f22e685be0fbd657c6aa13ac5a807a7d0.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 12/53] sql: introduce mem_copy()' \
    /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