mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Initial implementation of an optimization that attempts to reuse the same
materialization of a view on a self-join of the view. FossilOrigin-Name: 478c34b9a8b5127d13024e10307aa832f160b89720c46424dd17555bd36f590d
This commit is contained in:
28
src/vdbe.c
28
src/vdbe.c
@@ -3540,6 +3540,34 @@ open_cursor_set_hints:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Opcode: OpenDup P1 P2 * * *
|
||||
**
|
||||
** Open a new cursor P1 that points to the same ephemeral table as
|
||||
** cursor P2. The P2 cursor must have been opened by a prior OP_OpenEphemeral
|
||||
** opcode. Only ephemeral cursors may be duplicated.
|
||||
**
|
||||
** Duplicate ephemeral cursors are used for self-joins of materialized views.
|
||||
*/
|
||||
case OP_OpenDup: {
|
||||
VdbeCursor *pOrig; /* The original cursor to be duplicated */
|
||||
VdbeCursor *pCx; /* The new cursor */
|
||||
|
||||
pOrig = p->apCsr[pOp->p2];
|
||||
assert( pOrig->pBtx!=0 ); /* Only ephemeral cursors can be duplicated */
|
||||
|
||||
pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE);
|
||||
if( pCx==0 ) goto no_mem;
|
||||
pCx->nullRow = 1;
|
||||
pCx->isEphemeral = 1;
|
||||
pCx->pKeyInfo = pOrig->pKeyInfo;
|
||||
pCx->isTable = pOrig->isTable;
|
||||
rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR,
|
||||
pCx->pKeyInfo, pCx->uc.pCursor);
|
||||
if( rc ) goto abort_due_to_error;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* Opcode: OpenEphemeral P1 P2 * P4 P5
|
||||
** Synopsis: nColumn=P2
|
||||
**
|
||||
|
Reference in New Issue
Block a user