From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id 144966EC5D; Fri, 9 Apr 2021 20:38:56 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 144966EC5D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1617989936; bh=UTeem5Bi8J2M27FPynxya5dX9wHbEwFdhj8pR8WH4u8=; h=To:Cc:Date:In-Reply-To:References:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=l2SDGWb1yh4g4h21AsG9KZ8x8XzwX0YguK10Z2XhjDmKUAMs/2uhkDYDP1ovn7g4Y av8H2ADAswaJ2WQLU7imkqX9sQIfoJm5MYipWp+Jc4eNENXecsRM+NDSrVNsQFodDd 8zGoOxvCVbGM8F2TUkpj1xULqTRUkiF2vj2vrCxA= Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 133D76EC5D for ; Fri, 9 Apr 2021 20:37:09 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 133D76EC5D Received: by smtpng2.m.smailru.net with esmtpa (envelope-from ) id 1lUv48-0007gE-CO; Fri, 09 Apr 2021 20:37:08 +0300 To: v.shpilevoy@tarantool.org, tsafin@tarantool.org Cc: tarantool-patches@dev.tarantool.org Date: Fri, 9 Apr 2021 20:37:08 +0300 Message-Id: <03a0defcf93a9c1ac1080d13f9178ea5ab33ae59.1617984948.git.imeevma@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-7564579A: 78E4E2B564C1792B X-77F55803: 4F1203BC0FB41BD92FFCB8E6708E7480EBD5CA77A668ECB87DA2124B0A8E6609182A05F53808504077BF0D58DF1012ADE4376312576A27AF14FAAFE534287D838DF361E3A6A96DE3 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE76F334650EE2FF367EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637770CCD3A0ADFB7EEEA1F7E6F0F101C67CDEEF6D7F21E0D1D9295C2E9FA3191EE1B59CA4C82EFA6583E1145C0997A7CC2B779AF986C1EF7D0F6B57BC7E64490618DEB871D839B73339E8FC8737B5C2249E232F00D8D26902CA471835C12D1D9774AD6D5ED66289B52BA9C0B312567BB23117882F4460429728776938767073520B1593CA6EC85F86D2CC0D3CB04F14752D2E47CDBA5A96583BA9C0B312567BB231DD303D21008E298D5E8D9A59859A8B6B372FE9A2E580EFC725E5C173C3A84C33A60492226029A77089D37D7C0E48F6C5571747095F342E88FB05168BE4CE3AF X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975CD0035DD76F8A8A4FE62E5D941F918BC2C7D88E590130A35D9C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF0417BEADF48D1460699F904B3F4130E343918A1A30D5E7FCCB5012B2E24CD356 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34C786159FDC4342B032F008842B3FFA9015C28CB99DB06BCF8E096BBB9B1177B51E4A3588857818C41D7E09C32AA3244CFD92E4D47F6FD393BA072C908BF3BAAB64EE5813BBCA3A9DFACE5A9C96DEB163 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojyO2lHpuZu4Sv2r86tTayZA== X-Mailru-Sender: 689FA8AB762F73936BC43F508A0638225080BC4694AC050CD5E75A46F5B1FB3F83D72C36FC87018B9F80AB2734326CD2FB559BB5D741EB96352A0ABBE4FDA4210A04DAD6CC59E33667EA787935ED9F1B X-Mras: Ok Subject: [Tarantool-patches] [PATCH v5 15/52] sql: rework mem_move() X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Mergen Imeev via Tarantool-patches Reply-To: imeevma@tarantool.org Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" This patch reworks mem_move(). This function moves all content of source MEM to destination MEM. Source mem is set to NULL. Part of #5818 --- src/box/sql/mem.c | 57 +++++++++---------------------------------- src/box/sql/mem.h | 8 ++++-- src/box/sql/vdbe.c | 23 +---------------- src/box/sql/vdbeapi.c | 2 +- 4 files changed, 19 insertions(+), 71 deletions(-) diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c index f75661e04..d56fe56c6 100644 --- a/src/box/sql/mem.c +++ b/src/box/sql/mem.c @@ -315,6 +315,17 @@ mem_copy_as_ephemeral(struct Mem *to, const struct Mem *from) return; } +int +mem_move(struct Mem *to, struct Mem *from) +{ + mem_destroy(to); + memcpy(to, from, sizeof(*to)); + from->flags = MEM_Null; + from->szMalloc = 0; + from->zMalloc = NULL; + return 0; +} + static inline bool mem_has_msgpack_subtype(struct Mem *mem) { @@ -1994,52 +2005,6 @@ vdbe_mem_alloc_blob_region(struct Mem *vdbe_mem, uint32_t size) return 0; } -/* - * Transfer the contents of pFrom to pTo. Any existing value in pTo is - * freed. If pFrom contains ephemeral data, a copy is made. - * - * pFrom contains an SQL NULL when this routine returns. - */ -void -sqlVdbeMemMove(Mem * pTo, Mem * pFrom) -{ - assert(pFrom->db == 0 || pTo->db == 0 || pFrom->db == pTo->db); - - mem_destroy(pTo); - memcpy(pTo, pFrom, sizeof(Mem)); - pFrom->flags = MEM_Null; - pFrom->szMalloc = 0; -} - -/* - * Change pMem so that its MEM_Str or MEM_Blob value is stored in - * MEM.zMalloc, where it can be safely written. - * - * Return 0 on success or -1 if malloc fails. - */ -int -sqlVdbeMemMakeWriteable(Mem * pMem) -{ - if ((pMem->flags & (MEM_Str | MEM_Blob)) != 0) { - if (ExpandBlob(pMem)) - return -1; - if (pMem->szMalloc == 0 || pMem->z != pMem->zMalloc) { - if (sqlVdbeMemGrow(pMem, pMem->n + 2, 1)) { - return -1; - } - pMem->z[pMem->n] = 0; - pMem->z[pMem->n + 1] = 0; - pMem->flags |= MEM_Term; - } - } - pMem->flags &= ~MEM_Ephem; -#ifdef SQL_DEBUG - pMem->pScopyFrom = 0; -#endif - - return 0; -} - 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 3898888ff..394055db9 100644 --- a/src/box/sql/mem.h +++ b/src/box/sql/mem.h @@ -178,6 +178,12 @@ mem_copy(struct Mem *to, const struct Mem *from); void mem_copy_as_ephemeral(struct Mem *to, const struct Mem *from); +/** + * Move all content of source MEM to destination MEM. Source MEM is set to NULL. + */ +int +mem_move(struct Mem *to, 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. * @@ -477,8 +483,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); -void sqlVdbeMemMove(Mem *, Mem *); -int sqlVdbeMemMakeWriteable(Mem *); /** * Memory cell mem contains the context of an aggregate function. diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index bbeabf238..0c19acff5 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -197,21 +197,6 @@ vdbeTakeBranch(int iSrcLine, u8 I, u8 M) } #endif -/* - * An ephemeral string value (signified by the MEM_Ephem flag) contains - * a pointer to a dynamically allocated string where some other entity - * is responsible for deallocating that string. Because the register - * does not control the string, it might be deleted without the register - * knowing it. - * - * This routine converts an ephemeral string into a dynamically allocated - * string that the register itself controls. In other words, it - * converts an MEM_Ephem string into a string with P.z==P.zMalloc. - */ -#define Deephemeralize(P) \ - if (((P)->flags&MEM_Ephem)!=0 \ - && sqlVdbeMemMakeWriteable(P)) { goto no_mem;} - /* Return true if the cursor was opened using the OP_OpenSorter opcode. */ #define isSorter(x) ((x)->eCurType==CURTYPE_SORTER) @@ -981,13 +966,7 @@ case OP_Move: { assert(pIn1<=&aMem[(p->nMem+1 - p->nCursor)]); assert(memIsValid(pIn1)); memAboutToChange(p, pOut); - sqlVdbeMemMove(pOut, pIn1); -#ifdef SQL_DEBUG - if (pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrompScopyFrom += pOp->p2 - p1; - } -#endif - Deephemeralize(pOut); + mem_move(pOut, pIn1); REGISTER_TRACE(p, p2++, pOut); pIn1++; pOut++; diff --git a/src/box/sql/vdbeapi.c b/src/box/sql/vdbeapi.c index 7951996ea..8e69e3c38 100644 --- a/src/box/sql/vdbeapi.c +++ b/src/box/sql/vdbeapi.c @@ -980,7 +980,7 @@ sqlTransferBindings(sql_stmt * pFromStmt, sql_stmt * pToStmt) assert(pTo->db == pFrom->db); assert(pTo->nVar == pFrom->nVar); for (i = 0; i < pFrom->nVar; i++) { - sqlVdbeMemMove(&pTo->aVar[i], &pFrom->aVar[i]); + mem_move(&pTo->aVar[i], &pFrom->aVar[i]); } return 0; } -- 2.25.1