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 C7BAE6AA80; Tue, 23 Mar 2021 12:41:17 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org C7BAE6AA80 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1616492477; bh=Src/z47TQrBQuy4dqKQ66GMyioU9aNvp8hSOX+Jc1bo=; 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=zpK4jQZCK5XhH8w3bJJde3SLbnHaXl4c8vPUW5zogNkt60uXR2I+bWR5GyZJ9WRkK E/Lr2uEMrTMTdnD27poJALRTMl2i3yr7CoEFkQ5MxjZZxb/FXFysiFGApLfkFySu2S dJYvA+pdAFwRJ9FZAfc6a7P3hm22BgsFi3PjZPm8= Received: from smtp3.mail.ru (smtp3.mail.ru [94.100.179.58]) (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 A7E2368F41 for ; Tue, 23 Mar 2021 12:35:23 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org A7E2368F41 Received: by smtp3.mail.ru with esmtpa (envelope-from ) id 1lOdRa-0006WX-RP; Tue, 23 Mar 2021 12:35:23 +0300 To: v.shpilevoy@tarantool.org, tsafin@tarantool.org Cc: tarantool-patches@dev.tarantool.org Date: Tue, 23 Mar 2021 12:35:22 +0300 Message-Id: <851163339776934088ab040a37043337497e65a9.1616491731.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: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD95D6E7CC48CB1F5F1C82687294EF6886BAE1FA542CE3F1C38182A05F5380850403890FF50A33426F1C147602D5529D52FEC00E403CA6E02304325E921CBCFB4EC X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7C59BC9C499248573C2099A533E45F2D0395957E7521B51C2CFCAF695D4D8E9FCEA1F7E6F0F101C6778DA827A17800CE78EA80DE462DCD770EA1F7E6F0F101C67CDEEF6D7F21E0D1D174C73DBBBFC7664D54267400E4E38EC82CE009D278D122D6AA60DBFDBF23C6C389733CBF5DBD5E913377AFFFEAFD269176DF2183F8FC7C0A29E2F051442AF778941B15DA834481FCF19DD082D7633A0EF3E4896CB9E6436389733CBF5DBD5E9D5E8D9A59859A8B6A70DDFFB3186CBC5CC7F00164DA146DA6F5DAA56C3B73B237318B6A418E8EAB8D32BA5DBAC0009BE9E8FC8737B5C2249DBB84FCD3E22D09776E601842F6C81A12EF20D2F80756B5F7E9C4E3C761E06A776E601842F6C81A127C277FBC8AE2E8B382800A26CACC6B6D81D268191BDAD3D698AB9A7B718F8C4D1B931868CE1C5781A620F70A64A45A98AA50765F79006372E808ACE2090B5E14AD6D5ED66289B52BA9C0B312567BB23089D37D7C0E48F6CA18204E546F3947C1B3F1E879BC1E2F16D8C47C27EEC5E9FC8A9BA7A39EFB7666BA297DBC24807EA089D37D7C0E48F6C8AA50765F79006376521614475B80AD4EFF80C71ABB335746BA297DBC24807EA27F269C8F02392CDC58410348177836EABEDDA51113D120200306258E7E6ABB4E4A6367B16DE6309 X-B7AD71C0: AC4F5C86D027EB782CDD5689AFBDA7A24A6D60772A99906F8E1CD14B953EB46D50E049F5F8F341A8355D89D7DBCDD132 X-C1DE0DAB: C20DE7B7AB408E4181F030C43753B8186998911F362727C414F749A5E30D975C686AF563A045C75E747423351C1D1FC42CC963269A0C62329C2B6934AE262D3EE7EAB7254005DCED7532B743992DF240BDC6A1CF3F042BAD6DF99611D93F60EF0417BEADF48D1460699F904B3F4130E343918A1A30D5E7FCCB5012B2E24CD356 X-C8649E89: 4E36BF7865823D7055A7F0CF078B5EC49A30900B95165D34A08F09726D78E07B651181EB9C6A52F26EADFC9A88A9DC89DCF7931B77B69A5BE1C887CE56B9F1A41D7E09C32AA3244C867E3247AEAE3724434610B9912CECD151E887DA02A9F7BFFACE5A9C96DEB163 X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu530nj6fImhcD4MUrOEAnl0W826KZ9Q+tr5ycPtXkTV4k65bRjmOUUP8cvGozZ33TWg5HZplvhhXbhDGzqmQDTd6OAevLeAnq3Ra9uf7zvY2zzsIhlcp/Y7m53TZgf2aB4JOg4gkr2biojWJZv20R+6Uh6ldRbE07Ilg== X-Mailru-Sender: 5C3750E245F362008BC1685FEC6306ED11EC9C2EFE0F886DC147602D5529D52FBE4EBEF89FC7D6FA5105BD0848736F9966FEC6BF5C9C28D97E07721503EA2E00ED97202A5A4E92BF7402F9BA4338D657ED14614B50AE0675 X-Mras: Ok Subject: [Tarantool-patches] [PATCH v4 13/53] sql: introduce mem_copy_as_ephemeral() 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 intoduces mem_copy_as_ephemeral(). This function copies value from source MEM to destination MEM. In case value is of string or binary type and its allocation type is not static, it copied as value with ephemeral allocation type. Part of #5818 --- src/box/sql/mem.c | 58 ++++++++++++++++++++-------------------------- src/box/sql/mem.h | 15 ++++++------ src/box/sql/vdbe.c | 10 ++++---- 3 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c index f12441d7c..30c568970 100644 --- a/src/box/sql/mem.c +++ b/src/box/sql/mem.c @@ -289,6 +289,25 @@ mem_copy(struct Mem *to, const struct Mem *from) return 0; } +int +mem_copy_as_ephemeral(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 | MEM_Ephem)) != 0) + return 0; + to->flags &= (MEM_Str | MEM_Blob | MEM_Term | MEM_Zero | MEM_Subtype); + to->flags |= MEM_Ephem; + return 0; +} + static inline bool mem_has_msgpack_subtype(struct Mem *mem) { @@ -400,20 +419,6 @@ vdbeMemAddTerminator(Mem * pMem) return 0; } -/* - * Make an shallow copy of pFrom into pTo. Prior contents of - * pTo are freed. The pFrom->z field is not duplicated. If - * pFrom->z is used, then pTo->z points to the same thing as pFrom->z - * and flags gets srcType (either MEM_Ephem or MEM_Static). - */ -static SQL_NOINLINE void -vdbeClrCopy(Mem * pTo, const Mem * pFrom, int eType) -{ - mem_clear(pTo); - assert(!VdbeMemDynamic(pTo)); - sqlVdbeMemShallowCopy(pTo, pFrom, eType); -} - /* * Both *pMem1 and *pMem2 contain string values. Compare the two values * using the collation sequence pColl. As usual, return a negative , zero @@ -593,9 +598,12 @@ sqlVdbeMemAboutToChange(Vdbe * pVdbe, Mem * pMem) int i; Mem *pX; for (i = 0, pX = pVdbe->aMem; i < pVdbe->nMem; i++, pX++) { - if (pX->pScopyFrom == pMem) { - pX->flags |= MEM_Undefined; - pX->pScopyFrom = 0; + if ((pX->flags & (MEM_Blob | MEM_Str)) != 0 && + (pX->flags & (MEM_Ephem | MEM_Static)) == 0) { + if (pX->pScopyFrom == pMem) { + pX->flags |= MEM_Undefined; + pX->pScopyFrom = 0; + } } } pMem->pScopyFrom = 0; @@ -2025,22 +2033,6 @@ vdbe_mem_alloc_blob_region(struct Mem *vdbe_mem, uint32_t size) return 0; } -void -sqlVdbeMemShallowCopy(Mem * pTo, const Mem * pFrom, int srcType) -{ - assert(pTo->db == pFrom->db); - if (VdbeMemDynamic(pTo)) { - vdbeClrCopy(pTo, pFrom, srcType); - return; - } - memcpy(pTo, pFrom, MEMCELLSIZE); - if ((pFrom->flags & MEM_Static) == 0) { - pTo->flags &= ~(MEM_Dyn | MEM_Static | MEM_Ephem); - assert(srcType == MEM_Ephem || srcType == MEM_Static); - pTo->flags |= srcType; - } -} - /* * Transfer the contents of pFrom to pTo. Any existing value in pTo is * freed. If pFrom contains ephemeral data, a copy is made. diff --git a/src/box/sql/mem.h b/src/box/sql/mem.h index fb649891a..58220d215 100644 --- a/src/box/sql/mem.h +++ b/src/box/sql/mem.h @@ -81,12 +81,6 @@ struct Mem { #endif }; -/* - * Size of struct Mem not including the Mem.zMalloc member or anything that - * follows. - */ -#define MEMCELLSIZE offsetof(Mem,zMalloc) - bool mem_is_null(const struct Mem *mem); @@ -177,6 +171,14 @@ mem_destroy(struct Mem *mem); int mem_copy(struct Mem *to, const struct Mem *from); +/** + * 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 as + * value with ephemeral allocation type. + */ +int +mem_copy_as_ephemeral(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. * @@ -493,7 +495,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 sqlVdbeMemShallowCopy(Mem *, const Mem *, int); void sqlVdbeMemMove(Mem *, Mem *); int sqlVdbeMemMakeWriteable(Mem *); diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index 05e0f78c1..55083fb23 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -917,7 +917,7 @@ case OP_Variable: { /* out2 */ goto too_big; } pOut = vdbe_prepare_null_out(p, pOp->p2); - sqlVdbeMemShallowCopy(pOut, pVar, MEM_Static); + mem_copy_as_ephemeral(pOut, pVar); UPDATE_MAX_BLOBSIZE(pOut); break; } @@ -979,7 +979,7 @@ case OP_Copy: { pOut = &aMem[pOp->p2]; assert(pOut!=pIn1); while( 1) { - sqlVdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); + mem_copy_as_ephemeral(pOut, pIn1); Deephemeralize(pOut); #ifdef SQL_DEBUG pOut->pScopyFrom = 0; @@ -1009,7 +1009,7 @@ case OP_SCopy: { /* out2 */ pIn1 = &aMem[pOp->p1]; pOut = &aMem[pOp->p2]; assert(pOut!=pIn1); - sqlVdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); + mem_copy_as_ephemeral(pOut, pIn1); #ifdef SQL_DEBUG if (pOut->pScopyFrom==0) pOut->pScopyFrom = pIn1; #endif @@ -2295,7 +2295,7 @@ case OP_Column: { if (mem_is_null(pDest) && (uint32_t) p2 >= pC->field_ref.field_count && default_val_mem != NULL) { - sqlVdbeMemShallowCopy(pDest, default_val_mem, MEM_Static); + mem_copy_as_ephemeral(pDest, default_val_mem); } pDest->field_type = field_type; op_column_out: @@ -4473,7 +4473,7 @@ case OP_Param: { /* out2 */ pOut = vdbe_prepare_null_out(p, pOp->p2); pFrame = p->pFrame; pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; - sqlVdbeMemShallowCopy(pOut, pIn, MEM_Ephem); + mem_copy_as_ephemeral(pOut, pIn); break; } -- 2.25.1