Annotation of embedaddon/php/ext/sqlite/libsqlite/src/vdbeaux.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2003 September 6
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: ** This file contains code used for creating, destroying, and populating
        !            13: ** a VDBE (or an "sqlite_vm" as it is known to the outside world.)  Prior
        !            14: ** to version 2.8.7, all this code was combined into the vdbe.c source file.
        !            15: ** But that file was getting too big so this subroutines were split out.
        !            16: */
        !            17: #include "sqliteInt.h"
        !            18: #include "os.h"
        !            19: #include <ctype.h>
        !            20: #include "vdbeInt.h"
        !            21: 
        !            22: 
        !            23: /*
        !            24: ** When debugging the code generator in a symbolic debugger, one can
        !            25: ** set the sqlite_vdbe_addop_trace to 1 and all opcodes will be printed
        !            26: ** as they are added to the instruction stream.
        !            27: */
        !            28: #ifndef NDEBUG
        !            29: int sqlite_vdbe_addop_trace = 0;
        !            30: #endif
        !            31: 
        !            32: 
        !            33: /*
        !            34: ** Create a new virtual database engine.
        !            35: */
        !            36: Vdbe *sqliteVdbeCreate(sqlite *db){
        !            37:   Vdbe *p;
        !            38:   p = sqliteMalloc( sizeof(Vdbe) );
        !            39:   if( p==0 ) return 0;
        !            40:   p->db = db;
        !            41:   if( db->pVdbe ){
        !            42:     db->pVdbe->pPrev = p;
        !            43:   }
        !            44:   p->pNext = db->pVdbe;
        !            45:   p->pPrev = 0;
        !            46:   db->pVdbe = p;
        !            47:   p->magic = VDBE_MAGIC_INIT;
        !            48:   return p;
        !            49: }
        !            50: 
        !            51: /*
        !            52: ** Turn tracing on or off
        !            53: */
        !            54: void sqliteVdbeTrace(Vdbe *p, FILE *trace){
        !            55:   p->trace = trace;
        !            56: }
        !            57: 
        !            58: /*
        !            59: ** Add a new instruction to the list of instructions current in the
        !            60: ** VDBE.  Return the address of the new instruction.
        !            61: **
        !            62: ** Parameters:
        !            63: **
        !            64: **    p               Pointer to the VDBE
        !            65: **
        !            66: **    op              The opcode for this instruction
        !            67: **
        !            68: **    p1, p2          First two of the three possible operands.
        !            69: **
        !            70: ** Use the sqliteVdbeResolveLabel() function to fix an address and
        !            71: ** the sqliteVdbeChangeP3() function to change the value of the P3
        !            72: ** operand.
        !            73: */
        !            74: int sqliteVdbeAddOp(Vdbe *p, int op, int p1, int p2){
        !            75:   int i;
        !            76:   VdbeOp *pOp;
        !            77: 
        !            78:   i = p->nOp;
        !            79:   p->nOp++;
        !            80:   assert( p->magic==VDBE_MAGIC_INIT );
        !            81:   if( i>=p->nOpAlloc ){
        !            82:     int oldSize = p->nOpAlloc;
        !            83:     Op *aNew;
        !            84:     p->nOpAlloc = p->nOpAlloc*2 + 100;
        !            85:     aNew = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op));
        !            86:     if( aNew==0 ){
        !            87:       p->nOpAlloc = oldSize;
        !            88:       return 0;
        !            89:     }
        !            90:     p->aOp = aNew;
        !            91:     memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
        !            92:   }
        !            93:   pOp = &p->aOp[i];
        !            94:   pOp->opcode = op;
        !            95:   pOp->p1 = p1;
        !            96:   if( p2<0 && (-1-p2)<p->nLabel && p->aLabel[-1-p2]>=0 ){
        !            97:     p2 = p->aLabel[-1-p2];
        !            98:   }
        !            99:   pOp->p2 = p2;
        !           100:   pOp->p3 = 0;
        !           101:   pOp->p3type = P3_NOTUSED;
        !           102: #ifndef NDEBUG
        !           103:   if( sqlite_vdbe_addop_trace ) sqliteVdbePrintOp(0, i, &p->aOp[i]);
        !           104: #endif
        !           105:   return i;
        !           106: }
        !           107: 
        !           108: /*
        !           109: ** Add an opcode that includes the p3 value.
        !           110: */
        !           111: int sqliteVdbeOp3(Vdbe *p, int op, int p1, int p2, const char *zP3, int p3type){
        !           112:   int addr = sqliteVdbeAddOp(p, op, p1, p2);
        !           113:   sqliteVdbeChangeP3(p, addr, zP3, p3type);
        !           114:   return addr;
        !           115: }
        !           116: 
        !           117: /*
        !           118: ** Add multiple opcodes.  The list is terminated by an opcode of 0.
        !           119: */
        !           120: int sqliteVdbeCode(Vdbe *p, ...){
        !           121:   int addr;
        !           122:   va_list ap;
        !           123:   int opcode, p1, p2;
        !           124:   va_start(ap, p);
        !           125:   addr = p->nOp;
        !           126:   while( (opcode = va_arg(ap,int))!=0 ){
        !           127:     p1 = va_arg(ap,int);
        !           128:     p2 = va_arg(ap,int);
        !           129:     sqliteVdbeAddOp(p, opcode, p1, p2);
        !           130:   }
        !           131:   va_end(ap);
        !           132:   return addr;
        !           133: }
        !           134: 
        !           135: 
        !           136: 
        !           137: /*
        !           138: ** Create a new symbolic label for an instruction that has yet to be
        !           139: ** coded.  The symbolic label is really just a negative number.  The
        !           140: ** label can be used as the P2 value of an operation.  Later, when
        !           141: ** the label is resolved to a specific address, the VDBE will scan
        !           142: ** through its operation list and change all values of P2 which match
        !           143: ** the label into the resolved address.
        !           144: **
        !           145: ** The VDBE knows that a P2 value is a label because labels are
        !           146: ** always negative and P2 values are suppose to be non-negative.
        !           147: ** Hence, a negative P2 value is a label that has yet to be resolved.
        !           148: */
        !           149: int sqliteVdbeMakeLabel(Vdbe *p){
        !           150:   int i;
        !           151:   i = p->nLabel++;
        !           152:   assert( p->magic==VDBE_MAGIC_INIT );
        !           153:   if( i>=p->nLabelAlloc ){
        !           154:     int *aNew;
        !           155:     p->nLabelAlloc = p->nLabelAlloc*2 + 10;
        !           156:     aNew = sqliteRealloc( p->aLabel, p->nLabelAlloc*sizeof(p->aLabel[0]));
        !           157:     if( aNew==0 ){
        !           158:       sqliteFree(p->aLabel);
        !           159:     }
        !           160:     p->aLabel = aNew;
        !           161:   }
        !           162:   if( p->aLabel==0 ){
        !           163:     p->nLabel = 0;
        !           164:     p->nLabelAlloc = 0;
        !           165:     return 0;
        !           166:   }
        !           167:   p->aLabel[i] = -1;
        !           168:   return -1-i;
        !           169: }
        !           170: 
        !           171: /*
        !           172: ** Resolve label "x" to be the address of the next instruction to
        !           173: ** be inserted.  The parameter "x" must have been obtained from
        !           174: ** a prior call to sqliteVdbeMakeLabel().
        !           175: */
        !           176: void sqliteVdbeResolveLabel(Vdbe *p, int x){
        !           177:   int j;
        !           178:   assert( p->magic==VDBE_MAGIC_INIT );
        !           179:   if( x<0 && (-x)<=p->nLabel && p->aOp ){
        !           180:     if( p->aLabel[-1-x]==p->nOp ) return;
        !           181:     assert( p->aLabel[-1-x]<0 );
        !           182:     p->aLabel[-1-x] = p->nOp;
        !           183:     for(j=0; j<p->nOp; j++){
        !           184:       if( p->aOp[j].p2==x ) p->aOp[j].p2 = p->nOp;
        !           185:     }
        !           186:   }
        !           187: }
        !           188: 
        !           189: /*
        !           190: ** Return the address of the next instruction to be inserted.
        !           191: */
        !           192: int sqliteVdbeCurrentAddr(Vdbe *p){
        !           193:   assert( p->magic==VDBE_MAGIC_INIT );
        !           194:   return p->nOp;
        !           195: }
        !           196: 
        !           197: /*
        !           198: ** Add a whole list of operations to the operation stack.  Return the
        !           199: ** address of the first operation added.
        !           200: */
        !           201: int sqliteVdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){
        !           202:   int addr;
        !           203:   assert( p->magic==VDBE_MAGIC_INIT );
        !           204:   if( p->nOp + nOp >= p->nOpAlloc ){
        !           205:     int oldSize = p->nOpAlloc;
        !           206:     Op *aNew;
        !           207:     p->nOpAlloc = p->nOpAlloc*2 + nOp + 10;
        !           208:     aNew = sqliteRealloc(p->aOp, p->nOpAlloc*sizeof(Op));
        !           209:     if( aNew==0 ){
        !           210:       p->nOpAlloc = oldSize;
        !           211:       return 0;
        !           212:     }
        !           213:     p->aOp = aNew;
        !           214:     memset(&p->aOp[oldSize], 0, (p->nOpAlloc-oldSize)*sizeof(Op));
        !           215:   }
        !           216:   addr = p->nOp;
        !           217:   if( nOp>0 ){
        !           218:     int i;
        !           219:     VdbeOpList const *pIn = aOp;
        !           220:     for(i=0; i<nOp; i++, pIn++){
        !           221:       int p2 = pIn->p2;
        !           222:       VdbeOp *pOut = &p->aOp[i+addr];
        !           223:       pOut->opcode = pIn->opcode;
        !           224:       pOut->p1 = pIn->p1;
        !           225:       pOut->p2 = p2<0 ? addr + ADDR(p2) : p2;
        !           226:       pOut->p3 = pIn->p3;
        !           227:       pOut->p3type = pIn->p3 ? P3_STATIC : P3_NOTUSED;
        !           228: #ifndef NDEBUG
        !           229:       if( sqlite_vdbe_addop_trace ){
        !           230:         sqliteVdbePrintOp(0, i+addr, &p->aOp[i+addr]);
        !           231:       }
        !           232: #endif
        !           233:     }
        !           234:     p->nOp += nOp;
        !           235:   }
        !           236:   return addr;
        !           237: }
        !           238: 
        !           239: /*
        !           240: ** Change the value of the P1 operand for a specific instruction.
        !           241: ** This routine is useful when a large program is loaded from a
        !           242: ** static array using sqliteVdbeAddOpList but we want to make a
        !           243: ** few minor changes to the program.
        !           244: */
        !           245: void sqliteVdbeChangeP1(Vdbe *p, int addr, int val){
        !           246:   assert( p->magic==VDBE_MAGIC_INIT );
        !           247:   if( p && addr>=0 && p->nOp>addr && p->aOp ){
        !           248:     p->aOp[addr].p1 = val;
        !           249:   }
        !           250: }
        !           251: 
        !           252: /*
        !           253: ** Change the value of the P2 operand for a specific instruction.
        !           254: ** This routine is useful for setting a jump destination.
        !           255: */
        !           256: void sqliteVdbeChangeP2(Vdbe *p, int addr, int val){
        !           257:   assert( val>=0 );
        !           258:   assert( p->magic==VDBE_MAGIC_INIT );
        !           259:   if( p && addr>=0 && p->nOp>addr && p->aOp ){
        !           260:     p->aOp[addr].p2 = val;
        !           261:   }
        !           262: }
        !           263: 
        !           264: /*
        !           265: ** Change the value of the P3 operand for a specific instruction.
        !           266: ** This routine is useful when a large program is loaded from a
        !           267: ** static array using sqliteVdbeAddOpList but we want to make a
        !           268: ** few minor changes to the program.
        !           269: **
        !           270: ** If n>=0 then the P3 operand is dynamic, meaning that a copy of
        !           271: ** the string is made into memory obtained from sqliteMalloc().
        !           272: ** A value of n==0 means copy bytes of zP3 up to and including the
        !           273: ** first null byte.  If n>0 then copy n+1 bytes of zP3.
        !           274: **
        !           275: ** If n==P3_STATIC  it means that zP3 is a pointer to a constant static
        !           276: ** string and we can just copy the pointer.  n==P3_POINTER means zP3 is
        !           277: ** a pointer to some object other than a string.
        !           278: **
        !           279: ** If addr<0 then change P3 on the most recently inserted instruction.
        !           280: */
        !           281: void sqliteVdbeChangeP3(Vdbe *p, int addr, const char *zP3, int n){
        !           282:   Op *pOp;
        !           283:   assert( p->magic==VDBE_MAGIC_INIT );
        !           284:   if( p==0 || p->aOp==0 ) return;
        !           285:   if( addr<0 || addr>=p->nOp ){
        !           286:     addr = p->nOp - 1;
        !           287:     if( addr<0 ) return;
        !           288:   }
        !           289:   pOp = &p->aOp[addr];
        !           290:   if( pOp->p3 && pOp->p3type==P3_DYNAMIC ){
        !           291:     sqliteFree(pOp->p3);
        !           292:     pOp->p3 = 0;
        !           293:   }
        !           294:   if( zP3==0 ){
        !           295:     pOp->p3 = 0;
        !           296:     pOp->p3type = P3_NOTUSED;
        !           297:   }else if( n<0 ){
        !           298:     pOp->p3 = (char*)zP3;
        !           299:     pOp->p3type = n;
        !           300:   }else{
        !           301:     sqliteSetNString(&pOp->p3, zP3, n, 0);
        !           302:     pOp->p3type = P3_DYNAMIC;
        !           303:   }
        !           304: }
        !           305: 
        !           306: /*
        !           307: ** If the P3 operand to the specified instruction appears
        !           308: ** to be a quoted string token, then this procedure removes 
        !           309: ** the quotes.
        !           310: **
        !           311: ** The quoting operator can be either a grave ascent (ASCII 0x27)
        !           312: ** or a double quote character (ASCII 0x22).  Two quotes in a row
        !           313: ** resolve to be a single actual quote character within the string.
        !           314: */
        !           315: void sqliteVdbeDequoteP3(Vdbe *p, int addr){
        !           316:   Op *pOp;
        !           317:   assert( p->magic==VDBE_MAGIC_INIT );
        !           318:   if( p->aOp==0 ) return;
        !           319:   if( addr<0 || addr>=p->nOp ){
        !           320:     addr = p->nOp - 1;
        !           321:     if( addr<0 ) return;
        !           322:   }
        !           323:   pOp = &p->aOp[addr];
        !           324:   if( pOp->p3==0 || pOp->p3[0]==0 ) return;
        !           325:   if( pOp->p3type==P3_POINTER ) return;
        !           326:   if( pOp->p3type!=P3_DYNAMIC ){
        !           327:     pOp->p3 = sqliteStrDup(pOp->p3);
        !           328:     pOp->p3type = P3_DYNAMIC;
        !           329:   }
        !           330:   sqliteDequote(pOp->p3);
        !           331: }
        !           332: 
        !           333: /*
        !           334: ** On the P3 argument of the given instruction, change all
        !           335: ** strings of whitespace characters into a single space and
        !           336: ** delete leading and trailing whitespace.
        !           337: */
        !           338: void sqliteVdbeCompressSpace(Vdbe *p, int addr){
        !           339:   unsigned char *z;
        !           340:   int i, j;
        !           341:   Op *pOp;
        !           342:   assert( p->magic==VDBE_MAGIC_INIT );
        !           343:   if( p->aOp==0 || addr<0 || addr>=p->nOp ) return;
        !           344:   pOp = &p->aOp[addr];
        !           345:   if( pOp->p3type==P3_POINTER ){
        !           346:     return;
        !           347:   }
        !           348:   if( pOp->p3type!=P3_DYNAMIC ){
        !           349:     pOp->p3 = sqliteStrDup(pOp->p3);
        !           350:     pOp->p3type = P3_DYNAMIC;
        !           351:   }
        !           352:   z = (unsigned char*)pOp->p3;
        !           353:   if( z==0 ) return;
        !           354:   i = j = 0;
        !           355:   while( isspace(z[i]) ){ i++; }
        !           356:   while( z[i] ){
        !           357:     if( isspace(z[i]) ){
        !           358:       z[j++] = ' ';
        !           359:       while( isspace(z[++i]) ){}
        !           360:     }else{
        !           361:       z[j++] = z[i++];
        !           362:     }
        !           363:   }
        !           364:   while( j>0 && isspace(z[j-1]) ){ j--; }
        !           365:   z[j] = 0;
        !           366: }
        !           367: 
        !           368: /*
        !           369: ** Search for the current program for the given opcode and P2
        !           370: ** value.  Return the address plus 1 if found and 0 if not found.
        !           371: */
        !           372: int sqliteVdbeFindOp(Vdbe *p, int op, int p2){
        !           373:   int i;
        !           374:   assert( p->magic==VDBE_MAGIC_INIT );
        !           375:   for(i=0; i<p->nOp; i++){
        !           376:     if( p->aOp[i].opcode==op && p->aOp[i].p2==p2 ) return i+1;
        !           377:   }
        !           378:   return 0;
        !           379: }
        !           380: 
        !           381: /*
        !           382: ** Return the opcode for a given address.
        !           383: */
        !           384: VdbeOp *sqliteVdbeGetOp(Vdbe *p, int addr){
        !           385:   assert( p->magic==VDBE_MAGIC_INIT );
        !           386:   assert( addr>=0 && addr<p->nOp );
        !           387:   return &p->aOp[addr];
        !           388: }
        !           389: 
        !           390: /*
        !           391: ** The following group or routines are employed by installable functions
        !           392: ** to return their results.
        !           393: **
        !           394: ** The sqlite_set_result_string() routine can be used to return a string
        !           395: ** value or to return a NULL.  To return a NULL, pass in NULL for zResult.
        !           396: ** A copy is made of the string before this routine returns so it is safe
        !           397: ** to pass in an ephemeral string.
        !           398: **
        !           399: ** sqlite_set_result_error() works like sqlite_set_result_string() except
        !           400: ** that it signals a fatal error.  The string argument, if any, is the
        !           401: ** error message.  If the argument is NULL a generic substitute error message
        !           402: ** is used.
        !           403: **
        !           404: ** The sqlite_set_result_int() and sqlite_set_result_double() set the return
        !           405: ** value of the user function to an integer or a double.
        !           406: **
        !           407: ** These routines are defined here in vdbe.c because they depend on knowing
        !           408: ** the internals of the sqlite_func structure which is only defined in 
        !           409: ** this source file.
        !           410: */
        !           411: char *sqlite_set_result_string(sqlite_func *p, const char *zResult, int n){
        !           412:   assert( !p->isStep );
        !           413:   if( p->s.flags & MEM_Dyn ){
        !           414:     sqliteFree(p->s.z);
        !           415:   }
        !           416:   if( zResult==0 ){
        !           417:     p->s.flags = MEM_Null;
        !           418:     n = 0;
        !           419:     p->s.z = 0;
        !           420:     p->s.n = 0;
        !           421:   }else{
        !           422:     if( n<0 ) n = strlen(zResult);
        !           423:     if( n<NBFS-1 ){
        !           424:       memcpy(p->s.zShort, zResult, n);
        !           425:       p->s.zShort[n] = 0;
        !           426:       p->s.flags = MEM_Str | MEM_Short;
        !           427:       p->s.z = p->s.zShort;
        !           428:     }else{
        !           429:       p->s.z = sqliteMallocRaw( n+1 );
        !           430:       if( p->s.z ){
        !           431:         memcpy(p->s.z, zResult, n);
        !           432:         p->s.z[n] = 0;
        !           433:       }
        !           434:       p->s.flags = MEM_Str | MEM_Dyn;
        !           435:     }
        !           436:     p->s.n = n+1;
        !           437:   }
        !           438:   return p->s.z;
        !           439: }
        !           440: void sqlite_set_result_int(sqlite_func *p, int iResult){
        !           441:   assert( !p->isStep );
        !           442:   if( p->s.flags & MEM_Dyn ){
        !           443:     sqliteFree(p->s.z);
        !           444:   }
        !           445:   p->s.i = iResult;
        !           446:   p->s.flags = MEM_Int;
        !           447: }
        !           448: void sqlite_set_result_double(sqlite_func *p, double rResult){
        !           449:   assert( !p->isStep );
        !           450:   if( p->s.flags & MEM_Dyn ){
        !           451:     sqliteFree(p->s.z);
        !           452:   }
        !           453:   p->s.r = rResult;
        !           454:   p->s.flags = MEM_Real;
        !           455: }
        !           456: void sqlite_set_result_error(sqlite_func *p, const char *zMsg, int n){
        !           457:   assert( !p->isStep );
        !           458:   sqlite_set_result_string(p, zMsg, n);
        !           459:   p->isError = 1;
        !           460: }
        !           461: 
        !           462: /*
        !           463: ** Extract the user data from a sqlite_func structure and return a
        !           464: ** pointer to it.
        !           465: */
        !           466: void *sqlite_user_data(sqlite_func *p){
        !           467:   assert( p && p->pFunc );
        !           468:   return p->pFunc->pUserData;
        !           469: }
        !           470: 
        !           471: /*
        !           472: ** Allocate or return the aggregate context for a user function.  A new
        !           473: ** context is allocated on the first call.  Subsequent calls return the
        !           474: ** same context that was returned on prior calls.
        !           475: **
        !           476: ** This routine is defined here in vdbe.c because it depends on knowing
        !           477: ** the internals of the sqlite_func structure which is only defined in
        !           478: ** this source file.
        !           479: */
        !           480: void *sqlite_aggregate_context(sqlite_func *p, int nByte){
        !           481:   assert( p && p->pFunc && p->pFunc->xStep );
        !           482:   if( p->pAgg==0 ){
        !           483:     if( nByte<=NBFS ){
        !           484:       p->pAgg = (void*)p->s.z;
        !           485:       memset(p->pAgg, 0, nByte);
        !           486:     }else{
        !           487:       p->pAgg = sqliteMalloc( nByte );
        !           488:     }
        !           489:   }
        !           490:   return p->pAgg;
        !           491: }
        !           492: 
        !           493: /*
        !           494: ** Return the number of times the Step function of a aggregate has been 
        !           495: ** called.
        !           496: **
        !           497: ** This routine is defined here in vdbe.c because it depends on knowing
        !           498: ** the internals of the sqlite_func structure which is only defined in
        !           499: ** this source file.
        !           500: */
        !           501: int sqlite_aggregate_count(sqlite_func *p){
        !           502:   assert( p && p->pFunc && p->pFunc->xStep );
        !           503:   return p->cnt;
        !           504: }
        !           505: 
        !           506: #if !defined(NDEBUG) || defined(VDBE_PROFILE)
        !           507: /*
        !           508: ** Print a single opcode.  This routine is used for debugging only.
        !           509: */
        !           510: void sqliteVdbePrintOp(FILE *pOut, int pc, Op *pOp){
        !           511:   char *zP3;
        !           512:   char zPtr[40];
        !           513:   if( pOp->p3type==P3_POINTER ){
        !           514:     sprintf(zPtr, "ptr(%#lx)", (long)pOp->p3);
        !           515:     zP3 = zPtr;
        !           516:   }else{
        !           517:     zP3 = pOp->p3;
        !           518:   }
        !           519:   if( pOut==0 ) pOut = stdout;
        !           520:   fprintf(pOut,"%4d %-12s %4d %4d %s\n",
        !           521:       pc, sqliteOpcodeNames[pOp->opcode], pOp->p1, pOp->p2, zP3 ? zP3 : "");
        !           522:   fflush(pOut);
        !           523: }
        !           524: #endif
        !           525: 
        !           526: /*
        !           527: ** Give a listing of the program in the virtual machine.
        !           528: **
        !           529: ** The interface is the same as sqliteVdbeExec().  But instead of
        !           530: ** running the code, it invokes the callback once for each instruction.
        !           531: ** This feature is used to implement "EXPLAIN".
        !           532: */
        !           533: int sqliteVdbeList(
        !           534:   Vdbe *p                   /* The VDBE */
        !           535: ){
        !           536:   sqlite *db = p->db;
        !           537:   int i;
        !           538:   int rc = SQLITE_OK;
        !           539:   static char *azColumnNames[] = {
        !           540:      "addr", "opcode", "p1",  "p2",  "p3", 
        !           541:      "int",  "text",   "int", "int", "text",
        !           542:      0
        !           543:   };
        !           544: 
        !           545:   assert( p->popStack==0 );
        !           546:   assert( p->explain );
        !           547:   p->azColName = azColumnNames;
        !           548:   p->azResColumn = p->zArgv;
        !           549:   for(i=0; i<5; i++) p->zArgv[i] = p->aStack[i].zShort;
        !           550:   i = p->pc;
        !           551:   if( i>=p->nOp ){
        !           552:     p->rc = SQLITE_OK;
        !           553:     rc = SQLITE_DONE;
        !           554:   }else if( db->flags & SQLITE_Interrupt ){
        !           555:     db->flags &= ~SQLITE_Interrupt;
        !           556:     if( db->magic!=SQLITE_MAGIC_BUSY ){
        !           557:       p->rc = SQLITE_MISUSE;
        !           558:     }else{
        !           559:       p->rc = SQLITE_INTERRUPT;
        !           560:     }
        !           561:     rc = SQLITE_ERROR;
        !           562:     sqliteSetString(&p->zErrMsg, sqlite_error_string(p->rc), (char*)0);
        !           563:   }else{
        !           564:     sprintf(p->zArgv[0],"%d",i);
        !           565:     sprintf(p->zArgv[2],"%d", p->aOp[i].p1);
        !           566:     sprintf(p->zArgv[3],"%d", p->aOp[i].p2);
        !           567:     if( p->aOp[i].p3type==P3_POINTER ){
        !           568:       sprintf(p->aStack[4].zShort, "ptr(%#lx)", (long)p->aOp[i].p3);
        !           569:       p->zArgv[4] = p->aStack[4].zShort;
        !           570:     }else{
        !           571:       p->zArgv[4] = p->aOp[i].p3;
        !           572:     }
        !           573:     p->zArgv[1] = sqliteOpcodeNames[p->aOp[i].opcode];
        !           574:     p->pc = i+1;
        !           575:     p->azResColumn = p->zArgv;
        !           576:     p->nResColumn = 5;
        !           577:     p->rc = SQLITE_OK;
        !           578:     rc = SQLITE_ROW;
        !           579:   }
        !           580:   return rc;
        !           581: }
        !           582: 
        !           583: /*
        !           584: ** Prepare a virtual machine for execution.  This involves things such
        !           585: ** as allocating stack space and initializing the program counter.
        !           586: ** After the VDBE has be prepped, it can be executed by one or more
        !           587: ** calls to sqliteVdbeExec().  
        !           588: */
        !           589: void sqliteVdbeMakeReady(
        !           590:   Vdbe *p,                       /* The VDBE */
        !           591:   int nVar,                      /* Number of '?' see in the SQL statement */
        !           592:   int isExplain                  /* True if the EXPLAIN keywords is present */
        !           593: ){
        !           594:   int n;
        !           595: 
        !           596:   assert( p!=0 );
        !           597:   assert( p->magic==VDBE_MAGIC_INIT );
        !           598: 
        !           599:   /* Add a HALT instruction to the very end of the program.
        !           600:   */
        !           601:   if( p->nOp==0 || (p->aOp && p->aOp[p->nOp-1].opcode!=OP_Halt) ){
        !           602:     sqliteVdbeAddOp(p, OP_Halt, 0, 0);
        !           603:   }
        !           604: 
        !           605:   /* No instruction ever pushes more than a single element onto the
        !           606:   ** stack.  And the stack never grows on successive executions of the
        !           607:   ** same loop.  So the total number of instructions is an upper bound
        !           608:   ** on the maximum stack depth required.
        !           609:   **
        !           610:   ** Allocation all the stack space we will ever need.
        !           611:   */
        !           612:   if( p->aStack==0 ){
        !           613:     p->nVar = nVar;
        !           614:     assert( nVar>=0 );
        !           615:     n = isExplain ? 10 : p->nOp;
        !           616:     p->aStack = sqliteMalloc(
        !           617:       n*(sizeof(p->aStack[0]) + 2*sizeof(char*))     /* aStack and zArgv */
        !           618:         + p->nVar*(sizeof(char*)+sizeof(int)+1)    /* azVar, anVar, abVar */
        !           619:     );
        !           620:     p->zArgv = (char**)&p->aStack[n];
        !           621:     p->azColName = (char**)&p->zArgv[n];
        !           622:     p->azVar = (char**)&p->azColName[n];
        !           623:     p->anVar = (int*)&p->azVar[p->nVar];
        !           624:     p->abVar = (u8*)&p->anVar[p->nVar];
        !           625:   }
        !           626: 
        !           627:   sqliteHashInit(&p->agg.hash, SQLITE_HASH_BINARY, 0);
        !           628:   p->agg.pSearch = 0;
        !           629: #ifdef MEMORY_DEBUG
        !           630:   if( sqliteOsFileExists("vdbe_trace") ){
        !           631:     p->trace = stdout;
        !           632:   }
        !           633: #endif
        !           634:   p->pTos = &p->aStack[-1];
        !           635:   p->pc = 0;
        !           636:   p->rc = SQLITE_OK;
        !           637:   p->uniqueCnt = 0;
        !           638:   p->returnDepth = 0;
        !           639:   p->errorAction = OE_Abort;
        !           640:   p->undoTransOnError = 0;
        !           641:   p->popStack =  0;
        !           642:   p->explain |= isExplain;
        !           643:   p->magic = VDBE_MAGIC_RUN;
        !           644: #ifdef VDBE_PROFILE
        !           645:   {
        !           646:     int i;
        !           647:     for(i=0; i<p->nOp; i++){
        !           648:       p->aOp[i].cnt = 0;
        !           649:       p->aOp[i].cycles = 0;
        !           650:     }
        !           651:   }
        !           652: #endif
        !           653: }
        !           654: 
        !           655: 
        !           656: /*
        !           657: ** Remove any elements that remain on the sorter for the VDBE given.
        !           658: */
        !           659: void sqliteVdbeSorterReset(Vdbe *p){
        !           660:   while( p->pSort ){
        !           661:     Sorter *pSorter = p->pSort;
        !           662:     p->pSort = pSorter->pNext;
        !           663:     sqliteFree(pSorter->zKey);
        !           664:     sqliteFree(pSorter->pData);
        !           665:     sqliteFree(pSorter);
        !           666:   }
        !           667: }
        !           668: 
        !           669: /*
        !           670: ** Reset an Agg structure.  Delete all its contents. 
        !           671: **
        !           672: ** For installable aggregate functions, if the step function has been
        !           673: ** called, make sure the finalizer function has also been called.  The
        !           674: ** finalizer might need to free memory that was allocated as part of its
        !           675: ** private context.  If the finalizer has not been called yet, call it
        !           676: ** now.
        !           677: */
        !           678: void sqliteVdbeAggReset(Agg *pAgg){
        !           679:   int i;
        !           680:   HashElem *p;
        !           681:   for(p = sqliteHashFirst(&pAgg->hash); p; p = sqliteHashNext(p)){
        !           682:     AggElem *pElem = sqliteHashData(p);
        !           683:     assert( pAgg->apFunc!=0 );
        !           684:     for(i=0; i<pAgg->nMem; i++){
        !           685:       Mem *pMem = &pElem->aMem[i];
        !           686:       if( pAgg->apFunc[i] && (pMem->flags & MEM_AggCtx)!=0 ){
        !           687:         sqlite_func ctx;
        !           688:         ctx.pFunc = pAgg->apFunc[i];
        !           689:         ctx.s.flags = MEM_Null;
        !           690:         ctx.pAgg = pMem->z;
        !           691:         ctx.cnt = pMem->i;
        !           692:         ctx.isStep = 0;
        !           693:         ctx.isError = 0;
        !           694:         (*pAgg->apFunc[i]->xFinalize)(&ctx);
        !           695:         if( pMem->z!=0 && pMem->z!=pMem->zShort ){
        !           696:           sqliteFree(pMem->z);
        !           697:         }
        !           698:         if( ctx.s.flags & MEM_Dyn ){
        !           699:           sqliteFree(ctx.s.z);
        !           700:         }
        !           701:       }else if( pMem->flags & MEM_Dyn ){
        !           702:         sqliteFree(pMem->z);
        !           703:       }
        !           704:     }
        !           705:     sqliteFree(pElem);
        !           706:   }
        !           707:   sqliteHashClear(&pAgg->hash);
        !           708:   sqliteFree(pAgg->apFunc);
        !           709:   pAgg->apFunc = 0;
        !           710:   pAgg->pCurrent = 0;
        !           711:   pAgg->pSearch = 0;
        !           712:   pAgg->nMem = 0;
        !           713: }
        !           714: 
        !           715: /*
        !           716: ** Delete a keylist
        !           717: */
        !           718: void sqliteVdbeKeylistFree(Keylist *p){
        !           719:   while( p ){
        !           720:     Keylist *pNext = p->pNext;
        !           721:     sqliteFree(p);
        !           722:     p = pNext;
        !           723:   }
        !           724: }
        !           725: 
        !           726: /*
        !           727: ** Close a cursor and release all the resources that cursor happens
        !           728: ** to hold.
        !           729: */
        !           730: void sqliteVdbeCleanupCursor(Cursor *pCx){
        !           731:   if( pCx->pCursor ){
        !           732:     sqliteBtreeCloseCursor(pCx->pCursor);
        !           733:   }
        !           734:   if( pCx->pBt ){
        !           735:     sqliteBtreeClose(pCx->pBt);
        !           736:   }
        !           737:   sqliteFree(pCx->pData);
        !           738:   memset(pCx, 0, sizeof(Cursor));
        !           739: }
        !           740: 
        !           741: /*
        !           742: ** Close all cursors
        !           743: */
        !           744: static void closeAllCursors(Vdbe *p){
        !           745:   int i;
        !           746:   for(i=0; i<p->nCursor; i++){
        !           747:     sqliteVdbeCleanupCursor(&p->aCsr[i]);
        !           748:   }
        !           749:   sqliteFree(p->aCsr);
        !           750:   p->aCsr = 0;
        !           751:   p->nCursor = 0;
        !           752: }
        !           753: 
        !           754: /*
        !           755: ** Clean up the VM after execution.
        !           756: **
        !           757: ** This routine will automatically close any cursors, lists, and/or
        !           758: ** sorters that were left open.  It also deletes the values of
        !           759: ** variables in the azVariable[] array.
        !           760: */
        !           761: static void Cleanup(Vdbe *p){
        !           762:   int i;
        !           763:   if( p->aStack ){
        !           764:     Mem *pTos = p->pTos;
        !           765:     while( pTos>=p->aStack ){
        !           766:       if( pTos->flags & MEM_Dyn ){
        !           767:         sqliteFree(pTos->z);
        !           768:       }
        !           769:       pTos--;
        !           770:     }
        !           771:     p->pTos = pTos;
        !           772:   }
        !           773:   closeAllCursors(p);
        !           774:   if( p->aMem ){
        !           775:     for(i=0; i<p->nMem; i++){
        !           776:       if( p->aMem[i].flags & MEM_Dyn ){
        !           777:         sqliteFree(p->aMem[i].z);
        !           778:       }
        !           779:     }
        !           780:   }
        !           781:   sqliteFree(p->aMem);
        !           782:   p->aMem = 0;
        !           783:   p->nMem = 0;
        !           784:   if( p->pList ){
        !           785:     sqliteVdbeKeylistFree(p->pList);
        !           786:     p->pList = 0;
        !           787:   }
        !           788:   sqliteVdbeSorterReset(p);
        !           789:   if( p->pFile ){
        !           790:     if( p->pFile!=stdin ) fclose(p->pFile);
        !           791:     p->pFile = 0;
        !           792:   }
        !           793:   if( p->azField ){
        !           794:     sqliteFree(p->azField);
        !           795:     p->azField = 0;
        !           796:   }
        !           797:   p->nField = 0;
        !           798:   if( p->zLine ){
        !           799:     sqliteFree(p->zLine);
        !           800:     p->zLine = 0;
        !           801:   }
        !           802:   p->nLineAlloc = 0;
        !           803:   sqliteVdbeAggReset(&p->agg);
        !           804:   if( p->aSet ){
        !           805:     for(i=0; i<p->nSet; i++){
        !           806:       sqliteHashClear(&p->aSet[i].hash);
        !           807:     }
        !           808:   }
        !           809:   sqliteFree(p->aSet);
        !           810:   p->aSet = 0;
        !           811:   p->nSet = 0;
        !           812:   if( p->keylistStack ){
        !           813:     int ii;
        !           814:     for(ii = 0; ii < p->keylistStackDepth; ii++){
        !           815:       sqliteVdbeKeylistFree(p->keylistStack[ii]);
        !           816:     }
        !           817:     sqliteFree(p->keylistStack);
        !           818:     p->keylistStackDepth = 0;
        !           819:     p->keylistStack = 0;
        !           820:   }
        !           821:   sqliteFree(p->contextStack);
        !           822:   p->contextStack = 0;
        !           823:   sqliteFree(p->zErrMsg);
        !           824:   p->zErrMsg = 0;
        !           825: }
        !           826: 
        !           827: /*
        !           828: ** Clean up a VDBE after execution but do not delete the VDBE just yet.
        !           829: ** Write any error messages into *pzErrMsg.  Return the result code.
        !           830: **
        !           831: ** After this routine is run, the VDBE should be ready to be executed
        !           832: ** again.
        !           833: */
        !           834: int sqliteVdbeReset(Vdbe *p, char **pzErrMsg){
        !           835:   sqlite *db = p->db;
        !           836:   int i;
        !           837: 
        !           838:   if( p->magic!=VDBE_MAGIC_RUN && p->magic!=VDBE_MAGIC_HALT ){
        !           839:     sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), (char*)0);
        !           840:     return SQLITE_MISUSE;
        !           841:   }
        !           842:   if( p->zErrMsg ){
        !           843:     if( pzErrMsg && *pzErrMsg==0 ){
        !           844:       *pzErrMsg = p->zErrMsg;
        !           845:     }else{
        !           846:       sqliteFree(p->zErrMsg);
        !           847:     }
        !           848:     p->zErrMsg = 0;
        !           849:   }else if( p->rc ){
        !           850:     sqliteSetString(pzErrMsg, sqlite_error_string(p->rc), (char*)0);
        !           851:   }
        !           852:   Cleanup(p);
        !           853:   if( p->rc!=SQLITE_OK ){
        !           854:     switch( p->errorAction ){
        !           855:       case OE_Abort: {
        !           856:         if( !p->undoTransOnError ){
        !           857:           for(i=0; i<db->nDb; i++){
        !           858:             if( db->aDb[i].pBt ){
        !           859:               sqliteBtreeRollbackCkpt(db->aDb[i].pBt);
        !           860:             }
        !           861:           }
        !           862:           break;
        !           863:         }
        !           864:         /* Fall through to ROLLBACK */
        !           865:       }
        !           866:       case OE_Rollback: {
        !           867:         sqliteRollbackAll(db);
        !           868:         db->flags &= ~SQLITE_InTrans;
        !           869:         db->onError = OE_Default;
        !           870:         break;
        !           871:       }
        !           872:       default: {
        !           873:         if( p->undoTransOnError ){
        !           874:           sqliteRollbackAll(db);
        !           875:           db->flags &= ~SQLITE_InTrans;
        !           876:           db->onError = OE_Default;
        !           877:         }
        !           878:         break;
        !           879:       }
        !           880:     }
        !           881:     sqliteRollbackInternalChanges(db);
        !           882:   }
        !           883:   for(i=0; i<db->nDb; i++){
        !           884:     if( db->aDb[i].pBt && db->aDb[i].inTrans==2 ){
        !           885:       sqliteBtreeCommitCkpt(db->aDb[i].pBt);
        !           886:       db->aDb[i].inTrans = 1;
        !           887:     }
        !           888:   }
        !           889:   assert( p->pTos<&p->aStack[p->pc] || sqlite_malloc_failed==1 );
        !           890: #ifdef VDBE_PROFILE
        !           891:   {
        !           892:     FILE *out = fopen("vdbe_profile.out", "a");
        !           893:     if( out ){
        !           894:       int i;
        !           895:       fprintf(out, "---- ");
        !           896:       for(i=0; i<p->nOp; i++){
        !           897:         fprintf(out, "%02x", p->aOp[i].opcode);
        !           898:       }
        !           899:       fprintf(out, "\n");
        !           900:       for(i=0; i<p->nOp; i++){
        !           901:         fprintf(out, "%6d %10lld %8lld ",
        !           902:            p->aOp[i].cnt,
        !           903:            p->aOp[i].cycles,
        !           904:            p->aOp[i].cnt>0 ? p->aOp[i].cycles/p->aOp[i].cnt : 0
        !           905:         );
        !           906:         sqliteVdbePrintOp(out, i, &p->aOp[i]);
        !           907:       }
        !           908:       fclose(out);
        !           909:     }
        !           910:   }
        !           911: #endif
        !           912:   p->magic = VDBE_MAGIC_INIT;
        !           913:   return p->rc;
        !           914: }
        !           915: 
        !           916: /*
        !           917: ** Clean up and delete a VDBE after execution.  Return an integer which is
        !           918: ** the result code.  Write any error message text into *pzErrMsg.
        !           919: */
        !           920: int sqliteVdbeFinalize(Vdbe *p, char **pzErrMsg){
        !           921:   int rc;
        !           922:   sqlite *db;
        !           923: 
        !           924:   if( p->magic!=VDBE_MAGIC_RUN && p->magic!=VDBE_MAGIC_HALT ){
        !           925:     sqliteSetString(pzErrMsg, sqlite_error_string(SQLITE_MISUSE), (char*)0);
        !           926:     return SQLITE_MISUSE;
        !           927:   }
        !           928:   db = p->db;
        !           929:   rc = sqliteVdbeReset(p, pzErrMsg);
        !           930:   sqliteVdbeDelete(p);
        !           931:   if( db->want_to_close && db->pVdbe==0 ){
        !           932:     sqlite_close(db);
        !           933:   }
        !           934:   if( rc==SQLITE_SCHEMA ){
        !           935:     sqliteResetInternalSchema(db, 0);
        !           936:   }
        !           937:   return rc;
        !           938: }
        !           939: 
        !           940: /*
        !           941: ** Set the values of all variables.  Variable $1 in the original SQL will
        !           942: ** be the string azValue[0].  $2 will have the value azValue[1].  And
        !           943: ** so forth.  If a value is out of range (for example $3 when nValue==2)
        !           944: ** then its value will be NULL.
        !           945: **
        !           946: ** This routine overrides any prior call.
        !           947: */
        !           948: int sqlite_bind(sqlite_vm *pVm, int i, const char *zVal, int len, int copy){
        !           949:   Vdbe *p = (Vdbe*)pVm;
        !           950:   if( p->magic!=VDBE_MAGIC_RUN || p->pc!=0 ){
        !           951:     return SQLITE_MISUSE;
        !           952:   }
        !           953:   if( i<1 || i>p->nVar ){
        !           954:     return SQLITE_RANGE;
        !           955:   }
        !           956:   i--;
        !           957:   if( p->abVar[i] ){
        !           958:     sqliteFree(p->azVar[i]);
        !           959:   }
        !           960:   if( zVal==0 ){
        !           961:     copy = 0;
        !           962:     len = 0;
        !           963:   }
        !           964:   if( len<0 ){
        !           965:     len = strlen(zVal)+1;
        !           966:   }
        !           967:   if( copy ){
        !           968:     p->azVar[i] = sqliteMalloc( len );
        !           969:     if( p->azVar[i] ) memcpy(p->azVar[i], zVal, len);
        !           970:   }else{
        !           971:     p->azVar[i] = (char*)zVal;
        !           972:   }
        !           973:   p->abVar[i] = copy;
        !           974:   p->anVar[i] = len;
        !           975:   return SQLITE_OK;
        !           976: }
        !           977: 
        !           978: 
        !           979: /*
        !           980: ** Delete an entire VDBE.
        !           981: */
        !           982: void sqliteVdbeDelete(Vdbe *p){
        !           983:   int i;
        !           984:   if( p==0 ) return;
        !           985:   Cleanup(p);
        !           986:   if( p->pPrev ){
        !           987:     p->pPrev->pNext = p->pNext;
        !           988:   }else{
        !           989:     assert( p->db->pVdbe==p );
        !           990:     p->db->pVdbe = p->pNext;
        !           991:   }
        !           992:   if( p->pNext ){
        !           993:     p->pNext->pPrev = p->pPrev;
        !           994:   }
        !           995:   p->pPrev = p->pNext = 0;
        !           996:   if( p->nOpAlloc==0 ){
        !           997:     p->aOp = 0;
        !           998:     p->nOp = 0;
        !           999:   }
        !          1000:   for(i=0; i<p->nOp; i++){
        !          1001:     if( p->aOp[i].p3type==P3_DYNAMIC ){
        !          1002:       sqliteFree(p->aOp[i].p3);
        !          1003:     }
        !          1004:   }
        !          1005:   for(i=0; i<p->nVar; i++){
        !          1006:     if( p->abVar[i] ) sqliteFree(p->azVar[i]);
        !          1007:   }
        !          1008:   sqliteFree(p->aOp);
        !          1009:   sqliteFree(p->aLabel);
        !          1010:   sqliteFree(p->aStack);
        !          1011:   p->magic = VDBE_MAGIC_DEAD;
        !          1012:   sqliteFree(p);
        !          1013: }
        !          1014: 
        !          1015: /*
        !          1016: ** Convert an integer in between the native integer format and
        !          1017: ** the bigEndian format used as the record number for tables.
        !          1018: **
        !          1019: ** The bigEndian format (most significant byte first) is used for
        !          1020: ** record numbers so that records will sort into the correct order
        !          1021: ** even though memcmp() is used to compare the keys.  On machines
        !          1022: ** whose native integer format is little endian (ex: i486) the
        !          1023: ** order of bytes is reversed.  On native big-endian machines
        !          1024: ** (ex: Alpha, Sparc, Motorola) the byte order is the same.
        !          1025: **
        !          1026: ** This function is its own inverse.  In other words
        !          1027: **
        !          1028: **         X == byteSwap(byteSwap(X))
        !          1029: */
        !          1030: int sqliteVdbeByteSwap(int x){
        !          1031:   union {
        !          1032:      char zBuf[sizeof(int)];
        !          1033:      int i;
        !          1034:   } ux;
        !          1035:   ux.zBuf[3] = x&0xff;
        !          1036:   ux.zBuf[2] = (x>>8)&0xff;
        !          1037:   ux.zBuf[1] = (x>>16)&0xff;
        !          1038:   ux.zBuf[0] = (x>>24)&0xff;
        !          1039:   return ux.i;
        !          1040: }
        !          1041: 
        !          1042: /*
        !          1043: ** If a MoveTo operation is pending on the given cursor, then do that
        !          1044: ** MoveTo now.  Return an error code.  If no MoveTo is pending, this
        !          1045: ** routine does nothing and returns SQLITE_OK.
        !          1046: */
        !          1047: int sqliteVdbeCursorMoveto(Cursor *p){
        !          1048:   if( p->deferredMoveto ){
        !          1049:     int res;
        !          1050:     extern int sqlite_search_count;
        !          1051:     sqliteBtreeMoveto(p->pCursor, (char*)&p->movetoTarget, sizeof(int), &res);
        !          1052:     p->lastRecno = keyToInt(p->movetoTarget);
        !          1053:     p->recnoIsValid = res==0;
        !          1054:     if( res<0 ){
        !          1055:       sqliteBtreeNext(p->pCursor, &res);
        !          1056:     }
        !          1057:     sqlite_search_count++;
        !          1058:     p->deferredMoveto = 0;
        !          1059:   }
        !          1060:   return SQLITE_OK;
        !          1061: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>