diff --git a/manifest b/manifest index 2eeac7aa21..7380517b45 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Cache\srecord\sheaders\sin\sthe\sOP_Column\sopcode.\s(CVS\s1382) -D 2004-05-14T21:12:23 +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:59:40 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -63,10 +63,10 @@ F src/update.c 0441f8b64d616ef244583449e66c984e536c6c9b F src/utf.c fc799748d43fe1982d157b871e3e420a19c85d4f F src/util.c f9511ffba78e6cf71a28774c2820d7750b5bacdf F src/vacuum.c c134702e023db8778e6be59ac0ea7b02315b5476 -F src/vdbe.c 90018d7938d36daec5caf3fb4c3833bcd803b061 +F src/vdbe.c c12726cf16c9a4e70ff606f87dc0e10e55a11988 F src/vdbe.h 94457ca73bae972dc61bca33a4dccc2e6e14e2f8 -F src/vdbeInt.h 6740a3b80d437e9a6b3710aead703690fc0d1ddc -F src/vdbeaux.c 38f924db0aa31c13d556bd65ad129d6f5d8c0a27 +F src/vdbeInt.h 67c3b2cf924e176c10ba75b36d295b165d55c451 +F src/vdbeaux.c 8411f411b421bc19ded1e992db82434aef740f5f F src/where.c 6957bbd333cc7ffa7b3878adbe67a095319daa54 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83 @@ -191,7 +191,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P cf75cac9b6bd43e60c6e25042b194ec5c60e5671 -R 1c44996f87c60027ab5d6785ca9e8bee +P 8d9eab178f285415775060369f372a88c7091f9f +R b51b67250edc5f732aa65343a7a205f1 U drh -Z d44c78218fc520c849f4d72442c0d411 +Z 23e87bbd07c6c07486d74ecaf3cab33d diff --git a/manifest.uuid b/manifest.uuid index bfb52e9896..0c33c7c0e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8d9eab178f285415775060369f372a88c7091f9f \ No newline at end of file +d8bacc16801606176fe8639b2f55b4584ad549df \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index a024cd9ff3..c4223c6f32 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,7 +43,7 @@ ** in this file for details. If in doubt, do not deviate from existing ** 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 "os.h" @@ -413,11 +413,13 @@ static char *vdbe_fgets(char *zBuf, int nBuf, FILE *in){ */ static int expandCursorArraySize(Vdbe *p, int mxCursor){ if( mxCursor>=p->nCursor ){ - Cursor *aCsr = sqliteRealloc( p->aCsr, (mxCursor+1)*sizeof(Cursor) ); - if( aCsr==0 ) return 1; - p->aCsr = aCsr; - memset(&p->aCsr[p->nCursor], 0, sizeof(Cursor)*(mxCursor+1-p->nCursor)); - p->nCursor = mxCursor+1; + p->apCsr = sqliteRealloc( p->apCsr, (mxCursor+1)*sizeof(Cursor*) ); + if( p->apCsr==0 ) return 1; + while( p->nCursor<=mxCursor ){ + Cursor *pC; + p->apCsr[p->nCursor++] = pC = sqliteMalloc( sizeof(Cursor) ); + if( pC==0 ) return 1; + } } return 0; } @@ -562,9 +564,6 @@ int sqlite3VdbeExec( int nProgressOps = 0; /* Opcodes executed since progress callback. */ #endif - /* FIX ME. */ - expandCursorArraySize(p, 100); - if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE; assert( db->magic==SQLITE_MAGIC_BUSY ); assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY ); @@ -1921,7 +1920,7 @@ case OP_Column: { zRec = pTos[i].z; payloadSize = pTos[i].n; pC->cacheValid = 0; - }else if( (pC = &p->aCsr[i])->pCursor!=0 ){ + }else if( (pC = p->apCsr[i])->pCursor!=0 ){ sqlite3VdbeCursorMoveto(pC); zRec = 0; pCrsr = pC->pCursor; @@ -2623,9 +2622,8 @@ case OP_OpenWrite: { } assert( i>=0 ); if( expandCursorArraySize(p, i) ) goto no_mem; - pCur = &p->aCsr[i]; + pCur = p->apCsr[i]; sqlite3VdbeCleanupCursor(pCur); - memset(pCur, 0, sizeof(Cursor)); pCur->nullRow = 1; if( pX==0 ) break; do{ @@ -2691,7 +2689,7 @@ case OP_OpenTemp: { Cursor *pCx; assert( i>=0 ); if( expandCursorArraySize(p, i) ) goto no_mem; - pCx = &p->aCsr[i]; + pCx = p->apCsr[i]; sqlite3VdbeCleanupCursor(pCx); memset(pCx, 0, sizeof(*pCx)); pCx->nullRow = 1; @@ -2736,7 +2734,7 @@ case OP_OpenPseudo: { Cursor *pCx; assert( i>=0 ); if( expandCursorArraySize(p, i) ) goto no_mem; - pCx = &p->aCsr[i]; + pCx = p->apCsr[i]; sqlite3VdbeCleanupCursor(pCx); memset(pCx, 0, sizeof(*pCx)); pCx->nullRow = 1; @@ -2752,7 +2750,7 @@ case OP_OpenPseudo: { case OP_Close: { int i = pOp->p1; if( i>=0 && inCursor ){ - sqlite3VdbeCleanupCursor(&p->aCsr[i]); + sqlite3VdbeCleanupCursor(p->apCsr[i]); } break; } @@ -2795,7 +2793,7 @@ case OP_MoveTo: { assert( pTos>=p->aStack ); assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; if( pC->pCursor!=0 ){ int res, oc; pC->nullRow = 0; @@ -2895,7 +2893,7 @@ case OP_Found: { Cursor *pC; assert( pTos>=p->aStack ); assert( i>=0 && inCursor ); - if( (pC = &p->aCsr[i])->pCursor!=0 ){ + if( (pC = p->apCsr[i])->pCursor!=0 ){ int res, rx; assert( pC->intKey==0 ); Stringify(pTos); @@ -2950,7 +2948,7 @@ case OP_IsUnique: { R = pTos->i; pTos--; assert( i>=0 && i<=p->nCursor ); - pCx = &p->aCsr[i]; + pCx = p->apCsr[i]; pCrsr = pCx->pCursor; if( pCrsr!=0 ){ int res, rc; @@ -3034,11 +3032,11 @@ case OP_NotExists: { BtCursor *pCrsr; assert( pTos>=p->aStack ); assert( i>=0 && inCursor ); - if( (pCrsr = (pC = &p->aCsr[i])->pCursor)!=0 ){ + if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ int res, rx; u64 iKey; assert( pTos->flags & MEM_Int ); - assert( p->aCsr[i].intKey ); + assert( p->apCsr[i]->intKey ); iKey = intToKey(pTos->i); rx = sqlite3BtreeMoveto(pCrsr, 0, iKey, &res); pC->lastRecno = pTos->i; @@ -3067,7 +3065,7 @@ case OP_NewRecno: { i64 v = 0; Cursor *pC; assert( i>=0 && inCursor ); - if( (pC = &p->aCsr[i])->pCursor==0 ){ + if( (pC = p->apCsr[i])->pCursor==0 ){ /* The zero initialization above is all that is needed */ }else{ /* The next rowid or record number (different terms for the same @@ -3195,7 +3193,7 @@ case OP_PutStrKey: { Cursor *pC; assert( pNos>=p->aStack ); assert( i>=0 && inCursor ); - if( ((pC = &p->aCsr[i])->pCursor!=0 || pC->pseudoTable) ){ + if( ((pC = p->apCsr[i])->pCursor!=0 || pC->pseudoTable) ){ char *zKey; i64 nKey; i64 iKey; @@ -3282,7 +3280,7 @@ case OP_Delete: { int i = pOp->p1; Cursor *pC; assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; if( pC->pCursor!=0 ){ sqlite3VdbeCursorMoveto(pC); rc = sqlite3BtreeDelete(pC->pCursor); @@ -3315,7 +3313,7 @@ case OP_SetCounts: { case OP_KeyAsData: { int i = pOp->p1; assert( i>=0 && inCursor ); - p->aCsr[i].keyAsData = pOp->p2; + p->apCsr[i]->keyAsData = pOp->p2; break; } @@ -3345,7 +3343,7 @@ case OP_RowData: { pTos++; assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; if( pC->nullRow ){ pTos->flags = MEM_Null; }else if( pC->pCursor!=0 ){ @@ -3400,7 +3398,7 @@ case OP_Recno: { i64 v; assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; sqlite3VdbeCursorMoveto(pC); pTos++; if( pC->recnoIsValid ){ @@ -3434,17 +3432,18 @@ case OP_Recno: { case OP_FullKey: { int i = pOp->p1; BtCursor *pCrsr; + Cursor *pC; - assert( p->aCsr[i].keyAsData ); - assert( !p->aCsr[i].pseudoTable ); + assert( p->apCsr[i]->keyAsData ); + assert( !p->apCsr[i]->pseudoTable ); assert( i>=0 && inCursor ); pTos++; - if( (pCrsr = p->aCsr[i].pCursor)!=0 ){ + if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ u64 amt; char *z; - sqlite3VdbeCursorMoveto(&p->aCsr[i]); - assert( p->aCsr[i].intKey==0 ); + sqlite3VdbeCursorMoveto(pC); + assert( pC->intKey==0 ); sqlite3BtreeKeySize(pCrsr, &amt); if( amt<=0 ){ rc = SQLITE_CORRUPT; @@ -3473,10 +3472,12 @@ case OP_FullKey: { */ case OP_NullRow: { int i = pOp->p1; + Cursor *pC; assert( i>=0 && inCursor ); - p->aCsr[i].nullRow = 1; - p->aCsr[i].recnoIsValid = 0; + pC = p->apCsr[i]; + pC->nullRow = 1; + pC->recnoIsValid = 0; break; } @@ -3494,7 +3495,7 @@ case OP_Last: { BtCursor *pCrsr; assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; if( (pCrsr = pC->pCursor)!=0 ){ int res; rc = sqlite3BtreeLast(pCrsr, &res); @@ -3525,7 +3526,7 @@ case OP_Rewind: { int res; assert( i>=0 && inCursor ); - pC = &p->aCsr[i]; + pC = p->apCsr[i]; if( (pCrsr = pC->pCursor)!=0 ){ rc = sqlite3BtreeFirst(pCrsr, &res); pC->atFirst = res==0; @@ -3564,7 +3565,7 @@ case OP_Next: { CHECK_FOR_INTERRUPT; assert( pOp->p1>=0 && pOp->p1nCursor ); - pC = &p->aCsr[pOp->p1]; + pC = p->apCsr[pOp->p1]; if( (pCrsr = pC->pCursor)!=0 ){ int res; if( pC->nullRow ){ @@ -3605,7 +3606,7 @@ case OP_IdxPut: { assert( pTos>=p->aStack ); assert( i>=0 && inCursor ); 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; const char *zKey = pTos->z; if( pOp->p2 ){ @@ -3662,7 +3663,7 @@ case OP_IdxDelete: { assert( pTos>=p->aStack ); assert( pTos->flags & MEM_Str ); assert( i>=0 && inCursor ); - if( (pCrsr = (pC = &p->aCsr[i])->pCursor)!=0 ){ + if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ int rx, res; rx = sqlite3BtreeMoveto(pCrsr, pTos->z, pTos->n, &res); if( rx==SQLITE_OK && res==0 ){ @@ -3687,14 +3688,15 @@ case OP_IdxDelete: { case OP_IdxRecno: { int i = pOp->p1; BtCursor *pCrsr; + Cursor *pC; assert( i>=0 && inCursor ); pTos++; - if( (pCrsr = p->aCsr[i].pCursor)!=0 ){ + if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ i64 rowid; - assert( p->aCsr[i].deferredMoveto==0 ); - assert( p->aCsr[i].intKey==0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->intKey==0 ); rc = sqlite3VdbeIdxRowid(pCrsr, &rowid); if( rc!=SQLITE_OK ){ goto abort_due_to_error; @@ -3769,15 +3771,15 @@ case OP_IdxGT: case OP_IdxGE: { int i= pOp->p1; BtCursor *pCrsr; + Cursor *pC; assert( i>=0 && inCursor ); assert( pTos>=p->aStack ); - if( (pCrsr = p->aCsr[i].pCursor)!=0 ){ + if( (pCrsr = (pC = p->apCsr[i])->pCursor)!=0 ){ int res, rc; - Cursor *pC = &p->aCsr[i]; Stringify(pTos); - assert( p->aCsr[i].deferredMoveto==0 ); + assert( pC->deferredMoveto==0 ); if( pOp->p3 ){ pC->incrKey = 1; } diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 3bd25c0f18..682774bbb2 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -265,8 +265,8 @@ struct Vdbe { Mem *pTos; /* Top entry in the operand stack */ char **zArgv; /* Text values used by the callback */ char **azColName; /* Becomes the 4th parameter to callbacks */ - int nCursor; /* Number of slots in aCsr[] */ - Cursor *aCsr; /* One element of this array for each open cursor */ + int nCursor; /* Number of slots in apCsr[] */ + Cursor **apCsr; /* One element of this array for each open cursor */ Sorter *pSort; /* A linked list of objects to be sorted */ FILE *pFile; /* At most one open file handler */ int nField; /* Number of file fields */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 297d97f3b9..5e3672f918 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -736,7 +736,7 @@ void sqlite3VdbeCleanupCursor(Cursor *pCx){ } sqliteFree(pCx->pData); 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){ int i; for(i=0; inCursor; i++){ - sqlite3VdbeCleanupCursor(&p->aCsr[i]); + Cursor *pC = p->apCsr[i]; + sqlite3VdbeCleanupCursor(pC); + sqliteFree(pC); } - sqliteFree(p->aCsr); - p->aCsr = 0; + sqliteFree(p->apCsr); + p->apCsr = 0; p->nCursor = 0; }