mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-21 09:00:59 +03:00
When an INSERT is receiving content from a SELECT, run an OP_ReleaseReg opcode
at the top of each iteration of the loop in order to prevent spurious OP_SCopy misuse complaints. Ticket [de4b04149b9fdeae] FossilOrigin-Name: 6afadd3b3a40b0ef29fd14fb24c2a4b9479483e5f8b9125ce02d8daae662207f
This commit is contained in:
10
src/insert.c
10
src/insert.c
@@ -1020,6 +1020,7 @@ void sqlite3Insert(
|
||||
** goto C
|
||||
** D: ...
|
||||
*/
|
||||
sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0);
|
||||
addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm);
|
||||
VdbeCoverage(v);
|
||||
if( ipkColumn>=0 ){
|
||||
@@ -1280,6 +1281,15 @@ void sqlite3Insert(
|
||||
sqlite3VdbeAddOp1(v, OP_Close, srcTab);
|
||||
}else if( pSelect ){
|
||||
sqlite3VdbeGoto(v, addrCont);
|
||||
#ifdef SQLITE_DEBUG
|
||||
/* If we are jumping back to an OP_Yield that is preceded by an
|
||||
** OP_ReleaseReg, set the p5 flag on the OP_Goto so that the
|
||||
** OP_ReleaseReg will be included in the loop. */
|
||||
if( sqlite3VdbeGetOp(v, addrCont-1)->opcode==OP_ReleaseReg ){
|
||||
assert( sqlite3VdbeGetOp(v, addrCont)->opcode==OP_Yield );
|
||||
sqlite3VdbeChangeP5(v, 1);
|
||||
}
|
||||
#endif
|
||||
sqlite3VdbeJumpHere(v, addrInsTop);
|
||||
}
|
||||
|
||||
|
||||
14
src/vdbe.c
14
src/vdbe.c
@@ -845,6 +845,20 @@ int sqlite3VdbeExec(
|
||||
** to the current line should be indented for EXPLAIN output.
|
||||
*/
|
||||
case OP_Goto: { /* jump */
|
||||
|
||||
#ifdef SQLITE_DEBUG
|
||||
/* In debuggging mode, when the p5 flags is set on an OP_Goto, that
|
||||
** means we should really jump back to the preceeding OP_ReleaseReg
|
||||
** instruction. */
|
||||
if( pOp->p5 ){
|
||||
assert( pOp->p2 < (int)(pOp - aOp) );
|
||||
assert( pOp->p2 > 1 );
|
||||
pOp = &aOp[pOp->p2 - 2];
|
||||
assert( pOp[1].opcode==OP_ReleaseReg );
|
||||
goto check_for_interrupt;
|
||||
}
|
||||
#endif
|
||||
|
||||
jump_to_p2_and_check_for_interrupt:
|
||||
pOp = &aOp[pOp->p2 - 1];
|
||||
|
||||
|
||||
@@ -870,8 +870,8 @@ static void constructAutomaticIndex(
|
||||
pTabItem->fg.viaCoroutine = 0;
|
||||
}else{
|
||||
sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v);
|
||||
sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX);
|
||||
}
|
||||
sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX);
|
||||
sqlite3VdbeJumpHere(v, addrTop);
|
||||
sqlite3ReleaseTempReg(pParse, regRecord);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user