[Tarantool-patches] [PATCH v4 15/53] sql: rework vdbe_decode_msgpack_into_mem()

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


Thanks for the patch!

See 3 comments below.

On 23.03.2021 10:35, Mergen Imeev via Tarantool-patches wrote:
> The original vdbe_decode_msgpack_into_mem() returns a MEM that contains
> string and binary values as ephemeral. This patch renames this function
> to vdbe_decode_msgpack_into_mem_ephemeral() and introduces new
> vdbe_decode_msgpack_into_mem(), which returns a MEM that contains string
> and binary values in newly allocated memory.
> 
> This patch actually changes behavior in this case:

1. Changes how? I don't see any changes in the tests.

> CREATE TABLE t1(m VARBINARY primary key);
> INSERT INTO t1 VALUES(x'6178'), (x'6278'), (x'6379');
> SELECT count(*), substr(m,2,1) AS m FROM t1 GROUP BY m;
> SELECT count(*), substr(m,2,1) AS mx FROM t1 GROUP BY mx;
> 
> But it doesn't change behaviour for this:
> 
> CREATE TABLE t2(m STRING primary key);
> INSERT INTO t2 VALUES('ax'), ('bx'), ('cy');
> SELECT count(*), substr(m,2,1) AS m FROM t2 GROUP BY m;
> SELECT count(*), substr(m,2,1) AS mx FROM t2 GROUP BY mx;
> 
> Part of #5818
> Part of #5890
> ---
>  src/box/sql/mem.c     | 16 +++++++++++++++-
>  src/box/sql/mem.h     | 17 ++++++++++++++++-
>  src/box/sql/vdbe.c    | 18 ------------------
>  src/box/sql/vdbeaux.c |  2 +-
>  4 files changed, 32 insertions(+), 21 deletions(-)
> 
> diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c
> index 3d42ac63c..a2316cc90 100644
> --- a/src/box/sql/mem.c
> +++ b/src/box/sql/mem.c
> @@ -2253,7 +2253,8 @@ sqlVdbeRecordCompareMsgpack(const void *key1,
>  }
>  
>  int
> -vdbe_decode_msgpack_into_mem(const char *buf, struct Mem *mem, uint32_t *len)
> +vdbe_decode_msgpack_into_ephemeral_mem(const char *buf, struct Mem *mem,
> +				       uint32_t *len)

2. The function name is getting Java vibes. I propose to rename it to
mem_from_mp_ephemeral() and mem_from_mp() correspondingly. They also should
start taking the mem as a first argument.

>  {
>  	const char *start_buf = buf;
>  	switch (mp_typeof(*buf)) {
> @@ -2354,6 +2355,19 @@ install_blob:
>  	return 0;
>  }
>  
> +int
> +vdbe_decode_msgpack_into_mem(const char *buf, struct Mem *mem, uint32_t *len)
> +{
> +	if (vdbe_decode_msgpack_into_ephemeral_mem(buf, mem, len) != 0)
> +		return -1;
> +	if ((mem->flags & (MEM_Str | MEM_Blob)) != 0) {
> +		assert((mem->flags & MEM_Ephem) != 0);
> +		if (sqlVdbeMemGrow(mem, mem->n, 1) != 0)
> +			return -1;

3. Maybe it is worth adding a function like mem_materialize() or
mem_make_writable() for that kind of work.

> +	}
> +	return 0;
> +}


More information about the Tarantool-patches mailing list