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

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

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