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