[Tarantool-patches] [PATCH v4 12/53] sql: introduce mem_copy()

Vladislav Shpilevoy v.shpilevoy at tarantool.org
Tue Mar 30 02:01:18 MSK 2021


I appreciate the work you did here!

See 2 comments below.

On 23.03.2021 10:35, Mergen Imeev via Tarantool-patches wrote:
> 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);

1. Still is "used" in stat4ValueFromExpr().

> +			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;

2. You can make `returnsqlVdbeMemExpandBlob(to);`, no need to check its result.

Also what was wrong with sqlVdbeMemCopy's way of using sqlVdbeMemMakeWriteable?

> +	}
> +	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)
>  {


More information about the Tarantool-patches mailing list