-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
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
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
** 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"
*/
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;
}
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 );
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;
}
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{
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;
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;
case OP_Close: {
int i = pOp->p1;
if( i>=0 && i<p->nCursor ){
- sqlite3VdbeCleanupCursor(&p->aCsr[i]);
+ sqlite3VdbeCleanupCursor(p->apCsr[i]);
}
break;
}
assert( pTos>=p->aStack );
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
if( pC->pCursor!=0 ){
int res, oc;
pC->nullRow = 0;
Cursor *pC;
assert( pTos>=p->aStack );
assert( i>=0 && i<p->nCursor );
- if( (pC = &p->aCsr[i])->pCursor!=0 ){
+ if( (pC = p->apCsr[i])->pCursor!=0 ){
int res, rx;
assert( pC->intKey==0 );
Stringify(pTos);
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;
BtCursor *pCrsr;
assert( pTos>=p->aStack );
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;
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;
i64 v = 0;
Cursor *pC;
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 */
}else{
/* The next rowid or record number (different terms for the same
Cursor *pC;
assert( pNos>=p->aStack );
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;
i64 nKey;
i64 iKey;
int i = pOp->p1;
Cursor *pC;
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
if( pC->pCursor!=0 ){
sqlite3VdbeCursorMoveto(pC);
rc = sqlite3BtreeDelete(pC->pCursor);
case OP_KeyAsData: {
int i = pOp->p1;
assert( i>=0 && i<p->nCursor );
- p->aCsr[i].keyAsData = pOp->p2;
+ p->apCsr[i]->keyAsData = pOp->p2;
break;
}
pTos++;
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
if( pC->nullRow ){
pTos->flags = MEM_Null;
}else if( pC->pCursor!=0 ){
i64 v;
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
sqlite3VdbeCursorMoveto(pC);
pTos++;
if( pC->recnoIsValid ){
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 && i<p->nCursor );
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;
*/
case OP_NullRow: {
int i = pOp->p1;
+ Cursor *pC;
assert( i>=0 && i<p->nCursor );
- p->aCsr[i].nullRow = 1;
- p->aCsr[i].recnoIsValid = 0;
+ pC = p->apCsr[i];
+ pC->nullRow = 1;
+ pC->recnoIsValid = 0;
break;
}
BtCursor *pCrsr;
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
if( (pCrsr = pC->pCursor)!=0 ){
int res;
rc = sqlite3BtreeLast(pCrsr, &res);
int res;
assert( i>=0 && i<p->nCursor );
- pC = &p->aCsr[i];
+ pC = p->apCsr[i];
if( (pCrsr = pC->pCursor)!=0 ){
rc = sqlite3BtreeFirst(pCrsr, &res);
pC->atFirst = res==0;
CHECK_FOR_INTERRUPT;
assert( pOp->p1>=0 && pOp->p1<p->nCursor );
- pC = &p->aCsr[pOp->p1];
+ pC = p->apCsr[pOp->p1];
if( (pCrsr = pC->pCursor)!=0 ){
int res;
if( pC->nullRow ){
assert( pTos>=p->aStack );
assert( i>=0 && i<p->nCursor );
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 ){
assert( pTos>=p->aStack );
assert( pTos->flags & MEM_Str );
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;
rx = sqlite3BtreeMoveto(pCrsr, pTos->z, pTos->n, &res);
if( rx==SQLITE_OK && res==0 ){
case OP_IdxRecno: {
int i = pOp->p1;
BtCursor *pCrsr;
+ Cursor *pC;
assert( i>=0 && i<p->nCursor );
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;
case OP_IdxGE: {
int i= pOp->p1;
BtCursor *pCrsr;
+ Cursor *pC;
assert( i>=0 && i<p->nCursor );
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;
}