mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-10 01:02:56 +03:00
Allocates VDBE cursors one by one in separate memory so that pointers to
cursors can persist through a realloc(). (CVS 1383) FossilOrigin-Name: d8bacc16801606176fe8639b2f55b4584ad549df
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Cache\srecord\sheaders\sin\sthe\sOP_Column\sopcode.\s(CVS\s1382)
|
C Allocates\sVDBE\scursors\sone\sby\sone\sin\sseparate\smemory\sso\sthat\spointers\sto\ncursors\scan\spersist\sthrough\sa\srealloc().\s(CVS\s1383)
|
||||||
D 2004-05-14T21:12:23
|
D 2004-05-14T21:59:40
|
||||||
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
|
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
|
||||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@@ -63,10 +63,10 @@ F src/update.c 0441f8b64d616ef244583449e66c984e536c6c9b
|
|||||||
F src/utf.c fc799748d43fe1982d157b871e3e420a19c85d4f
|
F src/utf.c fc799748d43fe1982d157b871e3e420a19c85d4f
|
||||||
F src/util.c f9511ffba78e6cf71a28774c2820d7750b5bacdf
|
F src/util.c f9511ffba78e6cf71a28774c2820d7750b5bacdf
|
||||||
F src/vacuum.c c134702e023db8778e6be59ac0ea7b02315b5476
|
F src/vacuum.c c134702e023db8778e6be59ac0ea7b02315b5476
|
||||||
F src/vdbe.c 90018d7938d36daec5caf3fb4c3833bcd803b061
|
F src/vdbe.c c12726cf16c9a4e70ff606f87dc0e10e55a11988
|
||||||
F src/vdbe.h 94457ca73bae972dc61bca33a4dccc2e6e14e2f8
|
F src/vdbe.h 94457ca73bae972dc61bca33a4dccc2e6e14e2f8
|
||||||
F src/vdbeInt.h 6740a3b80d437e9a6b3710aead703690fc0d1ddc
|
F src/vdbeInt.h 67c3b2cf924e176c10ba75b36d295b165d55c451
|
||||||
F src/vdbeaux.c 38f924db0aa31c13d556bd65ad129d6f5d8c0a27
|
F src/vdbeaux.c 8411f411b421bc19ded1e992db82434aef740f5f
|
||||||
F src/where.c 6957bbd333cc7ffa7b3878adbe67a095319daa54
|
F src/where.c 6957bbd333cc7ffa7b3878adbe67a095319daa54
|
||||||
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
|
F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242
|
||||||
F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83
|
F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83
|
||||||
@@ -191,7 +191,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
|||||||
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
||||||
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
||||||
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
||||||
P cf75cac9b6bd43e60c6e25042b194ec5c60e5671
|
P 8d9eab178f285415775060369f372a88c7091f9f
|
||||||
R 1c44996f87c60027ab5d6785ca9e8bee
|
R b51b67250edc5f732aa65343a7a205f1
|
||||||
U drh
|
U drh
|
||||||
Z d44c78218fc520c849f4d72442c0d411
|
Z 23e87bbd07c6c07486d74ecaf3cab33d
|
||||||
|
@@ -1 +1 @@
|
|||||||
8d9eab178f285415775060369f372a88c7091f9f
|
d8bacc16801606176fe8639b2f55b4584ad549df
|
90
src/vdbe.c
90
src/vdbe.c
@@ -43,7 +43,7 @@
|
|||||||
** in this file for details. If in doubt, do not deviate from existing
|
** in this file for details. If in doubt, do not deviate from existing
|
||||||
** commenting and indentation practices when changing or adding code.
|
** commenting and indentation practices when changing or adding code.
|
||||||
**
|
**
|
||||||
** $Id: vdbe.c,v 1.292 2004/05/14 21:12:23 drh Exp $
|
** $Id: vdbe.c,v 1.293 2004/05/14 21:59:40 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
@@ -413,11 +413,13 @@ static char *vdbe_fgets(char *zBuf, int nBuf, FILE *in){
|
|||||||
*/
|
*/
|
||||||
static int expandCursorArraySize(Vdbe *p, int mxCursor){
|
static int expandCursorArraySize(Vdbe *p, int mxCursor){
|
||||||
if( mxCursor>=p->nCursor ){
|
if( mxCursor>=p->nCursor ){
|
||||||
Cursor *aCsr = sqliteRealloc( p->aCsr, (mxCursor+1)*sizeof(Cursor) );
|
p->apCsr = sqliteRealloc( p->apCsr, (mxCursor+1)*sizeof(Cursor*) );
|
||||||
if( aCsr==0 ) return 1;
|
if( p->apCsr==0 ) return 1;
|
||||||
p->aCsr = aCsr;
|
while( p->nCursor<=mxCursor ){
|
||||||
memset(&p->aCsr[p->nCursor], 0, sizeof(Cursor)*(mxCursor+1-p->nCursor));
|
Cursor *pC;
|
||||||
p->nCursor = mxCursor+1;
|
p->apCsr[p->nCursor++] = pC = sqliteMalloc( sizeof(Cursor) );
|
||||||
|
if( pC==0 ) return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -562,9 +564,6 @@ int sqlite3VdbeExec(
|
|||||||
int nProgressOps = 0; /* Opcodes executed since progress callback. */
|
int nProgressOps = 0; /* Opcodes executed since progress callback. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* FIX ME. */
|
|
||||||
expandCursorArraySize(p, 100);
|
|
||||||
|
|
||||||
if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE;
|
if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE;
|
||||||
assert( db->magic==SQLITE_MAGIC_BUSY );
|
assert( db->magic==SQLITE_MAGIC_BUSY );
|
||||||
assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
|
assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
|
||||||
@@ -1921,7 +1920,7 @@ case OP_Column: {
|
|||||||
zRec = pTos[i].z;
|
zRec = pTos[i].z;
|
||||||
payloadSize = pTos[i].n;
|
payloadSize = pTos[i].n;
|
||||||
pC->cacheValid = 0;
|
pC->cacheValid = 0;
|
||||||
}else if( (pC = &p->aCsr[i])->pCursor!=0 ){
|
}else if( (pC = p->apCsr[i])->pCursor!=0 ){
|
||||||
sqlite3VdbeCursorMoveto(pC);
|
sqlite3VdbeCursorMoveto(pC);
|
||||||
zRec = 0;
|
zRec = 0;
|
||||||
pCrsr = pC->pCursor;
|
pCrsr = pC->pCursor;
|
||||||
@@ -2623,9 +2622,8 @@ case OP_OpenWrite: {
|
|||||||
}
|
}
|
||||||
assert( i>=0 );
|
assert( i>=0 );
|
||||||
if( expandCursorArraySize(p, i) ) goto no_mem;
|
if( expandCursorArraySize(p, i) ) goto no_mem;
|
||||||
pCur = &p->aCsr[i];
|
pCur = p->apCsr[i];
|
||||||
sqlite3VdbeCleanupCursor(pCur);
|
sqlite3VdbeCleanupCursor(pCur);
|
||||||
memset(pCur, 0, sizeof(Cursor));
|
|
||||||
pCur->nullRow = 1;
|
pCur->nullRow = 1;
|
||||||
if( pX==0 ) break;
|
if( pX==0 ) break;
|
||||||
do{
|
do{
|
||||||
@@ -2691,7 +2689,7 @@ case OP_OpenTemp: {
|
|||||||
Cursor *pCx;
|
Cursor *pCx;
|
||||||
assert( i>=0 );
|
assert( i>=0 );
|
||||||
if( expandCursorArraySize(p, i) ) goto no_mem;
|
if( expandCursorArraySize(p, i) ) goto no_mem;
|
||||||
pCx = &p->aCsr[i];
|
pCx = p->apCsr[i];
|
||||||
sqlite3VdbeCleanupCursor(pCx);
|
sqlite3VdbeCleanupCursor(pCx);
|
||||||
memset(pCx, 0, sizeof(*pCx));
|
memset(pCx, 0, sizeof(*pCx));
|
||||||
pCx->nullRow = 1;
|
pCx->nullRow = 1;
|
||||||
@@ -2736,7 +2734,7 @@ case OP_OpenPseudo: {
|
|||||||
Cursor *pCx;
|
Cursor *pCx;
|
||||||
assert( i>=0 );
|
assert( i>=0 );
|
||||||
if( expandCursorArraySize(p, i) ) goto no_mem;
|
if( expandCursorArraySize(p, i) ) goto no_mem;
|
||||||
pCx = &p->aCsr[i];
|
pCx = p->apCsr[i];
|
||||||
sqlite3VdbeCleanupCursor(pCx);
|
sqlite3VdbeCleanupCursor(pCx);
|
||||||
memset(pCx, 0, sizeof(*pCx));
|
memset(pCx, 0, sizeof(*pCx));
|
||||||
pCx->nullRow = 1;
|
pCx->nullRow = 1;
|
||||||
@@ -2752,7 +2750,7 @@ case OP_OpenPseudo: {
|
|||||||
case OP_Close: {
|
case OP_Close: {
|
||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
if( i>=0 && i<p->nCursor ){
|
if( i>=0 && i<p->nCursor ){
|
||||||
sqlite3VdbeCleanupCursor(&p->aCsr[i]);
|
sqlite3VdbeCleanupCursor(p->apCsr[i]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2795,7 +2793,7 @@ case OP_MoveTo: {
|
|||||||
|
|
||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
if( pC->pCursor!=0 ){
|
if( pC->pCursor!=0 ){
|
||||||
int res, oc;
|
int res, oc;
|
||||||
pC->nullRow = 0;
|
pC->nullRow = 0;
|
||||||
@@ -2895,7 +2893,7 @@ case OP_Found: {
|
|||||||
Cursor *pC;
|
Cursor *pC;
|
||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
if( (pC = &p->aCsr[i])->pCursor!=0 ){
|
if( (pC = p->apCsr[i])->pCursor!=0 ){
|
||||||
int res, rx;
|
int res, rx;
|
||||||
assert( pC->intKey==0 );
|
assert( pC->intKey==0 );
|
||||||
Stringify(pTos);
|
Stringify(pTos);
|
||||||
@@ -2950,7 +2948,7 @@ case OP_IsUnique: {
|
|||||||
R = pTos->i;
|
R = pTos->i;
|
||||||
pTos--;
|
pTos--;
|
||||||
assert( i>=0 && i<=p->nCursor );
|
assert( i>=0 && i<=p->nCursor );
|
||||||
pCx = &p->aCsr[i];
|
pCx = p->apCsr[i];
|
||||||
pCrsr = pCx->pCursor;
|
pCrsr = pCx->pCursor;
|
||||||
if( pCrsr!=0 ){
|
if( pCrsr!=0 ){
|
||||||
int res, rc;
|
int res, rc;
|
||||||
@@ -3034,11 +3032,11 @@ case OP_NotExists: {
|
|||||||
BtCursor *pCrsr;
|
BtCursor *pCrsr;
|
||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
if( (pCrsr = (pC = &p->aCsr[i])->pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
int res, rx;
|
int res, rx;
|
||||||
u64 iKey;
|
u64 iKey;
|
||||||
assert( pTos->flags & MEM_Int );
|
assert( pTos->flags & MEM_Int );
|
||||||
assert( p->aCsr[i].intKey );
|
assert( p->apCsr[i]->intKey );
|
||||||
iKey = intToKey(pTos->i);
|
iKey = intToKey(pTos->i);
|
||||||
rx = sqlite3BtreeMoveto(pCrsr, 0, iKey, &res);
|
rx = sqlite3BtreeMoveto(pCrsr, 0, iKey, &res);
|
||||||
pC->lastRecno = pTos->i;
|
pC->lastRecno = pTos->i;
|
||||||
@@ -3067,7 +3065,7 @@ case OP_NewRecno: {
|
|||||||
i64 v = 0;
|
i64 v = 0;
|
||||||
Cursor *pC;
|
Cursor *pC;
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
if( (pC = &p->aCsr[i])->pCursor==0 ){
|
if( (pC = p->apCsr[i])->pCursor==0 ){
|
||||||
/* The zero initialization above is all that is needed */
|
/* The zero initialization above is all that is needed */
|
||||||
}else{
|
}else{
|
||||||
/* The next rowid or record number (different terms for the same
|
/* The next rowid or record number (different terms for the same
|
||||||
@@ -3195,7 +3193,7 @@ case OP_PutStrKey: {
|
|||||||
Cursor *pC;
|
Cursor *pC;
|
||||||
assert( pNos>=p->aStack );
|
assert( pNos>=p->aStack );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
if( ((pC = &p->aCsr[i])->pCursor!=0 || pC->pseudoTable) ){
|
if( ((pC = p->apCsr[i])->pCursor!=0 || pC->pseudoTable) ){
|
||||||
char *zKey;
|
char *zKey;
|
||||||
i64 nKey;
|
i64 nKey;
|
||||||
i64 iKey;
|
i64 iKey;
|
||||||
@@ -3282,7 +3280,7 @@ case OP_Delete: {
|
|||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
Cursor *pC;
|
Cursor *pC;
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
if( pC->pCursor!=0 ){
|
if( pC->pCursor!=0 ){
|
||||||
sqlite3VdbeCursorMoveto(pC);
|
sqlite3VdbeCursorMoveto(pC);
|
||||||
rc = sqlite3BtreeDelete(pC->pCursor);
|
rc = sqlite3BtreeDelete(pC->pCursor);
|
||||||
@@ -3315,7 +3313,7 @@ case OP_SetCounts: {
|
|||||||
case OP_KeyAsData: {
|
case OP_KeyAsData: {
|
||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
p->aCsr[i].keyAsData = pOp->p2;
|
p->apCsr[i]->keyAsData = pOp->p2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3345,7 +3343,7 @@ case OP_RowData: {
|
|||||||
|
|
||||||
pTos++;
|
pTos++;
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
if( pC->nullRow ){
|
if( pC->nullRow ){
|
||||||
pTos->flags = MEM_Null;
|
pTos->flags = MEM_Null;
|
||||||
}else if( pC->pCursor!=0 ){
|
}else if( pC->pCursor!=0 ){
|
||||||
@@ -3400,7 +3398,7 @@ case OP_Recno: {
|
|||||||
i64 v;
|
i64 v;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
sqlite3VdbeCursorMoveto(pC);
|
sqlite3VdbeCursorMoveto(pC);
|
||||||
pTos++;
|
pTos++;
|
||||||
if( pC->recnoIsValid ){
|
if( pC->recnoIsValid ){
|
||||||
@@ -3434,17 +3432,18 @@ case OP_Recno: {
|
|||||||
case OP_FullKey: {
|
case OP_FullKey: {
|
||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
BtCursor *pCrsr;
|
BtCursor *pCrsr;
|
||||||
|
Cursor *pC;
|
||||||
|
|
||||||
assert( p->aCsr[i].keyAsData );
|
assert( p->apCsr[i]->keyAsData );
|
||||||
assert( !p->aCsr[i].pseudoTable );
|
assert( !p->apCsr[i]->pseudoTable );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pTos++;
|
pTos++;
|
||||||
if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
u64 amt;
|
u64 amt;
|
||||||
char *z;
|
char *z;
|
||||||
|
|
||||||
sqlite3VdbeCursorMoveto(&p->aCsr[i]);
|
sqlite3VdbeCursorMoveto(pC);
|
||||||
assert( p->aCsr[i].intKey==0 );
|
assert( pC->intKey==0 );
|
||||||
sqlite3BtreeKeySize(pCrsr, &amt);
|
sqlite3BtreeKeySize(pCrsr, &amt);
|
||||||
if( amt<=0 ){
|
if( amt<=0 ){
|
||||||
rc = SQLITE_CORRUPT;
|
rc = SQLITE_CORRUPT;
|
||||||
@@ -3473,10 +3472,12 @@ case OP_FullKey: {
|
|||||||
*/
|
*/
|
||||||
case OP_NullRow: {
|
case OP_NullRow: {
|
||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
|
Cursor *pC;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
p->aCsr[i].nullRow = 1;
|
pC = p->apCsr[i];
|
||||||
p->aCsr[i].recnoIsValid = 0;
|
pC->nullRow = 1;
|
||||||
|
pC->recnoIsValid = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3494,7 +3495,7 @@ case OP_Last: {
|
|||||||
BtCursor *pCrsr;
|
BtCursor *pCrsr;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
if( (pCrsr = pC->pCursor)!=0 ){
|
if( (pCrsr = pC->pCursor)!=0 ){
|
||||||
int res;
|
int res;
|
||||||
rc = sqlite3BtreeLast(pCrsr, &res);
|
rc = sqlite3BtreeLast(pCrsr, &res);
|
||||||
@@ -3525,7 +3526,7 @@ case OP_Rewind: {
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pC = &p->aCsr[i];
|
pC = p->apCsr[i];
|
||||||
if( (pCrsr = pC->pCursor)!=0 ){
|
if( (pCrsr = pC->pCursor)!=0 ){
|
||||||
rc = sqlite3BtreeFirst(pCrsr, &res);
|
rc = sqlite3BtreeFirst(pCrsr, &res);
|
||||||
pC->atFirst = res==0;
|
pC->atFirst = res==0;
|
||||||
@@ -3564,7 +3565,7 @@ case OP_Next: {
|
|||||||
|
|
||||||
CHECK_FOR_INTERRUPT;
|
CHECK_FOR_INTERRUPT;
|
||||||
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
|
||||||
pC = &p->aCsr[pOp->p1];
|
pC = p->apCsr[pOp->p1];
|
||||||
if( (pCrsr = pC->pCursor)!=0 ){
|
if( (pCrsr = pC->pCursor)!=0 ){
|
||||||
int res;
|
int res;
|
||||||
if( pC->nullRow ){
|
if( pC->nullRow ){
|
||||||
@@ -3605,7 +3606,7 @@ case OP_IdxPut: {
|
|||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
assert( pTos->flags & MEM_Str );
|
assert( pTos->flags & MEM_Str );
|
||||||
if( (pCrsr = (pC = &p->aCsr[i])->pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
int nKey = pTos->n;
|
int nKey = pTos->n;
|
||||||
const char *zKey = pTos->z;
|
const char *zKey = pTos->z;
|
||||||
if( pOp->p2 ){
|
if( pOp->p2 ){
|
||||||
@@ -3662,7 +3663,7 @@ case OP_IdxDelete: {
|
|||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
assert( pTos->flags & MEM_Str );
|
assert( pTos->flags & MEM_Str );
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
if( (pCrsr = (pC = &p->aCsr[i])->pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
int rx, res;
|
int rx, res;
|
||||||
rx = sqlite3BtreeMoveto(pCrsr, pTos->z, pTos->n, &res);
|
rx = sqlite3BtreeMoveto(pCrsr, pTos->z, pTos->n, &res);
|
||||||
if( rx==SQLITE_OK && res==0 ){
|
if( rx==SQLITE_OK && res==0 ){
|
||||||
@@ -3687,14 +3688,15 @@ case OP_IdxDelete: {
|
|||||||
case OP_IdxRecno: {
|
case OP_IdxRecno: {
|
||||||
int i = pOp->p1;
|
int i = pOp->p1;
|
||||||
BtCursor *pCrsr;
|
BtCursor *pCrsr;
|
||||||
|
Cursor *pC;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
pTos++;
|
pTos++;
|
||||||
if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
i64 rowid;
|
i64 rowid;
|
||||||
|
|
||||||
assert( p->aCsr[i].deferredMoveto==0 );
|
assert( pC->deferredMoveto==0 );
|
||||||
assert( p->aCsr[i].intKey==0 );
|
assert( pC->intKey==0 );
|
||||||
rc = sqlite3VdbeIdxRowid(pCrsr, &rowid);
|
rc = sqlite3VdbeIdxRowid(pCrsr, &rowid);
|
||||||
if( rc!=SQLITE_OK ){
|
if( rc!=SQLITE_OK ){
|
||||||
goto abort_due_to_error;
|
goto abort_due_to_error;
|
||||||
@@ -3769,15 +3771,15 @@ case OP_IdxGT:
|
|||||||
case OP_IdxGE: {
|
case OP_IdxGE: {
|
||||||
int i= pOp->p1;
|
int i= pOp->p1;
|
||||||
BtCursor *pCrsr;
|
BtCursor *pCrsr;
|
||||||
|
Cursor *pC;
|
||||||
|
|
||||||
assert( i>=0 && i<p->nCursor );
|
assert( i>=0 && i<p->nCursor );
|
||||||
assert( pTos>=p->aStack );
|
assert( pTos>=p->aStack );
|
||||||
if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
|
if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){
|
||||||
int res, rc;
|
int res, rc;
|
||||||
Cursor *pC = &p->aCsr[i];
|
|
||||||
|
|
||||||
Stringify(pTos);
|
Stringify(pTos);
|
||||||
assert( p->aCsr[i].deferredMoveto==0 );
|
assert( pC->deferredMoveto==0 );
|
||||||
if( pOp->p3 ){
|
if( pOp->p3 ){
|
||||||
pC->incrKey = 1;
|
pC->incrKey = 1;
|
||||||
}
|
}
|
||||||
|
@@ -265,8 +265,8 @@ struct Vdbe {
|
|||||||
Mem *pTos; /* Top entry in the operand stack */
|
Mem *pTos; /* Top entry in the operand stack */
|
||||||
char **zArgv; /* Text values used by the callback */
|
char **zArgv; /* Text values used by the callback */
|
||||||
char **azColName; /* Becomes the 4th parameter to callbacks */
|
char **azColName; /* Becomes the 4th parameter to callbacks */
|
||||||
int nCursor; /* Number of slots in aCsr[] */
|
int nCursor; /* Number of slots in apCsr[] */
|
||||||
Cursor *aCsr; /* One element of this array for each open cursor */
|
Cursor **apCsr; /* One element of this array for each open cursor */
|
||||||
Sorter *pSort; /* A linked list of objects to be sorted */
|
Sorter *pSort; /* A linked list of objects to be sorted */
|
||||||
FILE *pFile; /* At most one open file handler */
|
FILE *pFile; /* At most one open file handler */
|
||||||
int nField; /* Number of file fields */
|
int nField; /* Number of file fields */
|
||||||
|
@@ -736,7 +736,7 @@ void sqlite3VdbeCleanupCursor(Cursor *pCx){
|
|||||||
}
|
}
|
||||||
sqliteFree(pCx->pData);
|
sqliteFree(pCx->pData);
|
||||||
sqliteFree(pCx->aType);
|
sqliteFree(pCx->aType);
|
||||||
memset(pCx, 0, sizeof(Cursor));
|
memset(pCx, 0, sizeof(*pCx));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -745,10 +745,12 @@ void sqlite3VdbeCleanupCursor(Cursor *pCx){
|
|||||||
static void closeAllCursors(Vdbe *p){
|
static void closeAllCursors(Vdbe *p){
|
||||||
int i;
|
int i;
|
||||||
for(i=0; i<p->nCursor; i++){
|
for(i=0; i<p->nCursor; i++){
|
||||||
sqlite3VdbeCleanupCursor(&p->aCsr[i]);
|
Cursor *pC = p->apCsr[i];
|
||||||
|
sqlite3VdbeCleanupCursor(pC);
|
||||||
|
sqliteFree(pC);
|
||||||
}
|
}
|
||||||
sqliteFree(p->aCsr);
|
sqliteFree(p->apCsr);
|
||||||
p->aCsr = 0;
|
p->apCsr = 0;
|
||||||
p->nCursor = 0;
|
p->nCursor = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user