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

1.1     ! misho       1: /*
        !             2: ** 2001 September 15
        !             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: ** The code in this file implements execution method of the 
        !            13: ** Virtual Database Engine (VDBE).  A separate file ("vdbeaux.c")
        !            14: ** handles housekeeping details such as creating and deleting
        !            15: ** VDBE instances.  This file is solely interested in executing
        !            16: ** the VDBE program.
        !            17: **
        !            18: ** In the external interface, an "sqlite_vm*" is an opaque pointer
        !            19: ** to a VDBE.
        !            20: **
        !            21: ** The SQL parser generates a program which is then executed by
        !            22: ** the VDBE to do the work of the SQL statement.  VDBE programs are 
        !            23: ** similar in form to assembly language.  The program consists of
        !            24: ** a linear sequence of operations.  Each operation has an opcode 
        !            25: ** and 3 operands.  Operands P1 and P2 are integers.  Operand P3 
        !            26: ** is a null-terminated string.   The P2 operand must be non-negative.
        !            27: ** Opcodes will typically ignore one or more operands.  Many opcodes
        !            28: ** ignore all three operands.
        !            29: **
        !            30: ** Computation results are stored on a stack.  Each entry on the
        !            31: ** stack is either an integer, a null-terminated string, a floating point
        !            32: ** number, or the SQL "NULL" value.  An inplicit conversion from one
        !            33: ** type to the other occurs as necessary.
        !            34: ** 
        !            35: ** Most of the code in this file is taken up by the sqliteVdbeExec()
        !            36: ** function which does the work of interpreting a VDBE program.
        !            37: ** But other routines are also provided to help in building up
        !            38: ** a program instruction by instruction.
        !            39: **
        !            40: ** Various scripts scan this source file in order to generate HTML
        !            41: ** documentation, headers files, or other derived files.  The formatting
        !            42: ** of the code in this file is, therefore, important.  See other comments
        !            43: ** in this file for details.  If in doubt, do not deviate from existing
        !            44: ** commenting and indentation practices when changing or adding code.
        !            45: **
        !            46: ** $Id: vdbe.c 219681 2006-09-09 10:59:05Z tony2001 $
        !            47: */
        !            48: #include "sqliteInt.h"
        !            49: #include "os.h"
        !            50: #include <ctype.h>
        !            51: #include "vdbeInt.h"
        !            52: 
        !            53: /*
        !            54: ** The following global variable is incremented every time a cursor
        !            55: ** moves, either by the OP_MoveTo or the OP_Next opcode.  The test
        !            56: ** procedures use this information to make sure that indices are
        !            57: ** working correctly.  This variable has no function other than to
        !            58: ** help verify the correct operation of the library.
        !            59: */
        !            60: int sqlite_search_count = 0;
        !            61: 
        !            62: /*
        !            63: ** When this global variable is positive, it gets decremented once before
        !            64: ** each instruction in the VDBE.  When reaches zero, the SQLITE_Interrupt
        !            65: ** of the db.flags field is set in order to simulate an interrupt.
        !            66: **
        !            67: ** This facility is used for testing purposes only.  It does not function
        !            68: ** in an ordinary build.
        !            69: */
        !            70: int sqlite_interrupt_count = 0;
        !            71: 
        !            72: /*
        !            73: ** Advance the virtual machine to the next output row.
        !            74: **
        !            75: ** The return vale will be either SQLITE_BUSY, SQLITE_DONE, 
        !            76: ** SQLITE_ROW, SQLITE_ERROR, or SQLITE_MISUSE.
        !            77: **
        !            78: ** SQLITE_BUSY means that the virtual machine attempted to open
        !            79: ** a locked database and there is no busy callback registered.
        !            80: ** Call sqlite_step() again to retry the open.  *pN is set to 0
        !            81: ** and *pazColName and *pazValue are both set to NULL.
        !            82: **
        !            83: ** SQLITE_DONE means that the virtual machine has finished
        !            84: ** executing.  sqlite_step() should not be called again on this
        !            85: ** virtual machine.  *pN and *pazColName are set appropriately
        !            86: ** but *pazValue is set to NULL.
        !            87: **
        !            88: ** SQLITE_ROW means that the virtual machine has generated another
        !            89: ** row of the result set.  *pN is set to the number of columns in
        !            90: ** the row.  *pazColName is set to the names of the columns followed
        !            91: ** by the column datatypes.  *pazValue is set to the values of each
        !            92: ** column in the row.  The value of the i-th column is (*pazValue)[i].
        !            93: ** The name of the i-th column is (*pazColName)[i] and the datatype
        !            94: ** of the i-th column is (*pazColName)[i+*pN].
        !            95: **
        !            96: ** SQLITE_ERROR means that a run-time error (such as a constraint
        !            97: ** violation) has occurred.  The details of the error will be returned
        !            98: ** by the next call to sqlite_finalize().  sqlite_step() should not
        !            99: ** be called again on the VM.
        !           100: **
        !           101: ** SQLITE_MISUSE means that the this routine was called inappropriately.
        !           102: ** Perhaps it was called on a virtual machine that had already been
        !           103: ** finalized or on one that had previously returned SQLITE_ERROR or
        !           104: ** SQLITE_DONE.  Or it could be the case the the same database connection
        !           105: ** is being used simulataneously by two or more threads.
        !           106: */
        !           107: int sqlite_step(
        !           108:   sqlite_vm *pVm,              /* The virtual machine to execute */
        !           109:   int *pN,                     /* OUT: Number of columns in result */
        !           110:   const char ***pazValue,      /* OUT: Column data */
        !           111:   const char ***pazColName     /* OUT: Column names and datatypes */
        !           112: ){
        !           113:   Vdbe *p = (Vdbe*)pVm;
        !           114:   sqlite *db;
        !           115:   int rc;
        !           116: 
        !           117:   if( !p || p->magic!=VDBE_MAGIC_RUN ){
        !           118:     return SQLITE_MISUSE;
        !           119:   }
        !           120:   db = p->db;
        !           121:   if( sqliteSafetyOn(db) ){
        !           122:     p->rc = SQLITE_MISUSE;
        !           123:     return SQLITE_MISUSE;
        !           124:   }
        !           125:   if( p->explain ){
        !           126:     rc = sqliteVdbeList(p);
        !           127:   }else{
        !           128:     rc = sqliteVdbeExec(p);
        !           129:   }
        !           130:   if( rc==SQLITE_DONE || rc==SQLITE_ROW ){
        !           131:     if( pazColName ) *pazColName = (const char**)p->azColName;
        !           132:     if( pN ) *pN = p->nResColumn;
        !           133:   }else{
        !           134:     if( pazColName) *pazColName = 0;
        !           135:     if( pN ) *pN = 0;
        !           136:   }
        !           137:   if( pazValue ){
        !           138:     if( rc==SQLITE_ROW ){
        !           139:       *pazValue = (const char**)p->azResColumn;
        !           140:     }else{
        !           141:       *pazValue = 0;
        !           142:     }
        !           143:   }
        !           144:   if( sqliteSafetyOff(db) ){
        !           145:     return SQLITE_MISUSE;
        !           146:   }
        !           147:   return rc;
        !           148: }
        !           149: 
        !           150: /*
        !           151: ** Insert a new aggregate element and make it the element that
        !           152: ** has focus.
        !           153: **
        !           154: ** Return 0 on success and 1 if memory is exhausted.
        !           155: */
        !           156: static int AggInsert(Agg *p, char *zKey, int nKey){
        !           157:   AggElem *pElem, *pOld;
        !           158:   int i;
        !           159:   Mem *pMem;
        !           160:   pElem = sqliteMalloc( sizeof(AggElem) + nKey +
        !           161:                         (p->nMem-1)*sizeof(pElem->aMem[0]) );
        !           162:   if( pElem==0 ) return 1;
        !           163:   pElem->zKey = (char*)&pElem->aMem[p->nMem];
        !           164:   memcpy(pElem->zKey, zKey, nKey);
        !           165:   pElem->nKey = nKey;
        !           166:   pOld = sqliteHashInsert(&p->hash, pElem->zKey, pElem->nKey, pElem);
        !           167:   if( pOld!=0 ){
        !           168:     assert( pOld==pElem );  /* Malloc failed on insert */
        !           169:     sqliteFree(pOld);
        !           170:     return 0;
        !           171:   }
        !           172:   for(i=0, pMem=pElem->aMem; i<p->nMem; i++, pMem++){
        !           173:     pMem->flags = MEM_Null;
        !           174:   }
        !           175:   p->pCurrent = pElem;
        !           176:   return 0;
        !           177: }
        !           178: 
        !           179: /*
        !           180: ** Get the AggElem currently in focus
        !           181: */
        !           182: #define AggInFocus(P)   ((P).pCurrent ? (P).pCurrent : _AggInFocus(&(P)))
        !           183: static AggElem *_AggInFocus(Agg *p){
        !           184:   HashElem *pElem = sqliteHashFirst(&p->hash);
        !           185:   if( pElem==0 ){
        !           186:     AggInsert(p,"",1);
        !           187:     pElem = sqliteHashFirst(&p->hash);
        !           188:   }
        !           189:   return pElem ? sqliteHashData(pElem) : 0;
        !           190: }
        !           191: 
        !           192: /*
        !           193: ** Convert the given stack entity into a string if it isn't one
        !           194: ** already.
        !           195: */
        !           196: #define Stringify(P) if(((P)->flags & MEM_Str)==0){hardStringify(P);}
        !           197: static int hardStringify(Mem *pStack){
        !           198:   int fg = pStack->flags;
        !           199:   if( fg & MEM_Real ){
        !           200:     sqlite_snprintf(sizeof(pStack->zShort),pStack->zShort,"%.15g",pStack->r);
        !           201:   }else if( fg & MEM_Int ){
        !           202:     sqlite_snprintf(sizeof(pStack->zShort),pStack->zShort,"%d",pStack->i);
        !           203:   }else{
        !           204:     pStack->zShort[0] = 0;
        !           205:   }
        !           206:   pStack->z = pStack->zShort;
        !           207:   pStack->n = strlen(pStack->zShort)+1;
        !           208:   pStack->flags = MEM_Str | MEM_Short;
        !           209:   return 0;
        !           210: }
        !           211: 
        !           212: /*
        !           213: ** Convert the given stack entity into a string that has been obtained
        !           214: ** from sqliteMalloc().  This is different from Stringify() above in that
        !           215: ** Stringify() will use the NBFS bytes of static string space if the string
        !           216: ** will fit but this routine always mallocs for space.
        !           217: ** Return non-zero if we run out of memory.
        !           218: */
        !           219: #define Dynamicify(P) (((P)->flags & MEM_Dyn)==0 ? hardDynamicify(P):0)
        !           220: static int hardDynamicify(Mem *pStack){
        !           221:   int fg = pStack->flags;
        !           222:   char *z;
        !           223:   if( (fg & MEM_Str)==0 ){
        !           224:     hardStringify(pStack);
        !           225:   }
        !           226:   assert( (fg & MEM_Dyn)==0 );
        !           227:   z = sqliteMallocRaw( pStack->n );
        !           228:   if( z==0 ) return 1;
        !           229:   memcpy(z, pStack->z, pStack->n);
        !           230:   pStack->z = z;
        !           231:   pStack->flags |= MEM_Dyn;
        !           232:   return 0;
        !           233: }
        !           234: 
        !           235: /*
        !           236: ** An ephemeral string value (signified by the MEM_Ephem flag) contains
        !           237: ** a pointer to a dynamically allocated string where some other entity
        !           238: ** is responsible for deallocating that string.  Because the stack entry
        !           239: ** does not control the string, it might be deleted without the stack
        !           240: ** entry knowing it.
        !           241: **
        !           242: ** This routine converts an ephemeral string into a dynamically allocated
        !           243: ** string that the stack entry itself controls.  In other words, it
        !           244: ** converts an MEM_Ephem string into an MEM_Dyn string.
        !           245: */
        !           246: #define Deephemeralize(P) \
        !           247:    if( ((P)->flags&MEM_Ephem)!=0 && hardDeephem(P) ){ goto no_mem;}
        !           248: static int hardDeephem(Mem *pStack){
        !           249:   char *z;
        !           250:   assert( (pStack->flags & MEM_Ephem)!=0 );
        !           251:   z = sqliteMallocRaw( pStack->n );
        !           252:   if( z==0 ) return 1;
        !           253:   memcpy(z, pStack->z, pStack->n);
        !           254:   pStack->z = z;
        !           255:   pStack->flags &= ~MEM_Ephem;
        !           256:   pStack->flags |= MEM_Dyn;
        !           257:   return 0;
        !           258: }
        !           259: 
        !           260: /*
        !           261: ** Release the memory associated with the given stack level.  This
        !           262: ** leaves the Mem.flags field in an inconsistent state.
        !           263: */
        !           264: #define Release(P) if((P)->flags&MEM_Dyn){ sqliteFree((P)->z); }
        !           265: 
        !           266: /*
        !           267: ** Pop the stack N times.
        !           268: */
        !           269: static void popStack(Mem **ppTos, int N){
        !           270:   Mem *pTos = *ppTos;
        !           271:   while( N>0 ){
        !           272:     N--;
        !           273:     Release(pTos);
        !           274:     pTos--;
        !           275:   }
        !           276:   *ppTos = pTos;
        !           277: }
        !           278: 
        !           279: /*
        !           280: ** Return TRUE if zNum is a 32-bit signed integer and write
        !           281: ** the value of the integer into *pNum.  If zNum is not an integer
        !           282: ** or is an integer that is too large to be expressed with just 32
        !           283: ** bits, then return false.
        !           284: **
        !           285: ** Under Linux (RedHat 7.2) this routine is much faster than atoi()
        !           286: ** for converting strings into integers.
        !           287: */
        !           288: static int toInt(const char *zNum, int *pNum){
        !           289:   int v = 0;
        !           290:   int neg;
        !           291:   int i, c;
        !           292:   if( *zNum=='-' ){
        !           293:     neg = 1;
        !           294:     zNum++;
        !           295:   }else if( *zNum=='+' ){
        !           296:     neg = 0;
        !           297:     zNum++;
        !           298:   }else{
        !           299:     neg = 0;
        !           300:   }
        !           301:   for(i=0; (c=zNum[i])>='0' && c<='9'; i++){
        !           302:     v = v*10 + c - '0';
        !           303:   }
        !           304:   *pNum = neg ? -v : v;
        !           305:   return c==0 && i>0 && (i<10 || (i==10 && memcmp(zNum,"2147483647",10)<=0));
        !           306: }
        !           307: 
        !           308: /*
        !           309: ** Convert the given stack entity into a integer if it isn't one
        !           310: ** already.
        !           311: **
        !           312: ** Any prior string or real representation is invalidated.  
        !           313: ** NULLs are converted into 0.
        !           314: */
        !           315: #define Integerify(P) if(((P)->flags&MEM_Int)==0){ hardIntegerify(P); }
        !           316: static void hardIntegerify(Mem *pStack){
        !           317:   if( pStack->flags & MEM_Real ){
        !           318:     pStack->i = (int)pStack->r;
        !           319:     Release(pStack);
        !           320:   }else if( pStack->flags & MEM_Str ){
        !           321:     toInt(pStack->z, &pStack->i);
        !           322:     Release(pStack);
        !           323:   }else{
        !           324:     pStack->i = 0;
        !           325:   }
        !           326:   pStack->flags = MEM_Int;
        !           327: }
        !           328: 
        !           329: /*
        !           330: ** Get a valid Real representation for the given stack element.
        !           331: **
        !           332: ** Any prior string or integer representation is retained.
        !           333: ** NULLs are converted into 0.0.
        !           334: */
        !           335: #define Realify(P) if(((P)->flags&MEM_Real)==0){ hardRealify(P); }
        !           336: static void hardRealify(Mem *pStack){
        !           337:   if( pStack->flags & MEM_Str ){
        !           338:     pStack->r = sqliteAtoF(pStack->z, 0);
        !           339:   }else if( pStack->flags & MEM_Int ){
        !           340:     pStack->r = pStack->i;
        !           341:   }else{
        !           342:     pStack->r = 0.0;
        !           343:   }
        !           344:   pStack->flags |= MEM_Real;
        !           345: }
        !           346: 
        !           347: /*
        !           348: ** The parameters are pointers to the head of two sorted lists
        !           349: ** of Sorter structures.  Merge these two lists together and return
        !           350: ** a single sorted list.  This routine forms the core of the merge-sort
        !           351: ** algorithm.
        !           352: **
        !           353: ** In the case of a tie, left sorts in front of right.
        !           354: */
        !           355: static Sorter *Merge(Sorter *pLeft, Sorter *pRight){
        !           356:   Sorter sHead;
        !           357:   Sorter *pTail;
        !           358:   pTail = &sHead;
        !           359:   pTail->pNext = 0;
        !           360:   while( pLeft && pRight ){
        !           361:     int c = sqliteSortCompare(pLeft->zKey, pRight->zKey);
        !           362:     if( c<=0 ){
        !           363:       pTail->pNext = pLeft;
        !           364:       pLeft = pLeft->pNext;
        !           365:     }else{
        !           366:       pTail->pNext = pRight;
        !           367:       pRight = pRight->pNext;
        !           368:     }
        !           369:     pTail = pTail->pNext;
        !           370:   }
        !           371:   if( pLeft ){
        !           372:     pTail->pNext = pLeft;
        !           373:   }else if( pRight ){
        !           374:     pTail->pNext = pRight;
        !           375:   }
        !           376:   return sHead.pNext;
        !           377: }
        !           378: 
        !           379: /*
        !           380: ** The following routine works like a replacement for the standard
        !           381: ** library routine fgets().  The difference is in how end-of-line (EOL)
        !           382: ** is handled.  Standard fgets() uses LF for EOL under unix, CRLF
        !           383: ** under windows, and CR under mac.  This routine accepts any of these
        !           384: ** character sequences as an EOL mark.  The EOL mark is replaced by
        !           385: ** a single LF character in zBuf.
        !           386: */
        !           387: static char *vdbe_fgets(char *zBuf, int nBuf, FILE *in){
        !           388:   int i, c;
        !           389:   for(i=0; i<nBuf-1 && (c=getc(in))!=EOF; i++){
        !           390:     zBuf[i] = c;
        !           391:     if( c=='\r' || c=='\n' ){
        !           392:       if( c=='\r' ){
        !           393:         zBuf[i] = '\n';
        !           394:         c = getc(in);
        !           395:         if( c!=EOF && c!='\n' ) ungetc(c, in);
        !           396:       }
        !           397:       i++;
        !           398:       break;
        !           399:     }
        !           400:   }
        !           401:   zBuf[i]  = 0;
        !           402:   return i>0 ? zBuf : 0;
        !           403: }
        !           404: 
        !           405: /*
        !           406: ** Make sure there is space in the Vdbe structure to hold at least
        !           407: ** mxCursor cursors.  If there is not currently enough space, then
        !           408: ** allocate more.
        !           409: **
        !           410: ** If a memory allocation error occurs, return 1.  Return 0 if
        !           411: ** everything works.
        !           412: */
        !           413: static int expandCursorArraySize(Vdbe *p, int mxCursor){
        !           414:   if( mxCursor>=p->nCursor ){
        !           415:     Cursor *aCsr = sqliteRealloc( p->aCsr, (mxCursor+1)*sizeof(Cursor) );
        !           416:     if( aCsr==0 ) return 1;
        !           417:     p->aCsr = aCsr;
        !           418:     memset(&p->aCsr[p->nCursor], 0, sizeof(Cursor)*(mxCursor+1-p->nCursor));
        !           419:     p->nCursor = mxCursor+1;
        !           420:   }
        !           421:   return 0;
        !           422: }
        !           423: 
        !           424: #ifdef VDBE_PROFILE
        !           425: /*
        !           426: ** The following routine only works on pentium-class processors.
        !           427: ** It uses the RDTSC opcode to read cycle count value out of the
        !           428: ** processor and returns that value.  This can be used for high-res
        !           429: ** profiling.
        !           430: */
        !           431: __inline__ unsigned long long int hwtime(void){
        !           432:   unsigned long long int x;
        !           433:   __asm__("rdtsc\n\t"
        !           434:           "mov %%edx, %%ecx\n\t"
        !           435:           :"=A" (x));
        !           436:   return x;
        !           437: }
        !           438: #endif
        !           439: 
        !           440: /*
        !           441: ** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
        !           442: ** sqlite_interrupt() routine has been called.  If it has been, then
        !           443: ** processing of the VDBE program is interrupted.
        !           444: **
        !           445: ** This macro added to every instruction that does a jump in order to
        !           446: ** implement a loop.  This test used to be on every single instruction,
        !           447: ** but that meant we more testing that we needed.  By only testing the
        !           448: ** flag on jump instructions, we get a (small) speed improvement.
        !           449: */
        !           450: #define CHECK_FOR_INTERRUPT \
        !           451:    if( db->flags & SQLITE_Interrupt ) goto abort_due_to_interrupt;
        !           452: 
        !           453: 
        !           454: /*
        !           455: ** Execute as much of a VDBE program as we can then return.
        !           456: **
        !           457: ** sqliteVdbeMakeReady() must be called before this routine in order to
        !           458: ** close the program with a final OP_Halt and to set up the callbacks
        !           459: ** and the error message pointer.
        !           460: **
        !           461: ** Whenever a row or result data is available, this routine will either
        !           462: ** invoke the result callback (if there is one) or return with
        !           463: ** SQLITE_ROW.
        !           464: **
        !           465: ** If an attempt is made to open a locked database, then this routine
        !           466: ** will either invoke the busy callback (if there is one) or it will
        !           467: ** return SQLITE_BUSY.
        !           468: **
        !           469: ** If an error occurs, an error message is written to memory obtained
        !           470: ** from sqliteMalloc() and p->zErrMsg is made to point to that memory.
        !           471: ** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
        !           472: **
        !           473: ** If the callback ever returns non-zero, then the program exits
        !           474: ** immediately.  There will be no error message but the p->rc field is
        !           475: ** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
        !           476: **
        !           477: ** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
        !           478: ** routine to return SQLITE_ERROR.
        !           479: **
        !           480: ** Other fatal errors return SQLITE_ERROR.
        !           481: **
        !           482: ** After this routine has finished, sqliteVdbeFinalize() should be
        !           483: ** used to clean up the mess that was left behind.
        !           484: */
        !           485: int sqliteVdbeExec(
        !           486:   Vdbe *p                    /* The VDBE */
        !           487: ){
        !           488:   int pc;                    /* The program counter */
        !           489:   Op *pOp;                   /* Current operation */
        !           490:   int rc = SQLITE_OK;        /* Value to return */
        !           491:   sqlite *db = p->db;        /* The database */
        !           492:   Mem *pTos;                 /* Top entry in the operand stack */
        !           493:   char zBuf[100];            /* Space to sprintf() an integer */
        !           494: #ifdef VDBE_PROFILE
        !           495:   unsigned long long start;  /* CPU clock count at start of opcode */
        !           496:   int origPc;                /* Program counter at start of opcode */
        !           497: #endif
        !           498: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
        !           499:   int nProgressOps = 0;      /* Opcodes executed since progress callback. */
        !           500: #endif
        !           501: 
        !           502:   if( p->magic!=VDBE_MAGIC_RUN ) return SQLITE_MISUSE;
        !           503:   assert( db->magic==SQLITE_MAGIC_BUSY );
        !           504:   assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
        !           505:   p->rc = SQLITE_OK;
        !           506:   assert( p->explain==0 );
        !           507:   if( sqlite_malloc_failed ) goto no_mem;
        !           508:   pTos = p->pTos;
        !           509:   if( p->popStack ){
        !           510:     popStack(&pTos, p->popStack);
        !           511:     p->popStack = 0;
        !           512:   }
        !           513:   CHECK_FOR_INTERRUPT;
        !           514:   for(pc=p->pc; rc==SQLITE_OK; pc++){
        !           515:     assert( pc>=0 && pc<p->nOp );
        !           516:     assert( pTos<=&p->aStack[pc] );
        !           517: #ifdef VDBE_PROFILE
        !           518:     origPc = pc;
        !           519:     start = hwtime();
        !           520: #endif
        !           521:     pOp = &p->aOp[pc];
        !           522: 
        !           523:     /* Only allow tracing if NDEBUG is not defined.
        !           524:     */
        !           525: #ifndef NDEBUG
        !           526:     if( p->trace ){
        !           527:       sqliteVdbePrintOp(p->trace, pc, pOp);
        !           528:     }
        !           529: #endif
        !           530: 
        !           531:     /* Check to see if we need to simulate an interrupt.  This only happens
        !           532:     ** if we have a special test build.
        !           533:     */
        !           534: #ifdef SQLITE_TEST
        !           535:     if( sqlite_interrupt_count>0 ){
        !           536:       sqlite_interrupt_count--;
        !           537:       if( sqlite_interrupt_count==0 ){
        !           538:         sqlite_interrupt(db);
        !           539:       }
        !           540:     }
        !           541: #endif
        !           542: 
        !           543: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
        !           544:     /* Call the progress callback if it is configured and the required number
        !           545:     ** of VDBE ops have been executed (either since this invocation of
        !           546:     ** sqliteVdbeExec() or since last time the progress callback was called).
        !           547:     ** If the progress callback returns non-zero, exit the virtual machine with
        !           548:     ** a return code SQLITE_ABORT.
        !           549:     */
        !           550:     if( db->xProgress ){
        !           551:       if( db->nProgressOps==nProgressOps ){
        !           552:         if( db->xProgress(db->pProgressArg)!=0 ){
        !           553:           rc = SQLITE_ABORT;
        !           554:           continue; /* skip to the next iteration of the for loop */
        !           555:         }
        !           556:         nProgressOps = 0;
        !           557:       }
        !           558:       nProgressOps++;
        !           559:     }
        !           560: #endif
        !           561: 
        !           562:     switch( pOp->opcode ){
        !           563: 
        !           564: /*****************************************************************************
        !           565: ** What follows is a massive switch statement where each case implements a
        !           566: ** separate instruction in the virtual machine.  If we follow the usual
        !           567: ** indentation conventions, each case should be indented by 6 spaces.  But
        !           568: ** that is a lot of wasted space on the left margin.  So the code within
        !           569: ** the switch statement will break with convention and be flush-left. Another
        !           570: ** big comment (similar to this one) will mark the point in the code where
        !           571: ** we transition back to normal indentation.
        !           572: **
        !           573: ** The formatting of each case is important.  The makefile for SQLite
        !           574: ** generates two C files "opcodes.h" and "opcodes.c" by scanning this
        !           575: ** file looking for lines that begin with "case OP_".  The opcodes.h files
        !           576: ** will be filled with #defines that give unique integer values to each
        !           577: ** opcode and the opcodes.c file is filled with an array of strings where
        !           578: ** each string is the symbolic name for the corresponding opcode.
        !           579: **
        !           580: ** Documentation about VDBE opcodes is generated by scanning this file
        !           581: ** for lines of that contain "Opcode:".  That line and all subsequent
        !           582: ** comment lines are used in the generation of the opcode.html documentation
        !           583: ** file.
        !           584: **
        !           585: ** SUMMARY:
        !           586: **
        !           587: **     Formatting is important to scripts that scan this file.
        !           588: **     Do not deviate from the formatting style currently in use.
        !           589: **
        !           590: *****************************************************************************/
        !           591: 
        !           592: /* Opcode:  Goto * P2 *
        !           593: **
        !           594: ** An unconditional jump to address P2.
        !           595: ** The next instruction executed will be 
        !           596: ** the one at index P2 from the beginning of
        !           597: ** the program.
        !           598: */
        !           599: case OP_Goto: {
        !           600:   CHECK_FOR_INTERRUPT;
        !           601:   pc = pOp->p2 - 1;
        !           602:   break;
        !           603: }
        !           604: 
        !           605: /* Opcode:  Gosub * P2 *
        !           606: **
        !           607: ** Push the current address plus 1 onto the return address stack
        !           608: ** and then jump to address P2.
        !           609: **
        !           610: ** The return address stack is of limited depth.  If too many
        !           611: ** OP_Gosub operations occur without intervening OP_Returns, then
        !           612: ** the return address stack will fill up and processing will abort
        !           613: ** with a fatal error.
        !           614: */
        !           615: case OP_Gosub: {
        !           616:   if( p->returnDepth>=sizeof(p->returnStack)/sizeof(p->returnStack[0]) ){
        !           617:     sqliteSetString(&p->zErrMsg, "return address stack overflow", (char*)0);
        !           618:     p->rc = SQLITE_INTERNAL;
        !           619:     return SQLITE_ERROR;
        !           620:   }
        !           621:   p->returnStack[p->returnDepth++] = pc+1;
        !           622:   pc = pOp->p2 - 1;
        !           623:   break;
        !           624: }
        !           625: 
        !           626: /* Opcode:  Return * * *
        !           627: **
        !           628: ** Jump immediately to the next instruction after the last unreturned
        !           629: ** OP_Gosub.  If an OP_Return has occurred for all OP_Gosubs, then
        !           630: ** processing aborts with a fatal error.
        !           631: */
        !           632: case OP_Return: {
        !           633:   if( p->returnDepth<=0 ){
        !           634:     sqliteSetString(&p->zErrMsg, "return address stack underflow", (char*)0);
        !           635:     p->rc = SQLITE_INTERNAL;
        !           636:     return SQLITE_ERROR;
        !           637:   }
        !           638:   p->returnDepth--;
        !           639:   pc = p->returnStack[p->returnDepth] - 1;
        !           640:   break;
        !           641: }
        !           642: 
        !           643: /* Opcode:  Halt P1 P2 *
        !           644: **
        !           645: ** Exit immediately.  All open cursors, Lists, Sorts, etc are closed
        !           646: ** automatically.
        !           647: **
        !           648: ** P1 is the result code returned by sqlite_exec().  For a normal
        !           649: ** halt, this should be SQLITE_OK (0).  For errors, it can be some
        !           650: ** other value.  If P1!=0 then P2 will determine whether or not to
        !           651: ** rollback the current transaction.  Do not rollback if P2==OE_Fail.
        !           652: ** Do the rollback if P2==OE_Rollback.  If P2==OE_Abort, then back
        !           653: ** out all changes that have occurred during this execution of the
        !           654: ** VDBE, but do not rollback the transaction. 
        !           655: **
        !           656: ** There is an implied "Halt 0 0 0" instruction inserted at the very end of
        !           657: ** every program.  So a jump past the last instruction of the program
        !           658: ** is the same as executing Halt.
        !           659: */
        !           660: case OP_Halt: {
        !           661:   p->magic = VDBE_MAGIC_HALT;
        !           662:   p->pTos = pTos;
        !           663:   if( pOp->p1!=SQLITE_OK ){
        !           664:     p->rc = pOp->p1;
        !           665:     p->errorAction = pOp->p2;
        !           666:     if( pOp->p3 ){
        !           667:       sqliteSetString(&p->zErrMsg, pOp->p3, (char*)0);
        !           668:     }
        !           669:     return SQLITE_ERROR;
        !           670:   }else{
        !           671:     p->rc = SQLITE_OK;
        !           672:     return SQLITE_DONE;
        !           673:   }
        !           674: }
        !           675: 
        !           676: /* Opcode: Integer P1 * P3
        !           677: **
        !           678: ** The integer value P1 is pushed onto the stack.  If P3 is not zero
        !           679: ** then it is assumed to be a string representation of the same integer.
        !           680: */
        !           681: case OP_Integer: {
        !           682:   pTos++;
        !           683:   pTos->i = pOp->p1;
        !           684:   pTos->flags = MEM_Int;
        !           685:   if( pOp->p3 ){
        !           686:     pTos->z = pOp->p3;
        !           687:     pTos->flags |= MEM_Str | MEM_Static;
        !           688:     pTos->n = strlen(pOp->p3)+1;
        !           689:   }
        !           690:   break;
        !           691: }
        !           692: 
        !           693: /* Opcode: String * * P3
        !           694: **
        !           695: ** The string value P3 is pushed onto the stack.  If P3==0 then a
        !           696: ** NULL is pushed onto the stack.
        !           697: */
        !           698: case OP_String: {
        !           699:   char *z = pOp->p3;
        !           700:   pTos++;
        !           701:   if( z==0 ){
        !           702:     pTos->flags = MEM_Null;
        !           703:   }else{
        !           704:     pTos->z = z;
        !           705:     pTos->n = strlen(z) + 1;
        !           706:     pTos->flags = MEM_Str | MEM_Static;
        !           707:   }
        !           708:   break;
        !           709: }
        !           710: 
        !           711: /* Opcode: Variable P1 * *
        !           712: **
        !           713: ** Push the value of variable P1 onto the stack.  A variable is
        !           714: ** an unknown in the original SQL string as handed to sqlite_compile().
        !           715: ** Any occurance of the '?' character in the original SQL is considered
        !           716: ** a variable.  Variables in the SQL string are number from left to
        !           717: ** right beginning with 1.  The values of variables are set using the
        !           718: ** sqlite_bind() API.
        !           719: */
        !           720: case OP_Variable: {
        !           721:   int j = pOp->p1 - 1;
        !           722:   pTos++;
        !           723:   if( j>=0 && j<p->nVar && p->azVar[j]!=0 ){
        !           724:     pTos->z = p->azVar[j];
        !           725:     pTos->n = p->anVar[j];
        !           726:     pTos->flags = MEM_Str | MEM_Static;
        !           727:   }else{
        !           728:     pTos->flags = MEM_Null;
        !           729:   }
        !           730:   break;
        !           731: }
        !           732: 
        !           733: /* Opcode: Pop P1 * *
        !           734: **
        !           735: ** P1 elements are popped off of the top of stack and discarded.
        !           736: */
        !           737: case OP_Pop: {
        !           738:   assert( pOp->p1>=0 );
        !           739:   popStack(&pTos, pOp->p1);
        !           740:   assert( pTos>=&p->aStack[-1] );
        !           741:   break;
        !           742: }
        !           743: 
        !           744: /* Opcode: Dup P1 P2 *
        !           745: **
        !           746: ** A copy of the P1-th element of the stack 
        !           747: ** is made and pushed onto the top of the stack.
        !           748: ** The top of the stack is element 0.  So the
        !           749: ** instruction "Dup 0 0 0" will make a copy of the
        !           750: ** top of the stack.
        !           751: **
        !           752: ** If the content of the P1-th element is a dynamically
        !           753: ** allocated string, then a new copy of that string
        !           754: ** is made if P2==0.  If P2!=0, then just a pointer
        !           755: ** to the string is copied.
        !           756: **
        !           757: ** Also see the Pull instruction.
        !           758: */
        !           759: case OP_Dup: {
        !           760:   Mem *pFrom = &pTos[-pOp->p1];
        !           761:   assert( pFrom<=pTos && pFrom>=p->aStack );
        !           762:   pTos++;
        !           763:   memcpy(pTos, pFrom, sizeof(*pFrom)-NBFS);
        !           764:   if( pTos->flags & MEM_Str ){
        !           765:     if( pOp->p2 && (pTos->flags & (MEM_Dyn|MEM_Ephem)) ){
        !           766:       pTos->flags &= ~MEM_Dyn;
        !           767:       pTos->flags |= MEM_Ephem;
        !           768:     }else if( pTos->flags & MEM_Short ){
        !           769:       memcpy(pTos->zShort, pFrom->zShort, pTos->n);
        !           770:       pTos->z = pTos->zShort;
        !           771:     }else if( (pTos->flags & MEM_Static)==0 ){
        !           772:       pTos->z = sqliteMallocRaw(pFrom->n);
        !           773:       if( sqlite_malloc_failed ) goto no_mem;
        !           774:       memcpy(pTos->z, pFrom->z, pFrom->n);
        !           775:       pTos->flags &= ~(MEM_Static|MEM_Ephem|MEM_Short);
        !           776:       pTos->flags |= MEM_Dyn;
        !           777:     }
        !           778:   }
        !           779:   break;
        !           780: }
        !           781: 
        !           782: /* Opcode: Pull P1 * *
        !           783: **
        !           784: ** The P1-th element is removed from its current location on 
        !           785: ** the stack and pushed back on top of the stack.  The
        !           786: ** top of the stack is element 0, so "Pull 0 0 0" is
        !           787: ** a no-op.  "Pull 1 0 0" swaps the top two elements of
        !           788: ** the stack.
        !           789: **
        !           790: ** See also the Dup instruction.
        !           791: */
        !           792: case OP_Pull: {
        !           793:   Mem *pFrom = &pTos[-pOp->p1];
        !           794:   int i;
        !           795:   Mem ts;
        !           796: 
        !           797:   ts = *pFrom;
        !           798:   Deephemeralize(pTos);
        !           799:   for(i=0; i<pOp->p1; i++, pFrom++){
        !           800:     Deephemeralize(&pFrom[1]);
        !           801:     *pFrom = pFrom[1];
        !           802:     assert( (pFrom->flags & MEM_Ephem)==0 );
        !           803:     if( pFrom->flags & MEM_Short ){
        !           804:       assert( pFrom->flags & MEM_Str );
        !           805:       assert( pFrom->z==pFrom[1].zShort );
        !           806:       pFrom->z = pFrom->zShort;
        !           807:     }
        !           808:   }
        !           809:   *pTos = ts;
        !           810:   if( pTos->flags & MEM_Short ){
        !           811:     assert( pTos->flags & MEM_Str );
        !           812:     assert( pTos->z==pTos[-pOp->p1].zShort );
        !           813:     pTos->z = pTos->zShort;
        !           814:   }
        !           815:   break;
        !           816: }
        !           817: 
        !           818: /* Opcode: Push P1 * *
        !           819: **
        !           820: ** Overwrite the value of the P1-th element down on the
        !           821: ** stack (P1==0 is the top of the stack) with the value
        !           822: ** of the top of the stack.  Then pop the top of the stack.
        !           823: */
        !           824: case OP_Push: {
        !           825:   Mem *pTo = &pTos[-pOp->p1];
        !           826: 
        !           827:   assert( pTo>=p->aStack );
        !           828:   Deephemeralize(pTos);
        !           829:   Release(pTo);
        !           830:   *pTo = *pTos;
        !           831:   if( pTo->flags & MEM_Short ){
        !           832:     assert( pTo->z==pTos->zShort );
        !           833:     pTo->z = pTo->zShort;
        !           834:   }
        !           835:   pTos--;
        !           836:   break;
        !           837: }
        !           838: 
        !           839: 
        !           840: /* Opcode: ColumnName P1 P2 P3
        !           841: **
        !           842: ** P3 becomes the P1-th column name (first is 0).  An array of pointers
        !           843: ** to all column names is passed as the 4th parameter to the callback.
        !           844: ** If P2==1 then this is the last column in the result set and thus the
        !           845: ** number of columns in the result set will be P1.  There must be at least
        !           846: ** one OP_ColumnName with a P2==1 before invoking OP_Callback and the
        !           847: ** number of columns specified in OP_Callback must one more than the P1
        !           848: ** value of the OP_ColumnName that has P2==1.
        !           849: */
        !           850: case OP_ColumnName: {
        !           851:   assert( pOp->p1>=0 && pOp->p1<p->nOp );
        !           852:   p->azColName[pOp->p1] = pOp->p3;
        !           853:   p->nCallback = 0;
        !           854:   if( pOp->p2 ) p->nResColumn = pOp->p1+1;
        !           855:   break;
        !           856: }
        !           857: 
        !           858: /* Opcode: Callback P1 * *
        !           859: **
        !           860: ** Pop P1 values off the stack and form them into an array.  Then
        !           861: ** invoke the callback function using the newly formed array as the
        !           862: ** 3rd parameter.
        !           863: */
        !           864: case OP_Callback: {
        !           865:   int i;
        !           866:   char **azArgv = p->zArgv;
        !           867:   Mem *pCol;
        !           868: 
        !           869:   pCol = &pTos[1-pOp->p1];
        !           870:   assert( pCol>=p->aStack );
        !           871:   for(i=0; i<pOp->p1; i++, pCol++){
        !           872:     if( pCol->flags & MEM_Null ){
        !           873:       azArgv[i] = 0;
        !           874:     }else{
        !           875:       Stringify(pCol);
        !           876:       azArgv[i] = pCol->z;
        !           877:     }
        !           878:   }
        !           879:   azArgv[i] = 0;
        !           880:   p->nCallback++;
        !           881:   p->azResColumn = azArgv;
        !           882:   assert( p->nResColumn==pOp->p1 );
        !           883:   p->popStack = pOp->p1;
        !           884:   p->pc = pc + 1;
        !           885:   p->pTos = pTos;
        !           886:   return SQLITE_ROW;
        !           887: }
        !           888: 
        !           889: /* Opcode: Concat P1 P2 P3
        !           890: **
        !           891: ** Look at the first P1 elements of the stack.  Append them all 
        !           892: ** together with the lowest element first.  Use P3 as a separator.  
        !           893: ** Put the result on the top of the stack.  The original P1 elements
        !           894: ** are popped from the stack if P2==0 and retained if P2==1.  If
        !           895: ** any element of the stack is NULL, then the result is NULL.
        !           896: **
        !           897: ** If P3 is NULL, then use no separator.  When P1==1, this routine
        !           898: ** makes a copy of the top stack element into memory obtained
        !           899: ** from sqliteMalloc().
        !           900: */
        !           901: case OP_Concat: {
        !           902:   char *zNew;
        !           903:   int nByte;
        !           904:   int nField;
        !           905:   int i, j;
        !           906:   char *zSep;
        !           907:   int nSep;
        !           908:   Mem *pTerm;
        !           909: 
        !           910:   nField = pOp->p1;
        !           911:   zSep = pOp->p3;
        !           912:   if( zSep==0 ) zSep = "";
        !           913:   nSep = strlen(zSep);
        !           914:   assert( &pTos[1-nField] >= p->aStack );
        !           915:   nByte = 1 - nSep;
        !           916:   pTerm = &pTos[1-nField];
        !           917:   for(i=0; i<nField; i++, pTerm++){
        !           918:     if( pTerm->flags & MEM_Null ){
        !           919:       nByte = -1;
        !           920:       break;
        !           921:     }else{
        !           922:       Stringify(pTerm);
        !           923:       nByte += pTerm->n - 1 + nSep;
        !           924:     }
        !           925:   }
        !           926:   if( nByte<0 ){
        !           927:     if( pOp->p2==0 ){
        !           928:       popStack(&pTos, nField);
        !           929:     }
        !           930:     pTos++;
        !           931:     pTos->flags = MEM_Null;
        !           932:     break;
        !           933:   }
        !           934:   zNew = sqliteMallocRaw( nByte );
        !           935:   if( zNew==0 ) goto no_mem;
        !           936:   j = 0;
        !           937:   pTerm = &pTos[1-nField];
        !           938:   for(i=j=0; i<nField; i++, pTerm++){
        !           939:     assert( pTerm->flags & MEM_Str );
        !           940:     memcpy(&zNew[j], pTerm->z, pTerm->n-1);
        !           941:     j += pTerm->n-1;
        !           942:     if( nSep>0 && i<nField-1 ){
        !           943:       memcpy(&zNew[j], zSep, nSep);
        !           944:       j += nSep;
        !           945:     }
        !           946:   }
        !           947:   zNew[j] = 0;
        !           948:   if( pOp->p2==0 ){
        !           949:     popStack(&pTos, nField);
        !           950:   }
        !           951:   pTos++;
        !           952:   pTos->n = nByte;
        !           953:   pTos->flags = MEM_Str|MEM_Dyn;
        !           954:   pTos->z = zNew;
        !           955:   break;
        !           956: }
        !           957: 
        !           958: /* Opcode: Add * * *
        !           959: **
        !           960: ** Pop the top two elements from the stack, add them together,
        !           961: ** and push the result back onto the stack.  If either element
        !           962: ** is a string then it is converted to a double using the atof()
        !           963: ** function before the addition.
        !           964: ** If either operand is NULL, the result is NULL.
        !           965: */
        !           966: /* Opcode: Multiply * * *
        !           967: **
        !           968: ** Pop the top two elements from the stack, multiply them together,
        !           969: ** and push the result back onto the stack.  If either element
        !           970: ** is a string then it is converted to a double using the atof()
        !           971: ** function before the multiplication.
        !           972: ** If either operand is NULL, the result is NULL.
        !           973: */
        !           974: /* Opcode: Subtract * * *
        !           975: **
        !           976: ** Pop the top two elements from the stack, subtract the
        !           977: ** first (what was on top of the stack) from the second (the
        !           978: ** next on stack)
        !           979: ** and push the result back onto the stack.  If either element
        !           980: ** is a string then it is converted to a double using the atof()
        !           981: ** function before the subtraction.
        !           982: ** If either operand is NULL, the result is NULL.
        !           983: */
        !           984: /* Opcode: Divide * * *
        !           985: **
        !           986: ** Pop the top two elements from the stack, divide the
        !           987: ** first (what was on top of the stack) from the second (the
        !           988: ** next on stack)
        !           989: ** and push the result back onto the stack.  If either element
        !           990: ** is a string then it is converted to a double using the atof()
        !           991: ** function before the division.  Division by zero returns NULL.
        !           992: ** If either operand is NULL, the result is NULL.
        !           993: */
        !           994: /* Opcode: Remainder * * *
        !           995: **
        !           996: ** Pop the top two elements from the stack, divide the
        !           997: ** first (what was on top of the stack) from the second (the
        !           998: ** next on stack)
        !           999: ** and push the remainder after division onto the stack.  If either element
        !          1000: ** is a string then it is converted to a double using the atof()
        !          1001: ** function before the division.  Division by zero returns NULL.
        !          1002: ** If either operand is NULL, the result is NULL.
        !          1003: */
        !          1004: case OP_Add:
        !          1005: case OP_Subtract:
        !          1006: case OP_Multiply:
        !          1007: case OP_Divide:
        !          1008: case OP_Remainder: {
        !          1009:   Mem *pNos = &pTos[-1];
        !          1010:   assert( pNos>=p->aStack );
        !          1011:   if( ((pTos->flags | pNos->flags) & MEM_Null)!=0 ){
        !          1012:     Release(pTos);
        !          1013:     pTos--;
        !          1014:     Release(pTos);
        !          1015:     pTos->flags = MEM_Null;
        !          1016:   }else if( (pTos->flags & pNos->flags & MEM_Int)==MEM_Int ){
        !          1017:     int a, b;
        !          1018:     a = pTos->i;
        !          1019:     b = pNos->i;
        !          1020:     switch( pOp->opcode ){
        !          1021:       case OP_Add:         b += a;       break;
        !          1022:       case OP_Subtract:    b -= a;       break;
        !          1023:       case OP_Multiply:    b *= a;       break;
        !          1024:       case OP_Divide: {
        !          1025:         if( a==0 ) goto divide_by_zero;
        !          1026:         b /= a;
        !          1027:         break;
        !          1028:       }
        !          1029:       default: {
        !          1030:         if( a==0 ) goto divide_by_zero;
        !          1031:         b %= a;
        !          1032:         break;
        !          1033:       }
        !          1034:     }
        !          1035:     Release(pTos);
        !          1036:     pTos--;
        !          1037:     Release(pTos);
        !          1038:     pTos->i = b;
        !          1039:     pTos->flags = MEM_Int;
        !          1040:   }else{
        !          1041:     double a, b;
        !          1042:     Realify(pTos);
        !          1043:     Realify(pNos);
        !          1044:     a = pTos->r;
        !          1045:     b = pNos->r;
        !          1046:     switch( pOp->opcode ){
        !          1047:       case OP_Add:         b += a;       break;
        !          1048:       case OP_Subtract:    b -= a;       break;
        !          1049:       case OP_Multiply:    b *= a;       break;
        !          1050:       case OP_Divide: {
        !          1051:         if( a==0.0 ) goto divide_by_zero;
        !          1052:         b /= a;
        !          1053:         break;
        !          1054:       }
        !          1055:       default: {
        !          1056:         int ia = (int)a;
        !          1057:         int ib = (int)b;
        !          1058:         if( ia==0.0 ) goto divide_by_zero;
        !          1059:         b = ib % ia;
        !          1060:         break;
        !          1061:       }
        !          1062:     }
        !          1063:     Release(pTos);
        !          1064:     pTos--;
        !          1065:     Release(pTos);
        !          1066:     pTos->r = b;
        !          1067:     pTos->flags = MEM_Real;
        !          1068:   }
        !          1069:   break;
        !          1070: 
        !          1071: divide_by_zero:
        !          1072:   Release(pTos);
        !          1073:   pTos--;
        !          1074:   Release(pTos);
        !          1075:   pTos->flags = MEM_Null;
        !          1076:   break;
        !          1077: }
        !          1078: 
        !          1079: /* Opcode: Function P1 * P3
        !          1080: **
        !          1081: ** Invoke a user function (P3 is a pointer to a Function structure that
        !          1082: ** defines the function) with P1 string arguments taken from the stack.
        !          1083: ** Pop all arguments from the stack and push back the result.
        !          1084: **
        !          1085: ** See also: AggFunc
        !          1086: */
        !          1087: case OP_Function: {
        !          1088:   int n, i;
        !          1089:   Mem *pArg;
        !          1090:   char **azArgv;
        !          1091:   sqlite_func ctx;
        !          1092: 
        !          1093:   n = pOp->p1;
        !          1094:   pArg = &pTos[1-n];
        !          1095:   azArgv = p->zArgv;
        !          1096:   for(i=0; i<n; i++, pArg++){
        !          1097:     if( pArg->flags & MEM_Null ){
        !          1098:       azArgv[i] = 0;
        !          1099:     }else{
        !          1100:       Stringify(pArg);
        !          1101:       azArgv[i] = pArg->z;
        !          1102:     }
        !          1103:   }
        !          1104:   ctx.pFunc = (FuncDef*)pOp->p3;
        !          1105:   ctx.s.flags = MEM_Null;
        !          1106:   ctx.s.z = 0;
        !          1107:   ctx.isError = 0;
        !          1108:   ctx.isStep = 0;
        !          1109:   if( sqliteSafetyOff(db) ) goto abort_due_to_misuse;
        !          1110:   (*ctx.pFunc->xFunc)(&ctx, n, (const char**)azArgv);
        !          1111:   if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
        !          1112:   popStack(&pTos, n);
        !          1113:   pTos++;
        !          1114:   *pTos = ctx.s;
        !          1115:   if( pTos->flags & MEM_Short ){
        !          1116:     pTos->z = pTos->zShort;
        !          1117:   }
        !          1118:   if( ctx.isError ){
        !          1119:     sqliteSetString(&p->zErrMsg, 
        !          1120:        (pTos->flags & MEM_Str)!=0 ? pTos->z : "user function error", (char*)0);
        !          1121:     rc = SQLITE_ERROR;
        !          1122:   }
        !          1123:   break;
        !          1124: }
        !          1125: 
        !          1126: /* Opcode: BitAnd * * *
        !          1127: **
        !          1128: ** Pop the top two elements from the stack.  Convert both elements
        !          1129: ** to integers.  Push back onto the stack the bit-wise AND of the
        !          1130: ** two elements.
        !          1131: ** If either operand is NULL, the result is NULL.
        !          1132: */
        !          1133: /* Opcode: BitOr * * *
        !          1134: **
        !          1135: ** Pop the top two elements from the stack.  Convert both elements
        !          1136: ** to integers.  Push back onto the stack the bit-wise OR of the
        !          1137: ** two elements.
        !          1138: ** If either operand is NULL, the result is NULL.
        !          1139: */
        !          1140: /* Opcode: ShiftLeft * * *
        !          1141: **
        !          1142: ** Pop the top two elements from the stack.  Convert both elements
        !          1143: ** to integers.  Push back onto the stack the top element shifted
        !          1144: ** left by N bits where N is the second element on the stack.
        !          1145: ** If either operand is NULL, the result is NULL.
        !          1146: */
        !          1147: /* Opcode: ShiftRight * * *
        !          1148: **
        !          1149: ** Pop the top two elements from the stack.  Convert both elements
        !          1150: ** to integers.  Push back onto the stack the top element shifted
        !          1151: ** right by N bits where N is the second element on the stack.
        !          1152: ** If either operand is NULL, the result is NULL.
        !          1153: */
        !          1154: case OP_BitAnd:
        !          1155: case OP_BitOr:
        !          1156: case OP_ShiftLeft:
        !          1157: case OP_ShiftRight: {
        !          1158:   Mem *pNos = &pTos[-1];
        !          1159:   int a, b;
        !          1160: 
        !          1161:   assert( pNos>=p->aStack );
        !          1162:   if( (pTos->flags | pNos->flags) & MEM_Null ){
        !          1163:     popStack(&pTos, 2);
        !          1164:     pTos++;
        !          1165:     pTos->flags = MEM_Null;
        !          1166:     break;
        !          1167:   }
        !          1168:   Integerify(pTos);
        !          1169:   Integerify(pNos);
        !          1170:   a = pTos->i;
        !          1171:   b = pNos->i;
        !          1172:   switch( pOp->opcode ){
        !          1173:     case OP_BitAnd:      a &= b;     break;
        !          1174:     case OP_BitOr:       a |= b;     break;
        !          1175:     case OP_ShiftLeft:   a <<= b;    break;
        !          1176:     case OP_ShiftRight:  a >>= b;    break;
        !          1177:     default:   /* CANT HAPPEN */     break;
        !          1178:   }
        !          1179:   assert( (pTos->flags & MEM_Dyn)==0 );
        !          1180:   assert( (pNos->flags & MEM_Dyn)==0 );
        !          1181:   pTos--;
        !          1182:   Release(pTos);
        !          1183:   pTos->i = a;
        !          1184:   pTos->flags = MEM_Int;
        !          1185:   break;
        !          1186: }
        !          1187: 
        !          1188: /* Opcode: AddImm  P1 * *
        !          1189: ** 
        !          1190: ** Add the value P1 to whatever is on top of the stack.  The result
        !          1191: ** is always an integer.
        !          1192: **
        !          1193: ** To force the top of the stack to be an integer, just add 0.
        !          1194: */
        !          1195: case OP_AddImm: {
        !          1196:   assert( pTos>=p->aStack );
        !          1197:   Integerify(pTos);
        !          1198:   pTos->i += pOp->p1;
        !          1199:   break;
        !          1200: }
        !          1201: 
        !          1202: /* Opcode: ForceInt P1 P2 *
        !          1203: **
        !          1204: ** Convert the top of the stack into an integer.  If the current top of
        !          1205: ** the stack is not numeric (meaning that is is a NULL or a string that
        !          1206: ** does not look like an integer or floating point number) then pop the
        !          1207: ** stack and jump to P2.  If the top of the stack is numeric then
        !          1208: ** convert it into the least integer that is greater than or equal to its
        !          1209: ** current value if P1==0, or to the least integer that is strictly
        !          1210: ** greater than its current value if P1==1.
        !          1211: */
        !          1212: case OP_ForceInt: {
        !          1213:   int v;
        !          1214:   assert( pTos>=p->aStack );
        !          1215:   if( (pTos->flags & (MEM_Int|MEM_Real))==0
        !          1216:          && ((pTos->flags & MEM_Str)==0 || sqliteIsNumber(pTos->z)==0) ){
        !          1217:     Release(pTos);
        !          1218:     pTos--;
        !          1219:     pc = pOp->p2 - 1;
        !          1220:     break;
        !          1221:   }
        !          1222:   if( pTos->flags & MEM_Int ){
        !          1223:     v = pTos->i + (pOp->p1!=0);
        !          1224:   }else{
        !          1225:     Realify(pTos);
        !          1226:     v = (int)pTos->r;
        !          1227:     if( pTos->r>(double)v ) v++;
        !          1228:     if( pOp->p1 && pTos->r==(double)v ) v++;
        !          1229:   }
        !          1230:   Release(pTos);
        !          1231:   pTos->i = v;
        !          1232:   pTos->flags = MEM_Int;
        !          1233:   break;
        !          1234: }
        !          1235: 
        !          1236: /* Opcode: MustBeInt P1 P2 *
        !          1237: ** 
        !          1238: ** Force the top of the stack to be an integer.  If the top of the
        !          1239: ** stack is not an integer and cannot be converted into an integer
        !          1240: ** with out data loss, then jump immediately to P2, or if P2==0
        !          1241: ** raise an SQLITE_MISMATCH exception.
        !          1242: **
        !          1243: ** If the top of the stack is not an integer and P2 is not zero and
        !          1244: ** P1 is 1, then the stack is popped.  In all other cases, the depth
        !          1245: ** of the stack is unchanged.
        !          1246: */
        !          1247: case OP_MustBeInt: {
        !          1248:   assert( pTos>=p->aStack );
        !          1249:   if( pTos->flags & MEM_Int ){
        !          1250:     /* Do nothing */
        !          1251:   }else if( pTos->flags & MEM_Real ){
        !          1252:     int i = (int)pTos->r;
        !          1253:     double r = (double)i;
        !          1254:     if( r!=pTos->r ){
        !          1255:       goto mismatch;
        !          1256:     }
        !          1257:     pTos->i = i;
        !          1258:   }else if( pTos->flags & MEM_Str ){
        !          1259:     int v;
        !          1260:     if( !toInt(pTos->z, &v) ){
        !          1261:       double r;
        !          1262:       if( !sqliteIsNumber(pTos->z) ){
        !          1263:         goto mismatch;
        !          1264:       }
        !          1265:       Realify(pTos);
        !          1266:       v = (int)pTos->r;
        !          1267:       r = (double)v;
        !          1268:       if( r!=pTos->r ){
        !          1269:         goto mismatch;
        !          1270:       }
        !          1271:     }
        !          1272:     pTos->i = v;
        !          1273:   }else{
        !          1274:     goto mismatch;
        !          1275:   }
        !          1276:   Release(pTos);
        !          1277:   pTos->flags = MEM_Int;
        !          1278:   break;
        !          1279: 
        !          1280: mismatch:
        !          1281:   if( pOp->p2==0 ){
        !          1282:     rc = SQLITE_MISMATCH;
        !          1283:     goto abort_due_to_error;
        !          1284:   }else{
        !          1285:     if( pOp->p1 ) popStack(&pTos, 1);
        !          1286:     pc = pOp->p2 - 1;
        !          1287:   }
        !          1288:   break;
        !          1289: }
        !          1290: 
        !          1291: /* Opcode: Eq P1 P2 *
        !          1292: **
        !          1293: ** Pop the top two elements from the stack.  If they are equal, then
        !          1294: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1295: **
        !          1296: ** If either operand is NULL (and thus if the result is unknown) then
        !          1297: ** take the jump if P1 is true.
        !          1298: **
        !          1299: ** If both values are numeric, they are converted to doubles using atof()
        !          1300: ** and compared for equality that way.  Otherwise the strcmp() library
        !          1301: ** routine is used for the comparison.  For a pure text comparison
        !          1302: ** use OP_StrEq.
        !          1303: **
        !          1304: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1305: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1306: ** NULL if either operand was NULL.
        !          1307: */
        !          1308: /* Opcode: Ne P1 P2 *
        !          1309: **
        !          1310: ** Pop the top two elements from the stack.  If they are not equal, then
        !          1311: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1312: **
        !          1313: ** If either operand is NULL (and thus if the result is unknown) then
        !          1314: ** take the jump if P1 is true.
        !          1315: **
        !          1316: ** If both values are numeric, they are converted to doubles using atof()
        !          1317: ** and compared in that format.  Otherwise the strcmp() library
        !          1318: ** routine is used for the comparison.  For a pure text comparison
        !          1319: ** use OP_StrNe.
        !          1320: **
        !          1321: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1322: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1323: ** NULL if either operand was NULL.
        !          1324: */
        !          1325: /* Opcode: Lt P1 P2 *
        !          1326: **
        !          1327: ** Pop the top two elements from the stack.  If second element (the
        !          1328: ** next on stack) is less than the first (the top of stack), then
        !          1329: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1330: ** In other words, jump if NOS<TOS.
        !          1331: **
        !          1332: ** If either operand is NULL (and thus if the result is unknown) then
        !          1333: ** take the jump if P1 is true.
        !          1334: **
        !          1335: ** If both values are numeric, they are converted to doubles using atof()
        !          1336: ** and compared in that format.  Numeric values are always less than
        !          1337: ** non-numeric values.  If both operands are non-numeric, the strcmp() library
        !          1338: ** routine is used for the comparison.  For a pure text comparison
        !          1339: ** use OP_StrLt.
        !          1340: **
        !          1341: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1342: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1343: ** NULL if either operand was NULL.
        !          1344: */
        !          1345: /* Opcode: Le P1 P2 *
        !          1346: **
        !          1347: ** Pop the top two elements from the stack.  If second element (the
        !          1348: ** next on stack) is less than or equal to the first (the top of stack),
        !          1349: ** then jump to instruction P2. In other words, jump if NOS<=TOS.
        !          1350: **
        !          1351: ** If either operand is NULL (and thus if the result is unknown) then
        !          1352: ** take the jump if P1 is true.
        !          1353: **
        !          1354: ** If both values are numeric, they are converted to doubles using atof()
        !          1355: ** and compared in that format.  Numeric values are always less than
        !          1356: ** non-numeric values.  If both operands are non-numeric, the strcmp() library
        !          1357: ** routine is used for the comparison.  For a pure text comparison
        !          1358: ** use OP_StrLe.
        !          1359: **
        !          1360: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1361: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1362: ** NULL if either operand was NULL.
        !          1363: */
        !          1364: /* Opcode: Gt P1 P2 *
        !          1365: **
        !          1366: ** Pop the top two elements from the stack.  If second element (the
        !          1367: ** next on stack) is greater than the first (the top of stack),
        !          1368: ** then jump to instruction P2. In other words, jump if NOS>TOS.
        !          1369: **
        !          1370: ** If either operand is NULL (and thus if the result is unknown) then
        !          1371: ** take the jump if P1 is true.
        !          1372: **
        !          1373: ** If both values are numeric, they are converted to doubles using atof()
        !          1374: ** and compared in that format.  Numeric values are always less than
        !          1375: ** non-numeric values.  If both operands are non-numeric, the strcmp() library
        !          1376: ** routine is used for the comparison.  For a pure text comparison
        !          1377: ** use OP_StrGt.
        !          1378: **
        !          1379: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1380: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1381: ** NULL if either operand was NULL.
        !          1382: */
        !          1383: /* Opcode: Ge P1 P2 *
        !          1384: **
        !          1385: ** Pop the top two elements from the stack.  If second element (the next
        !          1386: ** on stack) is greater than or equal to the first (the top of stack),
        !          1387: ** then jump to instruction P2. In other words, jump if NOS>=TOS.
        !          1388: **
        !          1389: ** If either operand is NULL (and thus if the result is unknown) then
        !          1390: ** take the jump if P1 is true.
        !          1391: **
        !          1392: ** If both values are numeric, they are converted to doubles using atof()
        !          1393: ** and compared in that format.  Numeric values are always less than
        !          1394: ** non-numeric values.  If both operands are non-numeric, the strcmp() library
        !          1395: ** routine is used for the comparison.  For a pure text comparison
        !          1396: ** use OP_StrGe.
        !          1397: **
        !          1398: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1399: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1400: ** NULL if either operand was NULL.
        !          1401: */
        !          1402: case OP_Eq:
        !          1403: case OP_Ne:
        !          1404: case OP_Lt:
        !          1405: case OP_Le:
        !          1406: case OP_Gt:
        !          1407: case OP_Ge: {
        !          1408:   Mem *pNos = &pTos[-1];
        !          1409:   int c, v;
        !          1410:   int ft, fn;
        !          1411:   assert( pNos>=p->aStack );
        !          1412:   ft = pTos->flags;
        !          1413:   fn = pNos->flags;
        !          1414:   if( (ft | fn) & MEM_Null ){
        !          1415:     popStack(&pTos, 2);
        !          1416:     if( pOp->p2 ){
        !          1417:       if( pOp->p1 ) pc = pOp->p2-1;
        !          1418:     }else{
        !          1419:       pTos++;
        !          1420:       pTos->flags = MEM_Null;
        !          1421:     }
        !          1422:     break;
        !          1423:   }else if( (ft & fn & MEM_Int)==MEM_Int ){
        !          1424:     c = pNos->i - pTos->i;
        !          1425:   }else if( (ft & MEM_Int)!=0 && (fn & MEM_Str)!=0 && toInt(pNos->z,&v) ){
        !          1426:     c = v - pTos->i;
        !          1427:   }else if( (fn & MEM_Int)!=0 && (ft & MEM_Str)!=0 && toInt(pTos->z,&v) ){
        !          1428:     c = pNos->i - v;
        !          1429:   }else{
        !          1430:     Stringify(pTos);
        !          1431:     Stringify(pNos);
        !          1432:     c = sqliteCompare(pNos->z, pTos->z);
        !          1433:   }
        !          1434:   switch( pOp->opcode ){
        !          1435:     case OP_Eq:    c = c==0;     break;
        !          1436:     case OP_Ne:    c = c!=0;     break;
        !          1437:     case OP_Lt:    c = c<0;      break;
        !          1438:     case OP_Le:    c = c<=0;     break;
        !          1439:     case OP_Gt:    c = c>0;      break;
        !          1440:     default:       c = c>=0;     break;
        !          1441:   }
        !          1442:   popStack(&pTos, 2);
        !          1443:   if( pOp->p2 ){
        !          1444:     if( c ) pc = pOp->p2-1;
        !          1445:   }else{
        !          1446:     pTos++;
        !          1447:     pTos->i = c;
        !          1448:     pTos->flags = MEM_Int;
        !          1449:   }
        !          1450:   break;
        !          1451: }
        !          1452: /* INSERT NO CODE HERE!
        !          1453: **
        !          1454: ** The opcode numbers are extracted from this source file by doing
        !          1455: **
        !          1456: **    grep '^case OP_' vdbe.c | ... >opcodes.h
        !          1457: **
        !          1458: ** The opcodes are numbered in the order that they appear in this file.
        !          1459: ** But in order for the expression generating code to work right, the
        !          1460: ** string comparison operators that follow must be numbered exactly 6
        !          1461: ** greater than the numeric comparison opcodes above.  So no other
        !          1462: ** cases can appear between the two.
        !          1463: */
        !          1464: /* Opcode: StrEq P1 P2 *
        !          1465: **
        !          1466: ** Pop the top two elements from the stack.  If they are equal, then
        !          1467: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1468: **
        !          1469: ** If either operand is NULL (and thus if the result is unknown) then
        !          1470: ** take the jump if P1 is true.
        !          1471: **
        !          1472: ** The strcmp() library routine is used for the comparison.  For a
        !          1473: ** numeric comparison, use OP_Eq.
        !          1474: **
        !          1475: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1476: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1477: ** NULL if either operand was NULL.
        !          1478: */
        !          1479: /* Opcode: StrNe P1 P2 *
        !          1480: **
        !          1481: ** Pop the top two elements from the stack.  If they are not equal, then
        !          1482: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1483: **
        !          1484: ** If either operand is NULL (and thus if the result is unknown) then
        !          1485: ** take the jump if P1 is true.
        !          1486: **
        !          1487: ** The strcmp() library routine is used for the comparison.  For a
        !          1488: ** numeric comparison, use OP_Ne.
        !          1489: **
        !          1490: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1491: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1492: ** NULL if either operand was NULL.
        !          1493: */
        !          1494: /* Opcode: StrLt P1 P2 *
        !          1495: **
        !          1496: ** Pop the top two elements from the stack.  If second element (the
        !          1497: ** next on stack) is less than the first (the top of stack), then
        !          1498: ** jump to instruction P2.  Otherwise, continue to the next instruction.
        !          1499: ** In other words, jump if NOS<TOS.
        !          1500: **
        !          1501: ** If either operand is NULL (and thus if the result is unknown) then
        !          1502: ** take the jump if P1 is true.
        !          1503: **
        !          1504: ** The strcmp() library routine is used for the comparison.  For a
        !          1505: ** numeric comparison, use OP_Lt.
        !          1506: **
        !          1507: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1508: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1509: ** NULL if either operand was NULL.
        !          1510: */
        !          1511: /* Opcode: StrLe P1 P2 *
        !          1512: **
        !          1513: ** Pop the top two elements from the stack.  If second element (the
        !          1514: ** next on stack) is less than or equal to the first (the top of stack),
        !          1515: ** then jump to instruction P2. In other words, jump if NOS<=TOS.
        !          1516: **
        !          1517: ** If either operand is NULL (and thus if the result is unknown) then
        !          1518: ** take the jump if P1 is true.
        !          1519: **
        !          1520: ** The strcmp() library routine is used for the comparison.  For a
        !          1521: ** numeric comparison, use OP_Le.
        !          1522: **
        !          1523: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1524: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1525: ** NULL if either operand was NULL.
        !          1526: */
        !          1527: /* Opcode: StrGt P1 P2 *
        !          1528: **
        !          1529: ** Pop the top two elements from the stack.  If second element (the
        !          1530: ** next on stack) is greater than the first (the top of stack),
        !          1531: ** then jump to instruction P2. In other words, jump if NOS>TOS.
        !          1532: **
        !          1533: ** If either operand is NULL (and thus if the result is unknown) then
        !          1534: ** take the jump if P1 is true.
        !          1535: **
        !          1536: ** The strcmp() library routine is used for the comparison.  For a
        !          1537: ** numeric comparison, use OP_Gt.
        !          1538: **
        !          1539: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1540: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1541: ** NULL if either operand was NULL.
        !          1542: */
        !          1543: /* Opcode: StrGe P1 P2 *
        !          1544: **
        !          1545: ** Pop the top two elements from the stack.  If second element (the next
        !          1546: ** on stack) is greater than or equal to the first (the top of stack),
        !          1547: ** then jump to instruction P2. In other words, jump if NOS>=TOS.
        !          1548: **
        !          1549: ** If either operand is NULL (and thus if the result is unknown) then
        !          1550: ** take the jump if P1 is true.
        !          1551: **
        !          1552: ** The strcmp() library routine is used for the comparison.  For a
        !          1553: ** numeric comparison, use OP_Ge.
        !          1554: **
        !          1555: ** If P2 is zero, do not jump.  Instead, push an integer 1 onto the
        !          1556: ** stack if the jump would have been taken, or a 0 if not.  Push a
        !          1557: ** NULL if either operand was NULL.
        !          1558: */
        !          1559: case OP_StrEq:
        !          1560: case OP_StrNe:
        !          1561: case OP_StrLt:
        !          1562: case OP_StrLe:
        !          1563: case OP_StrGt:
        !          1564: case OP_StrGe: {
        !          1565:   Mem *pNos = &pTos[-1];
        !          1566:   int c;
        !          1567:   assert( pNos>=p->aStack );
        !          1568:   if( (pNos->flags | pTos->flags) & MEM_Null ){
        !          1569:     popStack(&pTos, 2);
        !          1570:     if( pOp->p2 ){
        !          1571:       if( pOp->p1 ) pc = pOp->p2-1;
        !          1572:     }else{
        !          1573:       pTos++;
        !          1574:       pTos->flags = MEM_Null;
        !          1575:     }
        !          1576:     break;
        !          1577:   }else{
        !          1578:     Stringify(pTos);
        !          1579:     Stringify(pNos);
        !          1580:     c = strcmp(pNos->z, pTos->z);
        !          1581:   }
        !          1582:   /* The asserts on each case of the following switch are there to verify
        !          1583:   ** that string comparison opcodes are always exactly 6 greater than the
        !          1584:   ** corresponding numeric comparison opcodes.  The code generator depends
        !          1585:   ** on this fact.
        !          1586:   */
        !          1587:   switch( pOp->opcode ){
        !          1588:     case OP_StrEq:    c = c==0;    assert( pOp->opcode-6==OP_Eq );   break;
        !          1589:     case OP_StrNe:    c = c!=0;    assert( pOp->opcode-6==OP_Ne );   break;
        !          1590:     case OP_StrLt:    c = c<0;     assert( pOp->opcode-6==OP_Lt );   break;
        !          1591:     case OP_StrLe:    c = c<=0;    assert( pOp->opcode-6==OP_Le );   break;
        !          1592:     case OP_StrGt:    c = c>0;     assert( pOp->opcode-6==OP_Gt );   break;
        !          1593:     default:          c = c>=0;    assert( pOp->opcode-6==OP_Ge );   break;
        !          1594:   }
        !          1595:   popStack(&pTos, 2);
        !          1596:   if( pOp->p2 ){
        !          1597:     if( c ) pc = pOp->p2-1;
        !          1598:   }else{
        !          1599:     pTos++;
        !          1600:     pTos->flags = MEM_Int;
        !          1601:     pTos->i = c;
        !          1602:   }
        !          1603:   break;
        !          1604: }
        !          1605: 
        !          1606: /* Opcode: And * * *
        !          1607: **
        !          1608: ** Pop two values off the stack.  Take the logical AND of the
        !          1609: ** two values and push the resulting boolean value back onto the
        !          1610: ** stack. 
        !          1611: */
        !          1612: /* Opcode: Or * * *
        !          1613: **
        !          1614: ** Pop two values off the stack.  Take the logical OR of the
        !          1615: ** two values and push the resulting boolean value back onto the
        !          1616: ** stack. 
        !          1617: */
        !          1618: case OP_And:
        !          1619: case OP_Or: {
        !          1620:   Mem *pNos = &pTos[-1];
        !          1621:   int v1, v2;    /* 0==TRUE, 1==FALSE, 2==UNKNOWN or NULL */
        !          1622: 
        !          1623:   assert( pNos>=p->aStack );
        !          1624:   if( pTos->flags & MEM_Null ){
        !          1625:     v1 = 2;
        !          1626:   }else{
        !          1627:     Integerify(pTos);
        !          1628:     v1 = pTos->i==0;
        !          1629:   }
        !          1630:   if( pNos->flags & MEM_Null ){
        !          1631:     v2 = 2;
        !          1632:   }else{
        !          1633:     Integerify(pNos);
        !          1634:     v2 = pNos->i==0;
        !          1635:   }
        !          1636:   if( pOp->opcode==OP_And ){
        !          1637:     static const unsigned char and_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
        !          1638:     v1 = and_logic[v1*3+v2];
        !          1639:   }else{
        !          1640:     static const unsigned char or_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
        !          1641:     v1 = or_logic[v1*3+v2];
        !          1642:   }
        !          1643:   popStack(&pTos, 2);
        !          1644:   pTos++;
        !          1645:   if( v1==2 ){
        !          1646:     pTos->flags = MEM_Null;
        !          1647:   }else{
        !          1648:     pTos->i = v1==0;
        !          1649:     pTos->flags = MEM_Int;
        !          1650:   }
        !          1651:   break;
        !          1652: }
        !          1653: 
        !          1654: /* Opcode: Negative * * *
        !          1655: **
        !          1656: ** Treat the top of the stack as a numeric quantity.  Replace it
        !          1657: ** with its additive inverse.  If the top of the stack is NULL
        !          1658: ** its value is unchanged.
        !          1659: */
        !          1660: /* Opcode: AbsValue * * *
        !          1661: **
        !          1662: ** Treat the top of the stack as a numeric quantity.  Replace it
        !          1663: ** with its absolute value. If the top of the stack is NULL
        !          1664: ** its value is unchanged.
        !          1665: */
        !          1666: case OP_Negative:
        !          1667: case OP_AbsValue: {
        !          1668:   assert( pTos>=p->aStack );
        !          1669:   if( pTos->flags & MEM_Real ){
        !          1670:     Release(pTos);
        !          1671:     if( pOp->opcode==OP_Negative || pTos->r<0.0 ){
        !          1672:       pTos->r = -pTos->r;
        !          1673:     }
        !          1674:     pTos->flags = MEM_Real;
        !          1675:   }else if( pTos->flags & MEM_Int ){
        !          1676:     Release(pTos);
        !          1677:     if( pOp->opcode==OP_Negative || pTos->i<0 ){
        !          1678:       pTos->i = -pTos->i;
        !          1679:     }
        !          1680:     pTos->flags = MEM_Int;
        !          1681:   }else if( pTos->flags & MEM_Null ){
        !          1682:     /* Do nothing */
        !          1683:   }else{
        !          1684:     Realify(pTos);
        !          1685:     Release(pTos);
        !          1686:     if( pOp->opcode==OP_Negative || pTos->r<0.0 ){
        !          1687:       pTos->r = -pTos->r;
        !          1688:     }
        !          1689:     pTos->flags = MEM_Real;
        !          1690:   }
        !          1691:   break;
        !          1692: }
        !          1693: 
        !          1694: /* Opcode: Not * * *
        !          1695: **
        !          1696: ** Interpret the top of the stack as a boolean value.  Replace it
        !          1697: ** with its complement.  If the top of the stack is NULL its value
        !          1698: ** is unchanged.
        !          1699: */
        !          1700: case OP_Not: {
        !          1701:   assert( pTos>=p->aStack );
        !          1702:   if( pTos->flags & MEM_Null ) break;  /* Do nothing to NULLs */
        !          1703:   Integerify(pTos);
        !          1704:   Release(pTos);
        !          1705:   pTos->i = !pTos->i;
        !          1706:   pTos->flags = MEM_Int;
        !          1707:   break;
        !          1708: }
        !          1709: 
        !          1710: /* Opcode: BitNot * * *
        !          1711: **
        !          1712: ** Interpret the top of the stack as an value.  Replace it
        !          1713: ** with its ones-complement.  If the top of the stack is NULL its
        !          1714: ** value is unchanged.
        !          1715: */
        !          1716: case OP_BitNot: {
        !          1717:   assert( pTos>=p->aStack );
        !          1718:   if( pTos->flags & MEM_Null ) break;  /* Do nothing to NULLs */
        !          1719:   Integerify(pTos);
        !          1720:   Release(pTos);
        !          1721:   pTos->i = ~pTos->i;
        !          1722:   pTos->flags = MEM_Int;
        !          1723:   break;
        !          1724: }
        !          1725: 
        !          1726: /* Opcode: Noop * * *
        !          1727: **
        !          1728: ** Do nothing.  This instruction is often useful as a jump
        !          1729: ** destination.
        !          1730: */
        !          1731: case OP_Noop: {
        !          1732:   break;
        !          1733: }
        !          1734: 
        !          1735: /* Opcode: If P1 P2 *
        !          1736: **
        !          1737: ** Pop a single boolean from the stack.  If the boolean popped is
        !          1738: ** true, then jump to p2.  Otherwise continue to the next instruction.
        !          1739: ** An integer is false if zero and true otherwise.  A string is
        !          1740: ** false if it has zero length and true otherwise.
        !          1741: **
        !          1742: ** If the value popped of the stack is NULL, then take the jump if P1
        !          1743: ** is true and fall through if P1 is false.
        !          1744: */
        !          1745: /* Opcode: IfNot P1 P2 *
        !          1746: **
        !          1747: ** Pop a single boolean from the stack.  If the boolean popped is
        !          1748: ** false, then jump to p2.  Otherwise continue to the next instruction.
        !          1749: ** An integer is false if zero and true otherwise.  A string is
        !          1750: ** false if it has zero length and true otherwise.
        !          1751: **
        !          1752: ** If the value popped of the stack is NULL, then take the jump if P1
        !          1753: ** is true and fall through if P1 is false.
        !          1754: */
        !          1755: case OP_If:
        !          1756: case OP_IfNot: {
        !          1757:   int c;
        !          1758:   assert( pTos>=p->aStack );
        !          1759:   if( pTos->flags & MEM_Null ){
        !          1760:     c = pOp->p1;
        !          1761:   }else{
        !          1762:     Integerify(pTos);
        !          1763:     c = pTos->i;
        !          1764:     if( pOp->opcode==OP_IfNot ) c = !c;
        !          1765:   }
        !          1766:   assert( (pTos->flags & MEM_Dyn)==0 );
        !          1767:   pTos--;
        !          1768:   if( c ) pc = pOp->p2-1;
        !          1769:   break;
        !          1770: }
        !          1771: 
        !          1772: /* Opcode: IsNull P1 P2 *
        !          1773: **
        !          1774: ** If any of the top abs(P1) values on the stack are NULL, then jump
        !          1775: ** to P2.  Pop the stack P1 times if P1>0.   If P1<0 leave the stack
        !          1776: ** unchanged.
        !          1777: */
        !          1778: case OP_IsNull: {
        !          1779:   int i, cnt;
        !          1780:   Mem *pTerm;
        !          1781:   cnt = pOp->p1;
        !          1782:   if( cnt<0 ) cnt = -cnt;
        !          1783:   pTerm = &pTos[1-cnt];
        !          1784:   assert( pTerm>=p->aStack );
        !          1785:   for(i=0; i<cnt; i++, pTerm++){
        !          1786:     if( pTerm->flags & MEM_Null ){
        !          1787:       pc = pOp->p2-1;
        !          1788:       break;
        !          1789:     }
        !          1790:   }
        !          1791:   if( pOp->p1>0 ) popStack(&pTos, cnt);
        !          1792:   break;
        !          1793: }
        !          1794: 
        !          1795: /* Opcode: NotNull P1 P2 *
        !          1796: **
        !          1797: ** Jump to P2 if the top P1 values on the stack are all not NULL.  Pop the
        !          1798: ** stack if P1 times if P1 is greater than zero.  If P1 is less than
        !          1799: ** zero then leave the stack unchanged.
        !          1800: */
        !          1801: case OP_NotNull: {
        !          1802:   int i, cnt;
        !          1803:   cnt = pOp->p1;
        !          1804:   if( cnt<0 ) cnt = -cnt;
        !          1805:   assert( &pTos[1-cnt] >= p->aStack );
        !          1806:   for(i=0; i<cnt && (pTos[1+i-cnt].flags & MEM_Null)==0; i++){}
        !          1807:   if( i>=cnt ) pc = pOp->p2-1;
        !          1808:   if( pOp->p1>0 ) popStack(&pTos, cnt);
        !          1809:   break;
        !          1810: }
        !          1811: 
        !          1812: /* Opcode: MakeRecord P1 P2 *
        !          1813: **
        !          1814: ** Convert the top P1 entries of the stack into a single entry
        !          1815: ** suitable for use as a data record in a database table.  The
        !          1816: ** details of the format are irrelavant as long as the OP_Column
        !          1817: ** opcode can decode the record later.  Refer to source code
        !          1818: ** comments for the details of the record format.
        !          1819: **
        !          1820: ** If P2 is true (non-zero) and one or more of the P1 entries
        !          1821: ** that go into building the record is NULL, then add some extra
        !          1822: ** bytes to the record to make it distinct for other entries created
        !          1823: ** during the same run of the VDBE.  The extra bytes added are a
        !          1824: ** counter that is reset with each run of the VDBE, so records
        !          1825: ** created this way will not necessarily be distinct across runs.
        !          1826: ** But they should be distinct for transient tables (created using
        !          1827: ** OP_OpenTemp) which is what they are intended for.
        !          1828: **
        !          1829: ** (Later:) The P2==1 option was intended to make NULLs distinct
        !          1830: ** for the UNION operator.  But I have since discovered that NULLs
        !          1831: ** are indistinct for UNION.  So this option is never used.
        !          1832: */
        !          1833: case OP_MakeRecord: {
        !          1834:   char *zNewRecord;
        !          1835:   int nByte;
        !          1836:   int nField;
        !          1837:   int i, j;
        !          1838:   int idxWidth;
        !          1839:   u32 addr;
        !          1840:   Mem *pRec;
        !          1841:   int addUnique = 0;   /* True to cause bytes to be added to make the
        !          1842:                        ** generated record distinct */
        !          1843:   char zTemp[NBFS];    /* Temp space for small records */
        !          1844: 
        !          1845:   /* Assuming the record contains N fields, the record format looks
        !          1846:   ** like this:
        !          1847:   **
        !          1848:   **   -------------------------------------------------------------------
        !          1849:   **   | idx0 | idx1 | ... | idx(N-1) | idx(N) | data0 | ... | data(N-1) |
        !          1850:   **   -------------------------------------------------------------------
        !          1851:   **
        !          1852:   ** All data fields are converted to strings before being stored and
        !          1853:   ** are stored with their null terminators.  NULL entries omit the
        !          1854:   ** null terminator.  Thus an empty string uses 1 byte and a NULL uses
        !          1855:   ** zero bytes.  Data(0) is taken from the lowest element of the stack
        !          1856:   ** and data(N-1) is the top of the stack.
        !          1857:   **
        !          1858:   ** Each of the idx() entries is either 1, 2, or 3 bytes depending on
        !          1859:   ** how big the total record is.  Idx(0) contains the offset to the start
        !          1860:   ** of data(0).  Idx(k) contains the offset to the start of data(k).
        !          1861:   ** Idx(N) contains the total number of bytes in the record.
        !          1862:   */
        !          1863:   nField = pOp->p1;
        !          1864:   pRec = &pTos[1-nField];
        !          1865:   assert( pRec>=p->aStack );
        !          1866:   nByte = 0;
        !          1867:   for(i=0; i<nField; i++, pRec++){
        !          1868:     if( pRec->flags & MEM_Null ){
        !          1869:       addUnique = pOp->p2;
        !          1870:     }else{
        !          1871:       Stringify(pRec);
        !          1872:       nByte += pRec->n;
        !          1873:     }
        !          1874:   }
        !          1875:   if( addUnique ) nByte += sizeof(p->uniqueCnt);
        !          1876:   if( nByte + nField + 1 < 256 ){
        !          1877:     idxWidth = 1;
        !          1878:   }else if( nByte + 2*nField + 2 < 65536 ){
        !          1879:     idxWidth = 2;
        !          1880:   }else{
        !          1881:     idxWidth = 3;
        !          1882:   }
        !          1883:   nByte += idxWidth*(nField + 1);
        !          1884:   if( nByte>MAX_BYTES_PER_ROW ){
        !          1885:     rc = SQLITE_TOOBIG;
        !          1886:     goto abort_due_to_error;
        !          1887:   }
        !          1888:   if( nByte<=NBFS ){
        !          1889:     zNewRecord = zTemp;
        !          1890:   }else{
        !          1891:     zNewRecord = sqliteMallocRaw( nByte );
        !          1892:     if( zNewRecord==0 ) goto no_mem;
        !          1893:   }
        !          1894:   j = 0;
        !          1895:   addr = idxWidth*(nField+1) + addUnique*sizeof(p->uniqueCnt);
        !          1896:   for(i=0, pRec=&pTos[1-nField]; i<nField; i++, pRec++){
        !          1897:     zNewRecord[j++] = addr & 0xff;
        !          1898:     if( idxWidth>1 ){
        !          1899:       zNewRecord[j++] = (addr>>8)&0xff;
        !          1900:       if( idxWidth>2 ){
        !          1901:         zNewRecord[j++] = (addr>>16)&0xff;
        !          1902:       }
        !          1903:     }
        !          1904:     if( (pRec->flags & MEM_Null)==0 ){
        !          1905:       addr += pRec->n;
        !          1906:     }
        !          1907:   }
        !          1908:   zNewRecord[j++] = addr & 0xff;
        !          1909:   if( idxWidth>1 ){
        !          1910:     zNewRecord[j++] = (addr>>8)&0xff;
        !          1911:     if( idxWidth>2 ){
        !          1912:       zNewRecord[j++] = (addr>>16)&0xff;
        !          1913:     }
        !          1914:   }
        !          1915:   if( addUnique ){
        !          1916:     memcpy(&zNewRecord[j], &p->uniqueCnt, sizeof(p->uniqueCnt));
        !          1917:     p->uniqueCnt++;
        !          1918:     j += sizeof(p->uniqueCnt);
        !          1919:   }
        !          1920:   for(i=0, pRec=&pTos[1-nField]; i<nField; i++, pRec++){
        !          1921:     if( (pRec->flags & MEM_Null)==0 ){
        !          1922:       memcpy(&zNewRecord[j], pRec->z, pRec->n);
        !          1923:       j += pRec->n;
        !          1924:     }
        !          1925:   }
        !          1926:   popStack(&pTos, nField);
        !          1927:   pTos++;
        !          1928:   pTos->n = nByte;
        !          1929:   if( nByte<=NBFS ){
        !          1930:     assert( zNewRecord==zTemp );
        !          1931:     memcpy(pTos->zShort, zTemp, nByte);
        !          1932:     pTos->z = pTos->zShort;
        !          1933:     pTos->flags = MEM_Str | MEM_Short;
        !          1934:   }else{
        !          1935:     assert( zNewRecord!=zTemp );
        !          1936:     pTos->z = zNewRecord;
        !          1937:     pTos->flags = MEM_Str | MEM_Dyn;
        !          1938:   }
        !          1939:   break;
        !          1940: }
        !          1941: 
        !          1942: /* Opcode: MakeKey P1 P2 P3
        !          1943: **
        !          1944: ** Convert the top P1 entries of the stack into a single entry suitable
        !          1945: ** for use as the key in an index.  The top P1 records are
        !          1946: ** converted to strings and merged.  The null-terminators 
        !          1947: ** are retained and used as separators.
        !          1948: ** The lowest entry in the stack is the first field and the top of the
        !          1949: ** stack becomes the last.
        !          1950: **
        !          1951: ** If P2 is not zero, then the original entries remain on the stack
        !          1952: ** and the new key is pushed on top.  If P2 is zero, the original
        !          1953: ** data is popped off the stack first then the new key is pushed
        !          1954: ** back in its place.
        !          1955: **
        !          1956: ** P3 is a string that is P1 characters long.  Each character is either
        !          1957: ** an 'n' or a 't' to indicates if the argument should be intepreted as
        !          1958: ** numeric or text type.  The first character of P3 corresponds to the
        !          1959: ** lowest element on the stack.  If P3 is NULL then all arguments are
        !          1960: ** assumed to be of the numeric type.
        !          1961: **
        !          1962: ** The type makes a difference in that text-type fields may not be 
        !          1963: ** introduced by 'b' (as described in the next paragraph).  The
        !          1964: ** first character of a text-type field must be either 'a' (if it is NULL)
        !          1965: ** or 'c'.  Numeric fields will be introduced by 'b' if their content
        !          1966: ** looks like a well-formed number.  Otherwise the 'a' or 'c' will be
        !          1967: ** used.
        !          1968: **
        !          1969: ** The key is a concatenation of fields.  Each field is terminated by
        !          1970: ** a single 0x00 character.  A NULL field is introduced by an 'a' and
        !          1971: ** is followed immediately by its 0x00 terminator.  A numeric field is
        !          1972: ** introduced by a single character 'b' and is followed by a sequence
        !          1973: ** of characters that represent the number such that a comparison of
        !          1974: ** the character string using memcpy() sorts the numbers in numerical
        !          1975: ** order.  The character strings for numbers are generated using the
        !          1976: ** sqliteRealToSortable() function.  A text field is introduced by a
        !          1977: ** 'c' character and is followed by the exact text of the field.  The
        !          1978: ** use of an 'a', 'b', or 'c' character at the beginning of each field
        !          1979: ** guarantees that NULLs sort before numbers and that numbers sort
        !          1980: ** before text.  0x00 characters do not occur except as separators
        !          1981: ** between fields.
        !          1982: **
        !          1983: ** See also: MakeIdxKey, SortMakeKey
        !          1984: */
        !          1985: /* Opcode: MakeIdxKey P1 P2 P3
        !          1986: **
        !          1987: ** Convert the top P1 entries of the stack into a single entry suitable
        !          1988: ** for use as the key in an index.  In addition, take one additional integer
        !          1989: ** off of the stack, treat that integer as a four-byte record number, and
        !          1990: ** append the four bytes to the key.  Thus a total of P1+1 entries are
        !          1991: ** popped from the stack for this instruction and a single entry is pushed
        !          1992: ** back.  The first P1 entries that are popped are strings and the last
        !          1993: ** entry (the lowest on the stack) is an integer record number.
        !          1994: **
        !          1995: ** The converstion of the first P1 string entries occurs just like in
        !          1996: ** MakeKey.  Each entry is separated from the others by a null.
        !          1997: ** The entire concatenation is null-terminated.  The lowest entry
        !          1998: ** in the stack is the first field and the top of the stack becomes the
        !          1999: ** last.
        !          2000: **
        !          2001: ** If P2 is not zero and one or more of the P1 entries that go into the
        !          2002: ** generated key is NULL, then jump to P2 after the new key has been
        !          2003: ** pushed on the stack.  In other words, jump to P2 if the key is
        !          2004: ** guaranteed to be unique.  This jump can be used to skip a subsequent
        !          2005: ** uniqueness test.
        !          2006: **
        !          2007: ** P3 is a string that is P1 characters long.  Each character is either
        !          2008: ** an 'n' or a 't' to indicates if the argument should be numeric or
        !          2009: ** text.  The first character corresponds to the lowest element on the
        !          2010: ** stack.  If P3 is null then all arguments are assumed to be numeric.
        !          2011: **
        !          2012: ** See also:  MakeKey, SortMakeKey
        !          2013: */
        !          2014: case OP_MakeIdxKey:
        !          2015: case OP_MakeKey: {
        !          2016:   char *zNewKey;
        !          2017:   int nByte;
        !          2018:   int nField;
        !          2019:   int addRowid;
        !          2020:   int i, j;
        !          2021:   int containsNull = 0;
        !          2022:   Mem *pRec;
        !          2023:   char zTemp[NBFS];
        !          2024: 
        !          2025:   addRowid = pOp->opcode==OP_MakeIdxKey;
        !          2026:   nField = pOp->p1;
        !          2027:   pRec = &pTos[1-nField];
        !          2028:   assert( pRec>=p->aStack );
        !          2029:   nByte = 0;
        !          2030:   for(j=0, i=0; i<nField; i++, j++, pRec++){
        !          2031:     int flags = pRec->flags;
        !          2032:     int len;
        !          2033:     char *z;
        !          2034:     if( flags & MEM_Null ){
        !          2035:       nByte += 2;
        !          2036:       containsNull = 1;
        !          2037:     }else if( pOp->p3 && pOp->p3[j]=='t' ){
        !          2038:       Stringify(pRec);
        !          2039:       pRec->flags &= ~(MEM_Int|MEM_Real);
        !          2040:       nByte += pRec->n+1;
        !          2041:     }else if( (flags & (MEM_Real|MEM_Int))!=0 || sqliteIsNumber(pRec->z) ){
        !          2042:       if( (flags & (MEM_Real|MEM_Int))==MEM_Int ){
        !          2043:         pRec->r = pRec->i;
        !          2044:       }else if( (flags & (MEM_Real|MEM_Int))==0 ){
        !          2045:         pRec->r = sqliteAtoF(pRec->z, 0);
        !          2046:       }
        !          2047:       Release(pRec);
        !          2048:       z = pRec->zShort;
        !          2049:       sqliteRealToSortable(pRec->r, z);
        !          2050:       len = strlen(z);
        !          2051:       pRec->z = 0;
        !          2052:       pRec->flags = MEM_Real;
        !          2053:       pRec->n = len+1;
        !          2054:       nByte += pRec->n+1;
        !          2055:     }else{
        !          2056:       nByte += pRec->n+1;
        !          2057:     }
        !          2058:   }
        !          2059:   if( nByte+sizeof(u32)>MAX_BYTES_PER_ROW ){
        !          2060:     rc = SQLITE_TOOBIG;
        !          2061:     goto abort_due_to_error;
        !          2062:   }
        !          2063:   if( addRowid ) nByte += sizeof(u32);
        !          2064:   if( nByte<=NBFS ){
        !          2065:     zNewKey = zTemp;
        !          2066:   }else{
        !          2067:     zNewKey = sqliteMallocRaw( nByte );
        !          2068:     if( zNewKey==0 ) goto no_mem;
        !          2069:   }
        !          2070:   j = 0;
        !          2071:   pRec = &pTos[1-nField];
        !          2072:   for(i=0; i<nField; i++, pRec++){
        !          2073:     if( pRec->flags & MEM_Null ){
        !          2074:       zNewKey[j++] = 'a';
        !          2075:       zNewKey[j++] = 0;
        !          2076:     }else if( pRec->flags==MEM_Real ){
        !          2077:       zNewKey[j++] = 'b';
        !          2078:       memcpy(&zNewKey[j], pRec->zShort, pRec->n);
        !          2079:       j += pRec->n;
        !          2080:     }else{
        !          2081:       assert( pRec->flags & MEM_Str );
        !          2082:       zNewKey[j++] = 'c';
        !          2083:       memcpy(&zNewKey[j], pRec->z, pRec->n);
        !          2084:       j += pRec->n;
        !          2085:     }
        !          2086:   }
        !          2087:   if( addRowid ){
        !          2088:     u32 iKey;
        !          2089:     pRec = &pTos[-nField];
        !          2090:     assert( pRec>=p->aStack );
        !          2091:     Integerify(pRec);
        !          2092:     iKey = intToKey(pRec->i);
        !          2093:     memcpy(&zNewKey[j], &iKey, sizeof(u32));
        !          2094:     popStack(&pTos, nField+1);
        !          2095:     if( pOp->p2 && containsNull ) pc = pOp->p2 - 1;
        !          2096:   }else{
        !          2097:     if( pOp->p2==0 ) popStack(&pTos, nField);
        !          2098:   }
        !          2099:   pTos++;
        !          2100:   pTos->n = nByte;
        !          2101:   if( nByte<=NBFS ){
        !          2102:     assert( zNewKey==zTemp );
        !          2103:     pTos->z = pTos->zShort;
        !          2104:     memcpy(pTos->zShort, zTemp, nByte);
        !          2105:     pTos->flags = MEM_Str | MEM_Short;
        !          2106:   }else{
        !          2107:     pTos->z = zNewKey;
        !          2108:     pTos->flags = MEM_Str | MEM_Dyn;
        !          2109:   }
        !          2110:   break;
        !          2111: }
        !          2112: 
        !          2113: /* Opcode: IncrKey * * *
        !          2114: **
        !          2115: ** The top of the stack should contain an index key generated by
        !          2116: ** The MakeKey opcode.  This routine increases the least significant
        !          2117: ** byte of that key by one.  This is used so that the MoveTo opcode
        !          2118: ** will move to the first entry greater than the key rather than to
        !          2119: ** the key itself.
        !          2120: */
        !          2121: case OP_IncrKey: {
        !          2122:   assert( pTos>=p->aStack );
        !          2123:   /* The IncrKey opcode is only applied to keys generated by
        !          2124:   ** MakeKey or MakeIdxKey and the results of those operands
        !          2125:   ** are always dynamic strings or zShort[] strings.  So we
        !          2126:   ** are always free to modify the string in place.
        !          2127:   */
        !          2128:   assert( pTos->flags & (MEM_Dyn|MEM_Short) );
        !          2129:   pTos->z[pTos->n-1]++;
        !          2130:   break;
        !          2131: }
        !          2132: 
        !          2133: /* Opcode: Checkpoint P1 * *
        !          2134: **
        !          2135: ** Begin a checkpoint.  A checkpoint is the beginning of a operation that
        !          2136: ** is part of a larger transaction but which might need to be rolled back
        !          2137: ** itself without effecting the containing transaction.  A checkpoint will
        !          2138: ** be automatically committed or rollback when the VDBE halts.
        !          2139: **
        !          2140: ** The checkpoint is begun on the database file with index P1.  The main
        !          2141: ** database file has an index of 0 and the file used for temporary tables
        !          2142: ** has an index of 1.
        !          2143: */
        !          2144: case OP_Checkpoint: {
        !          2145:   int i = pOp->p1;
        !          2146:   if( i>=0 && i<db->nDb && db->aDb[i].pBt && db->aDb[i].inTrans==1 ){
        !          2147:     rc = sqliteBtreeBeginCkpt(db->aDb[i].pBt);
        !          2148:     if( rc==SQLITE_OK ) db->aDb[i].inTrans = 2;
        !          2149:   }
        !          2150:   break;
        !          2151: }
        !          2152: 
        !          2153: /* Opcode: Transaction P1 * *
        !          2154: **
        !          2155: ** Begin a transaction.  The transaction ends when a Commit or Rollback
        !          2156: ** opcode is encountered.  Depending on the ON CONFLICT setting, the
        !          2157: ** transaction might also be rolled back if an error is encountered.
        !          2158: **
        !          2159: ** P1 is the index of the database file on which the transaction is
        !          2160: ** started.  Index 0 is the main database file and index 1 is the
        !          2161: ** file used for temporary tables.
        !          2162: **
        !          2163: ** A write lock is obtained on the database file when a transaction is
        !          2164: ** started.  No other process can read or write the file while the
        !          2165: ** transaction is underway.  Starting a transaction also creates a
        !          2166: ** rollback journal.  A transaction must be started before any changes
        !          2167: ** can be made to the database.
        !          2168: */
        !          2169: case OP_Transaction: {
        !          2170:   int busy = 1;
        !          2171:   int i = pOp->p1;
        !          2172:   assert( i>=0 && i<db->nDb );
        !          2173:   if( db->aDb[i].inTrans ) break;
        !          2174:   while( db->aDb[i].pBt!=0 && busy ){
        !          2175:     rc = sqliteBtreeBeginTrans(db->aDb[i].pBt);
        !          2176:     switch( rc ){
        !          2177:       case SQLITE_BUSY: {
        !          2178:         if( db->xBusyCallback==0 ){
        !          2179:           p->pc = pc;
        !          2180:           p->undoTransOnError = 1;
        !          2181:           p->rc = SQLITE_BUSY;
        !          2182:           p->pTos = pTos;
        !          2183:           return SQLITE_BUSY;
        !          2184:         }else if( (*db->xBusyCallback)(db->pBusyArg, "", busy++)==0 ){
        !          2185:           sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
        !          2186:           busy = 0;
        !          2187:         }
        !          2188:         break;
        !          2189:       }
        !          2190:       case SQLITE_READONLY: {
        !          2191:         rc = SQLITE_OK;
        !          2192:         /* Fall thru into the next case */
        !          2193:       }
        !          2194:       case SQLITE_OK: {
        !          2195:         p->inTempTrans = 0;
        !          2196:         busy = 0;
        !          2197:         break;
        !          2198:       }
        !          2199:       default: {
        !          2200:         goto abort_due_to_error;
        !          2201:       }
        !          2202:     }
        !          2203:   }
        !          2204:   db->aDb[i].inTrans = 1;
        !          2205:   p->undoTransOnError = 1;
        !          2206:   break;
        !          2207: }
        !          2208: 
        !          2209: /* Opcode: Commit * * *
        !          2210: **
        !          2211: ** Cause all modifications to the database that have been made since the
        !          2212: ** last Transaction to actually take effect.  No additional modifications
        !          2213: ** are allowed until another transaction is started.  The Commit instruction
        !          2214: ** deletes the journal file and releases the write lock on the database.
        !          2215: ** A read lock continues to be held if there are still cursors open.
        !          2216: */
        !          2217: case OP_Commit: {
        !          2218:   int i;
        !          2219:   if( db->xCommitCallback!=0 ){
        !          2220:     if( sqliteSafetyOff(db) ) goto abort_due_to_misuse; 
        !          2221:     if( db->xCommitCallback(db->pCommitArg)!=0 ){
        !          2222:       rc = SQLITE_CONSTRAINT;
        !          2223:     }
        !          2224:     if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
        !          2225:   }
        !          2226:   for(i=0; rc==SQLITE_OK && i<db->nDb; i++){
        !          2227:     if( db->aDb[i].inTrans ){
        !          2228:       rc = sqliteBtreeCommit(db->aDb[i].pBt);
        !          2229:       db->aDb[i].inTrans = 0;
        !          2230:     }
        !          2231:   }
        !          2232:   if( rc==SQLITE_OK ){
        !          2233:     sqliteCommitInternalChanges(db);
        !          2234:   }else{
        !          2235:     sqliteRollbackAll(db);
        !          2236:   }
        !          2237:   break;
        !          2238: }
        !          2239: 
        !          2240: /* Opcode: Rollback P1 * *
        !          2241: **
        !          2242: ** Cause all modifications to the database that have been made since the
        !          2243: ** last Transaction to be undone. The database is restored to its state
        !          2244: ** before the Transaction opcode was executed.  No additional modifications
        !          2245: ** are allowed until another transaction is started.
        !          2246: **
        !          2247: ** P1 is the index of the database file that is committed.  An index of 0
        !          2248: ** is used for the main database and an index of 1 is used for the file used
        !          2249: ** to hold temporary tables.
        !          2250: **
        !          2251: ** This instruction automatically closes all cursors and releases both
        !          2252: ** the read and write locks on the indicated database.
        !          2253: */
        !          2254: case OP_Rollback: {
        !          2255:   sqliteRollbackAll(db);
        !          2256:   break;
        !          2257: }
        !          2258: 
        !          2259: /* Opcode: ReadCookie P1 P2 *
        !          2260: **
        !          2261: ** Read cookie number P2 from database P1 and push it onto the stack.
        !          2262: ** P2==0 is the schema version.  P2==1 is the database format.
        !          2263: ** P2==2 is the recommended pager cache size, and so forth.  P1==0 is
        !          2264: ** the main database file and P1==1 is the database file used to store
        !          2265: ** temporary tables.
        !          2266: **
        !          2267: ** There must be a read-lock on the database (either a transaction
        !          2268: ** must be started or there must be an open cursor) before
        !          2269: ** executing this instruction.
        !          2270: */
        !          2271: case OP_ReadCookie: {
        !          2272:   int aMeta[SQLITE_N_BTREE_META];
        !          2273:   assert( pOp->p2<SQLITE_N_BTREE_META );
        !          2274:   assert( pOp->p1>=0 && pOp->p1<db->nDb );
        !          2275:   assert( db->aDb[pOp->p1].pBt!=0 );
        !          2276:   rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
        !          2277:   pTos++;
        !          2278:   pTos->i = aMeta[1+pOp->p2];
        !          2279:   pTos->flags = MEM_Int;
        !          2280:   break;
        !          2281: }
        !          2282: 
        !          2283: /* Opcode: SetCookie P1 P2 *
        !          2284: **
        !          2285: ** Write the top of the stack into cookie number P2 of database P1.
        !          2286: ** P2==0 is the schema version.  P2==1 is the database format.
        !          2287: ** P2==2 is the recommended pager cache size, and so forth.  P1==0 is
        !          2288: ** the main database file and P1==1 is the database file used to store
        !          2289: ** temporary tables.
        !          2290: **
        !          2291: ** A transaction must be started before executing this opcode.
        !          2292: */
        !          2293: case OP_SetCookie: {
        !          2294:   int aMeta[SQLITE_N_BTREE_META];
        !          2295:   assert( pOp->p2<SQLITE_N_BTREE_META );
        !          2296:   assert( pOp->p1>=0 && pOp->p1<db->nDb );
        !          2297:   assert( db->aDb[pOp->p1].pBt!=0 );
        !          2298:   assert( pTos>=p->aStack );
        !          2299:   Integerify(pTos)
        !          2300:   rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
        !          2301:   if( rc==SQLITE_OK ){
        !          2302:     aMeta[1+pOp->p2] = pTos->i;
        !          2303:     rc = sqliteBtreeUpdateMeta(db->aDb[pOp->p1].pBt, aMeta);
        !          2304:   }
        !          2305:   Release(pTos);
        !          2306:   pTos--;
        !          2307:   break;
        !          2308: }
        !          2309: 
        !          2310: /* Opcode: VerifyCookie P1 P2 *
        !          2311: **
        !          2312: ** Check the value of global database parameter number 0 (the
        !          2313: ** schema version) and make sure it is equal to P2.  
        !          2314: ** P1 is the database number which is 0 for the main database file
        !          2315: ** and 1 for the file holding temporary tables and some higher number
        !          2316: ** for auxiliary databases.
        !          2317: **
        !          2318: ** The cookie changes its value whenever the database schema changes.
        !          2319: ** This operation is used to detect when that the cookie has changed
        !          2320: ** and that the current process needs to reread the schema.
        !          2321: **
        !          2322: ** Either a transaction needs to have been started or an OP_Open needs
        !          2323: ** to be executed (to establish a read lock) before this opcode is
        !          2324: ** invoked.
        !          2325: */
        !          2326: case OP_VerifyCookie: {
        !          2327:   int aMeta[SQLITE_N_BTREE_META];
        !          2328:   assert( pOp->p1>=0 && pOp->p1<db->nDb );
        !          2329:   rc = sqliteBtreeGetMeta(db->aDb[pOp->p1].pBt, aMeta);
        !          2330:   if( rc==SQLITE_OK && aMeta[1]!=pOp->p2 ){
        !          2331:     sqliteSetString(&p->zErrMsg, "database schema has changed", (char*)0);
        !          2332:     rc = SQLITE_SCHEMA;
        !          2333:   }
        !          2334:   break;
        !          2335: }
        !          2336: 
        !          2337: /* Opcode: OpenRead P1 P2 P3
        !          2338: **
        !          2339: ** Open a read-only cursor for the database table whose root page is
        !          2340: ** P2 in a database file.  The database file is determined by an 
        !          2341: ** integer from the top of the stack.  0 means the main database and
        !          2342: ** 1 means the database used for temporary tables.  Give the new 
        !          2343: ** cursor an identifier of P1.  The P1 values need not be contiguous
        !          2344: ** but all P1 values should be small integers.  It is an error for
        !          2345: ** P1 to be negative.
        !          2346: **
        !          2347: ** If P2==0 then take the root page number from the next of the stack.
        !          2348: **
        !          2349: ** There will be a read lock on the database whenever there is an
        !          2350: ** open cursor.  If the database was unlocked prior to this instruction
        !          2351: ** then a read lock is acquired as part of this instruction.  A read
        !          2352: ** lock allows other processes to read the database but prohibits
        !          2353: ** any other process from modifying the database.  The read lock is
        !          2354: ** released when all cursors are closed.  If this instruction attempts
        !          2355: ** to get a read lock but fails, the script terminates with an
        !          2356: ** SQLITE_BUSY error code.
        !          2357: **
        !          2358: ** The P3 value is the name of the table or index being opened.
        !          2359: ** The P3 value is not actually used by this opcode and may be
        !          2360: ** omitted.  But the code generator usually inserts the index or
        !          2361: ** table name into P3 to make the code easier to read.
        !          2362: **
        !          2363: ** See also OpenWrite.
        !          2364: */
        !          2365: /* Opcode: OpenWrite P1 P2 P3
        !          2366: **
        !          2367: ** Open a read/write cursor named P1 on the table or index whose root
        !          2368: ** page is P2.  If P2==0 then take the root page number from the stack.
        !          2369: **
        !          2370: ** The P3 value is the name of the table or index being opened.
        !          2371: ** The P3 value is not actually used by this opcode and may be
        !          2372: ** omitted.  But the code generator usually inserts the index or
        !          2373: ** table name into P3 to make the code easier to read.
        !          2374: **
        !          2375: ** This instruction works just like OpenRead except that it opens the cursor
        !          2376: ** in read/write mode.  For a given table, there can be one or more read-only
        !          2377: ** cursors or a single read/write cursor but not both.
        !          2378: **
        !          2379: ** See also OpenRead.
        !          2380: */
        !          2381: case OP_OpenRead:
        !          2382: case OP_OpenWrite: {
        !          2383:   int busy = 0;
        !          2384:   int i = pOp->p1;
        !          2385:   int p2 = pOp->p2;
        !          2386:   int wrFlag;
        !          2387:   Btree *pX;
        !          2388:   int iDb;
        !          2389:   
        !          2390:   assert( pTos>=p->aStack );
        !          2391:   Integerify(pTos);
        !          2392:   iDb = pTos->i;
        !          2393:   pTos--;
        !          2394:   assert( iDb>=0 && iDb<db->nDb );
        !          2395:   pX = db->aDb[iDb].pBt;
        !          2396:   assert( pX!=0 );
        !          2397:   wrFlag = pOp->opcode==OP_OpenWrite;
        !          2398:   if( p2<=0 ){
        !          2399:     assert( pTos>=p->aStack );
        !          2400:     Integerify(pTos);
        !          2401:     p2 = pTos->i;
        !          2402:     pTos--;
        !          2403:     if( p2<2 ){
        !          2404:       sqliteSetString(&p->zErrMsg, "root page number less than 2", (char*)0);
        !          2405:       rc = SQLITE_INTERNAL;
        !          2406:       break;
        !          2407:     }
        !          2408:   }
        !          2409:   assert( i>=0 );
        !          2410:   if( expandCursorArraySize(p, i) ) goto no_mem;
        !          2411:   sqliteVdbeCleanupCursor(&p->aCsr[i]);
        !          2412:   memset(&p->aCsr[i], 0, sizeof(Cursor));
        !          2413:   p->aCsr[i].nullRow = 1;
        !          2414:   if( pX==0 ) break;
        !          2415:   do{
        !          2416:     rc = sqliteBtreeCursor(pX, p2, wrFlag, &p->aCsr[i].pCursor);
        !          2417:     switch( rc ){
        !          2418:       case SQLITE_BUSY: {
        !          2419:         if( db->xBusyCallback==0 ){
        !          2420:           p->pc = pc;
        !          2421:           p->rc = SQLITE_BUSY;
        !          2422:           p->pTos = &pTos[1 + (pOp->p2<=0)]; /* Operands must remain on stack */
        !          2423:           return SQLITE_BUSY;
        !          2424:         }else if( (*db->xBusyCallback)(db->pBusyArg, pOp->p3, ++busy)==0 ){
        !          2425:           sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
        !          2426:           busy = 0;
        !          2427:         }
        !          2428:         break;
        !          2429:       }
        !          2430:       case SQLITE_OK: {
        !          2431:         busy = 0;
        !          2432:         break;
        !          2433:       }
        !          2434:       default: {
        !          2435:         goto abort_due_to_error;
        !          2436:       }
        !          2437:     }
        !          2438:   }while( busy );
        !          2439:   break;
        !          2440: }
        !          2441: 
        !          2442: /* Opcode: OpenTemp P1 P2 *
        !          2443: **
        !          2444: ** Open a new cursor to a transient table.
        !          2445: ** The transient cursor is always opened read/write even if 
        !          2446: ** the main database is read-only.  The transient table is deleted
        !          2447: ** automatically when the cursor is closed.
        !          2448: **
        !          2449: ** The cursor points to a BTree table if P2==0 and to a BTree index
        !          2450: ** if P2==1.  A BTree table must have an integer key and can have arbitrary
        !          2451: ** data.  A BTree index has no data but can have an arbitrary key.
        !          2452: **
        !          2453: ** This opcode is used for tables that exist for the duration of a single
        !          2454: ** SQL statement only.  Tables created using CREATE TEMPORARY TABLE
        !          2455: ** are opened using OP_OpenRead or OP_OpenWrite.  "Temporary" in the
        !          2456: ** context of this opcode means for the duration of a single SQL statement
        !          2457: ** whereas "Temporary" in the context of CREATE TABLE means for the duration
        !          2458: ** of the connection to the database.  Same word; different meanings.
        !          2459: */
        !          2460: case OP_OpenTemp: {
        !          2461:   int i = pOp->p1;
        !          2462:   Cursor *pCx;
        !          2463:   assert( i>=0 );
        !          2464:   if( expandCursorArraySize(p, i) ) goto no_mem;
        !          2465:   pCx = &p->aCsr[i];
        !          2466:   sqliteVdbeCleanupCursor(pCx);
        !          2467:   memset(pCx, 0, sizeof(*pCx));
        !          2468:   pCx->nullRow = 1;
        !          2469:   rc = sqliteBtreeFactory(db, 0, 1, TEMP_PAGES, &pCx->pBt);
        !          2470: 
        !          2471:   if( rc==SQLITE_OK ){
        !          2472:     rc = sqliteBtreeBeginTrans(pCx->pBt);
        !          2473:   }
        !          2474:   if( rc==SQLITE_OK ){
        !          2475:     if( pOp->p2 ){
        !          2476:       int pgno;
        !          2477:       rc = sqliteBtreeCreateIndex(pCx->pBt, &pgno);
        !          2478:       if( rc==SQLITE_OK ){
        !          2479:         rc = sqliteBtreeCursor(pCx->pBt, pgno, 1, &pCx->pCursor);
        !          2480:       }
        !          2481:     }else{
        !          2482:       rc = sqliteBtreeCursor(pCx->pBt, 2, 1, &pCx->pCursor);
        !          2483:     }
        !          2484:   }
        !          2485:   break;
        !          2486: }
        !          2487: 
        !          2488: /* Opcode: OpenPseudo P1 * *
        !          2489: **
        !          2490: ** Open a new cursor that points to a fake table that contains a single
        !          2491: ** row of data.  Any attempt to write a second row of data causes the
        !          2492: ** first row to be deleted.  All data is deleted when the cursor is
        !          2493: ** closed.
        !          2494: **
        !          2495: ** A pseudo-table created by this opcode is useful for holding the
        !          2496: ** NEW or OLD tables in a trigger.
        !          2497: */
        !          2498: case OP_OpenPseudo: {
        !          2499:   int i = pOp->p1;
        !          2500:   Cursor *pCx;
        !          2501:   assert( i>=0 );
        !          2502:   if( expandCursorArraySize(p, i) ) goto no_mem;
        !          2503:   pCx = &p->aCsr[i];
        !          2504:   sqliteVdbeCleanupCursor(pCx);
        !          2505:   memset(pCx, 0, sizeof(*pCx));
        !          2506:   pCx->nullRow = 1;
        !          2507:   pCx->pseudoTable = 1;
        !          2508:   break;
        !          2509: }
        !          2510: 
        !          2511: /* Opcode: Close P1 * *
        !          2512: **
        !          2513: ** Close a cursor previously opened as P1.  If P1 is not
        !          2514: ** currently open, this instruction is a no-op.
        !          2515: */
        !          2516: case OP_Close: {
        !          2517:   int i = pOp->p1;
        !          2518:   if( i>=0 && i<p->nCursor ){
        !          2519:     sqliteVdbeCleanupCursor(&p->aCsr[i]);
        !          2520:   }
        !          2521:   break;
        !          2522: }
        !          2523: 
        !          2524: /* Opcode: MoveTo P1 P2 *
        !          2525: **
        !          2526: ** Pop the top of the stack and use its value as a key.  Reposition
        !          2527: ** cursor P1 so that it points to an entry with a matching key.  If
        !          2528: ** the table contains no record with a matching key, then the cursor
        !          2529: ** is left pointing at the first record that is greater than the key.
        !          2530: ** If there are no records greater than the key and P2 is not zero,
        !          2531: ** then an immediate jump to P2 is made.
        !          2532: **
        !          2533: ** See also: Found, NotFound, Distinct, MoveLt
        !          2534: */
        !          2535: /* Opcode: MoveLt P1 P2 *
        !          2536: **
        !          2537: ** Pop the top of the stack and use its value as a key.  Reposition
        !          2538: ** cursor P1 so that it points to the entry with the largest key that is
        !          2539: ** less than the key popped from the stack.
        !          2540: ** If there are no records less than than the key and P2
        !          2541: ** is not zero then an immediate jump to P2 is made.
        !          2542: **
        !          2543: ** See also: MoveTo
        !          2544: */
        !          2545: case OP_MoveLt:
        !          2546: case OP_MoveTo: {
        !          2547:   int i = pOp->p1;
        !          2548:   Cursor *pC;
        !          2549: 
        !          2550:   assert( pTos>=p->aStack );
        !          2551:   assert( i>=0 && i<p->nCursor );
        !          2552:   pC = &p->aCsr[i];
        !          2553:   if( pC->pCursor!=0 ){
        !          2554:     int res, oc;
        !          2555:     pC->nullRow = 0;
        !          2556:     if( pTos->flags & MEM_Int ){
        !          2557:       int iKey = intToKey(pTos->i);
        !          2558:       if( pOp->p2==0 && pOp->opcode==OP_MoveTo ){
        !          2559:         pC->movetoTarget = iKey;
        !          2560:         pC->deferredMoveto = 1;
        !          2561:         Release(pTos);
        !          2562:         pTos--;
        !          2563:         break;
        !          2564:       }
        !          2565:       sqliteBtreeMoveto(pC->pCursor, (char*)&iKey, sizeof(int), &res);
        !          2566:       pC->lastRecno = pTos->i;
        !          2567:       pC->recnoIsValid = res==0;
        !          2568:     }else{
        !          2569:       Stringify(pTos);
        !          2570:       sqliteBtreeMoveto(pC->pCursor, pTos->z, pTos->n, &res);
        !          2571:       pC->recnoIsValid = 0;
        !          2572:     }
        !          2573:     pC->deferredMoveto = 0;
        !          2574:     sqlite_search_count++;
        !          2575:     oc = pOp->opcode;
        !          2576:     if( oc==OP_MoveTo && res<0 ){
        !          2577:       sqliteBtreeNext(pC->pCursor, &res);
        !          2578:       pC->recnoIsValid = 0;
        !          2579:       if( res && pOp->p2>0 ){
        !          2580:         pc = pOp->p2 - 1;
        !          2581:       }
        !          2582:     }else if( oc==OP_MoveLt ){
        !          2583:       if( res>=0 ){
        !          2584:         sqliteBtreePrevious(pC->pCursor, &res);
        !          2585:         pC->recnoIsValid = 0;
        !          2586:       }else{
        !          2587:         /* res might be negative because the table is empty.  Check to
        !          2588:         ** see if this is the case.
        !          2589:         */
        !          2590:         int keysize;
        !          2591:         res = sqliteBtreeKeySize(pC->pCursor,&keysize)!=0 || keysize==0;
        !          2592:       }
        !          2593:       if( res && pOp->p2>0 ){
        !          2594:         pc = pOp->p2 - 1;
        !          2595:       }
        !          2596:     }
        !          2597:   }
        !          2598:   Release(pTos);
        !          2599:   pTos--;
        !          2600:   break;
        !          2601: }
        !          2602: 
        !          2603: /* Opcode: Distinct P1 P2 *
        !          2604: **
        !          2605: ** Use the top of the stack as a string key.  If a record with that key does
        !          2606: ** not exist in the table of cursor P1, then jump to P2.  If the record
        !          2607: ** does already exist, then fall thru.  The cursor is left pointing
        !          2608: ** at the record if it exists. The key is not popped from the stack.
        !          2609: **
        !          2610: ** This operation is similar to NotFound except that this operation
        !          2611: ** does not pop the key from the stack.
        !          2612: **
        !          2613: ** See also: Found, NotFound, MoveTo, IsUnique, NotExists
        !          2614: */
        !          2615: /* Opcode: Found P1 P2 *
        !          2616: **
        !          2617: ** Use the top of the stack as a string key.  If a record with that key
        !          2618: ** does exist in table of P1, then jump to P2.  If the record
        !          2619: ** does not exist, then fall thru.  The cursor is left pointing
        !          2620: ** to the record if it exists.  The key is popped from the stack.
        !          2621: **
        !          2622: ** See also: Distinct, NotFound, MoveTo, IsUnique, NotExists
        !          2623: */
        !          2624: /* Opcode: NotFound P1 P2 *
        !          2625: **
        !          2626: ** Use the top of the stack as a string key.  If a record with that key
        !          2627: ** does not exist in table of P1, then jump to P2.  If the record
        !          2628: ** does exist, then fall thru.  The cursor is left pointing to the
        !          2629: ** record if it exists.  The key is popped from the stack.
        !          2630: **
        !          2631: ** The difference between this operation and Distinct is that
        !          2632: ** Distinct does not pop the key from the stack.
        !          2633: **
        !          2634: ** See also: Distinct, Found, MoveTo, NotExists, IsUnique
        !          2635: */
        !          2636: case OP_Distinct:
        !          2637: case OP_NotFound:
        !          2638: case OP_Found: {
        !          2639:   int i = pOp->p1;
        !          2640:   int alreadyExists = 0;
        !          2641:   Cursor *pC;
        !          2642:   assert( pTos>=p->aStack );
        !          2643:   assert( i>=0 && i<p->nCursor );
        !          2644:   if( (pC = &p->aCsr[i])->pCursor!=0 ){
        !          2645:     int res, rx;
        !          2646:     Stringify(pTos);
        !          2647:     rx = sqliteBtreeMoveto(pC->pCursor, pTos->z, pTos->n, &res);
        !          2648:     alreadyExists = rx==SQLITE_OK && res==0;
        !          2649:     pC->deferredMoveto = 0;
        !          2650:   }
        !          2651:   if( pOp->opcode==OP_Found ){
        !          2652:     if( alreadyExists ) pc = pOp->p2 - 1;
        !          2653:   }else{
        !          2654:     if( !alreadyExists ) pc = pOp->p2 - 1;
        !          2655:   }
        !          2656:   if( pOp->opcode!=OP_Distinct ){
        !          2657:     Release(pTos);
        !          2658:     pTos--;
        !          2659:   }
        !          2660:   break;
        !          2661: }
        !          2662: 
        !          2663: /* Opcode: IsUnique P1 P2 *
        !          2664: **
        !          2665: ** The top of the stack is an integer record number.  Call this
        !          2666: ** record number R.  The next on the stack is an index key created
        !          2667: ** using MakeIdxKey.  Call it K.  This instruction pops R from the
        !          2668: ** stack but it leaves K unchanged.
        !          2669: **
        !          2670: ** P1 is an index.  So all but the last four bytes of K are an
        !          2671: ** index string.  The last four bytes of K are a record number.
        !          2672: **
        !          2673: ** This instruction asks if there is an entry in P1 where the
        !          2674: ** index string matches K but the record number is different
        !          2675: ** from R.  If there is no such entry, then there is an immediate
        !          2676: ** jump to P2.  If any entry does exist where the index string
        !          2677: ** matches K but the record number is not R, then the record
        !          2678: ** number for that entry is pushed onto the stack and control
        !          2679: ** falls through to the next instruction.
        !          2680: **
        !          2681: ** See also: Distinct, NotFound, NotExists, Found
        !          2682: */
        !          2683: case OP_IsUnique: {
        !          2684:   int i = pOp->p1;
        !          2685:   Mem *pNos = &pTos[-1];
        !          2686:   BtCursor *pCrsr;
        !          2687:   int R;
        !          2688: 
        !          2689:   /* Pop the value R off the top of the stack
        !          2690:   */
        !          2691:   assert( pNos>=p->aStack );
        !          2692:   Integerify(pTos);
        !          2693:   R = pTos->i;
        !          2694:   pTos--;
        !          2695:   assert( i>=0 && i<=p->nCursor );
        !          2696:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          2697:     int res, rc;
        !          2698:     int v;         /* The record number on the P1 entry that matches K */
        !          2699:     char *zKey;    /* The value of K */
        !          2700:     int nKey;      /* Number of bytes in K */
        !          2701: 
        !          2702:     /* Make sure K is a string and make zKey point to K
        !          2703:     */
        !          2704:     Stringify(pNos);
        !          2705:     zKey = pNos->z;
        !          2706:     nKey = pNos->n;
        !          2707:     assert( nKey >= 4 );
        !          2708: 
        !          2709:     /* Search for an entry in P1 where all but the last four bytes match K.
        !          2710:     ** If there is no such entry, jump immediately to P2.
        !          2711:     */
        !          2712:     assert( p->aCsr[i].deferredMoveto==0 );
        !          2713:     rc = sqliteBtreeMoveto(pCrsr, zKey, nKey-4, &res);
        !          2714:     if( rc!=SQLITE_OK ) goto abort_due_to_error;
        !          2715:     if( res<0 ){
        !          2716:       rc = sqliteBtreeNext(pCrsr, &res);
        !          2717:       if( res ){
        !          2718:         pc = pOp->p2 - 1;
        !          2719:         break;
        !          2720:       }
        !          2721:     }
        !          2722:     rc = sqliteBtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &res);
        !          2723:     if( rc!=SQLITE_OK ) goto abort_due_to_error;
        !          2724:     if( res>0 ){
        !          2725:       pc = pOp->p2 - 1;
        !          2726:       break;
        !          2727:     }
        !          2728: 
        !          2729:     /* At this point, pCrsr is pointing to an entry in P1 where all but
        !          2730:     ** the last for bytes of the key match K.  Check to see if the last
        !          2731:     ** four bytes of the key are different from R.  If the last four
        !          2732:     ** bytes equal R then jump immediately to P2.
        !          2733:     */
        !          2734:     sqliteBtreeKey(pCrsr, nKey - 4, 4, (char*)&v);
        !          2735:     v = keyToInt(v);
        !          2736:     if( v==R ){
        !          2737:       pc = pOp->p2 - 1;
        !          2738:       break;
        !          2739:     }
        !          2740: 
        !          2741:     /* The last four bytes of the key are different from R.  Convert the
        !          2742:     ** last four bytes of the key into an integer and push it onto the
        !          2743:     ** stack.  (These bytes are the record number of an entry that
        !          2744:     ** violates a UNIQUE constraint.)
        !          2745:     */
        !          2746:     pTos++;
        !          2747:     pTos->i = v;
        !          2748:     pTos->flags = MEM_Int;
        !          2749:   }
        !          2750:   break;
        !          2751: }
        !          2752: 
        !          2753: /* Opcode: NotExists P1 P2 *
        !          2754: **
        !          2755: ** Use the top of the stack as a integer key.  If a record with that key
        !          2756: ** does not exist in table of P1, then jump to P2.  If the record
        !          2757: ** does exist, then fall thru.  The cursor is left pointing to the
        !          2758: ** record if it exists.  The integer key is popped from the stack.
        !          2759: **
        !          2760: ** The difference between this operation and NotFound is that this
        !          2761: ** operation assumes the key is an integer and NotFound assumes it
        !          2762: ** is a string.
        !          2763: **
        !          2764: ** See also: Distinct, Found, MoveTo, NotFound, IsUnique
        !          2765: */
        !          2766: case OP_NotExists: {
        !          2767:   int i = pOp->p1;
        !          2768:   BtCursor *pCrsr;
        !          2769:   assert( pTos>=p->aStack );
        !          2770:   assert( i>=0 && i<p->nCursor );
        !          2771:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          2772:     int res, rx, iKey;
        !          2773:     assert( pTos->flags & MEM_Int );
        !          2774:     iKey = intToKey(pTos->i);
        !          2775:     rx = sqliteBtreeMoveto(pCrsr, (char*)&iKey, sizeof(int), &res);
        !          2776:     p->aCsr[i].lastRecno = pTos->i;
        !          2777:     p->aCsr[i].recnoIsValid = res==0;
        !          2778:     p->aCsr[i].nullRow = 0;
        !          2779:     if( rx!=SQLITE_OK || res!=0 ){
        !          2780:       pc = pOp->p2 - 1;
        !          2781:       p->aCsr[i].recnoIsValid = 0;
        !          2782:     }
        !          2783:   }
        !          2784:   Release(pTos);
        !          2785:   pTos--;
        !          2786:   break;
        !          2787: }
        !          2788: 
        !          2789: /* Opcode: NewRecno P1 * *
        !          2790: **
        !          2791: ** Get a new integer record number used as the key to a table.
        !          2792: ** The record number is not previously used as a key in the database
        !          2793: ** table that cursor P1 points to.  The new record number is pushed 
        !          2794: ** onto the stack.
        !          2795: */
        !          2796: case OP_NewRecno: {
        !          2797:   int i = pOp->p1;
        !          2798:   int v = 0;
        !          2799:   Cursor *pC;
        !          2800:   assert( i>=0 && i<p->nCursor );
        !          2801:   if( (pC = &p->aCsr[i])->pCursor==0 ){
        !          2802:     v = 0;
        !          2803:   }else{
        !          2804:     /* The next rowid or record number (different terms for the same
        !          2805:     ** thing) is obtained in a two-step algorithm.
        !          2806:     **
        !          2807:     ** First we attempt to find the largest existing rowid and add one
        !          2808:     ** to that.  But if the largest existing rowid is already the maximum
        !          2809:     ** positive integer, we have to fall through to the second
        !          2810:     ** probabilistic algorithm
        !          2811:     **
        !          2812:     ** The second algorithm is to select a rowid at random and see if
        !          2813:     ** it already exists in the table.  If it does not exist, we have
        !          2814:     ** succeeded.  If the random rowid does exist, we select a new one
        !          2815:     ** and try again, up to 1000 times.
        !          2816:     **
        !          2817:     ** For a table with less than 2 billion entries, the probability
        !          2818:     ** of not finding a unused rowid is about 1.0e-300.  This is a 
        !          2819:     ** non-zero probability, but it is still vanishingly small and should
        !          2820:     ** never cause a problem.  You are much, much more likely to have a
        !          2821:     ** hardware failure than for this algorithm to fail.
        !          2822:     **
        !          2823:     ** The analysis in the previous paragraph assumes that you have a good
        !          2824:     ** source of random numbers.  Is a library function like lrand48()
        !          2825:     ** good enough?  Maybe. Maybe not. It's hard to know whether there
        !          2826:     ** might be subtle bugs is some implementations of lrand48() that
        !          2827:     ** could cause problems. To avoid uncertainty, SQLite uses its own 
        !          2828:     ** random number generator based on the RC4 algorithm.
        !          2829:     **
        !          2830:     ** To promote locality of reference for repetitive inserts, the
        !          2831:     ** first few attempts at chosing a random rowid pick values just a little
        !          2832:     ** larger than the previous rowid.  This has been shown experimentally
        !          2833:     ** to double the speed of the COPY operation.
        !          2834:     */
        !          2835:     int res, rx, cnt, x;
        !          2836:     cnt = 0;
        !          2837:     if( !pC->useRandomRowid ){
        !          2838:       if( pC->nextRowidValid ){
        !          2839:         v = pC->nextRowid;
        !          2840:       }else{
        !          2841:         rx = sqliteBtreeLast(pC->pCursor, &res);
        !          2842:         if( res ){
        !          2843:           v = 1;
        !          2844:         }else{
        !          2845:           sqliteBtreeKey(pC->pCursor, 0, sizeof(v), (void*)&v);
        !          2846:           v = keyToInt(v);
        !          2847:           if( v==0x7fffffff ){
        !          2848:             pC->useRandomRowid = 1;
        !          2849:           }else{
        !          2850:             v++;
        !          2851:           }
        !          2852:         }
        !          2853:       }
        !          2854:       if( v<0x7fffffff ){
        !          2855:         pC->nextRowidValid = 1;
        !          2856:         pC->nextRowid = v+1;
        !          2857:       }else{
        !          2858:         pC->nextRowidValid = 0;
        !          2859:       }
        !          2860:     }
        !          2861:     if( pC->useRandomRowid ){
        !          2862:       v = db->priorNewRowid;
        !          2863:       cnt = 0;
        !          2864:       do{
        !          2865:         if( v==0 || cnt>2 ){
        !          2866:           sqliteRandomness(sizeof(v), &v);
        !          2867:           if( cnt<5 ) v &= 0xffffff;
        !          2868:         }else{
        !          2869:           unsigned char r;
        !          2870:           sqliteRandomness(1, &r);
        !          2871:           v += r + 1;
        !          2872:         }
        !          2873:         if( v==0 ) continue;
        !          2874:         x = intToKey(v);
        !          2875:         rx = sqliteBtreeMoveto(pC->pCursor, &x, sizeof(int), &res);
        !          2876:         cnt++;
        !          2877:       }while( cnt<1000 && rx==SQLITE_OK && res==0 );
        !          2878:       db->priorNewRowid = v;
        !          2879:       if( rx==SQLITE_OK && res==0 ){
        !          2880:         rc = SQLITE_FULL;
        !          2881:         goto abort_due_to_error;
        !          2882:       }
        !          2883:     }
        !          2884:     pC->recnoIsValid = 0;
        !          2885:     pC->deferredMoveto = 0;
        !          2886:   }
        !          2887:   pTos++;
        !          2888:   pTos->i = v;
        !          2889:   pTos->flags = MEM_Int;
        !          2890:   break;
        !          2891: }
        !          2892: 
        !          2893: /* Opcode: PutIntKey P1 P2 *
        !          2894: **
        !          2895: ** Write an entry into the table of cursor P1.  A new entry is
        !          2896: ** created if it doesn't already exist or the data for an existing
        !          2897: ** entry is overwritten.  The data is the value on the top of the
        !          2898: ** stack.  The key is the next value down on the stack.  The key must
        !          2899: ** be an integer.  The stack is popped twice by this instruction.
        !          2900: **
        !          2901: ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
        !          2902: ** incremented (otherwise not).  If the OPFLAG_CSCHANGE flag is set,
        !          2903: ** then the current statement change count is incremented (otherwise not).
        !          2904: ** If the OPFLAG_LASTROWID flag of P2 is set, then rowid is
        !          2905: ** stored for subsequent return by the sqlite_last_insert_rowid() function
        !          2906: ** (otherwise it's unmodified).
        !          2907: */
        !          2908: /* Opcode: PutStrKey P1 * *
        !          2909: **
        !          2910: ** Write an entry into the table of cursor P1.  A new entry is
        !          2911: ** created if it doesn't already exist or the data for an existing
        !          2912: ** entry is overwritten.  The data is the value on the top of the
        !          2913: ** stack.  The key is the next value down on the stack.  The key must
        !          2914: ** be a string.  The stack is popped twice by this instruction.
        !          2915: **
        !          2916: ** P1 may not be a pseudo-table opened using the OpenPseudo opcode.
        !          2917: */
        !          2918: case OP_PutIntKey:
        !          2919: case OP_PutStrKey: {
        !          2920:   Mem *pNos = &pTos[-1];
        !          2921:   int i = pOp->p1;
        !          2922:   Cursor *pC;
        !          2923:   assert( pNos>=p->aStack );
        !          2924:   assert( i>=0 && i<p->nCursor );
        !          2925:   if( ((pC = &p->aCsr[i])->pCursor!=0 || pC->pseudoTable) ){
        !          2926:     char *zKey;
        !          2927:     int nKey, iKey;
        !          2928:     if( pOp->opcode==OP_PutStrKey ){
        !          2929:       Stringify(pNos);
        !          2930:       nKey = pNos->n;
        !          2931:       zKey = pNos->z;
        !          2932:     }else{
        !          2933:       assert( pNos->flags & MEM_Int );
        !          2934:       nKey = sizeof(int);
        !          2935:       iKey = intToKey(pNos->i);
        !          2936:       zKey = (char*)&iKey;
        !          2937:       if( pOp->p2 & OPFLAG_NCHANGE ) db->nChange++;
        !          2938:       if( pOp->p2 & OPFLAG_LASTROWID ) db->lastRowid = pNos->i;
        !          2939:       if( pOp->p2 & OPFLAG_CSCHANGE ) db->csChange++;
        !          2940:       if( pC->nextRowidValid && pTos->i>=pC->nextRowid ){
        !          2941:         pC->nextRowidValid = 0;
        !          2942:       }
        !          2943:     }
        !          2944:     if( pTos->flags & MEM_Null ){
        !          2945:       pTos->z = 0;
        !          2946:       pTos->n = 0;
        !          2947:     }else{
        !          2948:       assert( pTos->flags & MEM_Str );
        !          2949:     }
        !          2950:     if( pC->pseudoTable ){
        !          2951:       /* PutStrKey does not work for pseudo-tables.
        !          2952:       ** The following assert makes sure we are not trying to use
        !          2953:       ** PutStrKey on a pseudo-table
        !          2954:       */
        !          2955:       assert( pOp->opcode==OP_PutIntKey );
        !          2956:       sqliteFree(pC->pData);
        !          2957:       pC->iKey = iKey;
        !          2958:       pC->nData = pTos->n;
        !          2959:       if( pTos->flags & MEM_Dyn ){
        !          2960:         pC->pData = pTos->z;
        !          2961:         pTos->flags = MEM_Null;
        !          2962:       }else{
        !          2963:         pC->pData = sqliteMallocRaw( pC->nData );
        !          2964:         if( pC->pData ){
        !          2965:           memcpy(pC->pData, pTos->z, pC->nData);
        !          2966:         }
        !          2967:       }
        !          2968:       pC->nullRow = 0;
        !          2969:     }else{
        !          2970:       rc = sqliteBtreeInsert(pC->pCursor, zKey, nKey, pTos->z, pTos->n);
        !          2971:     }
        !          2972:     pC->recnoIsValid = 0;
        !          2973:     pC->deferredMoveto = 0;
        !          2974:   }
        !          2975:   popStack(&pTos, 2);
        !          2976:   break;
        !          2977: }
        !          2978: 
        !          2979: /* Opcode: Delete P1 P2 *
        !          2980: **
        !          2981: ** Delete the record at which the P1 cursor is currently pointing.
        !          2982: **
        !          2983: ** The cursor will be left pointing at either the next or the previous
        !          2984: ** record in the table. If it is left pointing at the next record, then
        !          2985: ** the next Next instruction will be a no-op.  Hence it is OK to delete
        !          2986: ** a record from within an Next loop.
        !          2987: **
        !          2988: ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
        !          2989: ** incremented (otherwise not).  If OPFLAG_CSCHANGE flag is set,
        !          2990: ** then the current statement change count is incremented (otherwise not).
        !          2991: **
        !          2992: ** If P1 is a pseudo-table, then this instruction is a no-op.
        !          2993: */
        !          2994: case OP_Delete: {
        !          2995:   int i = pOp->p1;
        !          2996:   Cursor *pC;
        !          2997:   assert( i>=0 && i<p->nCursor );
        !          2998:   pC = &p->aCsr[i];
        !          2999:   if( pC->pCursor!=0 ){
        !          3000:     sqliteVdbeCursorMoveto(pC);
        !          3001:     rc = sqliteBtreeDelete(pC->pCursor);
        !          3002:     pC->nextRowidValid = 0;
        !          3003:   }
        !          3004:   if( pOp->p2 & OPFLAG_NCHANGE ) db->nChange++;
        !          3005:   if( pOp->p2 & OPFLAG_CSCHANGE ) db->csChange++;
        !          3006:   break;
        !          3007: }
        !          3008: 
        !          3009: /* Opcode: SetCounts * * *
        !          3010: **
        !          3011: ** Called at end of statement.  Updates lsChange (last statement change count)
        !          3012: ** and resets csChange (current statement change count) to 0.
        !          3013: */
        !          3014: case OP_SetCounts: {
        !          3015:   db->lsChange=db->csChange;
        !          3016:   db->csChange=0;
        !          3017:   break;
        !          3018: }
        !          3019: 
        !          3020: /* Opcode: KeyAsData P1 P2 *
        !          3021: **
        !          3022: ** Turn the key-as-data mode for cursor P1 either on (if P2==1) or
        !          3023: ** off (if P2==0).  In key-as-data mode, the OP_Column opcode pulls
        !          3024: ** data off of the key rather than the data.  This is used for
        !          3025: ** processing compound selects.
        !          3026: */
        !          3027: case OP_KeyAsData: {
        !          3028:   int i = pOp->p1;
        !          3029:   assert( i>=0 && i<p->nCursor );
        !          3030:   p->aCsr[i].keyAsData = pOp->p2;
        !          3031:   break;
        !          3032: }
        !          3033: 
        !          3034: /* Opcode: RowData P1 * *
        !          3035: **
        !          3036: ** Push onto the stack the complete row data for cursor P1.
        !          3037: ** There is no interpretation of the data.  It is just copied
        !          3038: ** onto the stack exactly as it is found in the database file.
        !          3039: **
        !          3040: ** If the cursor is not pointing to a valid row, a NULL is pushed
        !          3041: ** onto the stack.
        !          3042: */
        !          3043: /* Opcode: RowKey P1 * *
        !          3044: **
        !          3045: ** Push onto the stack the complete row key for cursor P1.
        !          3046: ** There is no interpretation of the key.  It is just copied
        !          3047: ** onto the stack exactly as it is found in the database file.
        !          3048: **
        !          3049: ** If the cursor is not pointing to a valid row, a NULL is pushed
        !          3050: ** onto the stack.
        !          3051: */
        !          3052: case OP_RowKey:
        !          3053: case OP_RowData: {
        !          3054:   int i = pOp->p1;
        !          3055:   Cursor *pC;
        !          3056:   int n;
        !          3057: 
        !          3058:   pTos++;
        !          3059:   assert( i>=0 && i<p->nCursor );
        !          3060:   pC = &p->aCsr[i];
        !          3061:   if( pC->nullRow ){
        !          3062:     pTos->flags = MEM_Null;
        !          3063:   }else if( pC->pCursor!=0 ){
        !          3064:     BtCursor *pCrsr = pC->pCursor;
        !          3065:     sqliteVdbeCursorMoveto(pC);
        !          3066:     if( pC->nullRow ){
        !          3067:       pTos->flags = MEM_Null;
        !          3068:       break;
        !          3069:     }else if( pC->keyAsData || pOp->opcode==OP_RowKey ){
        !          3070:       sqliteBtreeKeySize(pCrsr, &n);
        !          3071:     }else{
        !          3072:       sqliteBtreeDataSize(pCrsr, &n);
        !          3073:     }
        !          3074:     pTos->n = n;
        !          3075:     if( n<=NBFS ){
        !          3076:       pTos->flags = MEM_Str | MEM_Short;
        !          3077:       pTos->z = pTos->zShort;
        !          3078:     }else{
        !          3079:       char *z = sqliteMallocRaw( n );
        !          3080:       if( z==0 ) goto no_mem;
        !          3081:       pTos->flags = MEM_Str | MEM_Dyn;
        !          3082:       pTos->z = z;
        !          3083:     }
        !          3084:     if( pC->keyAsData || pOp->opcode==OP_RowKey ){
        !          3085:       sqliteBtreeKey(pCrsr, 0, n, pTos->z);
        !          3086:     }else{
        !          3087:       sqliteBtreeData(pCrsr, 0, n, pTos->z);
        !          3088:     }
        !          3089:   }else if( pC->pseudoTable ){
        !          3090:     pTos->n = pC->nData;
        !          3091:     pTos->z = pC->pData;
        !          3092:     pTos->flags = MEM_Str|MEM_Ephem;
        !          3093:   }else{
        !          3094:     pTos->flags = MEM_Null;
        !          3095:   }
        !          3096:   break;
        !          3097: }
        !          3098: 
        !          3099: /* Opcode: Column P1 P2 *
        !          3100: **
        !          3101: ** Interpret the data that cursor P1 points to as
        !          3102: ** a structure built using the MakeRecord instruction.
        !          3103: ** (See the MakeRecord opcode for additional information about
        !          3104: ** the format of the data.)
        !          3105: ** Push onto the stack the value of the P2-th column contained
        !          3106: ** in the data.
        !          3107: **
        !          3108: ** If the KeyAsData opcode has previously executed on this cursor,
        !          3109: ** then the field might be extracted from the key rather than the
        !          3110: ** data.
        !          3111: **
        !          3112: ** If P1 is negative, then the record is stored on the stack rather
        !          3113: ** than in a table.  For P1==-1, the top of the stack is used.
        !          3114: ** For P1==-2, the next on the stack is used.  And so forth.  The
        !          3115: ** value pushed is always just a pointer into the record which is
        !          3116: ** stored further down on the stack.  The column value is not copied.
        !          3117: */
        !          3118: case OP_Column: {
        !          3119:   int amt, offset, end, payloadSize;
        !          3120:   int i = pOp->p1;
        !          3121:   int p2 = pOp->p2;
        !          3122:   Cursor *pC;
        !          3123:   char *zRec;
        !          3124:   BtCursor *pCrsr;
        !          3125:   int idxWidth;
        !          3126:   unsigned char aHdr[10];
        !          3127: 
        !          3128:   assert( i<p->nCursor );
        !          3129:   pTos++;
        !          3130:   if( i<0 ){
        !          3131:     assert( &pTos[i]>=p->aStack );
        !          3132:     assert( pTos[i].flags & MEM_Str );
        !          3133:     zRec = pTos[i].z;
        !          3134:     payloadSize = pTos[i].n;
        !          3135:   }else if( (pC = &p->aCsr[i])->pCursor!=0 ){
        !          3136:     sqliteVdbeCursorMoveto(pC);
        !          3137:     zRec = 0;
        !          3138:     pCrsr = pC->pCursor;
        !          3139:     if( pC->nullRow ){
        !          3140:       payloadSize = 0;
        !          3141:     }else if( pC->keyAsData ){
        !          3142:       sqliteBtreeKeySize(pCrsr, &payloadSize);
        !          3143:     }else{
        !          3144:       sqliteBtreeDataSize(pCrsr, &payloadSize);
        !          3145:     }
        !          3146:   }else if( pC->pseudoTable ){
        !          3147:     payloadSize = pC->nData;
        !          3148:     zRec = pC->pData;
        !          3149:     assert( payloadSize==0 || zRec!=0 );
        !          3150:   }else{
        !          3151:     payloadSize = 0;
        !          3152:   }
        !          3153: 
        !          3154:   /* Figure out how many bytes in the column data and where the column
        !          3155:   ** data begins.
        !          3156:   */
        !          3157:   if( payloadSize==0 ){
        !          3158:     pTos->flags = MEM_Null;
        !          3159:     break;
        !          3160:   }else if( payloadSize<256 ){
        !          3161:     idxWidth = 1;
        !          3162:   }else if( payloadSize<65536 ){
        !          3163:     idxWidth = 2;
        !          3164:   }else{
        !          3165:     idxWidth = 3;
        !          3166:   }
        !          3167: 
        !          3168:   /* Figure out where the requested column is stored and how big it is.
        !          3169:   */
        !          3170:   if( payloadSize < idxWidth*(p2+1) ){
        !          3171:     rc = SQLITE_CORRUPT;
        !          3172:     goto abort_due_to_error;
        !          3173:   }
        !          3174:   if( zRec ){
        !          3175:     memcpy(aHdr, &zRec[idxWidth*p2], idxWidth*2);
        !          3176:   }else if( pC->keyAsData ){
        !          3177:     sqliteBtreeKey(pCrsr, idxWidth*p2, idxWidth*2, (char*)aHdr);
        !          3178:   }else{
        !          3179:     sqliteBtreeData(pCrsr, idxWidth*p2, idxWidth*2, (char*)aHdr);
        !          3180:   }
        !          3181:   offset = aHdr[0];
        !          3182:   end = aHdr[idxWidth];
        !          3183:   if( idxWidth>1 ){
        !          3184:     offset |= aHdr[1]<<8;
        !          3185:     end |= aHdr[idxWidth+1]<<8;
        !          3186:     if( idxWidth>2 ){
        !          3187:       offset |= aHdr[2]<<16;
        !          3188:       end |= aHdr[idxWidth+2]<<16;
        !          3189:     }
        !          3190:   }
        !          3191:   amt = end - offset;
        !          3192:   if( amt<0 || offset<0 || end>payloadSize ){
        !          3193:     rc = SQLITE_CORRUPT;
        !          3194:     goto abort_due_to_error;
        !          3195:   }
        !          3196: 
        !          3197:   /* amt and offset now hold the offset to the start of data and the
        !          3198:   ** amount of data.  Go get the data and put it on the stack.
        !          3199:   */
        !          3200:   pTos->n = amt;
        !          3201:   if( amt==0 ){
        !          3202:     pTos->flags = MEM_Null;
        !          3203:   }else if( zRec ){
        !          3204:     pTos->flags = MEM_Str | MEM_Ephem;
        !          3205:     pTos->z = &zRec[offset];
        !          3206:   }else{
        !          3207:     if( amt<=NBFS ){
        !          3208:       pTos->flags = MEM_Str | MEM_Short;
        !          3209:       pTos->z = pTos->zShort;
        !          3210:     }else{
        !          3211:       char *z = sqliteMallocRaw( amt );
        !          3212:       if( z==0 ) goto no_mem;
        !          3213:       pTos->flags = MEM_Str | MEM_Dyn;
        !          3214:       pTos->z = z;
        !          3215:     }
        !          3216:     if( pC->keyAsData ){
        !          3217:       sqliteBtreeKey(pCrsr, offset, amt, pTos->z);
        !          3218:     }else{
        !          3219:       sqliteBtreeData(pCrsr, offset, amt, pTos->z);
        !          3220:     }
        !          3221:   }
        !          3222:   break;
        !          3223: }
        !          3224: 
        !          3225: /* Opcode: Recno P1 * *
        !          3226: **
        !          3227: ** Push onto the stack an integer which is the first 4 bytes of the
        !          3228: ** the key to the current entry in a sequential scan of the database
        !          3229: ** file P1.  The sequential scan should have been started using the 
        !          3230: ** Next opcode.
        !          3231: */
        !          3232: case OP_Recno: {
        !          3233:   int i = pOp->p1;
        !          3234:   Cursor *pC;
        !          3235:   int v;
        !          3236: 
        !          3237:   assert( i>=0 && i<p->nCursor );
        !          3238:   pC = &p->aCsr[i];
        !          3239:   sqliteVdbeCursorMoveto(pC);
        !          3240:   pTos++;
        !          3241:   if( pC->recnoIsValid ){
        !          3242:     v = pC->lastRecno;
        !          3243:   }else if( pC->pseudoTable ){
        !          3244:     v = keyToInt(pC->iKey);
        !          3245:   }else if( pC->nullRow || pC->pCursor==0 ){
        !          3246:     pTos->flags = MEM_Null;
        !          3247:     break;
        !          3248:   }else{
        !          3249:     assert( pC->pCursor!=0 );
        !          3250:     sqliteBtreeKey(pC->pCursor, 0, sizeof(u32), (char*)&v);
        !          3251:     v = keyToInt(v);
        !          3252:   }
        !          3253:   pTos->i = v;
        !          3254:   pTos->flags = MEM_Int;
        !          3255:   break;
        !          3256: }
        !          3257: 
        !          3258: /* Opcode: FullKey P1 * *
        !          3259: **
        !          3260: ** Extract the complete key from the record that cursor P1 is currently
        !          3261: ** pointing to and push the key onto the stack as a string.
        !          3262: **
        !          3263: ** Compare this opcode to Recno.  The Recno opcode extracts the first
        !          3264: ** 4 bytes of the key and pushes those bytes onto the stack as an
        !          3265: ** integer.  This instruction pushes the entire key as a string.
        !          3266: **
        !          3267: ** This opcode may not be used on a pseudo-table.
        !          3268: */
        !          3269: case OP_FullKey: {
        !          3270:   int i = pOp->p1;
        !          3271:   BtCursor *pCrsr;
        !          3272: 
        !          3273:   assert( p->aCsr[i].keyAsData );
        !          3274:   assert( !p->aCsr[i].pseudoTable );
        !          3275:   assert( i>=0 && i<p->nCursor );
        !          3276:   pTos++;
        !          3277:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          3278:     int amt;
        !          3279:     char *z;
        !          3280: 
        !          3281:     sqliteVdbeCursorMoveto(&p->aCsr[i]);
        !          3282:     sqliteBtreeKeySize(pCrsr, &amt);
        !          3283:     if( amt<=0 ){
        !          3284:       rc = SQLITE_CORRUPT;
        !          3285:       goto abort_due_to_error;
        !          3286:     }
        !          3287:     if( amt>NBFS ){
        !          3288:       z = sqliteMallocRaw( amt );
        !          3289:       if( z==0 ) goto no_mem;
        !          3290:       pTos->flags = MEM_Str | MEM_Dyn;
        !          3291:     }else{
        !          3292:       z = pTos->zShort;
        !          3293:       pTos->flags = MEM_Str | MEM_Short;
        !          3294:     }
        !          3295:     sqliteBtreeKey(pCrsr, 0, amt, z);
        !          3296:     pTos->z = z;
        !          3297:     pTos->n = amt;
        !          3298:   }
        !          3299:   break;
        !          3300: }
        !          3301: 
        !          3302: /* Opcode: NullRow P1 * *
        !          3303: **
        !          3304: ** Move the cursor P1 to a null row.  Any OP_Column operations
        !          3305: ** that occur while the cursor is on the null row will always push 
        !          3306: ** a NULL onto the stack.
        !          3307: */
        !          3308: case OP_NullRow: {
        !          3309:   int i = pOp->p1;
        !          3310: 
        !          3311:   assert( i>=0 && i<p->nCursor );
        !          3312:   p->aCsr[i].nullRow = 1;
        !          3313:   p->aCsr[i].recnoIsValid = 0;
        !          3314:   break;
        !          3315: }
        !          3316: 
        !          3317: /* Opcode: Last P1 P2 *
        !          3318: **
        !          3319: ** The next use of the Recno or Column or Next instruction for P1 
        !          3320: ** will refer to the last entry in the database table or index.
        !          3321: ** If the table or index is empty and P2>0, then jump immediately to P2.
        !          3322: ** If P2 is 0 or if the table or index is not empty, fall through
        !          3323: ** to the following instruction.
        !          3324: */
        !          3325: case OP_Last: {
        !          3326:   int i = pOp->p1;
        !          3327:   Cursor *pC;
        !          3328:   BtCursor *pCrsr;
        !          3329: 
        !          3330:   assert( i>=0 && i<p->nCursor );
        !          3331:   pC = &p->aCsr[i];
        !          3332:   if( (pCrsr = pC->pCursor)!=0 ){
        !          3333:     int res;
        !          3334:     rc = sqliteBtreeLast(pCrsr, &res);
        !          3335:     pC->nullRow = res;
        !          3336:     pC->deferredMoveto = 0;
        !          3337:     if( res && pOp->p2>0 ){
        !          3338:       pc = pOp->p2 - 1;
        !          3339:     }
        !          3340:   }else{
        !          3341:     pC->nullRow = 0;
        !          3342:   }
        !          3343:   break;
        !          3344: }
        !          3345: 
        !          3346: /* Opcode: Rewind P1 P2 *
        !          3347: **
        !          3348: ** The next use of the Recno or Column or Next instruction for P1 
        !          3349: ** will refer to the first entry in the database table or index.
        !          3350: ** If the table or index is empty and P2>0, then jump immediately to P2.
        !          3351: ** If P2 is 0 or if the table or index is not empty, fall through
        !          3352: ** to the following instruction.
        !          3353: */
        !          3354: case OP_Rewind: {
        !          3355:   int i = pOp->p1;
        !          3356:   Cursor *pC;
        !          3357:   BtCursor *pCrsr;
        !          3358: 
        !          3359:   assert( i>=0 && i<p->nCursor );
        !          3360:   pC = &p->aCsr[i];
        !          3361:   if( (pCrsr = pC->pCursor)!=0 ){
        !          3362:     int res;
        !          3363:     rc = sqliteBtreeFirst(pCrsr, &res);
        !          3364:     pC->atFirst = res==0;
        !          3365:     pC->nullRow = res;
        !          3366:     pC->deferredMoveto = 0;
        !          3367:     if( res && pOp->p2>0 ){
        !          3368:       pc = pOp->p2 - 1;
        !          3369:     }
        !          3370:   }else{
        !          3371:     pC->nullRow = 0;
        !          3372:   }
        !          3373:   break;
        !          3374: }
        !          3375: 
        !          3376: /* Opcode: Next P1 P2 *
        !          3377: **
        !          3378: ** Advance cursor P1 so that it points to the next key/data pair in its
        !          3379: ** table or index.  If there are no more key/value pairs then fall through
        !          3380: ** to the following instruction.  But if the cursor advance was successful,
        !          3381: ** jump immediately to P2.
        !          3382: **
        !          3383: ** See also: Prev
        !          3384: */
        !          3385: /* Opcode: Prev P1 P2 *
        !          3386: **
        !          3387: ** Back up cursor P1 so that it points to the previous key/data pair in its
        !          3388: ** table or index.  If there is no previous key/value pairs then fall through
        !          3389: ** to the following instruction.  But if the cursor backup was successful,
        !          3390: ** jump immediately to P2.
        !          3391: */
        !          3392: case OP_Prev:
        !          3393: case OP_Next: {
        !          3394:   Cursor *pC;
        !          3395:   BtCursor *pCrsr;
        !          3396: 
        !          3397:   CHECK_FOR_INTERRUPT;
        !          3398:   assert( pOp->p1>=0 && pOp->p1<p->nCursor );
        !          3399:   pC = &p->aCsr[pOp->p1];
        !          3400:   if( (pCrsr = pC->pCursor)!=0 ){
        !          3401:     int res;
        !          3402:     if( pC->nullRow ){
        !          3403:       res = 1;
        !          3404:     }else{
        !          3405:       assert( pC->deferredMoveto==0 );
        !          3406:       rc = pOp->opcode==OP_Next ? sqliteBtreeNext(pCrsr, &res) :
        !          3407:                                   sqliteBtreePrevious(pCrsr, &res);
        !          3408:       pC->nullRow = res;
        !          3409:     }
        !          3410:     if( res==0 ){
        !          3411:       pc = pOp->p2 - 1;
        !          3412:       sqlite_search_count++;
        !          3413:     }
        !          3414:   }else{
        !          3415:     pC->nullRow = 1;
        !          3416:   }
        !          3417:   pC->recnoIsValid = 0;
        !          3418:   break;
        !          3419: }
        !          3420: 
        !          3421: /* Opcode: IdxPut P1 P2 P3
        !          3422: **
        !          3423: ** The top of the stack holds a SQL index key made using the
        !          3424: ** MakeIdxKey instruction.  This opcode writes that key into the
        !          3425: ** index P1.  Data for the entry is nil.
        !          3426: **
        !          3427: ** If P2==1, then the key must be unique.  If the key is not unique,
        !          3428: ** the program aborts with a SQLITE_CONSTRAINT error and the database
        !          3429: ** is rolled back.  If P3 is not null, then it becomes part of the
        !          3430: ** error message returned with the SQLITE_CONSTRAINT.
        !          3431: */
        !          3432: case OP_IdxPut: {
        !          3433:   int i = pOp->p1;
        !          3434:   BtCursor *pCrsr;
        !          3435:   assert( pTos>=p->aStack );
        !          3436:   assert( i>=0 && i<p->nCursor );
        !          3437:   assert( pTos->flags & MEM_Str );
        !          3438:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          3439:     int nKey = pTos->n;
        !          3440:     const char *zKey = pTos->z;
        !          3441:     if( pOp->p2 ){
        !          3442:       int res, n;
        !          3443:       assert( nKey >= 4 );
        !          3444:       rc = sqliteBtreeMoveto(pCrsr, zKey, nKey-4, &res);
        !          3445:       if( rc!=SQLITE_OK ) goto abort_due_to_error;
        !          3446:       while( res!=0 ){
        !          3447:         int c;
        !          3448:         sqliteBtreeKeySize(pCrsr, &n);
        !          3449:         if( n==nKey
        !          3450:            && sqliteBtreeKeyCompare(pCrsr, zKey, nKey-4, 4, &c)==SQLITE_OK
        !          3451:            && c==0
        !          3452:         ){
        !          3453:           rc = SQLITE_CONSTRAINT;
        !          3454:           if( pOp->p3 && pOp->p3[0] ){
        !          3455:             sqliteSetString(&p->zErrMsg, pOp->p3, (char*)0);
        !          3456:           }
        !          3457:           goto abort_due_to_error;
        !          3458:         }
        !          3459:         if( res<0 ){
        !          3460:           sqliteBtreeNext(pCrsr, &res);
        !          3461:           res = +1;
        !          3462:         }else{
        !          3463:           break;
        !          3464:         }
        !          3465:       }
        !          3466:     }
        !          3467:     rc = sqliteBtreeInsert(pCrsr, zKey, nKey, "", 0);
        !          3468:     assert( p->aCsr[i].deferredMoveto==0 );
        !          3469:   }
        !          3470:   Release(pTos);
        !          3471:   pTos--;
        !          3472:   break;
        !          3473: }
        !          3474: 
        !          3475: /* Opcode: IdxDelete P1 * *
        !          3476: **
        !          3477: ** The top of the stack is an index key built using the MakeIdxKey opcode.
        !          3478: ** This opcode removes that entry from the index.
        !          3479: */
        !          3480: case OP_IdxDelete: {
        !          3481:   int i = pOp->p1;
        !          3482:   BtCursor *pCrsr;
        !          3483:   assert( pTos>=p->aStack );
        !          3484:   assert( pTos->flags & MEM_Str );
        !          3485:   assert( i>=0 && i<p->nCursor );
        !          3486:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          3487:     int rx, res;
        !          3488:     rx = sqliteBtreeMoveto(pCrsr, pTos->z, pTos->n, &res);
        !          3489:     if( rx==SQLITE_OK && res==0 ){
        !          3490:       rc = sqliteBtreeDelete(pCrsr);
        !          3491:     }
        !          3492:     assert( p->aCsr[i].deferredMoveto==0 );
        !          3493:   }
        !          3494:   Release(pTos);
        !          3495:   pTos--;
        !          3496:   break;
        !          3497: }
        !          3498: 
        !          3499: /* Opcode: IdxRecno P1 * *
        !          3500: **
        !          3501: ** Push onto the stack an integer which is the last 4 bytes of the
        !          3502: ** the key to the current entry in index P1.  These 4 bytes should
        !          3503: ** be the record number of the table entry to which this index entry
        !          3504: ** points.
        !          3505: **
        !          3506: ** See also: Recno, MakeIdxKey.
        !          3507: */
        !          3508: case OP_IdxRecno: {
        !          3509:   int i = pOp->p1;
        !          3510:   BtCursor *pCrsr;
        !          3511: 
        !          3512:   assert( i>=0 && i<p->nCursor );
        !          3513:   pTos++;
        !          3514:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          3515:     int v;
        !          3516:     int sz;
        !          3517:     assert( p->aCsr[i].deferredMoveto==0 );
        !          3518:     sqliteBtreeKeySize(pCrsr, &sz);
        !          3519:     if( sz<sizeof(u32) ){
        !          3520:       pTos->flags = MEM_Null;
        !          3521:     }else{
        !          3522:       sqliteBtreeKey(pCrsr, sz - sizeof(u32), sizeof(u32), (char*)&v);
        !          3523:       v = keyToInt(v);
        !          3524:       pTos->i = v;
        !          3525:       pTos->flags = MEM_Int;
        !          3526:     }
        !          3527:   }else{
        !          3528:     pTos->flags = MEM_Null;
        !          3529:   }
        !          3530:   break;
        !          3531: }
        !          3532: 
        !          3533: /* Opcode: IdxGT P1 P2 *
        !          3534: **
        !          3535: ** Compare the top of the stack against the key on the index entry that
        !          3536: ** cursor P1 is currently pointing to.  Ignore the last 4 bytes of the
        !          3537: ** index entry.  If the index entry is greater than the top of the stack
        !          3538: ** then jump to P2.  Otherwise fall through to the next instruction.
        !          3539: ** In either case, the stack is popped once.
        !          3540: */
        !          3541: /* Opcode: IdxGE P1 P2 *
        !          3542: **
        !          3543: ** Compare the top of the stack against the key on the index entry that
        !          3544: ** cursor P1 is currently pointing to.  Ignore the last 4 bytes of the
        !          3545: ** index entry.  If the index entry is greater than or equal to 
        !          3546: ** the top of the stack
        !          3547: ** then jump to P2.  Otherwise fall through to the next instruction.
        !          3548: ** In either case, the stack is popped once.
        !          3549: */
        !          3550: /* Opcode: IdxLT P1 P2 *
        !          3551: **
        !          3552: ** Compare the top of the stack against the key on the index entry that
        !          3553: ** cursor P1 is currently pointing to.  Ignore the last 4 bytes of the
        !          3554: ** index entry.  If the index entry is less than the top of the stack
        !          3555: ** then jump to P2.  Otherwise fall through to the next instruction.
        !          3556: ** In either case, the stack is popped once.
        !          3557: */
        !          3558: case OP_IdxLT:
        !          3559: case OP_IdxGT:
        !          3560: case OP_IdxGE: {
        !          3561:   int i= pOp->p1;
        !          3562:   BtCursor *pCrsr;
        !          3563: 
        !          3564:   assert( i>=0 && i<p->nCursor );
        !          3565:   assert( pTos>=p->aStack );
        !          3566:   if( (pCrsr = p->aCsr[i].pCursor)!=0 ){
        !          3567:     int res, rc;
        !          3568:  
        !          3569:     Stringify(pTos);
        !          3570:     assert( p->aCsr[i].deferredMoveto==0 );
        !          3571:     rc = sqliteBtreeKeyCompare(pCrsr, pTos->z, pTos->n, 4, &res);
        !          3572:     if( rc!=SQLITE_OK ){
        !          3573:       break;
        !          3574:     }
        !          3575:     if( pOp->opcode==OP_IdxLT ){
        !          3576:       res = -res;
        !          3577:     }else if( pOp->opcode==OP_IdxGE ){
        !          3578:       res++;
        !          3579:     }
        !          3580:     if( res>0 ){
        !          3581:       pc = pOp->p2 - 1 ;
        !          3582:     }
        !          3583:   }
        !          3584:   Release(pTos);
        !          3585:   pTos--;
        !          3586:   break;
        !          3587: }
        !          3588: 
        !          3589: /* Opcode: IdxIsNull P1 P2 *
        !          3590: **
        !          3591: ** The top of the stack contains an index entry such as might be generated
        !          3592: ** by the MakeIdxKey opcode.  This routine looks at the first P1 fields of
        !          3593: ** that key.  If any of the first P1 fields are NULL, then a jump is made
        !          3594: ** to address P2.  Otherwise we fall straight through.
        !          3595: **
        !          3596: ** The index entry is always popped from the stack.
        !          3597: */
        !          3598: case OP_IdxIsNull: {
        !          3599:   int i = pOp->p1;
        !          3600:   int k, n;
        !          3601:   const char *z;
        !          3602: 
        !          3603:   assert( pTos>=p->aStack );
        !          3604:   assert( pTos->flags & MEM_Str );
        !          3605:   z = pTos->z;
        !          3606:   n = pTos->n;
        !          3607:   for(k=0; k<n && i>0; i--){
        !          3608:     if( z[k]=='a' ){
        !          3609:       pc = pOp->p2-1;
        !          3610:       break;
        !          3611:     }
        !          3612:     while( k<n && z[k] ){ k++; }
        !          3613:     k++;
        !          3614:   }
        !          3615:   Release(pTos);
        !          3616:   pTos--;
        !          3617:   break;
        !          3618: }
        !          3619: 
        !          3620: /* Opcode: Destroy P1 P2 *
        !          3621: **
        !          3622: ** Delete an entire database table or index whose root page in the database
        !          3623: ** file is given by P1.
        !          3624: **
        !          3625: ** The table being destroyed is in the main database file if P2==0.  If
        !          3626: ** P2==1 then the table to be clear is in the auxiliary database file
        !          3627: ** that is used to store tables create using CREATE TEMPORARY TABLE.
        !          3628: **
        !          3629: ** See also: Clear
        !          3630: */
        !          3631: case OP_Destroy: {
        !          3632:   rc = sqliteBtreeDropTable(db->aDb[pOp->p2].pBt, pOp->p1);
        !          3633:   break;
        !          3634: }
        !          3635: 
        !          3636: /* Opcode: Clear P1 P2 *
        !          3637: **
        !          3638: ** Delete all contents of the database table or index whose root page
        !          3639: ** in the database file is given by P1.  But, unlike Destroy, do not
        !          3640: ** remove the table or index from the database file.
        !          3641: **
        !          3642: ** The table being clear is in the main database file if P2==0.  If
        !          3643: ** P2==1 then the table to be clear is in the auxiliary database file
        !          3644: ** that is used to store tables create using CREATE TEMPORARY TABLE.
        !          3645: **
        !          3646: ** See also: Destroy
        !          3647: */
        !          3648: case OP_Clear: {
        !          3649:   rc = sqliteBtreeClearTable(db->aDb[pOp->p2].pBt, pOp->p1);
        !          3650:   break;
        !          3651: }
        !          3652: 
        !          3653: /* Opcode: CreateTable * P2 P3
        !          3654: **
        !          3655: ** Allocate a new table in the main database file if P2==0 or in the
        !          3656: ** auxiliary database file if P2==1.  Push the page number
        !          3657: ** for the root page of the new table onto the stack.
        !          3658: **
        !          3659: ** The root page number is also written to a memory location that P3
        !          3660: ** points to.  This is the mechanism is used to write the root page
        !          3661: ** number into the parser's internal data structures that describe the
        !          3662: ** new table.
        !          3663: **
        !          3664: ** The difference between a table and an index is this:  A table must
        !          3665: ** have a 4-byte integer key and can have arbitrary data.  An index
        !          3666: ** has an arbitrary key but no data.
        !          3667: **
        !          3668: ** See also: CreateIndex
        !          3669: */
        !          3670: /* Opcode: CreateIndex * P2 P3
        !          3671: **
        !          3672: ** Allocate a new index in the main database file if P2==0 or in the
        !          3673: ** auxiliary database file if P2==1.  Push the page number of the
        !          3674: ** root page of the new index onto the stack.
        !          3675: **
        !          3676: ** See documentation on OP_CreateTable for additional information.
        !          3677: */
        !          3678: case OP_CreateIndex:
        !          3679: case OP_CreateTable: {
        !          3680:   int pgno;
        !          3681:   assert( pOp->p3!=0 && pOp->p3type==P3_POINTER );
        !          3682:   assert( pOp->p2>=0 && pOp->p2<db->nDb );
        !          3683:   assert( db->aDb[pOp->p2].pBt!=0 );
        !          3684:   if( pOp->opcode==OP_CreateTable ){
        !          3685:     rc = sqliteBtreeCreateTable(db->aDb[pOp->p2].pBt, &pgno);
        !          3686:   }else{
        !          3687:     rc = sqliteBtreeCreateIndex(db->aDb[pOp->p2].pBt, &pgno);
        !          3688:   }
        !          3689:   pTos++;
        !          3690:   if( rc==SQLITE_OK ){
        !          3691:     pTos->i = pgno;
        !          3692:     pTos->flags = MEM_Int;
        !          3693:     *(u32*)pOp->p3 = pgno;
        !          3694:     pOp->p3 = 0;
        !          3695:   }else{
        !          3696:     pTos->flags = MEM_Null;
        !          3697:   }
        !          3698:   break;
        !          3699: }
        !          3700: 
        !          3701: /* Opcode: IntegrityCk P1 P2 *
        !          3702: **
        !          3703: ** Do an analysis of the currently open database.  Push onto the
        !          3704: ** stack the text of an error message describing any problems.
        !          3705: ** If there are no errors, push a "ok" onto the stack.
        !          3706: **
        !          3707: ** P1 is the index of a set that contains the root page numbers
        !          3708: ** for all tables and indices in the main database file.  The set
        !          3709: ** is cleared by this opcode.  In other words, after this opcode
        !          3710: ** has executed, the set will be empty.
        !          3711: **
        !          3712: ** If P2 is not zero, the check is done on the auxiliary database
        !          3713: ** file, not the main database file.
        !          3714: **
        !          3715: ** This opcode is used for testing purposes only.
        !          3716: */
        !          3717: case OP_IntegrityCk: {
        !          3718:   int nRoot;
        !          3719:   int *aRoot;
        !          3720:   int iSet = pOp->p1;
        !          3721:   Set *pSet;
        !          3722:   int j;
        !          3723:   HashElem *i;
        !          3724:   char *z;
        !          3725: 
        !          3726:   assert( iSet>=0 && iSet<p->nSet );
        !          3727:   pTos++;
        !          3728:   pSet = &p->aSet[iSet];
        !          3729:   nRoot = sqliteHashCount(&pSet->hash);
        !          3730:   aRoot = sqliteMallocRaw( sizeof(int)*(nRoot+1) );
        !          3731:   if( aRoot==0 ) goto no_mem;
        !          3732:   for(j=0, i=sqliteHashFirst(&pSet->hash); i; i=sqliteHashNext(i), j++){
        !          3733:     toInt((char*)sqliteHashKey(i), &aRoot[j]);
        !          3734:   }
        !          3735:   aRoot[j] = 0;
        !          3736:   sqliteHashClear(&pSet->hash);
        !          3737:   pSet->prev = 0;
        !          3738:   z = sqliteBtreeIntegrityCheck(db->aDb[pOp->p2].pBt, aRoot, nRoot);
        !          3739:   if( z==0 || z[0]==0 ){
        !          3740:     if( z ) sqliteFree(z);
        !          3741:     pTos->z = "ok";
        !          3742:     pTos->n = 3;
        !          3743:     pTos->flags = MEM_Str | MEM_Static;
        !          3744:   }else{
        !          3745:     pTos->z = z;
        !          3746:     pTos->n = strlen(z) + 1;
        !          3747:     pTos->flags = MEM_Str | MEM_Dyn;
        !          3748:   }
        !          3749:   sqliteFree(aRoot);
        !          3750:   break;
        !          3751: }
        !          3752: 
        !          3753: /* Opcode: ListWrite * * *
        !          3754: **
        !          3755: ** Write the integer on the top of the stack
        !          3756: ** into the temporary storage list.
        !          3757: */
        !          3758: case OP_ListWrite: {
        !          3759:   Keylist *pKeylist;
        !          3760:   assert( pTos>=p->aStack );
        !          3761:   pKeylist = p->pList;
        !          3762:   if( pKeylist==0 || pKeylist->nUsed>=pKeylist->nKey ){
        !          3763:     pKeylist = sqliteMallocRaw( sizeof(Keylist)+999*sizeof(pKeylist->aKey[0]) );
        !          3764:     if( pKeylist==0 ) goto no_mem;
        !          3765:     pKeylist->nKey = 1000;
        !          3766:     pKeylist->nRead = 0;
        !          3767:     pKeylist->nUsed = 0;
        !          3768:     pKeylist->pNext = p->pList;
        !          3769:     p->pList = pKeylist;
        !          3770:   }
        !          3771:   Integerify(pTos);
        !          3772:   pKeylist->aKey[pKeylist->nUsed++] = pTos->i;
        !          3773:   Release(pTos);
        !          3774:   pTos--;
        !          3775:   break;
        !          3776: }
        !          3777: 
        !          3778: /* Opcode: ListRewind * * *
        !          3779: **
        !          3780: ** Rewind the temporary buffer back to the beginning.
        !          3781: */
        !          3782: case OP_ListRewind: {
        !          3783:   /* What this opcode codes, really, is reverse the order of the
        !          3784:   ** linked list of Keylist structures so that they are read out
        !          3785:   ** in the same order that they were read in. */
        !          3786:   Keylist *pRev, *pTop;
        !          3787:   pRev = 0;
        !          3788:   while( p->pList ){
        !          3789:     pTop = p->pList;
        !          3790:     p->pList = pTop->pNext;
        !          3791:     pTop->pNext = pRev;
        !          3792:     pRev = pTop;
        !          3793:   }
        !          3794:   p->pList = pRev;
        !          3795:   break;
        !          3796: }
        !          3797: 
        !          3798: /* Opcode: ListRead * P2 *
        !          3799: **
        !          3800: ** Attempt to read an integer from the temporary storage buffer
        !          3801: ** and push it onto the stack.  If the storage buffer is empty, 
        !          3802: ** push nothing but instead jump to P2.
        !          3803: */
        !          3804: case OP_ListRead: {
        !          3805:   Keylist *pKeylist;
        !          3806:   CHECK_FOR_INTERRUPT;
        !          3807:   pKeylist = p->pList;
        !          3808:   if( pKeylist!=0 ){
        !          3809:     assert( pKeylist->nRead>=0 );
        !          3810:     assert( pKeylist->nRead<pKeylist->nUsed );
        !          3811:     assert( pKeylist->nRead<pKeylist->nKey );
        !          3812:     pTos++;
        !          3813:     pTos->i = pKeylist->aKey[pKeylist->nRead++];
        !          3814:     pTos->flags = MEM_Int;
        !          3815:     if( pKeylist->nRead>=pKeylist->nUsed ){
        !          3816:       p->pList = pKeylist->pNext;
        !          3817:       sqliteFree(pKeylist);
        !          3818:     }
        !          3819:   }else{
        !          3820:     pc = pOp->p2 - 1;
        !          3821:   }
        !          3822:   break;
        !          3823: }
        !          3824: 
        !          3825: /* Opcode: ListReset * * *
        !          3826: **
        !          3827: ** Reset the temporary storage buffer so that it holds nothing.
        !          3828: */
        !          3829: case OP_ListReset: {
        !          3830:   if( p->pList ){
        !          3831:     sqliteVdbeKeylistFree(p->pList);
        !          3832:     p->pList = 0;
        !          3833:   }
        !          3834:   break;
        !          3835: }
        !          3836: 
        !          3837: /* Opcode: ListPush * * * 
        !          3838: **
        !          3839: ** Save the current Vdbe list such that it can be restored by a ListPop
        !          3840: ** opcode. The list is empty after this is executed.
        !          3841: */
        !          3842: case OP_ListPush: {
        !          3843:   p->keylistStackDepth++;
        !          3844:   assert(p->keylistStackDepth > 0);
        !          3845:   p->keylistStack = sqliteRealloc(p->keylistStack, 
        !          3846:           sizeof(Keylist *) * p->keylistStackDepth);
        !          3847:   if( p->keylistStack==0 ) goto no_mem;
        !          3848:   p->keylistStack[p->keylistStackDepth - 1] = p->pList;
        !          3849:   p->pList = 0;
        !          3850:   break;
        !          3851: }
        !          3852: 
        !          3853: /* Opcode: ListPop * * * 
        !          3854: **
        !          3855: ** Restore the Vdbe list to the state it was in when ListPush was last
        !          3856: ** executed.
        !          3857: */
        !          3858: case OP_ListPop: {
        !          3859:   assert(p->keylistStackDepth > 0);
        !          3860:   p->keylistStackDepth--;
        !          3861:   sqliteVdbeKeylistFree(p->pList);
        !          3862:   p->pList = p->keylistStack[p->keylistStackDepth];
        !          3863:   p->keylistStack[p->keylistStackDepth] = 0;
        !          3864:   if( p->keylistStackDepth == 0 ){
        !          3865:     sqliteFree(p->keylistStack);
        !          3866:     p->keylistStack = 0;
        !          3867:   }
        !          3868:   break;
        !          3869: }
        !          3870: 
        !          3871: /* Opcode: ContextPush * * * 
        !          3872: **
        !          3873: ** Save the current Vdbe context such that it can be restored by a ContextPop
        !          3874: ** opcode. The context stores the last insert row id, the last statement change
        !          3875: ** count, and the current statement change count.
        !          3876: */
        !          3877: case OP_ContextPush: {
        !          3878:   p->contextStackDepth++;
        !          3879:   assert(p->contextStackDepth > 0);
        !          3880:   p->contextStack = sqliteRealloc(p->contextStack, 
        !          3881:           sizeof(Context) * p->contextStackDepth);
        !          3882:   if( p->contextStack==0 ) goto no_mem;
        !          3883:   p->contextStack[p->contextStackDepth - 1].lastRowid = p->db->lastRowid;
        !          3884:   p->contextStack[p->contextStackDepth - 1].lsChange = p->db->lsChange;
        !          3885:   p->contextStack[p->contextStackDepth - 1].csChange = p->db->csChange;
        !          3886:   break;
        !          3887: }
        !          3888: 
        !          3889: /* Opcode: ContextPop * * * 
        !          3890: **
        !          3891: ** Restore the Vdbe context to the state it was in when contextPush was last
        !          3892: ** executed. The context stores the last insert row id, the last statement
        !          3893: ** change count, and the current statement change count.
        !          3894: */
        !          3895: case OP_ContextPop: {
        !          3896:   assert(p->contextStackDepth > 0);
        !          3897:   p->contextStackDepth--;
        !          3898:   p->db->lastRowid = p->contextStack[p->contextStackDepth].lastRowid;
        !          3899:   p->db->lsChange = p->contextStack[p->contextStackDepth].lsChange;
        !          3900:   p->db->csChange = p->contextStack[p->contextStackDepth].csChange;
        !          3901:   if( p->contextStackDepth == 0 ){
        !          3902:     sqliteFree(p->contextStack);
        !          3903:     p->contextStack = 0;
        !          3904:   }
        !          3905:   break;
        !          3906: }
        !          3907: 
        !          3908: /* Opcode: SortPut * * *
        !          3909: **
        !          3910: ** The TOS is the key and the NOS is the data.  Pop both from the stack
        !          3911: ** and put them on the sorter.  The key and data should have been
        !          3912: ** made using SortMakeKey and SortMakeRec, respectively.
        !          3913: */
        !          3914: case OP_SortPut: {
        !          3915:   Mem *pNos = &pTos[-1];
        !          3916:   Sorter *pSorter;
        !          3917:   assert( pNos>=p->aStack );
        !          3918:   if( Dynamicify(pTos) || Dynamicify(pNos) ) goto no_mem;
        !          3919:   pSorter = sqliteMallocRaw( sizeof(Sorter) );
        !          3920:   if( pSorter==0 ) goto no_mem;
        !          3921:   pSorter->pNext = p->pSort;
        !          3922:   p->pSort = pSorter;
        !          3923:   assert( pTos->flags & MEM_Dyn );
        !          3924:   pSorter->nKey = pTos->n;
        !          3925:   pSorter->zKey = pTos->z;
        !          3926:   assert( pNos->flags & MEM_Dyn );
        !          3927:   pSorter->nData = pNos->n;
        !          3928:   pSorter->pData = pNos->z;
        !          3929:   pTos -= 2;
        !          3930:   break;
        !          3931: }
        !          3932: 
        !          3933: /* Opcode: SortMakeRec P1 * *
        !          3934: **
        !          3935: ** The top P1 elements are the arguments to a callback.  Form these
        !          3936: ** elements into a single data entry that can be stored on a sorter
        !          3937: ** using SortPut and later fed to a callback using SortCallback.
        !          3938: */
        !          3939: case OP_SortMakeRec: {
        !          3940:   char *z;
        !          3941:   char **azArg;
        !          3942:   int nByte;
        !          3943:   int nField;
        !          3944:   int i;
        !          3945:   Mem *pRec;
        !          3946: 
        !          3947:   nField = pOp->p1;
        !          3948:   pRec = &pTos[1-nField];
        !          3949:   assert( pRec>=p->aStack );
        !          3950:   nByte = 0;
        !          3951:   for(i=0; i<nField; i++, pRec++){
        !          3952:     if( (pRec->flags & MEM_Null)==0 ){
        !          3953:       Stringify(pRec);
        !          3954:       nByte += pRec->n;
        !          3955:     }
        !          3956:   }
        !          3957:   nByte += sizeof(char*)*(nField+1);
        !          3958:   azArg = sqliteMallocRaw( nByte );
        !          3959:   if( azArg==0 ) goto no_mem;
        !          3960:   z = (char*)&azArg[nField+1];
        !          3961:   for(pRec=&pTos[1-nField], i=0; i<nField; i++, pRec++){
        !          3962:     if( pRec->flags & MEM_Null ){
        !          3963:       azArg[i] = 0;
        !          3964:     }else{
        !          3965:       azArg[i] = z;
        !          3966:       memcpy(z, pRec->z, pRec->n);
        !          3967:       z += pRec->n;
        !          3968:     }
        !          3969:   }
        !          3970:   popStack(&pTos, nField);
        !          3971:   pTos++;
        !          3972:   pTos->n = nByte;
        !          3973:   pTos->z = (char*)azArg;
        !          3974:   pTos->flags = MEM_Str | MEM_Dyn;
        !          3975:   break;
        !          3976: }
        !          3977: 
        !          3978: /* Opcode: SortMakeKey * * P3
        !          3979: **
        !          3980: ** Convert the top few entries of the stack into a sort key.  The
        !          3981: ** number of stack entries consumed is the number of characters in 
        !          3982: ** the string P3.  One character from P3 is prepended to each entry.
        !          3983: ** The first character of P3 is prepended to the element lowest in
        !          3984: ** the stack and the last character of P3 is prepended to the top of
        !          3985: ** the stack.  All stack entries are separated by a \000 character
        !          3986: ** in the result.  The whole key is terminated by two \000 characters
        !          3987: ** in a row.
        !          3988: **
        !          3989: ** "N" is substituted in place of the P3 character for NULL values.
        !          3990: **
        !          3991: ** See also the MakeKey and MakeIdxKey opcodes.
        !          3992: */
        !          3993: case OP_SortMakeKey: {
        !          3994:   char *zNewKey;
        !          3995:   int nByte;
        !          3996:   int nField;
        !          3997:   int i, j, k;
        !          3998:   Mem *pRec;
        !          3999: 
        !          4000:   nField = strlen(pOp->p3);
        !          4001:   pRec = &pTos[1-nField];
        !          4002:   nByte = 1;
        !          4003:   for(i=0; i<nField; i++, pRec++){
        !          4004:     if( pRec->flags & MEM_Null ){
        !          4005:       nByte += 2;
        !          4006:     }else{
        !          4007:       Stringify(pRec);
        !          4008:       nByte += pRec->n+2;
        !          4009:     }
        !          4010:   }
        !          4011:   zNewKey = sqliteMallocRaw( nByte );
        !          4012:   if( zNewKey==0 ) goto no_mem;
        !          4013:   j = 0;
        !          4014:   k = 0;
        !          4015:   for(pRec=&pTos[1-nField], i=0; i<nField; i++, pRec++){
        !          4016:     if( pRec->flags & MEM_Null ){
        !          4017:       zNewKey[j++] = 'N';
        !          4018:       zNewKey[j++] = 0;
        !          4019:       k++;
        !          4020:     }else{
        !          4021:       zNewKey[j++] = pOp->p3[k++];
        !          4022:       memcpy(&zNewKey[j], pRec->z, pRec->n-1);
        !          4023:       j += pRec->n-1;
        !          4024:       zNewKey[j++] = 0;
        !          4025:     }
        !          4026:   }
        !          4027:   zNewKey[j] = 0;
        !          4028:   assert( j<nByte );
        !          4029:   popStack(&pTos, nField);
        !          4030:   pTos++;
        !          4031:   pTos->n = nByte;
        !          4032:   pTos->flags = MEM_Str|MEM_Dyn;
        !          4033:   pTos->z = zNewKey;
        !          4034:   break;
        !          4035: }
        !          4036: 
        !          4037: /* Opcode: Sort * * *
        !          4038: **
        !          4039: ** Sort all elements on the sorter.  The algorithm is a
        !          4040: ** mergesort.
        !          4041: */
        !          4042: case OP_Sort: {
        !          4043:   int i;
        !          4044:   Sorter *pElem;
        !          4045:   Sorter *apSorter[NSORT];
        !          4046:   for(i=0; i<NSORT; i++){
        !          4047:     apSorter[i] = 0;
        !          4048:   }
        !          4049:   while( p->pSort ){
        !          4050:     pElem = p->pSort;
        !          4051:     p->pSort = pElem->pNext;
        !          4052:     pElem->pNext = 0;
        !          4053:     for(i=0; i<NSORT-1; i++){
        !          4054:     if( apSorter[i]==0 ){
        !          4055:         apSorter[i] = pElem;
        !          4056:         break;
        !          4057:       }else{
        !          4058:         pElem = Merge(apSorter[i], pElem);
        !          4059:         apSorter[i] = 0;
        !          4060:       }
        !          4061:     }
        !          4062:     if( i>=NSORT-1 ){
        !          4063:       apSorter[NSORT-1] = Merge(apSorter[NSORT-1],pElem);
        !          4064:     }
        !          4065:   }
        !          4066:   pElem = 0;
        !          4067:   for(i=0; i<NSORT; i++){
        !          4068:     pElem = Merge(apSorter[i], pElem);
        !          4069:   }
        !          4070:   p->pSort = pElem;
        !          4071:   break;
        !          4072: }
        !          4073: 
        !          4074: /* Opcode: SortNext * P2 *
        !          4075: **
        !          4076: ** Push the data for the topmost element in the sorter onto the
        !          4077: ** stack, then remove the element from the sorter.  If the sorter
        !          4078: ** is empty, push nothing on the stack and instead jump immediately 
        !          4079: ** to instruction P2.
        !          4080: */
        !          4081: case OP_SortNext: {
        !          4082:   Sorter *pSorter = p->pSort;
        !          4083:   CHECK_FOR_INTERRUPT;
        !          4084:   if( pSorter!=0 ){
        !          4085:     p->pSort = pSorter->pNext;
        !          4086:     pTos++;
        !          4087:     pTos->z = pSorter->pData;
        !          4088:     pTos->n = pSorter->nData;
        !          4089:     pTos->flags = MEM_Str|MEM_Dyn;
        !          4090:     sqliteFree(pSorter->zKey);
        !          4091:     sqliteFree(pSorter);
        !          4092:   }else{
        !          4093:     pc = pOp->p2 - 1;
        !          4094:   }
        !          4095:   break;
        !          4096: }
        !          4097: 
        !          4098: /* Opcode: SortCallback P1 * *
        !          4099: **
        !          4100: ** The top of the stack contains a callback record built using
        !          4101: ** the SortMakeRec operation with the same P1 value as this
        !          4102: ** instruction.  Pop this record from the stack and invoke the
        !          4103: ** callback on it.
        !          4104: */
        !          4105: case OP_SortCallback: {
        !          4106:   assert( pTos>=p->aStack );
        !          4107:   assert( pTos->flags & MEM_Str );
        !          4108:   p->nCallback++;
        !          4109:   p->pc = pc+1;
        !          4110:   p->azResColumn = (char**)pTos->z;
        !          4111:   assert( p->nResColumn==pOp->p1 );
        !          4112:   p->popStack = 1;
        !          4113:   p->pTos = pTos;
        !          4114:   return SQLITE_ROW;
        !          4115: }
        !          4116: 
        !          4117: /* Opcode: SortReset * * *
        !          4118: **
        !          4119: ** Remove any elements that remain on the sorter.
        !          4120: */
        !          4121: case OP_SortReset: {
        !          4122:   sqliteVdbeSorterReset(p);
        !          4123:   break;
        !          4124: }
        !          4125: 
        !          4126: /* Opcode: FileOpen * * P3
        !          4127: **
        !          4128: ** Open the file named by P3 for reading using the FileRead opcode.
        !          4129: ** If P3 is "stdin" then open standard input for reading.
        !          4130: */
        !          4131: case OP_FileOpen: {
        !          4132:   assert( pOp->p3!=0 );
        !          4133:   if( p->pFile ){
        !          4134:     if( p->pFile!=stdin ) fclose(p->pFile);
        !          4135:     p->pFile = 0;
        !          4136:   }
        !          4137:   if( sqliteStrICmp(pOp->p3,"stdin")==0 ){
        !          4138:     p->pFile = stdin;
        !          4139:   }else{
        !          4140:     p->pFile = fopen(pOp->p3, "r");
        !          4141:   }
        !          4142:   if( p->pFile==0 ){
        !          4143:     sqliteSetString(&p->zErrMsg,"unable to open file: ", pOp->p3, (char*)0);
        !          4144:     rc = SQLITE_ERROR;
        !          4145:   }
        !          4146:   break;
        !          4147: }
        !          4148: 
        !          4149: /* Opcode: FileRead P1 P2 P3
        !          4150: **
        !          4151: ** Read a single line of input from the open file (the file opened using
        !          4152: ** FileOpen).  If we reach end-of-file, jump immediately to P2.  If
        !          4153: ** we are able to get another line, split the line apart using P3 as
        !          4154: ** a delimiter.  There should be P1 fields.  If the input line contains
        !          4155: ** more than P1 fields, ignore the excess.  If the input line contains
        !          4156: ** fewer than P1 fields, assume the remaining fields contain NULLs.
        !          4157: **
        !          4158: ** Input ends if a line consists of just "\.".  A field containing only
        !          4159: ** "\N" is a null field.  The backslash \ character can be used be used
        !          4160: ** to escape newlines or the delimiter.
        !          4161: */
        !          4162: case OP_FileRead: {
        !          4163:   int n, eol, nField, i, c, nDelim;
        !          4164:   char *zDelim, *z;
        !          4165:   CHECK_FOR_INTERRUPT;
        !          4166:   if( p->pFile==0 ) goto fileread_jump;
        !          4167:   nField = pOp->p1;
        !          4168:   if( nField<=0 ) goto fileread_jump;
        !          4169:   if( nField!=p->nField || p->azField==0 ){
        !          4170:     char **azField = sqliteRealloc(p->azField, sizeof(char*)*nField+1);
        !          4171:     if( azField==0 ){ goto no_mem; }
        !          4172:     p->azField = azField;
        !          4173:     p->nField = nField;
        !          4174:   }
        !          4175:   n = 0;
        !          4176:   eol = 0;
        !          4177:   while( eol==0 ){
        !          4178:     if( p->zLine==0 || n+200>p->nLineAlloc ){
        !          4179:       char *zLine;
        !          4180:       p->nLineAlloc = p->nLineAlloc*2 + 300;
        !          4181:       zLine = sqliteRealloc(p->zLine, p->nLineAlloc);
        !          4182:       if( zLine==0 ){
        !          4183:         p->nLineAlloc = 0;
        !          4184:         sqliteFree(p->zLine);
        !          4185:         p->zLine = 0;
        !          4186:         goto no_mem;
        !          4187:       }
        !          4188:       p->zLine = zLine;
        !          4189:     }
        !          4190:     if( vdbe_fgets(&p->zLine[n], p->nLineAlloc-n, p->pFile)==0 ){
        !          4191:       eol = 1;
        !          4192:       p->zLine[n] = 0;
        !          4193:     }else{
        !          4194:       int c;
        !          4195:       while( (c = p->zLine[n])!=0 ){
        !          4196:         if( c=='\\' ){
        !          4197:           if( p->zLine[n+1]==0 ) break;
        !          4198:           n += 2;
        !          4199:         }else if( c=='\n' ){
        !          4200:           p->zLine[n] = 0;
        !          4201:           eol = 1;
        !          4202:           break;
        !          4203:         }else{
        !          4204:           n++;
        !          4205:         }
        !          4206:       }
        !          4207:     }
        !          4208:   }
        !          4209:   if( n==0 ) goto fileread_jump;
        !          4210:   z = p->zLine;
        !          4211:   if( z[0]=='\\' && z[1]=='.' && z[2]==0 ){
        !          4212:     goto fileread_jump;
        !          4213:   }
        !          4214:   zDelim = pOp->p3;
        !          4215:   if( zDelim==0 ) zDelim = "\t";
        !          4216:   c = zDelim[0];
        !          4217:   nDelim = strlen(zDelim);
        !          4218:   p->azField[0] = z;
        !          4219:   for(i=1; *z!=0 && i<=nField; i++){
        !          4220:     int from, to;
        !          4221:     from = to = 0;
        !          4222:     if( z[0]=='\\' && z[1]=='N' 
        !          4223:        && (z[2]==0 || strncmp(&z[2],zDelim,nDelim)==0) ){
        !          4224:       if( i<=nField ) p->azField[i-1] = 0;
        !          4225:       z += 2 + nDelim;
        !          4226:       if( i<nField ) p->azField[i] = z;
        !          4227:       continue;
        !          4228:     }
        !          4229:     while( z[from] ){
        !          4230:       if( z[from]=='\\' && z[from+1]!=0 ){
        !          4231:         int tx = z[from+1];
        !          4232:         switch( tx ){
        !          4233:           case 'b':  tx = '\b'; break;
        !          4234:           case 'f':  tx = '\f'; break;
        !          4235:           case 'n':  tx = '\n'; break;
        !          4236:           case 'r':  tx = '\r'; break;
        !          4237:           case 't':  tx = '\t'; break;
        !          4238:           case 'v':  tx = '\v'; break;
        !          4239:           default:   break;
        !          4240:         }
        !          4241:         z[to++] = tx;
        !          4242:         from += 2;
        !          4243:         continue;
        !          4244:       }
        !          4245:       if( z[from]==c && strncmp(&z[from],zDelim,nDelim)==0 ) break;
        !          4246:       z[to++] = z[from++];
        !          4247:     }
        !          4248:     if( z[from] ){
        !          4249:       z[to] = 0;
        !          4250:       z += from + nDelim;
        !          4251:       if( i<nField ) p->azField[i] = z;
        !          4252:     }else{
        !          4253:       z[to] = 0;
        !          4254:       z = "";
        !          4255:     }
        !          4256:   }
        !          4257:   while( i<nField ){
        !          4258:     p->azField[i++] = 0;
        !          4259:   }
        !          4260:   break;
        !          4261: 
        !          4262:   /* If we reach end-of-file, or if anything goes wrong, jump here.
        !          4263:   ** This code will cause a jump to P2 */
        !          4264: fileread_jump:
        !          4265:   pc = pOp->p2 - 1;
        !          4266:   break;
        !          4267: }
        !          4268: 
        !          4269: /* Opcode: FileColumn P1 * *
        !          4270: **
        !          4271: ** Push onto the stack the P1-th column of the most recently read line
        !          4272: ** from the input file.
        !          4273: */
        !          4274: case OP_FileColumn: {
        !          4275:   int i = pOp->p1;
        !          4276:   char *z;
        !          4277:   assert( i>=0 && i<p->nField );
        !          4278:   if( p->azField ){
        !          4279:     z = p->azField[i];
        !          4280:   }else{
        !          4281:     z = 0;
        !          4282:   }
        !          4283:   pTos++;
        !          4284:   if( z ){
        !          4285:     pTos->n = strlen(z) + 1;
        !          4286:     pTos->z = z;
        !          4287:     pTos->flags = MEM_Str | MEM_Ephem;
        !          4288:   }else{
        !          4289:     pTos->flags = MEM_Null;
        !          4290:   }
        !          4291:   break;
        !          4292: }
        !          4293: 
        !          4294: /* Opcode: MemStore P1 P2 *
        !          4295: **
        !          4296: ** Write the top of the stack into memory location P1.
        !          4297: ** P1 should be a small integer since space is allocated
        !          4298: ** for all memory locations between 0 and P1 inclusive.
        !          4299: **
        !          4300: ** After the data is stored in the memory location, the
        !          4301: ** stack is popped once if P2 is 1.  If P2 is zero, then
        !          4302: ** the original data remains on the stack.
        !          4303: */
        !          4304: case OP_MemStore: {
        !          4305:   int i = pOp->p1;
        !          4306:   Mem *pMem;
        !          4307:   assert( pTos>=p->aStack );
        !          4308:   if( i>=p->nMem ){
        !          4309:     int nOld = p->nMem;
        !          4310:     Mem *aMem;
        !          4311:     p->nMem = i + 5;
        !          4312:     aMem = sqliteRealloc(p->aMem, p->nMem*sizeof(p->aMem[0]));
        !          4313:     if( aMem==0 ) goto no_mem;
        !          4314:     if( aMem!=p->aMem ){
        !          4315:       int j;
        !          4316:       for(j=0; j<nOld; j++){
        !          4317:         if( aMem[j].flags & MEM_Short ){
        !          4318:           aMem[j].z = aMem[j].zShort;
        !          4319:         }
        !          4320:       }
        !          4321:     }
        !          4322:     p->aMem = aMem;
        !          4323:     if( nOld<p->nMem ){
        !          4324:       memset(&p->aMem[nOld], 0, sizeof(p->aMem[0])*(p->nMem-nOld));
        !          4325:     }
        !          4326:   }
        !          4327:   Deephemeralize(pTos);
        !          4328:   pMem = &p->aMem[i];
        !          4329:   Release(pMem);
        !          4330:   *pMem = *pTos;
        !          4331:   if( pMem->flags & MEM_Dyn ){
        !          4332:     if( pOp->p2 ){
        !          4333:       pTos->flags = MEM_Null;
        !          4334:     }else{
        !          4335:       pMem->z = sqliteMallocRaw( pMem->n );
        !          4336:       if( pMem->z==0 ) goto no_mem;
        !          4337:       memcpy(pMem->z, pTos->z, pMem->n);
        !          4338:     }
        !          4339:   }else if( pMem->flags & MEM_Short ){
        !          4340:     pMem->z = pMem->zShort;
        !          4341:   }
        !          4342:   if( pOp->p2 ){
        !          4343:     Release(pTos);
        !          4344:     pTos--;
        !          4345:   }
        !          4346:   break;
        !          4347: }
        !          4348: 
        !          4349: /* Opcode: MemLoad P1 * *
        !          4350: **
        !          4351: ** Push a copy of the value in memory location P1 onto the stack.
        !          4352: **
        !          4353: ** If the value is a string, then the value pushed is a pointer to
        !          4354: ** the string that is stored in the memory location.  If the memory
        !          4355: ** location is subsequently changed (using OP_MemStore) then the
        !          4356: ** value pushed onto the stack will change too.
        !          4357: */
        !          4358: case OP_MemLoad: {
        !          4359:   int i = pOp->p1;
        !          4360:   assert( i>=0 && i<p->nMem );
        !          4361:   pTos++;
        !          4362:   memcpy(pTos, &p->aMem[i], sizeof(pTos[0])-NBFS);;
        !          4363:   if( pTos->flags & MEM_Str ){
        !          4364:     pTos->flags |= MEM_Ephem;
        !          4365:     pTos->flags &= ~(MEM_Dyn|MEM_Static|MEM_Short);
        !          4366:   }
        !          4367:   break;
        !          4368: }
        !          4369: 
        !          4370: /* Opcode: MemIncr P1 P2 *
        !          4371: **
        !          4372: ** Increment the integer valued memory cell P1 by 1.  If P2 is not zero
        !          4373: ** and the result after the increment is greater than zero, then jump
        !          4374: ** to P2.
        !          4375: **
        !          4376: ** This instruction throws an error if the memory cell is not initially
        !          4377: ** an integer.
        !          4378: */
        !          4379: case OP_MemIncr: {
        !          4380:   int i = pOp->p1;
        !          4381:   Mem *pMem;
        !          4382:   assert( i>=0 && i<p->nMem );
        !          4383:   pMem = &p->aMem[i];
        !          4384:   assert( pMem->flags==MEM_Int );
        !          4385:   pMem->i++;
        !          4386:   if( pOp->p2>0 && pMem->i>0 ){
        !          4387:      pc = pOp->p2 - 1;
        !          4388:   }
        !          4389:   break;
        !          4390: }
        !          4391: 
        !          4392: /* Opcode: AggReset * P2 *
        !          4393: **
        !          4394: ** Reset the aggregator so that it no longer contains any data.
        !          4395: ** Future aggregator elements will contain P2 values each.
        !          4396: */
        !          4397: case OP_AggReset: {
        !          4398:   sqliteVdbeAggReset(&p->agg);
        !          4399:   p->agg.nMem = pOp->p2;
        !          4400:   p->agg.apFunc = sqliteMalloc( p->agg.nMem*sizeof(p->agg.apFunc[0]) );
        !          4401:   if( p->agg.apFunc==0 ) goto no_mem;
        !          4402:   break;
        !          4403: }
        !          4404: 
        !          4405: /* Opcode: AggInit * P2 P3
        !          4406: **
        !          4407: ** Initialize the function parameters for an aggregate function.
        !          4408: ** The aggregate will operate out of aggregate column P2.
        !          4409: ** P3 is a pointer to the FuncDef structure for the function.
        !          4410: */
        !          4411: case OP_AggInit: {
        !          4412:   int i = pOp->p2;
        !          4413:   assert( i>=0 && i<p->agg.nMem );
        !          4414:   p->agg.apFunc[i] = (FuncDef*)pOp->p3;
        !          4415:   break;
        !          4416: }
        !          4417: 
        !          4418: /* Opcode: AggFunc * P2 P3
        !          4419: **
        !          4420: ** Execute the step function for an aggregate.  The
        !          4421: ** function has P2 arguments.  P3 is a pointer to the FuncDef
        !          4422: ** structure that specifies the function.
        !          4423: **
        !          4424: ** The top of the stack must be an integer which is the index of
        !          4425: ** the aggregate column that corresponds to this aggregate function.
        !          4426: ** Ideally, this index would be another parameter, but there are
        !          4427: ** no free parameters left.  The integer is popped from the stack.
        !          4428: */
        !          4429: case OP_AggFunc: {
        !          4430:   int n = pOp->p2;
        !          4431:   int i;
        !          4432:   Mem *pMem, *pRec;
        !          4433:   char **azArgv = p->zArgv;
        !          4434:   sqlite_func ctx;
        !          4435: 
        !          4436:   assert( n>=0 );
        !          4437:   assert( pTos->flags==MEM_Int );
        !          4438:   pRec = &pTos[-n];
        !          4439:   assert( pRec>=p->aStack );
        !          4440:   for(i=0; i<n; i++, pRec++){
        !          4441:     if( pRec->flags & MEM_Null ){
        !          4442:       azArgv[i] = 0;
        !          4443:     }else{
        !          4444:       Stringify(pRec);
        !          4445:       azArgv[i] = pRec->z;
        !          4446:     }
        !          4447:   }
        !          4448:   i = pTos->i;
        !          4449:   assert( i>=0 && i<p->agg.nMem );
        !          4450:   ctx.pFunc = (FuncDef*)pOp->p3;
        !          4451:   pMem = &p->agg.pCurrent->aMem[i];
        !          4452:   ctx.s.z = pMem->zShort;  /* Space used for small aggregate contexts */
        !          4453:   ctx.pAgg = pMem->z;
        !          4454:   ctx.cnt = ++pMem->i;
        !          4455:   ctx.isError = 0;
        !          4456:   ctx.isStep = 1;
        !          4457:   (ctx.pFunc->xStep)(&ctx, n, (const char**)azArgv);
        !          4458:   pMem->z = ctx.pAgg;
        !          4459:   pMem->flags = MEM_AggCtx;
        !          4460:   popStack(&pTos, n+1);
        !          4461:   if( ctx.isError ){
        !          4462:     rc = SQLITE_ERROR;
        !          4463:   }
        !          4464:   break;
        !          4465: }
        !          4466: 
        !          4467: /* Opcode: AggFocus * P2 *
        !          4468: **
        !          4469: ** Pop the top of the stack and use that as an aggregator key.  If
        !          4470: ** an aggregator with that same key already exists, then make the
        !          4471: ** aggregator the current aggregator and jump to P2.  If no aggregator
        !          4472: ** with the given key exists, create one and make it current but
        !          4473: ** do not jump.
        !          4474: **
        !          4475: ** The order of aggregator opcodes is important.  The order is:
        !          4476: ** AggReset AggFocus AggNext.  In other words, you must execute
        !          4477: ** AggReset first, then zero or more AggFocus operations, then
        !          4478: ** zero or more AggNext operations.  You must not execute an AggFocus
        !          4479: ** in between an AggNext and an AggReset.
        !          4480: */
        !          4481: case OP_AggFocus: {
        !          4482:   AggElem *pElem;
        !          4483:   char *zKey;
        !          4484:   int nKey;
        !          4485: 
        !          4486:   assert( pTos>=p->aStack );
        !          4487:   Stringify(pTos);
        !          4488:   zKey = pTos->z;
        !          4489:   nKey = pTos->n;
        !          4490:   pElem = sqliteHashFind(&p->agg.hash, zKey, nKey);
        !          4491:   if( pElem ){
        !          4492:     p->agg.pCurrent = pElem;
        !          4493:     pc = pOp->p2 - 1;
        !          4494:   }else{
        !          4495:     AggInsert(&p->agg, zKey, nKey);
        !          4496:     if( sqlite_malloc_failed ) goto no_mem;
        !          4497:   }
        !          4498:   Release(pTos);
        !          4499:   pTos--;
        !          4500:   break; 
        !          4501: }
        !          4502: 
        !          4503: /* Opcode: AggSet * P2 *
        !          4504: **
        !          4505: ** Move the top of the stack into the P2-th field of the current
        !          4506: ** aggregate.  String values are duplicated into new memory.
        !          4507: */
        !          4508: case OP_AggSet: {
        !          4509:   AggElem *pFocus = AggInFocus(p->agg);
        !          4510:   Mem *pMem;
        !          4511:   int i = pOp->p2;
        !          4512:   assert( pTos>=p->aStack );
        !          4513:   if( pFocus==0 ) goto no_mem;
        !          4514:   assert( i>=0 && i<p->agg.nMem );
        !          4515:   Deephemeralize(pTos);
        !          4516:   pMem = &pFocus->aMem[i];
        !          4517:   Release(pMem);
        !          4518:   *pMem = *pTos;
        !          4519:   if( pMem->flags & MEM_Dyn ){
        !          4520:     pTos->flags = MEM_Null;
        !          4521:   }else if( pMem->flags & MEM_Short ){
        !          4522:     pMem->z = pMem->zShort;
        !          4523:   }
        !          4524:   Release(pTos);
        !          4525:   pTos--;
        !          4526:   break;
        !          4527: }
        !          4528: 
        !          4529: /* Opcode: AggGet * P2 *
        !          4530: **
        !          4531: ** Push a new entry onto the stack which is a copy of the P2-th field
        !          4532: ** of the current aggregate.  Strings are not duplicated so
        !          4533: ** string values will be ephemeral.
        !          4534: */
        !          4535: case OP_AggGet: {
        !          4536:   AggElem *pFocus = AggInFocus(p->agg);
        !          4537:   Mem *pMem;
        !          4538:   int i = pOp->p2;
        !          4539:   if( pFocus==0 ) goto no_mem;
        !          4540:   assert( i>=0 && i<p->agg.nMem );
        !          4541:   pTos++;
        !          4542:   pMem = &pFocus->aMem[i];
        !          4543:   *pTos = *pMem;
        !          4544:   if( pTos->flags & MEM_Str ){
        !          4545:     pTos->flags &= ~(MEM_Dyn|MEM_Static|MEM_Short);
        !          4546:     pTos->flags |= MEM_Ephem;
        !          4547:   }
        !          4548:   if( pTos->flags & MEM_AggCtx ){
        !          4549:     Release(pTos);
        !          4550:     pTos->flags = MEM_Null;
        !          4551:   }
        !          4552:   break;
        !          4553: }
        !          4554: 
        !          4555: /* Opcode: AggNext * P2 *
        !          4556: **
        !          4557: ** Make the next aggregate value the current aggregate.  The prior
        !          4558: ** aggregate is deleted.  If all aggregate values have been consumed,
        !          4559: ** jump to P2.
        !          4560: **
        !          4561: ** The order of aggregator opcodes is important.  The order is:
        !          4562: ** AggReset AggFocus AggNext.  In other words, you must execute
        !          4563: ** AggReset first, then zero or more AggFocus operations, then
        !          4564: ** zero or more AggNext operations.  You must not execute an AggFocus
        !          4565: ** in between an AggNext and an AggReset.
        !          4566: */
        !          4567: case OP_AggNext: {
        !          4568:   CHECK_FOR_INTERRUPT;
        !          4569:   if( p->agg.pSearch==0 ){
        !          4570:     p->agg.pSearch = sqliteHashFirst(&p->agg.hash);
        !          4571:   }else{
        !          4572:     p->agg.pSearch = sqliteHashNext(p->agg.pSearch);
        !          4573:   }
        !          4574:   if( p->agg.pSearch==0 ){
        !          4575:     pc = pOp->p2 - 1;
        !          4576:   } else {
        !          4577:     int i;
        !          4578:     sqlite_func ctx;
        !          4579:     Mem *aMem;
        !          4580:     p->agg.pCurrent = sqliteHashData(p->agg.pSearch);
        !          4581:     aMem = p->agg.pCurrent->aMem;
        !          4582:     for(i=0; i<p->agg.nMem; i++){
        !          4583:       int freeCtx;
        !          4584:       if( p->agg.apFunc[i]==0 ) continue;
        !          4585:       if( p->agg.apFunc[i]->xFinalize==0 ) continue;
        !          4586:       ctx.s.flags = MEM_Null;
        !          4587:       ctx.s.z = aMem[i].zShort;
        !          4588:       ctx.pAgg = (void*)aMem[i].z;
        !          4589:       freeCtx = aMem[i].z && aMem[i].z!=aMem[i].zShort;
        !          4590:       ctx.cnt = aMem[i].i;
        !          4591:       ctx.isStep = 0;
        !          4592:       ctx.pFunc = p->agg.apFunc[i];
        !          4593:       (*p->agg.apFunc[i]->xFinalize)(&ctx);
        !          4594:       if( freeCtx ){
        !          4595:         sqliteFree( aMem[i].z );
        !          4596:       }
        !          4597:       aMem[i] = ctx.s;
        !          4598:       if( aMem[i].flags & MEM_Short ){
        !          4599:         aMem[i].z = aMem[i].zShort;
        !          4600:       }
        !          4601:     }
        !          4602:   }
        !          4603:   break;
        !          4604: }
        !          4605: 
        !          4606: /* Opcode: SetInsert P1 * P3
        !          4607: **
        !          4608: ** If Set P1 does not exist then create it.  Then insert value
        !          4609: ** P3 into that set.  If P3 is NULL, then insert the top of the
        !          4610: ** stack into the set.
        !          4611: */
        !          4612: case OP_SetInsert: {
        !          4613:   int i = pOp->p1;
        !          4614:   if( p->nSet<=i ){
        !          4615:     int k;
        !          4616:     Set *aSet = sqliteRealloc(p->aSet, (i+1)*sizeof(p->aSet[0]) );
        !          4617:     if( aSet==0 ) goto no_mem;
        !          4618:     p->aSet = aSet;
        !          4619:     for(k=p->nSet; k<=i; k++){
        !          4620:       sqliteHashInit(&p->aSet[k].hash, SQLITE_HASH_BINARY, 1);
        !          4621:     }
        !          4622:     p->nSet = i+1;
        !          4623:   }
        !          4624:   if( pOp->p3 ){
        !          4625:     sqliteHashInsert(&p->aSet[i].hash, pOp->p3, strlen(pOp->p3)+1, p);
        !          4626:   }else{
        !          4627:     assert( pTos>=p->aStack );
        !          4628:     Stringify(pTos);
        !          4629:     sqliteHashInsert(&p->aSet[i].hash, pTos->z, pTos->n, p);
        !          4630:     Release(pTos);
        !          4631:     pTos--;
        !          4632:   }
        !          4633:   if( sqlite_malloc_failed ) goto no_mem;
        !          4634:   break;
        !          4635: }
        !          4636: 
        !          4637: /* Opcode: SetFound P1 P2 *
        !          4638: **
        !          4639: ** Pop the stack once and compare the value popped off with the
        !          4640: ** contents of set P1.  If the element popped exists in set P1,
        !          4641: ** then jump to P2.  Otherwise fall through.
        !          4642: */
        !          4643: case OP_SetFound: {
        !          4644:   int i = pOp->p1;
        !          4645:   assert( pTos>=p->aStack );
        !          4646:   Stringify(pTos);
        !          4647:   if( i>=0 && i<p->nSet && sqliteHashFind(&p->aSet[i].hash, pTos->z, pTos->n)){
        !          4648:     pc = pOp->p2 - 1;
        !          4649:   }
        !          4650:   Release(pTos);
        !          4651:   pTos--;
        !          4652:   break;
        !          4653: }
        !          4654: 
        !          4655: /* Opcode: SetNotFound P1 P2 *
        !          4656: **
        !          4657: ** Pop the stack once and compare the value popped off with the
        !          4658: ** contents of set P1.  If the element popped does not exists in 
        !          4659: ** set P1, then jump to P2.  Otherwise fall through.
        !          4660: */
        !          4661: case OP_SetNotFound: {
        !          4662:   int i = pOp->p1;
        !          4663:   assert( pTos>=p->aStack );
        !          4664:   Stringify(pTos);
        !          4665:   if( i<0 || i>=p->nSet ||
        !          4666:        sqliteHashFind(&p->aSet[i].hash, pTos->z, pTos->n)==0 ){
        !          4667:     pc = pOp->p2 - 1;
        !          4668:   }
        !          4669:   Release(pTos);
        !          4670:   pTos--;
        !          4671:   break;
        !          4672: }
        !          4673: 
        !          4674: /* Opcode: SetFirst P1 P2 *
        !          4675: **
        !          4676: ** Read the first element from set P1 and push it onto the stack.  If the
        !          4677: ** set is empty, push nothing and jump immediately to P2.  This opcode is
        !          4678: ** used in combination with OP_SetNext to loop over all elements of a set.
        !          4679: */
        !          4680: /* Opcode: SetNext P1 P2 *
        !          4681: **
        !          4682: ** Read the next element from set P1 and push it onto the stack.  If there
        !          4683: ** are no more elements in the set, do not do the push and fall through.
        !          4684: ** Otherwise, jump to P2 after pushing the next set element.
        !          4685: */
        !          4686: case OP_SetFirst: 
        !          4687: case OP_SetNext: {
        !          4688:   Set *pSet;
        !          4689:   CHECK_FOR_INTERRUPT;
        !          4690:   if( pOp->p1<0 || pOp->p1>=p->nSet ){
        !          4691:     if( pOp->opcode==OP_SetFirst ) pc = pOp->p2 - 1;
        !          4692:     break;
        !          4693:   }
        !          4694:   pSet = &p->aSet[pOp->p1];
        !          4695:   if( pOp->opcode==OP_SetFirst ){
        !          4696:     pSet->prev = sqliteHashFirst(&pSet->hash);
        !          4697:     if( pSet->prev==0 ){
        !          4698:       pc = pOp->p2 - 1;
        !          4699:       break;
        !          4700:     }
        !          4701:   }else{
        !          4702:     if( pSet->prev ){
        !          4703:       pSet->prev = sqliteHashNext(pSet->prev);
        !          4704:     }
        !          4705:     if( pSet->prev==0 ){
        !          4706:       break;
        !          4707:     }else{
        !          4708:       pc = pOp->p2 - 1;
        !          4709:     }
        !          4710:   }
        !          4711:   pTos++;
        !          4712:   pTos->z = sqliteHashKey(pSet->prev);
        !          4713:   pTos->n = sqliteHashKeysize(pSet->prev);
        !          4714:   pTos->flags = MEM_Str | MEM_Ephem;
        !          4715:   break;
        !          4716: }
        !          4717: 
        !          4718: /* Opcode: Vacuum * * *
        !          4719: **
        !          4720: ** Vacuum the entire database.  This opcode will cause other virtual
        !          4721: ** machines to be created and run.  It may not be called from within
        !          4722: ** a transaction.
        !          4723: */
        !          4724: case OP_Vacuum: {
        !          4725:   if( sqliteSafetyOff(db) ) goto abort_due_to_misuse; 
        !          4726:   rc = sqliteRunVacuum(&p->zErrMsg, db);
        !          4727:   if( sqliteSafetyOn(db) ) goto abort_due_to_misuse;
        !          4728:   break;
        !          4729: }
        !          4730: 
        !          4731: /* Opcode: StackDepth * * *
        !          4732: **
        !          4733: ** Push an integer onto the stack which is the depth of the stack prior
        !          4734: ** to that integer being pushed.
        !          4735: */
        !          4736: case OP_StackDepth: {
        !          4737:   int depth = (&pTos[1]) - p->aStack;
        !          4738:   pTos++;
        !          4739:   pTos->i = depth;
        !          4740:   pTos->flags = MEM_Int;
        !          4741:   break;
        !          4742: }
        !          4743: 
        !          4744: /* Opcode: StackReset * * *
        !          4745: **
        !          4746: ** Pop a single integer off of the stack.  Then pop the stack
        !          4747: ** as many times as necessary to get the depth of the stack down
        !          4748: ** to the value of the integer that was popped.
        !          4749: */
        !          4750: case OP_StackReset: {
        !          4751:   int depth, goal;
        !          4752:   assert( pTos>=p->aStack );
        !          4753:   Integerify(pTos);
        !          4754:   goal = pTos->i;
        !          4755:   depth = (&pTos[1]) - p->aStack;
        !          4756:   assert( goal<depth );
        !          4757:   popStack(&pTos, depth-goal);
        !          4758:   break;
        !          4759: }
        !          4760: 
        !          4761: /* An other opcode is illegal...
        !          4762: */
        !          4763: default: {
        !          4764:   sqlite_snprintf(sizeof(zBuf),zBuf,"%d",pOp->opcode);
        !          4765:   sqliteSetString(&p->zErrMsg, "unknown opcode ", zBuf, (char*)0);
        !          4766:   rc = SQLITE_INTERNAL;
        !          4767:   break;
        !          4768: }
        !          4769: 
        !          4770: /*****************************************************************************
        !          4771: ** The cases of the switch statement above this line should all be indented
        !          4772: ** by 6 spaces.  But the left-most 6 spaces have been removed to improve the
        !          4773: ** readability.  From this point on down, the normal indentation rules are
        !          4774: ** restored.
        !          4775: *****************************************************************************/
        !          4776:     }
        !          4777: 
        !          4778: #ifdef VDBE_PROFILE
        !          4779:     {
        !          4780:       long long elapse = hwtime() - start;
        !          4781:       pOp->cycles += elapse;
        !          4782:       pOp->cnt++;
        !          4783: #if 0
        !          4784:         fprintf(stdout, "%10lld ", elapse);
        !          4785:         sqliteVdbePrintOp(stdout, origPc, &p->aOp[origPc]);
        !          4786: #endif
        !          4787:     }
        !          4788: #endif
        !          4789: 
        !          4790:     /* The following code adds nothing to the actual functionality
        !          4791:     ** of the program.  It is only here for testing and debugging.
        !          4792:     ** On the other hand, it does burn CPU cycles every time through
        !          4793:     ** the evaluator loop.  So we can leave it out when NDEBUG is defined.
        !          4794:     */
        !          4795: #ifndef NDEBUG
        !          4796:     /* Sanity checking on the top element of the stack */
        !          4797:     if( pTos>=p->aStack ){
        !          4798:       assert( pTos->flags!=0 );  /* Must define some type */
        !          4799:       if( pTos->flags & MEM_Str ){
        !          4800:         int x = pTos->flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short);
        !          4801:         assert( x!=0 );            /* Strings must define a string subtype */
        !          4802:         assert( (x & (x-1))==0 );  /* Only one string subtype can be defined */
        !          4803:         assert( pTos->z!=0 );      /* Strings must have a value */
        !          4804:         /* Mem.z points to Mem.zShort iff the subtype is MEM_Short */
        !          4805:         assert( (pTos->flags & MEM_Short)==0 || pTos->z==pTos->zShort );
        !          4806:         assert( (pTos->flags & MEM_Short)!=0 || pTos->z!=pTos->zShort );
        !          4807:       }else{
        !          4808:         /* Cannot define a string subtype for non-string objects */
        !          4809:         assert( (pTos->flags & (MEM_Static|MEM_Dyn|MEM_Ephem|MEM_Short))==0 );
        !          4810:       }
        !          4811:       /* MEM_Null excludes all other types */
        !          4812:       assert( pTos->flags==MEM_Null || (pTos->flags&MEM_Null)==0 );
        !          4813:     }
        !          4814:     if( pc<-1 || pc>=p->nOp ){
        !          4815:       sqliteSetString(&p->zErrMsg, "jump destination out of range", (char*)0);
        !          4816:       rc = SQLITE_INTERNAL;
        !          4817:     }
        !          4818:     if( p->trace && pTos>=p->aStack ){
        !          4819:       int i;
        !          4820:       fprintf(p->trace, "Stack:");
        !          4821:       for(i=0; i>-5 && &pTos[i]>=p->aStack; i--){
        !          4822:         if( pTos[i].flags & MEM_Null ){
        !          4823:           fprintf(p->trace, " NULL");
        !          4824:         }else if( (pTos[i].flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
        !          4825:           fprintf(p->trace, " si:%d", pTos[i].i);
        !          4826:         }else if( pTos[i].flags & MEM_Int ){
        !          4827:           fprintf(p->trace, " i:%d", pTos[i].i);
        !          4828:         }else if( pTos[i].flags & MEM_Real ){
        !          4829:           fprintf(p->trace, " r:%g", pTos[i].r);
        !          4830:         }else if( pTos[i].flags & MEM_Str ){
        !          4831:           int j, k;
        !          4832:           char zBuf[100];
        !          4833:           zBuf[0] = ' ';
        !          4834:           if( pTos[i].flags & MEM_Dyn ){
        !          4835:             zBuf[1] = 'z';
        !          4836:             assert( (pTos[i].flags & (MEM_Static|MEM_Ephem))==0 );
        !          4837:           }else if( pTos[i].flags & MEM_Static ){
        !          4838:             zBuf[1] = 't';
        !          4839:             assert( (pTos[i].flags & (MEM_Dyn|MEM_Ephem))==0 );
        !          4840:           }else if( pTos[i].flags & MEM_Ephem ){
        !          4841:             zBuf[1] = 'e';
        !          4842:             assert( (pTos[i].flags & (MEM_Static|MEM_Dyn))==0 );
        !          4843:           }else{
        !          4844:             zBuf[1] = 's';
        !          4845:           }
        !          4846:           zBuf[2] = '[';
        !          4847:           k = 3;
        !          4848:           for(j=0; j<20 && j<pTos[i].n; j++){
        !          4849:             int c = pTos[i].z[j];
        !          4850:             if( c==0 && j==pTos[i].n-1 ) break;
        !          4851:             if( isprint(c) && !isspace(c) ){
        !          4852:               zBuf[k++] = c;
        !          4853:             }else{
        !          4854:               zBuf[k++] = '.';
        !          4855:             }
        !          4856:           }
        !          4857:           zBuf[k++] = ']';
        !          4858:           zBuf[k++] = 0;
        !          4859:           fprintf(p->trace, "%s", zBuf);
        !          4860:         }else{
        !          4861:           fprintf(p->trace, " ???");
        !          4862:         }
        !          4863:       }
        !          4864:       if( rc!=0 ) fprintf(p->trace," rc=%d",rc);
        !          4865:       fprintf(p->trace,"\n");
        !          4866:     }
        !          4867: #endif
        !          4868:   }  /* The end of the for(;;) loop the loops through opcodes */
        !          4869: 
        !          4870:   /* If we reach this point, it means that execution is finished.
        !          4871:   */
        !          4872: vdbe_halt:
        !          4873:   CHECK_FOR_INTERRUPT
        !          4874:   if( rc ){
        !          4875:     p->rc = rc;
        !          4876:     rc = SQLITE_ERROR;
        !          4877:   }else{
        !          4878:     rc = SQLITE_DONE;
        !          4879:   }
        !          4880:   p->magic = VDBE_MAGIC_HALT;
        !          4881:   p->pTos = pTos;
        !          4882:   return rc;
        !          4883: 
        !          4884:   /* Jump to here if a malloc() fails.  It's hard to get a malloc()
        !          4885:   ** to fail on a modern VM computer, so this code is untested.
        !          4886:   */
        !          4887: no_mem:
        !          4888:   sqliteSetString(&p->zErrMsg, "out of memory", (char*)0);
        !          4889:   rc = SQLITE_NOMEM;
        !          4890:   goto vdbe_halt;
        !          4891: 
        !          4892:   /* Jump to here for an SQLITE_MISUSE error.
        !          4893:   */
        !          4894: abort_due_to_misuse:
        !          4895:   rc = SQLITE_MISUSE;
        !          4896:   /* Fall thru into abort_due_to_error */
        !          4897: 
        !          4898:   /* Jump to here for any other kind of fatal error.  The "rc" variable
        !          4899:   ** should hold the error number.
        !          4900:   */
        !          4901: abort_due_to_error:
        !          4902:   if( p->zErrMsg==0 ){
        !          4903:     if( sqlite_malloc_failed ) rc = SQLITE_NOMEM;
        !          4904:     sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
        !          4905:   }
        !          4906:   goto vdbe_halt;
        !          4907: 
        !          4908:   /* Jump to here if the sqlite_interrupt() API sets the interrupt
        !          4909:   ** flag.
        !          4910:   */
        !          4911: abort_due_to_interrupt:
        !          4912:   assert( db->flags & SQLITE_Interrupt );
        !          4913:   db->flags &= ~SQLITE_Interrupt;
        !          4914:   if( db->magic!=SQLITE_MAGIC_BUSY ){
        !          4915:     rc = SQLITE_MISUSE;
        !          4916:   }else{
        !          4917:     rc = SQLITE_INTERRUPT;
        !          4918:   }
        !          4919:   sqliteSetString(&p->zErrMsg, sqlite_error_string(rc), (char*)0);
        !          4920:   goto vdbe_halt;
        !          4921: }

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