From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id BE8732C8D2 for ; Thu, 29 Nov 2018 08:10:08 -0500 (EST) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id cG8q90IkwMjF for ; Thu, 29 Nov 2018 08:10:08 -0500 (EST) Received: from smtp52.i.mail.ru (smtp52.i.mail.ru [94.100.177.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id D2C4C2C20C for ; Thu, 29 Nov 2018 08:09:56 -0500 (EST) From: Kirill Shcherbatov Subject: [tarantool-patches] [PATCH v1 4/6] sql: release OP_Idx{Insert,Replace} p2 argument Date: Thu, 29 Nov 2018 16:09:48 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-help: List-unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-subscribe: List-owner: List-post: List-archive: To: tarantool-patches@freelists.org, v.shpilevoy@tarantool.org Cc: Kirill Shcherbatov Start using p3 argument instead of p2 argument in OP_Insert and OP_Replace opcodes. The p2 register is typically used for jump to label and resolveP2Values() is able to patch it. As we going to support interrupt handler for OP_Insert and OP_Replace instructions, we need a free p2 register to reuse it by appointment. Need for #3691 --- src/box/sql/delete.c | 2 +- src/box/sql/expr.c | 4 ++-- src/box/sql/insert.c | 2 +- src/box/sql/select.c | 33 +++++++++++++++++++++------------ src/box/sql/update.c | 2 +- src/box/sql/vdbe.c | 10 +++++----- src/box/sql/where.c | 2 +- src/box/sql/wherecode.c | 5 +++-- 8 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c index f9c42fdec..9bb38abe8 100644 --- a/src/box/sql/delete.c +++ b/src/box/sql/delete.c @@ -342,7 +342,7 @@ sql_table_delete_from(struct Parse *parse, struct SrcList *tab_list, * by malloc. */ sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, reg_key, reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, reg_key, 0, reg_eph); } /* If this DELETE cannot use the ONEPASS strategy, diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index b67b22c23..64a13bbb8 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -2864,8 +2864,8 @@ sqlite3CodeSubselect(Parse * pParse, /* Parsing context */ 1, r2, &affinity, 1); sqlite3ExprCacheAffinityChange(pParse, r3, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r2, - reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r2, + 0, reg_eph); } sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); diff --git a/src/box/sql/insert.c b/src/box/sql/insert.c index 6b76bb6da..b099178d7 100644 --- a/src/box/sql/insert.c +++ b/src/box/sql/insert.c @@ -492,7 +492,7 @@ sqlite3Insert(Parse * pParse, /* Parser context */ nColumn + 1, regRec); /* Set flag to save memory allocating one by malloc. */ sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regRec, reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRec, 0, reg_eph); sqlite3VdbeGoto(v, addrL); sqlite3VdbeJumpHere(v, addrL); diff --git a/src/box/sql/select.c b/src/box/sql/select.c index ca709b44f..afb60761f 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -780,7 +780,8 @@ pushOntoSorter(Parse * pParse, /* Parser context */ sqlite3VdbeAddOp2(v, OP_SorterInsert, pSort->iECursor, regRecord); } else { - sqlite3VdbeAddOp2(v, OP_IdxInsert, regRecord, pSort->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRecord, 0, + pSort->reg_eph); } if (iLimit) { @@ -862,7 +863,7 @@ vdbe_insert_distinct(struct Parse *parse, int cursor, int reg_eph, int r1 = sqlite3GetTempReg(parse); sqlite3VdbeAddOp4Int(v, OP_Found, cursor, addr_repeat, reg_data, n); sqlite3VdbeAddOp3(v, OP_MakeRecord, reg_data, n, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, reg_eph); sqlite3ReleaseTempReg(parse, r1); } @@ -1099,7 +1100,8 @@ selectInnerLoop(Parse * pParse, /* The parser context */ r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, + pDest->reg_eph); sqlite3ReleaseTempReg(pParse, r1); break; } @@ -1142,7 +1144,7 @@ selectInnerLoop(Parse * pParse, /* The parser context */ sqlite3VdbeAddOp4Int(v, OP_Found, iParm + 1, addr, r1, 0); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, pDest->reg_eph + 1); assert(pSort == 0); } @@ -1167,7 +1169,8 @@ selectInnerLoop(Parse * pParse, /* The parser context */ sqlite3VdbeAddOp3(v, OP_MakeRecord, regCopy, nResultCol + 1, regRec); /* Set flag to save memory allocating one by malloc. */ sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regRec, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRec, 0, + pDest->reg_eph); sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempRange(pParse, regCopy, nResultCol + 1); } @@ -1197,7 +1200,8 @@ selectInnerLoop(Parse * pParse, /* The parser context */ sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, + pDest->reg_eph); sqlite3ReleaseTempReg(pParse, r1); } break; @@ -1280,7 +1284,7 @@ selectInnerLoop(Parse * pParse, /* The parser context */ sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r3); if (eDest == SRT_DistQueue) { - sqlite3VdbeAddOp2(v, OP_IdxInsert, r3, + sqlite3VdbeAddOp3(v, OP_IdxInsert, r3, 0, pDest->reg_eph + 1); } for (i = 0; i < nKey; i++) { @@ -1291,7 +1295,8 @@ selectInnerLoop(Parse * pParse, /* The parser context */ } sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2 + nKey); sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey + 2, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, + pDest->reg_eph); if (addrTest) sqlite3VdbeJumpHere(v, addrTest); sqlite3ReleaseTempReg(pParse, r1); @@ -1606,7 +1611,8 @@ generateSortTail(Parse * pParse, /* Parsing context */ regTupleid); sqlite3VdbeAddOp3(v, OP_Copy, regRow, regCopy, nSortData - 1); sqlite3VdbeAddOp3(v, OP_MakeRecord, regCopy, nColumn + 1, regRow); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regRow, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRow, 0, + pDest->reg_eph); sqlite3ReleaseTempReg(pParse, regCopy); break; } @@ -1616,7 +1622,8 @@ generateSortTail(Parse * pParse, /* Parsing context */ sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regTupleid, pDest->zAffSdst, nColumn); sqlite3ExprCacheAffinityChange(pParse, regRow, nColumn); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regTupleid, pDest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regTupleid, 0, + pDest->reg_eph); break; } case SRT_Mem:{ @@ -3039,7 +3046,8 @@ generateOutputSubroutine(struct Parse *parse, struct Select *p, in->nSdst + 1, regRec); /* Set flag to save memory allocating one by malloc. */ sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regRec, dest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regRec, 0, + dest->reg_eph); sqlite3ReleaseTempRange(parse, regCopy, in->nSdst + 1); sqlite3ReleaseTempReg(parse, regRec); break; @@ -3055,7 +3063,8 @@ generateOutputSubroutine(struct Parse *parse, struct Select *p, in->nSdst); sqlite3ExprCacheAffinityChange(parse, in->iSdst, in->nSdst); - sqlite3VdbeAddOp2(v, OP_IdxInsert, r1, dest->reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, r1, 0, + dest->reg_eph); sqlite3ReleaseTempReg(parse, r1); break; } diff --git a/src/box/sql/update.c b/src/box/sql/update.c index 0e2d0fde8..cc69e2f30 100644 --- a/src/box/sql/update.c +++ b/src/box/sql/update.c @@ -284,7 +284,7 @@ sqlite3Update(Parse * pParse, /* The parser context */ * malloc. */ sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, regKey, reg_eph); + sqlite3VdbeAddOp3(v, OP_IdxInsert, regKey, 0, reg_eph); } /* End the database scan loop. */ diff --git a/src/box/sql/vdbe.c b/src/box/sql/vdbe.c index bf6f4cdd1..8fdabc212 100644 --- a/src/box/sql/vdbe.c +++ b/src/box/sql/vdbe.c @@ -4392,12 +4392,12 @@ case OP_SorterInsert: { /* in2 */ break; } -/* Opcode: IdxInsert P1 P2 * P4 P5 +/* Opcode: IdxInsert P1 * P3 P4 P5 * Synopsis: key=r[P1] * * @param P1 Index of a register with MessagePack data to insert. - * @param P2 If P4 is not set, then P2 is register containing pointer - * to space to insert into. + * @param P3 If P4 is not set, then P3 is register containing + * pointer to space to insert into. * @param P4 Pointer to the struct space to insert to. * @param P5 Flags. If P5 contains OPFLAG_NCHANGE, then VDBE * accounts the change in a case of successful insertion in @@ -4405,7 +4405,7 @@ case OP_SorterInsert: { /* in2 */ * we are processing INSERT OR INGORE statement. Thus, in * case of conflict we don't raise an error. */ -/* Opcode: IdxReplace2 P1 * * P4 P5 +/* Opcode: IdxReplace2 P1 * P3 P4 P5 * Synopsis: key=r[P1] * * This opcode works exactly as IdxInsert does, but in Tarantool @@ -4424,7 +4424,7 @@ case OP_IdxInsert: { if (pOp->p4type == P4_SPACEPTR) space = pOp->p4.space; else - space = aMem[pOp->p2].u.p; + space = aMem[pOp->p3].u.p; assert(space != NULL); if (space->def->id != 0) { /* Make sure that memory has been allocated on region. */ diff --git a/src/box/sql/where.c b/src/box/sql/where.c index 9c3462bc0..9b0652357 100644 --- a/src/box/sql/where.c +++ b/src/box/sql/where.c @@ -878,7 +878,7 @@ constructAutomaticIndex(Parse * pParse, /* The parsing context */ regRecord = sqlite3GetTempReg(pParse); regBase = sql_generate_index_key(pParse, pIdx, pLevel->iTabCur, regRecord, NULL, 0); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); + sqlite3VdbeAddOp3(v, OP_IdxInsert, pLevel->iIdxCur, 0, regRecord); if (pTabItem->fg.viaCoroutine) { sqlite3VdbeChangeP2(v, addrCounter, regBase + n); translateColumnToCopy(v, addrTop, pLevel->iTabCur, diff --git a/src/box/sql/wherecode.c b/src/box/sql/wherecode.c index b124a1d53..fee13cde3 100644 --- a/src/box/sql/wherecode.c +++ b/src/box/sql/wherecode.c @@ -1550,9 +1550,10 @@ sqlite3WhereCodeOneLoopStart(WhereInfo * pWInfo, /* Complete information about t sqlite3VdbeAddOp3 (v, OP_MakeRecord, r, pk_part_count, regPk); - sqlite3VdbeAddOp2 + sqlite3VdbeAddOp3 (v, OP_IdxInsert, - regPk, reg_row_set); + regPk, 0, + reg_row_set); } /* Release the array of temp registers */ -- 2.19.2