mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Add the OP_FinishSeek opcode which completes an OP_DeferredSeek if the seek
has not already completed. Also add the sqlite3WhereUsesDeferredSeek() interface to the query planner. The UPDATE implementation adds an OP_FinishSeek before running the final OP_Insert if one is needed. Ticket [ec8abb025e78f40c] and also an assertion fault reported by Yongheng. FossilOrigin-Name: 21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0
This commit is contained in:
19
src/vdbe.c
19
src/vdbe.c
@@ -4827,6 +4827,7 @@ case OP_Insert: {
|
||||
pC = p->apCsr[pOp->p1];
|
||||
assert( pC!=0 );
|
||||
assert( pC->eCurType==CURTYPE_BTREE );
|
||||
assert( pC->deferredMoveto==0 );
|
||||
assert( pC->uc.pCursor!=0 );
|
||||
assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable );
|
||||
assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC );
|
||||
@@ -5700,6 +5701,24 @@ case OP_IdxRowid: { /* out2 */
|
||||
break;
|
||||
}
|
||||
|
||||
/* Opcode: FinishSeek P1 * * * *
|
||||
**
|
||||
** If cursor P1 was previously moved via OP_DeferredSeek, complete that
|
||||
** seek operation now, without further delay. If the cursor seek has
|
||||
** already occurred, this instruction is a no-op.
|
||||
*/
|
||||
case OP_FinishSeek: {
|
||||
VdbeCursor *pC; /* The P1 index cursor */
|
||||
|
||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||
pC = p->apCsr[pOp->p1];
|
||||
if( pC->deferredMoveto ){
|
||||
rc = sqlite3VdbeFinishMoveto(pC);
|
||||
if( rc ) goto abort_due_to_error;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Opcode: IdxGE P1 P2 P3 P4 P5
|
||||
** Synopsis: key=r[P3@P4]
|
||||
**
|
||||
|
Reference in New Issue
Block a user