Annotation of embedaddon/sqlite3/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 "sqlite3_stmt*" 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 5 operands. Operands P1, P2, and P3 are integers. Operand P4
! 26: ** is a null-terminated string. Operand P5 is an unsigned character.
! 27: ** Few opcodes use all 5 operands.
! 28: **
! 29: ** Computation results are stored on a set of registers numbered beginning
! 30: ** with 1 and going up to Vdbe.nMem. Each register can store
! 31: ** either an integer, a null-terminated string, a floating point
! 32: ** number, or the SQL "NULL" value. An implicit 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 sqlite3VdbeExec()
! 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: #include "sqliteInt.h"
! 47: #include "vdbeInt.h"
! 48:
! 49: /*
! 50: ** Invoke this macro on memory cells just prior to changing the
! 51: ** value of the cell. This macro verifies that shallow copies are
! 52: ** not misused.
! 53: */
! 54: #ifdef SQLITE_DEBUG
! 55: # define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M)
! 56: #else
! 57: # define memAboutToChange(P,M)
! 58: #endif
! 59:
! 60: /*
! 61: ** The following global variable is incremented every time a cursor
! 62: ** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test
! 63: ** procedures use this information to make sure that indices are
! 64: ** working correctly. This variable has no function other than to
! 65: ** help verify the correct operation of the library.
! 66: */
! 67: #ifdef SQLITE_TEST
! 68: int sqlite3_search_count = 0;
! 69: #endif
! 70:
! 71: /*
! 72: ** When this global variable is positive, it gets decremented once before
! 73: ** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted
! 74: ** field of the sqlite3 structure is set in order to simulate an interrupt.
! 75: **
! 76: ** This facility is used for testing purposes only. It does not function
! 77: ** in an ordinary build.
! 78: */
! 79: #ifdef SQLITE_TEST
! 80: int sqlite3_interrupt_count = 0;
! 81: #endif
! 82:
! 83: /*
! 84: ** The next global variable is incremented each type the OP_Sort opcode
! 85: ** is executed. The test procedures use this information to make sure that
! 86: ** sorting is occurring or not occurring at appropriate times. This variable
! 87: ** has no function other than to help verify the correct operation of the
! 88: ** library.
! 89: */
! 90: #ifdef SQLITE_TEST
! 91: int sqlite3_sort_count = 0;
! 92: #endif
! 93:
! 94: /*
! 95: ** The next global variable records the size of the largest MEM_Blob
! 96: ** or MEM_Str that has been used by a VDBE opcode. The test procedures
! 97: ** use this information to make sure that the zero-blob functionality
! 98: ** is working correctly. This variable has no function other than to
! 99: ** help verify the correct operation of the library.
! 100: */
! 101: #ifdef SQLITE_TEST
! 102: int sqlite3_max_blobsize = 0;
! 103: static void updateMaxBlobsize(Mem *p){
! 104: if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){
! 105: sqlite3_max_blobsize = p->n;
! 106: }
! 107: }
! 108: #endif
! 109:
! 110: /*
! 111: ** The next global variable is incremented each type the OP_Found opcode
! 112: ** is executed. This is used to test whether or not the foreign key
! 113: ** operation implemented using OP_FkIsZero is working. This variable
! 114: ** has no function other than to help verify the correct operation of the
! 115: ** library.
! 116: */
! 117: #ifdef SQLITE_TEST
! 118: int sqlite3_found_count = 0;
! 119: #endif
! 120:
! 121: /*
! 122: ** Test a register to see if it exceeds the current maximum blob size.
! 123: ** If it does, record the new maximum blob size.
! 124: */
! 125: #if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST)
! 126: # define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P)
! 127: #else
! 128: # define UPDATE_MAX_BLOBSIZE(P)
! 129: #endif
! 130:
! 131: /*
! 132: ** Convert the given register into a string if it isn't one
! 133: ** already. Return non-zero if a malloc() fails.
! 134: */
! 135: #define Stringify(P, enc) \
! 136: if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc)) \
! 137: { goto no_mem; }
! 138:
! 139: /*
! 140: ** An ephemeral string value (signified by the MEM_Ephem flag) contains
! 141: ** a pointer to a dynamically allocated string where some other entity
! 142: ** is responsible for deallocating that string. Because the register
! 143: ** does not control the string, it might be deleted without the register
! 144: ** knowing it.
! 145: **
! 146: ** This routine converts an ephemeral string into a dynamically allocated
! 147: ** string that the register itself controls. In other words, it
! 148: ** converts an MEM_Ephem string into an MEM_Dyn string.
! 149: */
! 150: #define Deephemeralize(P) \
! 151: if( ((P)->flags&MEM_Ephem)!=0 \
! 152: && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;}
! 153:
! 154: /* Return true if the cursor was opened using the OP_OpenSorter opcode. */
! 155: #ifdef SQLITE_OMIT_MERGE_SORT
! 156: # define isSorter(x) 0
! 157: #else
! 158: # define isSorter(x) ((x)->pSorter!=0)
! 159: #endif
! 160:
! 161: /*
! 162: ** Argument pMem points at a register that will be passed to a
! 163: ** user-defined function or returned to the user as the result of a query.
! 164: ** This routine sets the pMem->type variable used by the sqlite3_value_*()
! 165: ** routines.
! 166: */
! 167: void sqlite3VdbeMemStoreType(Mem *pMem){
! 168: int flags = pMem->flags;
! 169: if( flags & MEM_Null ){
! 170: pMem->type = SQLITE_NULL;
! 171: }
! 172: else if( flags & MEM_Int ){
! 173: pMem->type = SQLITE_INTEGER;
! 174: }
! 175: else if( flags & MEM_Real ){
! 176: pMem->type = SQLITE_FLOAT;
! 177: }
! 178: else if( flags & MEM_Str ){
! 179: pMem->type = SQLITE_TEXT;
! 180: }else{
! 181: pMem->type = SQLITE_BLOB;
! 182: }
! 183: }
! 184:
! 185: /*
! 186: ** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL
! 187: ** if we run out of memory.
! 188: */
! 189: static VdbeCursor *allocateCursor(
! 190: Vdbe *p, /* The virtual machine */
! 191: int iCur, /* Index of the new VdbeCursor */
! 192: int nField, /* Number of fields in the table or index */
! 193: int iDb, /* Database the cursor belongs to, or -1 */
! 194: int isBtreeCursor /* True for B-Tree. False for pseudo-table or vtab */
! 195: ){
! 196: /* Find the memory cell that will be used to store the blob of memory
! 197: ** required for this VdbeCursor structure. It is convenient to use a
! 198: ** vdbe memory cell to manage the memory allocation required for a
! 199: ** VdbeCursor structure for the following reasons:
! 200: **
! 201: ** * Sometimes cursor numbers are used for a couple of different
! 202: ** purposes in a vdbe program. The different uses might require
! 203: ** different sized allocations. Memory cells provide growable
! 204: ** allocations.
! 205: **
! 206: ** * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can
! 207: ** be freed lazily via the sqlite3_release_memory() API. This
! 208: ** minimizes the number of malloc calls made by the system.
! 209: **
! 210: ** Memory cells for cursors are allocated at the top of the address
! 211: ** space. Memory cell (p->nMem) corresponds to cursor 0. Space for
! 212: ** cursor 1 is managed by memory cell (p->nMem-1), etc.
! 213: */
! 214: Mem *pMem = &p->aMem[p->nMem-iCur];
! 215:
! 216: int nByte;
! 217: VdbeCursor *pCx = 0;
! 218: nByte =
! 219: ROUND8(sizeof(VdbeCursor)) +
! 220: (isBtreeCursor?sqlite3BtreeCursorSize():0) +
! 221: 2*nField*sizeof(u32);
! 222:
! 223: assert( iCur<p->nCursor );
! 224: if( p->apCsr[iCur] ){
! 225: sqlite3VdbeFreeCursor(p, p->apCsr[iCur]);
! 226: p->apCsr[iCur] = 0;
! 227: }
! 228: if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){
! 229: p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z;
! 230: memset(pCx, 0, sizeof(VdbeCursor));
! 231: pCx->iDb = iDb;
! 232: pCx->nField = nField;
! 233: if( nField ){
! 234: pCx->aType = (u32 *)&pMem->z[ROUND8(sizeof(VdbeCursor))];
! 235: }
! 236: if( isBtreeCursor ){
! 237: pCx->pCursor = (BtCursor*)
! 238: &pMem->z[ROUND8(sizeof(VdbeCursor))+2*nField*sizeof(u32)];
! 239: sqlite3BtreeCursorZero(pCx->pCursor);
! 240: }
! 241: }
! 242: return pCx;
! 243: }
! 244:
! 245: /*
! 246: ** Try to convert a value into a numeric representation if we can
! 247: ** do so without loss of information. In other words, if the string
! 248: ** looks like a number, convert it into a number. If it does not
! 249: ** look like a number, leave it alone.
! 250: */
! 251: static void applyNumericAffinity(Mem *pRec){
! 252: if( (pRec->flags & (MEM_Real|MEM_Int))==0 ){
! 253: double rValue;
! 254: i64 iValue;
! 255: u8 enc = pRec->enc;
! 256: if( (pRec->flags&MEM_Str)==0 ) return;
! 257: if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return;
! 258: if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){
! 259: pRec->u.i = iValue;
! 260: pRec->flags |= MEM_Int;
! 261: }else{
! 262: pRec->r = rValue;
! 263: pRec->flags |= MEM_Real;
! 264: }
! 265: }
! 266: }
! 267:
! 268: /*
! 269: ** Processing is determine by the affinity parameter:
! 270: **
! 271: ** SQLITE_AFF_INTEGER:
! 272: ** SQLITE_AFF_REAL:
! 273: ** SQLITE_AFF_NUMERIC:
! 274: ** Try to convert pRec to an integer representation or a
! 275: ** floating-point representation if an integer representation
! 276: ** is not possible. Note that the integer representation is
! 277: ** always preferred, even if the affinity is REAL, because
! 278: ** an integer representation is more space efficient on disk.
! 279: **
! 280: ** SQLITE_AFF_TEXT:
! 281: ** Convert pRec to a text representation.
! 282: **
! 283: ** SQLITE_AFF_NONE:
! 284: ** No-op. pRec is unchanged.
! 285: */
! 286: static void applyAffinity(
! 287: Mem *pRec, /* The value to apply affinity to */
! 288: char affinity, /* The affinity to be applied */
! 289: u8 enc /* Use this text encoding */
! 290: ){
! 291: if( affinity==SQLITE_AFF_TEXT ){
! 292: /* Only attempt the conversion to TEXT if there is an integer or real
! 293: ** representation (blob and NULL do not get converted) but no string
! 294: ** representation.
! 295: */
! 296: if( 0==(pRec->flags&MEM_Str) && (pRec->flags&(MEM_Real|MEM_Int)) ){
! 297: sqlite3VdbeMemStringify(pRec, enc);
! 298: }
! 299: pRec->flags &= ~(MEM_Real|MEM_Int);
! 300: }else if( affinity!=SQLITE_AFF_NONE ){
! 301: assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL
! 302: || affinity==SQLITE_AFF_NUMERIC );
! 303: applyNumericAffinity(pRec);
! 304: if( pRec->flags & MEM_Real ){
! 305: sqlite3VdbeIntegerAffinity(pRec);
! 306: }
! 307: }
! 308: }
! 309:
! 310: /*
! 311: ** Try to convert the type of a function argument or a result column
! 312: ** into a numeric representation. Use either INTEGER or REAL whichever
! 313: ** is appropriate. But only do the conversion if it is possible without
! 314: ** loss of information and return the revised type of the argument.
! 315: */
! 316: int sqlite3_value_numeric_type(sqlite3_value *pVal){
! 317: Mem *pMem = (Mem*)pVal;
! 318: if( pMem->type==SQLITE_TEXT ){
! 319: applyNumericAffinity(pMem);
! 320: sqlite3VdbeMemStoreType(pMem);
! 321: }
! 322: return pMem->type;
! 323: }
! 324:
! 325: /*
! 326: ** Exported version of applyAffinity(). This one works on sqlite3_value*,
! 327: ** not the internal Mem* type.
! 328: */
! 329: void sqlite3ValueApplyAffinity(
! 330: sqlite3_value *pVal,
! 331: u8 affinity,
! 332: u8 enc
! 333: ){
! 334: applyAffinity((Mem *)pVal, affinity, enc);
! 335: }
! 336:
! 337: #ifdef SQLITE_DEBUG
! 338: /*
! 339: ** Write a nice string representation of the contents of cell pMem
! 340: ** into buffer zBuf, length nBuf.
! 341: */
! 342: void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
! 343: char *zCsr = zBuf;
! 344: int f = pMem->flags;
! 345:
! 346: static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"};
! 347:
! 348: if( f&MEM_Blob ){
! 349: int i;
! 350: char c;
! 351: if( f & MEM_Dyn ){
! 352: c = 'z';
! 353: assert( (f & (MEM_Static|MEM_Ephem))==0 );
! 354: }else if( f & MEM_Static ){
! 355: c = 't';
! 356: assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
! 357: }else if( f & MEM_Ephem ){
! 358: c = 'e';
! 359: assert( (f & (MEM_Static|MEM_Dyn))==0 );
! 360: }else{
! 361: c = 's';
! 362: }
! 363:
! 364: sqlite3_snprintf(100, zCsr, "%c", c);
! 365: zCsr += sqlite3Strlen30(zCsr);
! 366: sqlite3_snprintf(100, zCsr, "%d[", pMem->n);
! 367: zCsr += sqlite3Strlen30(zCsr);
! 368: for(i=0; i<16 && i<pMem->n; i++){
! 369: sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF));
! 370: zCsr += sqlite3Strlen30(zCsr);
! 371: }
! 372: for(i=0; i<16 && i<pMem->n; i++){
! 373: char z = pMem->z[i];
! 374: if( z<32 || z>126 ) *zCsr++ = '.';
! 375: else *zCsr++ = z;
! 376: }
! 377:
! 378: sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]);
! 379: zCsr += sqlite3Strlen30(zCsr);
! 380: if( f & MEM_Zero ){
! 381: sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero);
! 382: zCsr += sqlite3Strlen30(zCsr);
! 383: }
! 384: *zCsr = '\0';
! 385: }else if( f & MEM_Str ){
! 386: int j, k;
! 387: zBuf[0] = ' ';
! 388: if( f & MEM_Dyn ){
! 389: zBuf[1] = 'z';
! 390: assert( (f & (MEM_Static|MEM_Ephem))==0 );
! 391: }else if( f & MEM_Static ){
! 392: zBuf[1] = 't';
! 393: assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
! 394: }else if( f & MEM_Ephem ){
! 395: zBuf[1] = 'e';
! 396: assert( (f & (MEM_Static|MEM_Dyn))==0 );
! 397: }else{
! 398: zBuf[1] = 's';
! 399: }
! 400: k = 2;
! 401: sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n);
! 402: k += sqlite3Strlen30(&zBuf[k]);
! 403: zBuf[k++] = '[';
! 404: for(j=0; j<15 && j<pMem->n; j++){
! 405: u8 c = pMem->z[j];
! 406: if( c>=0x20 && c<0x7f ){
! 407: zBuf[k++] = c;
! 408: }else{
! 409: zBuf[k++] = '.';
! 410: }
! 411: }
! 412: zBuf[k++] = ']';
! 413: sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]);
! 414: k += sqlite3Strlen30(&zBuf[k]);
! 415: zBuf[k++] = 0;
! 416: }
! 417: }
! 418: #endif
! 419:
! 420: #ifdef SQLITE_DEBUG
! 421: /*
! 422: ** Print the value of a register for tracing purposes:
! 423: */
! 424: static void memTracePrint(FILE *out, Mem *p){
! 425: if( p->flags & MEM_Null ){
! 426: fprintf(out, " NULL");
! 427: }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
! 428: fprintf(out, " si:%lld", p->u.i);
! 429: }else if( p->flags & MEM_Int ){
! 430: fprintf(out, " i:%lld", p->u.i);
! 431: #ifndef SQLITE_OMIT_FLOATING_POINT
! 432: }else if( p->flags & MEM_Real ){
! 433: fprintf(out, " r:%g", p->r);
! 434: #endif
! 435: }else if( p->flags & MEM_RowSet ){
! 436: fprintf(out, " (rowset)");
! 437: }else{
! 438: char zBuf[200];
! 439: sqlite3VdbeMemPrettyPrint(p, zBuf);
! 440: fprintf(out, " ");
! 441: fprintf(out, "%s", zBuf);
! 442: }
! 443: }
! 444: static void registerTrace(FILE *out, int iReg, Mem *p){
! 445: fprintf(out, "REG[%d] = ", iReg);
! 446: memTracePrint(out, p);
! 447: fprintf(out, "\n");
! 448: }
! 449: #endif
! 450:
! 451: #ifdef SQLITE_DEBUG
! 452: # define REGISTER_TRACE(R,M) if(p->trace)registerTrace(p->trace,R,M)
! 453: #else
! 454: # define REGISTER_TRACE(R,M)
! 455: #endif
! 456:
! 457:
! 458: #ifdef VDBE_PROFILE
! 459:
! 460: /*
! 461: ** hwtime.h contains inline assembler code for implementing
! 462: ** high-performance timing routines.
! 463: */
! 464: #include "hwtime.h"
! 465:
! 466: #endif
! 467:
! 468: /*
! 469: ** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
! 470: ** sqlite3_interrupt() routine has been called. If it has been, then
! 471: ** processing of the VDBE program is interrupted.
! 472: **
! 473: ** This macro added to every instruction that does a jump in order to
! 474: ** implement a loop. This test used to be on every single instruction,
! 475: ** but that meant we more testing than we needed. By only testing the
! 476: ** flag on jump instructions, we get a (small) speed improvement.
! 477: */
! 478: #define CHECK_FOR_INTERRUPT \
! 479: if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
! 480:
! 481:
! 482: #ifndef NDEBUG
! 483: /*
! 484: ** This function is only called from within an assert() expression. It
! 485: ** checks that the sqlite3.nTransaction variable is correctly set to
! 486: ** the number of non-transaction savepoints currently in the
! 487: ** linked list starting at sqlite3.pSavepoint.
! 488: **
! 489: ** Usage:
! 490: **
! 491: ** assert( checkSavepointCount(db) );
! 492: */
! 493: static int checkSavepointCount(sqlite3 *db){
! 494: int n = 0;
! 495: Savepoint *p;
! 496: for(p=db->pSavepoint; p; p=p->pNext) n++;
! 497: assert( n==(db->nSavepoint + db->isTransactionSavepoint) );
! 498: return 1;
! 499: }
! 500: #endif
! 501:
! 502: /*
! 503: ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
! 504: ** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
! 505: ** in memory obtained from sqlite3DbMalloc).
! 506: */
! 507: static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
! 508: sqlite3 *db = p->db;
! 509: sqlite3DbFree(db, p->zErrMsg);
! 510: p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
! 511: sqlite3_free(pVtab->zErrMsg);
! 512: pVtab->zErrMsg = 0;
! 513: }
! 514:
! 515:
! 516: /*
! 517: ** Execute as much of a VDBE program as we can then return.
! 518: **
! 519: ** sqlite3VdbeMakeReady() must be called before this routine in order to
! 520: ** close the program with a final OP_Halt and to set up the callbacks
! 521: ** and the error message pointer.
! 522: **
! 523: ** Whenever a row or result data is available, this routine will either
! 524: ** invoke the result callback (if there is one) or return with
! 525: ** SQLITE_ROW.
! 526: **
! 527: ** If an attempt is made to open a locked database, then this routine
! 528: ** will either invoke the busy callback (if there is one) or it will
! 529: ** return SQLITE_BUSY.
! 530: **
! 531: ** If an error occurs, an error message is written to memory obtained
! 532: ** from sqlite3_malloc() and p->zErrMsg is made to point to that memory.
! 533: ** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
! 534: **
! 535: ** If the callback ever returns non-zero, then the program exits
! 536: ** immediately. There will be no error message but the p->rc field is
! 537: ** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
! 538: **
! 539: ** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
! 540: ** routine to return SQLITE_ERROR.
! 541: **
! 542: ** Other fatal errors return SQLITE_ERROR.
! 543: **
! 544: ** After this routine has finished, sqlite3VdbeFinalize() should be
! 545: ** used to clean up the mess that was left behind.
! 546: */
! 547: int sqlite3VdbeExec(
! 548: Vdbe *p /* The VDBE */
! 549: ){
! 550: int pc=0; /* The program counter */
! 551: Op *aOp = p->aOp; /* Copy of p->aOp */
! 552: Op *pOp; /* Current operation */
! 553: int rc = SQLITE_OK; /* Value to return */
! 554: sqlite3 *db = p->db; /* The database */
! 555: u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */
! 556: u8 encoding = ENC(db); /* The database encoding */
! 557: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
! 558: int checkProgress; /* True if progress callbacks are enabled */
! 559: int nProgressOps = 0; /* Opcodes executed since progress callback. */
! 560: #endif
! 561: Mem *aMem = p->aMem; /* Copy of p->aMem */
! 562: Mem *pIn1 = 0; /* 1st input operand */
! 563: Mem *pIn2 = 0; /* 2nd input operand */
! 564: Mem *pIn3 = 0; /* 3rd input operand */
! 565: Mem *pOut = 0; /* Output operand */
! 566: int iCompare = 0; /* Result of last OP_Compare operation */
! 567: int *aPermute = 0; /* Permutation of columns for OP_Compare */
! 568: i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */
! 569: #ifdef VDBE_PROFILE
! 570: u64 start; /* CPU clock count at start of opcode */
! 571: int origPc; /* Program counter at start of opcode */
! 572: #endif
! 573: /*** INSERT STACK UNION HERE ***/
! 574:
! 575: assert( p->magic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */
! 576: sqlite3VdbeEnter(p);
! 577: if( p->rc==SQLITE_NOMEM ){
! 578: /* This happens if a malloc() inside a call to sqlite3_column_text() or
! 579: ** sqlite3_column_text16() failed. */
! 580: goto no_mem;
! 581: }
! 582: assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
! 583: p->rc = SQLITE_OK;
! 584: assert( p->explain==0 );
! 585: p->pResultSet = 0;
! 586: db->busyHandler.nBusy = 0;
! 587: CHECK_FOR_INTERRUPT;
! 588: sqlite3VdbeIOTraceSql(p);
! 589: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
! 590: checkProgress = db->xProgress!=0;
! 591: #endif
! 592: #ifdef SQLITE_DEBUG
! 593: sqlite3BeginBenignMalloc();
! 594: if( p->pc==0 && (p->db->flags & SQLITE_VdbeListing)!=0 ){
! 595: int i;
! 596: printf("VDBE Program Listing:\n");
! 597: sqlite3VdbePrintSql(p);
! 598: for(i=0; i<p->nOp; i++){
! 599: sqlite3VdbePrintOp(stdout, i, &aOp[i]);
! 600: }
! 601: }
! 602: sqlite3EndBenignMalloc();
! 603: #endif
! 604: for(pc=p->pc; rc==SQLITE_OK; pc++){
! 605: assert( pc>=0 && pc<p->nOp );
! 606: if( db->mallocFailed ) goto no_mem;
! 607: #ifdef VDBE_PROFILE
! 608: origPc = pc;
! 609: start = sqlite3Hwtime();
! 610: #endif
! 611: pOp = &aOp[pc];
! 612:
! 613: /* Only allow tracing if SQLITE_DEBUG is defined.
! 614: */
! 615: #ifdef SQLITE_DEBUG
! 616: if( p->trace ){
! 617: if( pc==0 ){
! 618: printf("VDBE Execution Trace:\n");
! 619: sqlite3VdbePrintSql(p);
! 620: }
! 621: sqlite3VdbePrintOp(p->trace, pc, pOp);
! 622: }
! 623: #endif
! 624:
! 625:
! 626: /* Check to see if we need to simulate an interrupt. This only happens
! 627: ** if we have a special test build.
! 628: */
! 629: #ifdef SQLITE_TEST
! 630: if( sqlite3_interrupt_count>0 ){
! 631: sqlite3_interrupt_count--;
! 632: if( sqlite3_interrupt_count==0 ){
! 633: sqlite3_interrupt(db);
! 634: }
! 635: }
! 636: #endif
! 637:
! 638: #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
! 639: /* Call the progress callback if it is configured and the required number
! 640: ** of VDBE ops have been executed (either since this invocation of
! 641: ** sqlite3VdbeExec() or since last time the progress callback was called).
! 642: ** If the progress callback returns non-zero, exit the virtual machine with
! 643: ** a return code SQLITE_ABORT.
! 644: */
! 645: if( checkProgress ){
! 646: if( db->nProgressOps==nProgressOps ){
! 647: int prc;
! 648: prc = db->xProgress(db->pProgressArg);
! 649: if( prc!=0 ){
! 650: rc = SQLITE_INTERRUPT;
! 651: goto vdbe_error_halt;
! 652: }
! 653: nProgressOps = 0;
! 654: }
! 655: nProgressOps++;
! 656: }
! 657: #endif
! 658:
! 659: /* On any opcode with the "out2-prerelase" tag, free any
! 660: ** external allocations out of mem[p2] and set mem[p2] to be
! 661: ** an undefined integer. Opcodes will either fill in the integer
! 662: ** value or convert mem[p2] to a different type.
! 663: */
! 664: assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] );
! 665: if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){
! 666: assert( pOp->p2>0 );
! 667: assert( pOp->p2<=p->nMem );
! 668: pOut = &aMem[pOp->p2];
! 669: memAboutToChange(p, pOut);
! 670: VdbeMemRelease(pOut);
! 671: pOut->flags = MEM_Int;
! 672: }
! 673:
! 674: /* Sanity checking on other operands */
! 675: #ifdef SQLITE_DEBUG
! 676: if( (pOp->opflags & OPFLG_IN1)!=0 ){
! 677: assert( pOp->p1>0 );
! 678: assert( pOp->p1<=p->nMem );
! 679: assert( memIsValid(&aMem[pOp->p1]) );
! 680: REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]);
! 681: }
! 682: if( (pOp->opflags & OPFLG_IN2)!=0 ){
! 683: assert( pOp->p2>0 );
! 684: assert( pOp->p2<=p->nMem );
! 685: assert( memIsValid(&aMem[pOp->p2]) );
! 686: REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]);
! 687: }
! 688: if( (pOp->opflags & OPFLG_IN3)!=0 ){
! 689: assert( pOp->p3>0 );
! 690: assert( pOp->p3<=p->nMem );
! 691: assert( memIsValid(&aMem[pOp->p3]) );
! 692: REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]);
! 693: }
! 694: if( (pOp->opflags & OPFLG_OUT2)!=0 ){
! 695: assert( pOp->p2>0 );
! 696: assert( pOp->p2<=p->nMem );
! 697: memAboutToChange(p, &aMem[pOp->p2]);
! 698: }
! 699: if( (pOp->opflags & OPFLG_OUT3)!=0 ){
! 700: assert( pOp->p3>0 );
! 701: assert( pOp->p3<=p->nMem );
! 702: memAboutToChange(p, &aMem[pOp->p3]);
! 703: }
! 704: #endif
! 705:
! 706: switch( pOp->opcode ){
! 707:
! 708: /*****************************************************************************
! 709: ** What follows is a massive switch statement where each case implements a
! 710: ** separate instruction in the virtual machine. If we follow the usual
! 711: ** indentation conventions, each case should be indented by 6 spaces. But
! 712: ** that is a lot of wasted space on the left margin. So the code within
! 713: ** the switch statement will break with convention and be flush-left. Another
! 714: ** big comment (similar to this one) will mark the point in the code where
! 715: ** we transition back to normal indentation.
! 716: **
! 717: ** The formatting of each case is important. The makefile for SQLite
! 718: ** generates two C files "opcodes.h" and "opcodes.c" by scanning this
! 719: ** file looking for lines that begin with "case OP_". The opcodes.h files
! 720: ** will be filled with #defines that give unique integer values to each
! 721: ** opcode and the opcodes.c file is filled with an array of strings where
! 722: ** each string is the symbolic name for the corresponding opcode. If the
! 723: ** case statement is followed by a comment of the form "/# same as ... #/"
! 724: ** that comment is used to determine the particular value of the opcode.
! 725: **
! 726: ** Other keywords in the comment that follows each case are used to
! 727: ** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[].
! 728: ** Keywords include: in1, in2, in3, out2_prerelease, out2, out3. See
! 729: ** the mkopcodeh.awk script for additional information.
! 730: **
! 731: ** Documentation about VDBE opcodes is generated by scanning this file
! 732: ** for lines of that contain "Opcode:". That line and all subsequent
! 733: ** comment lines are used in the generation of the opcode.html documentation
! 734: ** file.
! 735: **
! 736: ** SUMMARY:
! 737: **
! 738: ** Formatting is important to scripts that scan this file.
! 739: ** Do not deviate from the formatting style currently in use.
! 740: **
! 741: *****************************************************************************/
! 742:
! 743: /* Opcode: Goto * P2 * * *
! 744: **
! 745: ** An unconditional jump to address P2.
! 746: ** The next instruction executed will be
! 747: ** the one at index P2 from the beginning of
! 748: ** the program.
! 749: */
! 750: case OP_Goto: { /* jump */
! 751: CHECK_FOR_INTERRUPT;
! 752: pc = pOp->p2 - 1;
! 753: break;
! 754: }
! 755:
! 756: /* Opcode: Gosub P1 P2 * * *
! 757: **
! 758: ** Write the current address onto register P1
! 759: ** and then jump to address P2.
! 760: */
! 761: case OP_Gosub: { /* jump */
! 762: assert( pOp->p1>0 && pOp->p1<=p->nMem );
! 763: pIn1 = &aMem[pOp->p1];
! 764: assert( (pIn1->flags & MEM_Dyn)==0 );
! 765: memAboutToChange(p, pIn1);
! 766: pIn1->flags = MEM_Int;
! 767: pIn1->u.i = pc;
! 768: REGISTER_TRACE(pOp->p1, pIn1);
! 769: pc = pOp->p2 - 1;
! 770: break;
! 771: }
! 772:
! 773: /* Opcode: Return P1 * * * *
! 774: **
! 775: ** Jump to the next instruction after the address in register P1.
! 776: */
! 777: case OP_Return: { /* in1 */
! 778: pIn1 = &aMem[pOp->p1];
! 779: assert( pIn1->flags & MEM_Int );
! 780: pc = (int)pIn1->u.i;
! 781: break;
! 782: }
! 783:
! 784: /* Opcode: Yield P1 * * * *
! 785: **
! 786: ** Swap the program counter with the value in register P1.
! 787: */
! 788: case OP_Yield: { /* in1 */
! 789: int pcDest;
! 790: pIn1 = &aMem[pOp->p1];
! 791: assert( (pIn1->flags & MEM_Dyn)==0 );
! 792: pIn1->flags = MEM_Int;
! 793: pcDest = (int)pIn1->u.i;
! 794: pIn1->u.i = pc;
! 795: REGISTER_TRACE(pOp->p1, pIn1);
! 796: pc = pcDest;
! 797: break;
! 798: }
! 799:
! 800: /* Opcode: HaltIfNull P1 P2 P3 P4 *
! 801: **
! 802: ** Check the value in register P3. If it is NULL then Halt using
! 803: ** parameter P1, P2, and P4 as if this were a Halt instruction. If the
! 804: ** value in register P3 is not NULL, then this routine is a no-op.
! 805: */
! 806: case OP_HaltIfNull: { /* in3 */
! 807: pIn3 = &aMem[pOp->p3];
! 808: if( (pIn3->flags & MEM_Null)==0 ) break;
! 809: /* Fall through into OP_Halt */
! 810: }
! 811:
! 812: /* Opcode: Halt P1 P2 * P4 *
! 813: **
! 814: ** Exit immediately. All open cursors, etc are closed
! 815: ** automatically.
! 816: **
! 817: ** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(),
! 818: ** or sqlite3_finalize(). For a normal halt, this should be SQLITE_OK (0).
! 819: ** For errors, it can be some other value. If P1!=0 then P2 will determine
! 820: ** whether or not to rollback the current transaction. Do not rollback
! 821: ** if P2==OE_Fail. Do the rollback if P2==OE_Rollback. If P2==OE_Abort,
! 822: ** then back out all changes that have occurred during this execution of the
! 823: ** VDBE, but do not rollback the transaction.
! 824: **
! 825: ** If P4 is not null then it is an error message string.
! 826: **
! 827: ** There is an implied "Halt 0 0 0" instruction inserted at the very end of
! 828: ** every program. So a jump past the last instruction of the program
! 829: ** is the same as executing Halt.
! 830: */
! 831: case OP_Halt: {
! 832: if( pOp->p1==SQLITE_OK && p->pFrame ){
! 833: /* Halt the sub-program. Return control to the parent frame. */
! 834: VdbeFrame *pFrame = p->pFrame;
! 835: p->pFrame = pFrame->pParent;
! 836: p->nFrame--;
! 837: sqlite3VdbeSetChanges(db, p->nChange);
! 838: pc = sqlite3VdbeFrameRestore(pFrame);
! 839: lastRowid = db->lastRowid;
! 840: if( pOp->p2==OE_Ignore ){
! 841: /* Instruction pc is the OP_Program that invoked the sub-program
! 842: ** currently being halted. If the p2 instruction of this OP_Halt
! 843: ** instruction is set to OE_Ignore, then the sub-program is throwing
! 844: ** an IGNORE exception. In this case jump to the address specified
! 845: ** as the p2 of the calling OP_Program. */
! 846: pc = p->aOp[pc].p2-1;
! 847: }
! 848: aOp = p->aOp;
! 849: aMem = p->aMem;
! 850: break;
! 851: }
! 852:
! 853: p->rc = pOp->p1;
! 854: p->errorAction = (u8)pOp->p2;
! 855: p->pc = pc;
! 856: if( pOp->p4.z ){
! 857: assert( p->rc!=SQLITE_OK );
! 858: sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z);
! 859: testcase( sqlite3GlobalConfig.xLog!=0 );
! 860: sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pc, p->zSql, pOp->p4.z);
! 861: }else if( p->rc ){
! 862: testcase( sqlite3GlobalConfig.xLog!=0 );
! 863: sqlite3_log(pOp->p1, "constraint failed at %d in [%s]", pc, p->zSql);
! 864: }
! 865: rc = sqlite3VdbeHalt(p);
! 866: assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR );
! 867: if( rc==SQLITE_BUSY ){
! 868: p->rc = rc = SQLITE_BUSY;
! 869: }else{
! 870: assert( rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT );
! 871: assert( rc==SQLITE_OK || db->nDeferredCons>0 );
! 872: rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
! 873: }
! 874: goto vdbe_return;
! 875: }
! 876:
! 877: /* Opcode: Integer P1 P2 * * *
! 878: **
! 879: ** The 32-bit integer value P1 is written into register P2.
! 880: */
! 881: case OP_Integer: { /* out2-prerelease */
! 882: pOut->u.i = pOp->p1;
! 883: break;
! 884: }
! 885:
! 886: /* Opcode: Int64 * P2 * P4 *
! 887: **
! 888: ** P4 is a pointer to a 64-bit integer value.
! 889: ** Write that value into register P2.
! 890: */
! 891: case OP_Int64: { /* out2-prerelease */
! 892: assert( pOp->p4.pI64!=0 );
! 893: pOut->u.i = *pOp->p4.pI64;
! 894: break;
! 895: }
! 896:
! 897: #ifndef SQLITE_OMIT_FLOATING_POINT
! 898: /* Opcode: Real * P2 * P4 *
! 899: **
! 900: ** P4 is a pointer to a 64-bit floating point value.
! 901: ** Write that value into register P2.
! 902: */
! 903: case OP_Real: { /* same as TK_FLOAT, out2-prerelease */
! 904: pOut->flags = MEM_Real;
! 905: assert( !sqlite3IsNaN(*pOp->p4.pReal) );
! 906: pOut->r = *pOp->p4.pReal;
! 907: break;
! 908: }
! 909: #endif
! 910:
! 911: /* Opcode: String8 * P2 * P4 *
! 912: **
! 913: ** P4 points to a nul terminated UTF-8 string. This opcode is transformed
! 914: ** into an OP_String before it is executed for the first time.
! 915: */
! 916: case OP_String8: { /* same as TK_STRING, out2-prerelease */
! 917: assert( pOp->p4.z!=0 );
! 918: pOp->opcode = OP_String;
! 919: pOp->p1 = sqlite3Strlen30(pOp->p4.z);
! 920:
! 921: #ifndef SQLITE_OMIT_UTF16
! 922: if( encoding!=SQLITE_UTF8 ){
! 923: rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
! 924: if( rc==SQLITE_TOOBIG ) goto too_big;
! 925: if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem;
! 926: assert( pOut->zMalloc==pOut->z );
! 927: assert( pOut->flags & MEM_Dyn );
! 928: pOut->zMalloc = 0;
! 929: pOut->flags |= MEM_Static;
! 930: pOut->flags &= ~MEM_Dyn;
! 931: if( pOp->p4type==P4_DYNAMIC ){
! 932: sqlite3DbFree(db, pOp->p4.z);
! 933: }
! 934: pOp->p4type = P4_DYNAMIC;
! 935: pOp->p4.z = pOut->z;
! 936: pOp->p1 = pOut->n;
! 937: }
! 938: #endif
! 939: if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 940: goto too_big;
! 941: }
! 942: /* Fall through to the next case, OP_String */
! 943: }
! 944:
! 945: /* Opcode: String P1 P2 * P4 *
! 946: **
! 947: ** The string value P4 of length P1 (bytes) is stored in register P2.
! 948: */
! 949: case OP_String: { /* out2-prerelease */
! 950: assert( pOp->p4.z!=0 );
! 951: pOut->flags = MEM_Str|MEM_Static|MEM_Term;
! 952: pOut->z = pOp->p4.z;
! 953: pOut->n = pOp->p1;
! 954: pOut->enc = encoding;
! 955: UPDATE_MAX_BLOBSIZE(pOut);
! 956: break;
! 957: }
! 958:
! 959: /* Opcode: Null * P2 P3 * *
! 960: **
! 961: ** Write a NULL into registers P2. If P3 greater than P2, then also write
! 962: ** NULL into register P3 and ever register in between P2 and P3. If P3
! 963: ** is less than P2 (typically P3 is zero) then only register P2 is
! 964: ** set to NULL
! 965: */
! 966: case OP_Null: { /* out2-prerelease */
! 967: int cnt;
! 968: cnt = pOp->p3-pOp->p2;
! 969: assert( pOp->p3<=p->nMem );
! 970: pOut->flags = MEM_Null;
! 971: while( cnt>0 ){
! 972: pOut++;
! 973: memAboutToChange(p, pOut);
! 974: VdbeMemRelease(pOut);
! 975: pOut->flags = MEM_Null;
! 976: cnt--;
! 977: }
! 978: break;
! 979: }
! 980:
! 981:
! 982: /* Opcode: Blob P1 P2 * P4
! 983: **
! 984: ** P4 points to a blob of data P1 bytes long. Store this
! 985: ** blob in register P2.
! 986: */
! 987: case OP_Blob: { /* out2-prerelease */
! 988: assert( pOp->p1 <= SQLITE_MAX_LENGTH );
! 989: sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
! 990: pOut->enc = encoding;
! 991: UPDATE_MAX_BLOBSIZE(pOut);
! 992: break;
! 993: }
! 994:
! 995: /* Opcode: Variable P1 P2 * P4 *
! 996: **
! 997: ** Transfer the values of bound parameter P1 into register P2
! 998: **
! 999: ** If the parameter is named, then its name appears in P4 and P3==1.
! 1000: ** The P4 value is used by sqlite3_bind_parameter_name().
! 1001: */
! 1002: case OP_Variable: { /* out2-prerelease */
! 1003: Mem *pVar; /* Value being transferred */
! 1004:
! 1005: assert( pOp->p1>0 && pOp->p1<=p->nVar );
! 1006: assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] );
! 1007: pVar = &p->aVar[pOp->p1 - 1];
! 1008: if( sqlite3VdbeMemTooBig(pVar) ){
! 1009: goto too_big;
! 1010: }
! 1011: sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static);
! 1012: UPDATE_MAX_BLOBSIZE(pOut);
! 1013: break;
! 1014: }
! 1015:
! 1016: /* Opcode: Move P1 P2 P3 * *
! 1017: **
! 1018: ** Move the values in register P1..P1+P3-1 over into
! 1019: ** registers P2..P2+P3-1. Registers P1..P1+P1-1 are
! 1020: ** left holding a NULL. It is an error for register ranges
! 1021: ** P1..P1+P3-1 and P2..P2+P3-1 to overlap.
! 1022: */
! 1023: case OP_Move: {
! 1024: char *zMalloc; /* Holding variable for allocated memory */
! 1025: int n; /* Number of registers left to copy */
! 1026: int p1; /* Register to copy from */
! 1027: int p2; /* Register to copy to */
! 1028:
! 1029: n = pOp->p3;
! 1030: p1 = pOp->p1;
! 1031: p2 = pOp->p2;
! 1032: assert( n>0 && p1>0 && p2>0 );
! 1033: assert( p1+n<=p2 || p2+n<=p1 );
! 1034:
! 1035: pIn1 = &aMem[p1];
! 1036: pOut = &aMem[p2];
! 1037: while( n-- ){
! 1038: assert( pOut<=&aMem[p->nMem] );
! 1039: assert( pIn1<=&aMem[p->nMem] );
! 1040: assert( memIsValid(pIn1) );
! 1041: memAboutToChange(p, pOut);
! 1042: zMalloc = pOut->zMalloc;
! 1043: pOut->zMalloc = 0;
! 1044: sqlite3VdbeMemMove(pOut, pIn1);
! 1045: #ifdef SQLITE_DEBUG
! 1046: if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrom<&aMem[p1+pOp->p3] ){
! 1047: pOut->pScopyFrom += p1 - pOp->p2;
! 1048: }
! 1049: #endif
! 1050: pIn1->zMalloc = zMalloc;
! 1051: REGISTER_TRACE(p2++, pOut);
! 1052: pIn1++;
! 1053: pOut++;
! 1054: }
! 1055: break;
! 1056: }
! 1057:
! 1058: /* Opcode: Copy P1 P2 * * *
! 1059: **
! 1060: ** Make a copy of register P1 into register P2.
! 1061: **
! 1062: ** This instruction makes a deep copy of the value. A duplicate
! 1063: ** is made of any string or blob constant. See also OP_SCopy.
! 1064: */
! 1065: case OP_Copy: { /* in1, out2 */
! 1066: pIn1 = &aMem[pOp->p1];
! 1067: pOut = &aMem[pOp->p2];
! 1068: assert( pOut!=pIn1 );
! 1069: sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
! 1070: Deephemeralize(pOut);
! 1071: REGISTER_TRACE(pOp->p2, pOut);
! 1072: break;
! 1073: }
! 1074:
! 1075: /* Opcode: SCopy P1 P2 * * *
! 1076: **
! 1077: ** Make a shallow copy of register P1 into register P2.
! 1078: **
! 1079: ** This instruction makes a shallow copy of the value. If the value
! 1080: ** is a string or blob, then the copy is only a pointer to the
! 1081: ** original and hence if the original changes so will the copy.
! 1082: ** Worse, if the original is deallocated, the copy becomes invalid.
! 1083: ** Thus the program must guarantee that the original will not change
! 1084: ** during the lifetime of the copy. Use OP_Copy to make a complete
! 1085: ** copy.
! 1086: */
! 1087: case OP_SCopy: { /* in1, out2 */
! 1088: pIn1 = &aMem[pOp->p1];
! 1089: pOut = &aMem[pOp->p2];
! 1090: assert( pOut!=pIn1 );
! 1091: sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
! 1092: #ifdef SQLITE_DEBUG
! 1093: if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1;
! 1094: #endif
! 1095: REGISTER_TRACE(pOp->p2, pOut);
! 1096: break;
! 1097: }
! 1098:
! 1099: /* Opcode: ResultRow P1 P2 * * *
! 1100: **
! 1101: ** The registers P1 through P1+P2-1 contain a single row of
! 1102: ** results. This opcode causes the sqlite3_step() call to terminate
! 1103: ** with an SQLITE_ROW return code and it sets up the sqlite3_stmt
! 1104: ** structure to provide access to the top P1 values as the result
! 1105: ** row.
! 1106: */
! 1107: case OP_ResultRow: {
! 1108: Mem *pMem;
! 1109: int i;
! 1110: assert( p->nResColumn==pOp->p2 );
! 1111: assert( pOp->p1>0 );
! 1112: assert( pOp->p1+pOp->p2<=p->nMem+1 );
! 1113:
! 1114: /* If this statement has violated immediate foreign key constraints, do
! 1115: ** not return the number of rows modified. And do not RELEASE the statement
! 1116: ** transaction. It needs to be rolled back. */
! 1117: if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){
! 1118: assert( db->flags&SQLITE_CountRows );
! 1119: assert( p->usesStmtJournal );
! 1120: break;
! 1121: }
! 1122:
! 1123: /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then
! 1124: ** DML statements invoke this opcode to return the number of rows
! 1125: ** modified to the user. This is the only way that a VM that
! 1126: ** opens a statement transaction may invoke this opcode.
! 1127: **
! 1128: ** In case this is such a statement, close any statement transaction
! 1129: ** opened by this VM before returning control to the user. This is to
! 1130: ** ensure that statement-transactions are always nested, not overlapping.
! 1131: ** If the open statement-transaction is not closed here, then the user
! 1132: ** may step another VM that opens its own statement transaction. This
! 1133: ** may lead to overlapping statement transactions.
! 1134: **
! 1135: ** The statement transaction is never a top-level transaction. Hence
! 1136: ** the RELEASE call below can never fail.
! 1137: */
! 1138: assert( p->iStatement==0 || db->flags&SQLITE_CountRows );
! 1139: rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE);
! 1140: if( NEVER(rc!=SQLITE_OK) ){
! 1141: break;
! 1142: }
! 1143:
! 1144: /* Invalidate all ephemeral cursor row caches */
! 1145: p->cacheCtr = (p->cacheCtr + 2)|1;
! 1146:
! 1147: /* Make sure the results of the current row are \000 terminated
! 1148: ** and have an assigned type. The results are de-ephemeralized as
! 1149: ** a side effect.
! 1150: */
! 1151: pMem = p->pResultSet = &aMem[pOp->p1];
! 1152: for(i=0; i<pOp->p2; i++){
! 1153: assert( memIsValid(&pMem[i]) );
! 1154: Deephemeralize(&pMem[i]);
! 1155: assert( (pMem[i].flags & MEM_Ephem)==0
! 1156: || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 );
! 1157: sqlite3VdbeMemNulTerminate(&pMem[i]);
! 1158: sqlite3VdbeMemStoreType(&pMem[i]);
! 1159: REGISTER_TRACE(pOp->p1+i, &pMem[i]);
! 1160: }
! 1161: if( db->mallocFailed ) goto no_mem;
! 1162:
! 1163: /* Return SQLITE_ROW
! 1164: */
! 1165: p->pc = pc + 1;
! 1166: rc = SQLITE_ROW;
! 1167: goto vdbe_return;
! 1168: }
! 1169:
! 1170: /* Opcode: Concat P1 P2 P3 * *
! 1171: **
! 1172: ** Add the text in register P1 onto the end of the text in
! 1173: ** register P2 and store the result in register P3.
! 1174: ** If either the P1 or P2 text are NULL then store NULL in P3.
! 1175: **
! 1176: ** P3 = P2 || P1
! 1177: **
! 1178: ** It is illegal for P1 and P3 to be the same register. Sometimes,
! 1179: ** if P3 is the same register as P2, the implementation is able
! 1180: ** to avoid a memcpy().
! 1181: */
! 1182: case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
! 1183: i64 nByte;
! 1184:
! 1185: pIn1 = &aMem[pOp->p1];
! 1186: pIn2 = &aMem[pOp->p2];
! 1187: pOut = &aMem[pOp->p3];
! 1188: assert( pIn1!=pOut );
! 1189: if( (pIn1->flags | pIn2->flags) & MEM_Null ){
! 1190: sqlite3VdbeMemSetNull(pOut);
! 1191: break;
! 1192: }
! 1193: if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem;
! 1194: Stringify(pIn1, encoding);
! 1195: Stringify(pIn2, encoding);
! 1196: nByte = pIn1->n + pIn2->n;
! 1197: if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 1198: goto too_big;
! 1199: }
! 1200: MemSetTypeFlag(pOut, MEM_Str);
! 1201: if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){
! 1202: goto no_mem;
! 1203: }
! 1204: if( pOut!=pIn2 ){
! 1205: memcpy(pOut->z, pIn2->z, pIn2->n);
! 1206: }
! 1207: memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
! 1208: pOut->z[nByte] = 0;
! 1209: pOut->z[nByte+1] = 0;
! 1210: pOut->flags |= MEM_Term;
! 1211: pOut->n = (int)nByte;
! 1212: pOut->enc = encoding;
! 1213: UPDATE_MAX_BLOBSIZE(pOut);
! 1214: break;
! 1215: }
! 1216:
! 1217: /* Opcode: Add P1 P2 P3 * *
! 1218: **
! 1219: ** Add the value in register P1 to the value in register P2
! 1220: ** and store the result in register P3.
! 1221: ** If either input is NULL, the result is NULL.
! 1222: */
! 1223: /* Opcode: Multiply P1 P2 P3 * *
! 1224: **
! 1225: **
! 1226: ** Multiply the value in register P1 by the value in register P2
! 1227: ** and store the result in register P3.
! 1228: ** If either input is NULL, the result is NULL.
! 1229: */
! 1230: /* Opcode: Subtract P1 P2 P3 * *
! 1231: **
! 1232: ** Subtract the value in register P1 from the value in register P2
! 1233: ** and store the result in register P3.
! 1234: ** If either input is NULL, the result is NULL.
! 1235: */
! 1236: /* Opcode: Divide P1 P2 P3 * *
! 1237: **
! 1238: ** Divide the value in register P1 by the value in register P2
! 1239: ** and store the result in register P3 (P3=P2/P1). If the value in
! 1240: ** register P1 is zero, then the result is NULL. If either input is
! 1241: ** NULL, the result is NULL.
! 1242: */
! 1243: /* Opcode: Remainder P1 P2 P3 * *
! 1244: **
! 1245: ** Compute the remainder after integer division of the value in
! 1246: ** register P1 by the value in register P2 and store the result in P3.
! 1247: ** If the value in register P2 is zero the result is NULL.
! 1248: ** If either operand is NULL, the result is NULL.
! 1249: */
! 1250: case OP_Add: /* same as TK_PLUS, in1, in2, out3 */
! 1251: case OP_Subtract: /* same as TK_MINUS, in1, in2, out3 */
! 1252: case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */
! 1253: case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */
! 1254: case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */
! 1255: int flags; /* Combined MEM_* flags from both inputs */
! 1256: i64 iA; /* Integer value of left operand */
! 1257: i64 iB; /* Integer value of right operand */
! 1258: double rA; /* Real value of left operand */
! 1259: double rB; /* Real value of right operand */
! 1260:
! 1261: pIn1 = &aMem[pOp->p1];
! 1262: applyNumericAffinity(pIn1);
! 1263: pIn2 = &aMem[pOp->p2];
! 1264: applyNumericAffinity(pIn2);
! 1265: pOut = &aMem[pOp->p3];
! 1266: flags = pIn1->flags | pIn2->flags;
! 1267: if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
! 1268: if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){
! 1269: iA = pIn1->u.i;
! 1270: iB = pIn2->u.i;
! 1271: switch( pOp->opcode ){
! 1272: case OP_Add: if( sqlite3AddInt64(&iB,iA) ) goto fp_math; break;
! 1273: case OP_Subtract: if( sqlite3SubInt64(&iB,iA) ) goto fp_math; break;
! 1274: case OP_Multiply: if( sqlite3MulInt64(&iB,iA) ) goto fp_math; break;
! 1275: case OP_Divide: {
! 1276: if( iA==0 ) goto arithmetic_result_is_null;
! 1277: if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math;
! 1278: iB /= iA;
! 1279: break;
! 1280: }
! 1281: default: {
! 1282: if( iA==0 ) goto arithmetic_result_is_null;
! 1283: if( iA==-1 ) iA = 1;
! 1284: iB %= iA;
! 1285: break;
! 1286: }
! 1287: }
! 1288: pOut->u.i = iB;
! 1289: MemSetTypeFlag(pOut, MEM_Int);
! 1290: }else{
! 1291: fp_math:
! 1292: rA = sqlite3VdbeRealValue(pIn1);
! 1293: rB = sqlite3VdbeRealValue(pIn2);
! 1294: switch( pOp->opcode ){
! 1295: case OP_Add: rB += rA; break;
! 1296: case OP_Subtract: rB -= rA; break;
! 1297: case OP_Multiply: rB *= rA; break;
! 1298: case OP_Divide: {
! 1299: /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
! 1300: if( rA==(double)0 ) goto arithmetic_result_is_null;
! 1301: rB /= rA;
! 1302: break;
! 1303: }
! 1304: default: {
! 1305: iA = (i64)rA;
! 1306: iB = (i64)rB;
! 1307: if( iA==0 ) goto arithmetic_result_is_null;
! 1308: if( iA==-1 ) iA = 1;
! 1309: rB = (double)(iB % iA);
! 1310: break;
! 1311: }
! 1312: }
! 1313: #ifdef SQLITE_OMIT_FLOATING_POINT
! 1314: pOut->u.i = rB;
! 1315: MemSetTypeFlag(pOut, MEM_Int);
! 1316: #else
! 1317: if( sqlite3IsNaN(rB) ){
! 1318: goto arithmetic_result_is_null;
! 1319: }
! 1320: pOut->r = rB;
! 1321: MemSetTypeFlag(pOut, MEM_Real);
! 1322: if( (flags & MEM_Real)==0 ){
! 1323: sqlite3VdbeIntegerAffinity(pOut);
! 1324: }
! 1325: #endif
! 1326: }
! 1327: break;
! 1328:
! 1329: arithmetic_result_is_null:
! 1330: sqlite3VdbeMemSetNull(pOut);
! 1331: break;
! 1332: }
! 1333:
! 1334: /* Opcode: CollSeq * * P4
! 1335: **
! 1336: ** P4 is a pointer to a CollSeq struct. If the next call to a user function
! 1337: ** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will
! 1338: ** be returned. This is used by the built-in min(), max() and nullif()
! 1339: ** functions.
! 1340: **
! 1341: ** The interface used by the implementation of the aforementioned functions
! 1342: ** to retrieve the collation sequence set by this opcode is not available
! 1343: ** publicly, only to user functions defined in func.c.
! 1344: */
! 1345: case OP_CollSeq: {
! 1346: assert( pOp->p4type==P4_COLLSEQ );
! 1347: break;
! 1348: }
! 1349:
! 1350: /* Opcode: Function P1 P2 P3 P4 P5
! 1351: **
! 1352: ** Invoke a user function (P4 is a pointer to a Function structure that
! 1353: ** defines the function) with P5 arguments taken from register P2 and
! 1354: ** successors. The result of the function is stored in register P3.
! 1355: ** Register P3 must not be one of the function inputs.
! 1356: **
! 1357: ** P1 is a 32-bit bitmask indicating whether or not each argument to the
! 1358: ** function was determined to be constant at compile time. If the first
! 1359: ** argument was constant then bit 0 of P1 is set. This is used to determine
! 1360: ** whether meta data associated with a user function argument using the
! 1361: ** sqlite3_set_auxdata() API may be safely retained until the next
! 1362: ** invocation of this opcode.
! 1363: **
! 1364: ** See also: AggStep and AggFinal
! 1365: */
! 1366: case OP_Function: {
! 1367: int i;
! 1368: Mem *pArg;
! 1369: sqlite3_context ctx;
! 1370: sqlite3_value **apVal;
! 1371: int n;
! 1372:
! 1373: n = pOp->p5;
! 1374: apVal = p->apArg;
! 1375: assert( apVal || n==0 );
! 1376: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 1377: pOut = &aMem[pOp->p3];
! 1378: memAboutToChange(p, pOut);
! 1379:
! 1380: assert( n==0 || (pOp->p2>0 && pOp->p2+n<=p->nMem+1) );
! 1381: assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
! 1382: pArg = &aMem[pOp->p2];
! 1383: for(i=0; i<n; i++, pArg++){
! 1384: assert( memIsValid(pArg) );
! 1385: apVal[i] = pArg;
! 1386: Deephemeralize(pArg);
! 1387: sqlite3VdbeMemStoreType(pArg);
! 1388: REGISTER_TRACE(pOp->p2+i, pArg);
! 1389: }
! 1390:
! 1391: assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC );
! 1392: if( pOp->p4type==P4_FUNCDEF ){
! 1393: ctx.pFunc = pOp->p4.pFunc;
! 1394: ctx.pVdbeFunc = 0;
! 1395: }else{
! 1396: ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
! 1397: ctx.pFunc = ctx.pVdbeFunc->pFunc;
! 1398: }
! 1399:
! 1400: ctx.s.flags = MEM_Null;
! 1401: ctx.s.db = db;
! 1402: ctx.s.xDel = 0;
! 1403: ctx.s.zMalloc = 0;
! 1404:
! 1405: /* The output cell may already have a buffer allocated. Move
! 1406: ** the pointer to ctx.s so in case the user-function can use
! 1407: ** the already allocated buffer instead of allocating a new one.
! 1408: */
! 1409: sqlite3VdbeMemMove(&ctx.s, pOut);
! 1410: MemSetTypeFlag(&ctx.s, MEM_Null);
! 1411:
! 1412: ctx.isError = 0;
! 1413: if( ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
! 1414: assert( pOp>aOp );
! 1415: assert( pOp[-1].p4type==P4_COLLSEQ );
! 1416: assert( pOp[-1].opcode==OP_CollSeq );
! 1417: ctx.pColl = pOp[-1].p4.pColl;
! 1418: }
! 1419: db->lastRowid = lastRowid;
! 1420: (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */
! 1421: lastRowid = db->lastRowid;
! 1422:
! 1423: /* If any auxiliary data functions have been called by this user function,
! 1424: ** immediately call the destructor for any non-static values.
! 1425: */
! 1426: if( ctx.pVdbeFunc ){
! 1427: sqlite3VdbeDeleteAuxData(ctx.pVdbeFunc, pOp->p1);
! 1428: pOp->p4.pVdbeFunc = ctx.pVdbeFunc;
! 1429: pOp->p4type = P4_VDBEFUNC;
! 1430: }
! 1431:
! 1432: if( db->mallocFailed ){
! 1433: /* Even though a malloc() has failed, the implementation of the
! 1434: ** user function may have called an sqlite3_result_XXX() function
! 1435: ** to return a value. The following call releases any resources
! 1436: ** associated with such a value.
! 1437: */
! 1438: sqlite3VdbeMemRelease(&ctx.s);
! 1439: goto no_mem;
! 1440: }
! 1441:
! 1442: /* If the function returned an error, throw an exception */
! 1443: if( ctx.isError ){
! 1444: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
! 1445: rc = ctx.isError;
! 1446: }
! 1447:
! 1448: /* Copy the result of the function into register P3 */
! 1449: sqlite3VdbeChangeEncoding(&ctx.s, encoding);
! 1450: sqlite3VdbeMemMove(pOut, &ctx.s);
! 1451: if( sqlite3VdbeMemTooBig(pOut) ){
! 1452: goto too_big;
! 1453: }
! 1454:
! 1455: #if 0
! 1456: /* The app-defined function has done something that as caused this
! 1457: ** statement to expire. (Perhaps the function called sqlite3_exec()
! 1458: ** with a CREATE TABLE statement.)
! 1459: */
! 1460: if( p->expired ) rc = SQLITE_ABORT;
! 1461: #endif
! 1462:
! 1463: REGISTER_TRACE(pOp->p3, pOut);
! 1464: UPDATE_MAX_BLOBSIZE(pOut);
! 1465: break;
! 1466: }
! 1467:
! 1468: /* Opcode: BitAnd P1 P2 P3 * *
! 1469: **
! 1470: ** Take the bit-wise AND of the values in register P1 and P2 and
! 1471: ** store the result in register P3.
! 1472: ** If either input is NULL, the result is NULL.
! 1473: */
! 1474: /* Opcode: BitOr P1 P2 P3 * *
! 1475: **
! 1476: ** Take the bit-wise OR of the values in register P1 and P2 and
! 1477: ** store the result in register P3.
! 1478: ** If either input is NULL, the result is NULL.
! 1479: */
! 1480: /* Opcode: ShiftLeft P1 P2 P3 * *
! 1481: **
! 1482: ** Shift the integer value in register P2 to the left by the
! 1483: ** number of bits specified by the integer in register P1.
! 1484: ** Store the result in register P3.
! 1485: ** If either input is NULL, the result is NULL.
! 1486: */
! 1487: /* Opcode: ShiftRight P1 P2 P3 * *
! 1488: **
! 1489: ** Shift the integer value in register P2 to the right by the
! 1490: ** number of bits specified by the integer in register P1.
! 1491: ** Store the result in register P3.
! 1492: ** If either input is NULL, the result is NULL.
! 1493: */
! 1494: case OP_BitAnd: /* same as TK_BITAND, in1, in2, out3 */
! 1495: case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */
! 1496: case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */
! 1497: case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */
! 1498: i64 iA;
! 1499: u64 uA;
! 1500: i64 iB;
! 1501: u8 op;
! 1502:
! 1503: pIn1 = &aMem[pOp->p1];
! 1504: pIn2 = &aMem[pOp->p2];
! 1505: pOut = &aMem[pOp->p3];
! 1506: if( (pIn1->flags | pIn2->flags) & MEM_Null ){
! 1507: sqlite3VdbeMemSetNull(pOut);
! 1508: break;
! 1509: }
! 1510: iA = sqlite3VdbeIntValue(pIn2);
! 1511: iB = sqlite3VdbeIntValue(pIn1);
! 1512: op = pOp->opcode;
! 1513: if( op==OP_BitAnd ){
! 1514: iA &= iB;
! 1515: }else if( op==OP_BitOr ){
! 1516: iA |= iB;
! 1517: }else if( iB!=0 ){
! 1518: assert( op==OP_ShiftRight || op==OP_ShiftLeft );
! 1519:
! 1520: /* If shifting by a negative amount, shift in the other direction */
! 1521: if( iB<0 ){
! 1522: assert( OP_ShiftRight==OP_ShiftLeft+1 );
! 1523: op = 2*OP_ShiftLeft + 1 - op;
! 1524: iB = iB>(-64) ? -iB : 64;
! 1525: }
! 1526:
! 1527: if( iB>=64 ){
! 1528: iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1;
! 1529: }else{
! 1530: memcpy(&uA, &iA, sizeof(uA));
! 1531: if( op==OP_ShiftLeft ){
! 1532: uA <<= iB;
! 1533: }else{
! 1534: uA >>= iB;
! 1535: /* Sign-extend on a right shift of a negative number */
! 1536: if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB);
! 1537: }
! 1538: memcpy(&iA, &uA, sizeof(iA));
! 1539: }
! 1540: }
! 1541: pOut->u.i = iA;
! 1542: MemSetTypeFlag(pOut, MEM_Int);
! 1543: break;
! 1544: }
! 1545:
! 1546: /* Opcode: AddImm P1 P2 * * *
! 1547: **
! 1548: ** Add the constant P2 to the value in register P1.
! 1549: ** The result is always an integer.
! 1550: **
! 1551: ** To force any register to be an integer, just add 0.
! 1552: */
! 1553: case OP_AddImm: { /* in1 */
! 1554: pIn1 = &aMem[pOp->p1];
! 1555: memAboutToChange(p, pIn1);
! 1556: sqlite3VdbeMemIntegerify(pIn1);
! 1557: pIn1->u.i += pOp->p2;
! 1558: break;
! 1559: }
! 1560:
! 1561: /* Opcode: MustBeInt P1 P2 * * *
! 1562: **
! 1563: ** Force the value in register P1 to be an integer. If the value
! 1564: ** in P1 is not an integer and cannot be converted into an integer
! 1565: ** without data loss, then jump immediately to P2, or if P2==0
! 1566: ** raise an SQLITE_MISMATCH exception.
! 1567: */
! 1568: case OP_MustBeInt: { /* jump, in1 */
! 1569: pIn1 = &aMem[pOp->p1];
! 1570: applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
! 1571: if( (pIn1->flags & MEM_Int)==0 ){
! 1572: if( pOp->p2==0 ){
! 1573: rc = SQLITE_MISMATCH;
! 1574: goto abort_due_to_error;
! 1575: }else{
! 1576: pc = pOp->p2 - 1;
! 1577: }
! 1578: }else{
! 1579: MemSetTypeFlag(pIn1, MEM_Int);
! 1580: }
! 1581: break;
! 1582: }
! 1583:
! 1584: #ifndef SQLITE_OMIT_FLOATING_POINT
! 1585: /* Opcode: RealAffinity P1 * * * *
! 1586: **
! 1587: ** If register P1 holds an integer convert it to a real value.
! 1588: **
! 1589: ** This opcode is used when extracting information from a column that
! 1590: ** has REAL affinity. Such column values may still be stored as
! 1591: ** integers, for space efficiency, but after extraction we want them
! 1592: ** to have only a real value.
! 1593: */
! 1594: case OP_RealAffinity: { /* in1 */
! 1595: pIn1 = &aMem[pOp->p1];
! 1596: if( pIn1->flags & MEM_Int ){
! 1597: sqlite3VdbeMemRealify(pIn1);
! 1598: }
! 1599: break;
! 1600: }
! 1601: #endif
! 1602:
! 1603: #ifndef SQLITE_OMIT_CAST
! 1604: /* Opcode: ToText P1 * * * *
! 1605: **
! 1606: ** Force the value in register P1 to be text.
! 1607: ** If the value is numeric, convert it to a string using the
! 1608: ** equivalent of printf(). Blob values are unchanged and
! 1609: ** are afterwards simply interpreted as text.
! 1610: **
! 1611: ** A NULL value is not changed by this routine. It remains NULL.
! 1612: */
! 1613: case OP_ToText: { /* same as TK_TO_TEXT, in1 */
! 1614: pIn1 = &aMem[pOp->p1];
! 1615: memAboutToChange(p, pIn1);
! 1616: if( pIn1->flags & MEM_Null ) break;
! 1617: assert( MEM_Str==(MEM_Blob>>3) );
! 1618: pIn1->flags |= (pIn1->flags&MEM_Blob)>>3;
! 1619: applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
! 1620: rc = ExpandBlob(pIn1);
! 1621: assert( pIn1->flags & MEM_Str || db->mallocFailed );
! 1622: pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero);
! 1623: UPDATE_MAX_BLOBSIZE(pIn1);
! 1624: break;
! 1625: }
! 1626:
! 1627: /* Opcode: ToBlob P1 * * * *
! 1628: **
! 1629: ** Force the value in register P1 to be a BLOB.
! 1630: ** If the value is numeric, convert it to a string first.
! 1631: ** Strings are simply reinterpreted as blobs with no change
! 1632: ** to the underlying data.
! 1633: **
! 1634: ** A NULL value is not changed by this routine. It remains NULL.
! 1635: */
! 1636: case OP_ToBlob: { /* same as TK_TO_BLOB, in1 */
! 1637: pIn1 = &aMem[pOp->p1];
! 1638: if( pIn1->flags & MEM_Null ) break;
! 1639: if( (pIn1->flags & MEM_Blob)==0 ){
! 1640: applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
! 1641: assert( pIn1->flags & MEM_Str || db->mallocFailed );
! 1642: MemSetTypeFlag(pIn1, MEM_Blob);
! 1643: }else{
! 1644: pIn1->flags &= ~(MEM_TypeMask&~MEM_Blob);
! 1645: }
! 1646: UPDATE_MAX_BLOBSIZE(pIn1);
! 1647: break;
! 1648: }
! 1649:
! 1650: /* Opcode: ToNumeric P1 * * * *
! 1651: **
! 1652: ** Force the value in register P1 to be numeric (either an
! 1653: ** integer or a floating-point number.)
! 1654: ** If the value is text or blob, try to convert it to an using the
! 1655: ** equivalent of atoi() or atof() and store 0 if no such conversion
! 1656: ** is possible.
! 1657: **
! 1658: ** A NULL value is not changed by this routine. It remains NULL.
! 1659: */
! 1660: case OP_ToNumeric: { /* same as TK_TO_NUMERIC, in1 */
! 1661: pIn1 = &aMem[pOp->p1];
! 1662: sqlite3VdbeMemNumerify(pIn1);
! 1663: break;
! 1664: }
! 1665: #endif /* SQLITE_OMIT_CAST */
! 1666:
! 1667: /* Opcode: ToInt P1 * * * *
! 1668: **
! 1669: ** Force the value in register P1 to be an integer. If
! 1670: ** The value is currently a real number, drop its fractional part.
! 1671: ** If the value is text or blob, try to convert it to an integer using the
! 1672: ** equivalent of atoi() and store 0 if no such conversion is possible.
! 1673: **
! 1674: ** A NULL value is not changed by this routine. It remains NULL.
! 1675: */
! 1676: case OP_ToInt: { /* same as TK_TO_INT, in1 */
! 1677: pIn1 = &aMem[pOp->p1];
! 1678: if( (pIn1->flags & MEM_Null)==0 ){
! 1679: sqlite3VdbeMemIntegerify(pIn1);
! 1680: }
! 1681: break;
! 1682: }
! 1683:
! 1684: #if !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT)
! 1685: /* Opcode: ToReal P1 * * * *
! 1686: **
! 1687: ** Force the value in register P1 to be a floating point number.
! 1688: ** If The value is currently an integer, convert it.
! 1689: ** If the value is text or blob, try to convert it to an integer using the
! 1690: ** equivalent of atoi() and store 0.0 if no such conversion is possible.
! 1691: **
! 1692: ** A NULL value is not changed by this routine. It remains NULL.
! 1693: */
! 1694: case OP_ToReal: { /* same as TK_TO_REAL, in1 */
! 1695: pIn1 = &aMem[pOp->p1];
! 1696: memAboutToChange(p, pIn1);
! 1697: if( (pIn1->flags & MEM_Null)==0 ){
! 1698: sqlite3VdbeMemRealify(pIn1);
! 1699: }
! 1700: break;
! 1701: }
! 1702: #endif /* !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT) */
! 1703:
! 1704: /* Opcode: Lt P1 P2 P3 P4 P5
! 1705: **
! 1706: ** Compare the values in register P1 and P3. If reg(P3)<reg(P1) then
! 1707: ** jump to address P2.
! 1708: **
! 1709: ** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
! 1710: ** reg(P3) is NULL then take the jump. If the SQLITE_JUMPIFNULL
! 1711: ** bit is clear then fall through if either operand is NULL.
! 1712: **
! 1713: ** The SQLITE_AFF_MASK portion of P5 must be an affinity character -
! 1714: ** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made
! 1715: ** to coerce both inputs according to this affinity before the
! 1716: ** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric
! 1717: ** affinity is used. Note that the affinity conversions are stored
! 1718: ** back into the input registers P1 and P3. So this opcode can cause
! 1719: ** persistent changes to registers P1 and P3.
! 1720: **
! 1721: ** Once any conversions have taken place, and neither value is NULL,
! 1722: ** the values are compared. If both values are blobs then memcmp() is
! 1723: ** used to determine the results of the comparison. If both values
! 1724: ** are text, then the appropriate collating function specified in
! 1725: ** P4 is used to do the comparison. If P4 is not specified then
! 1726: ** memcmp() is used to compare text string. If both values are
! 1727: ** numeric, then a numeric comparison is used. If the two values
! 1728: ** are of different types, then numbers are considered less than
! 1729: ** strings and strings are considered less than blobs.
! 1730: **
! 1731: ** If the SQLITE_STOREP2 bit of P5 is set, then do not jump. Instead,
! 1732: ** store a boolean result (either 0, or 1, or NULL) in register P2.
! 1733: */
! 1734: /* Opcode: Ne P1 P2 P3 P4 P5
! 1735: **
! 1736: ** This works just like the Lt opcode except that the jump is taken if
! 1737: ** the operands in registers P1 and P3 are not equal. See the Lt opcode for
! 1738: ** additional information.
! 1739: **
! 1740: ** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
! 1741: ** true or false and is never NULL. If both operands are NULL then the result
! 1742: ** of comparison is false. If either operand is NULL then the result is true.
! 1743: ** If neither operand is NULL the result is the same as it would be if
! 1744: ** the SQLITE_NULLEQ flag were omitted from P5.
! 1745: */
! 1746: /* Opcode: Eq P1 P2 P3 P4 P5
! 1747: **
! 1748: ** This works just like the Lt opcode except that the jump is taken if
! 1749: ** the operands in registers P1 and P3 are equal.
! 1750: ** See the Lt opcode for additional information.
! 1751: **
! 1752: ** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
! 1753: ** true or false and is never NULL. If both operands are NULL then the result
! 1754: ** of comparison is true. If either operand is NULL then the result is false.
! 1755: ** If neither operand is NULL the result is the same as it would be if
! 1756: ** the SQLITE_NULLEQ flag were omitted from P5.
! 1757: */
! 1758: /* Opcode: Le P1 P2 P3 P4 P5
! 1759: **
! 1760: ** This works just like the Lt opcode except that the jump is taken if
! 1761: ** the content of register P3 is less than or equal to the content of
! 1762: ** register P1. See the Lt opcode for additional information.
! 1763: */
! 1764: /* Opcode: Gt P1 P2 P3 P4 P5
! 1765: **
! 1766: ** This works just like the Lt opcode except that the jump is taken if
! 1767: ** the content of register P3 is greater than the content of
! 1768: ** register P1. See the Lt opcode for additional information.
! 1769: */
! 1770: /* Opcode: Ge P1 P2 P3 P4 P5
! 1771: **
! 1772: ** This works just like the Lt opcode except that the jump is taken if
! 1773: ** the content of register P3 is greater than or equal to the content of
! 1774: ** register P1. See the Lt opcode for additional information.
! 1775: */
! 1776: case OP_Eq: /* same as TK_EQ, jump, in1, in3 */
! 1777: case OP_Ne: /* same as TK_NE, jump, in1, in3 */
! 1778: case OP_Lt: /* same as TK_LT, jump, in1, in3 */
! 1779: case OP_Le: /* same as TK_LE, jump, in1, in3 */
! 1780: case OP_Gt: /* same as TK_GT, jump, in1, in3 */
! 1781: case OP_Ge: { /* same as TK_GE, jump, in1, in3 */
! 1782: int res; /* Result of the comparison of pIn1 against pIn3 */
! 1783: char affinity; /* Affinity to use for comparison */
! 1784: u16 flags1; /* Copy of initial value of pIn1->flags */
! 1785: u16 flags3; /* Copy of initial value of pIn3->flags */
! 1786:
! 1787: pIn1 = &aMem[pOp->p1];
! 1788: pIn3 = &aMem[pOp->p3];
! 1789: flags1 = pIn1->flags;
! 1790: flags3 = pIn3->flags;
! 1791: if( (flags1 | flags3)&MEM_Null ){
! 1792: /* One or both operands are NULL */
! 1793: if( pOp->p5 & SQLITE_NULLEQ ){
! 1794: /* If SQLITE_NULLEQ is set (which will only happen if the operator is
! 1795: ** OP_Eq or OP_Ne) then take the jump or not depending on whether
! 1796: ** or not both operands are null.
! 1797: */
! 1798: assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne );
! 1799: res = (flags1 & flags3 & MEM_Null)==0;
! 1800: }else{
! 1801: /* SQLITE_NULLEQ is clear and at least one operand is NULL,
! 1802: ** then the result is always NULL.
! 1803: ** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
! 1804: */
! 1805: if( pOp->p5 & SQLITE_STOREP2 ){
! 1806: pOut = &aMem[pOp->p2];
! 1807: MemSetTypeFlag(pOut, MEM_Null);
! 1808: REGISTER_TRACE(pOp->p2, pOut);
! 1809: }else if( pOp->p5 & SQLITE_JUMPIFNULL ){
! 1810: pc = pOp->p2-1;
! 1811: }
! 1812: break;
! 1813: }
! 1814: }else{
! 1815: /* Neither operand is NULL. Do a comparison. */
! 1816: affinity = pOp->p5 & SQLITE_AFF_MASK;
! 1817: if( affinity ){
! 1818: applyAffinity(pIn1, affinity, encoding);
! 1819: applyAffinity(pIn3, affinity, encoding);
! 1820: if( db->mallocFailed ) goto no_mem;
! 1821: }
! 1822:
! 1823: assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
! 1824: ExpandBlob(pIn1);
! 1825: ExpandBlob(pIn3);
! 1826: res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
! 1827: }
! 1828: switch( pOp->opcode ){
! 1829: case OP_Eq: res = res==0; break;
! 1830: case OP_Ne: res = res!=0; break;
! 1831: case OP_Lt: res = res<0; break;
! 1832: case OP_Le: res = res<=0; break;
! 1833: case OP_Gt: res = res>0; break;
! 1834: default: res = res>=0; break;
! 1835: }
! 1836:
! 1837: if( pOp->p5 & SQLITE_STOREP2 ){
! 1838: pOut = &aMem[pOp->p2];
! 1839: memAboutToChange(p, pOut);
! 1840: MemSetTypeFlag(pOut, MEM_Int);
! 1841: pOut->u.i = res;
! 1842: REGISTER_TRACE(pOp->p2, pOut);
! 1843: }else if( res ){
! 1844: pc = pOp->p2-1;
! 1845: }
! 1846:
! 1847: /* Undo any changes made by applyAffinity() to the input registers. */
! 1848: pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (flags1&MEM_TypeMask);
! 1849: pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (flags3&MEM_TypeMask);
! 1850: break;
! 1851: }
! 1852:
! 1853: /* Opcode: Permutation * * * P4 *
! 1854: **
! 1855: ** Set the permutation used by the OP_Compare operator to be the array
! 1856: ** of integers in P4.
! 1857: **
! 1858: ** The permutation is only valid until the next OP_Permutation, OP_Compare,
! 1859: ** OP_Halt, or OP_ResultRow. Typically the OP_Permutation should occur
! 1860: ** immediately prior to the OP_Compare.
! 1861: */
! 1862: case OP_Permutation: {
! 1863: assert( pOp->p4type==P4_INTARRAY );
! 1864: assert( pOp->p4.ai );
! 1865: aPermute = pOp->p4.ai;
! 1866: break;
! 1867: }
! 1868:
! 1869: /* Opcode: Compare P1 P2 P3 P4 *
! 1870: **
! 1871: ** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this
! 1872: ** vector "A") and in reg(P2)..reg(P2+P3-1) ("B"). Save the result of
! 1873: ** the comparison for use by the next OP_Jump instruct.
! 1874: **
! 1875: ** P4 is a KeyInfo structure that defines collating sequences and sort
! 1876: ** orders for the comparison. The permutation applies to registers
! 1877: ** only. The KeyInfo elements are used sequentially.
! 1878: **
! 1879: ** The comparison is a sort comparison, so NULLs compare equal,
! 1880: ** NULLs are less than numbers, numbers are less than strings,
! 1881: ** and strings are less than blobs.
! 1882: */
! 1883: case OP_Compare: {
! 1884: int n;
! 1885: int i;
! 1886: int p1;
! 1887: int p2;
! 1888: const KeyInfo *pKeyInfo;
! 1889: int idx;
! 1890: CollSeq *pColl; /* Collating sequence to use on this term */
! 1891: int bRev; /* True for DESCENDING sort order */
! 1892:
! 1893: n = pOp->p3;
! 1894: pKeyInfo = pOp->p4.pKeyInfo;
! 1895: assert( n>0 );
! 1896: assert( pKeyInfo!=0 );
! 1897: p1 = pOp->p1;
! 1898: p2 = pOp->p2;
! 1899: #if SQLITE_DEBUG
! 1900: if( aPermute ){
! 1901: int k, mx = 0;
! 1902: for(k=0; k<n; k++) if( aPermute[k]>mx ) mx = aPermute[k];
! 1903: assert( p1>0 && p1+mx<=p->nMem+1 );
! 1904: assert( p2>0 && p2+mx<=p->nMem+1 );
! 1905: }else{
! 1906: assert( p1>0 && p1+n<=p->nMem+1 );
! 1907: assert( p2>0 && p2+n<=p->nMem+1 );
! 1908: }
! 1909: #endif /* SQLITE_DEBUG */
! 1910: for(i=0; i<n; i++){
! 1911: idx = aPermute ? aPermute[i] : i;
! 1912: assert( memIsValid(&aMem[p1+idx]) );
! 1913: assert( memIsValid(&aMem[p2+idx]) );
! 1914: REGISTER_TRACE(p1+idx, &aMem[p1+idx]);
! 1915: REGISTER_TRACE(p2+idx, &aMem[p2+idx]);
! 1916: assert( i<pKeyInfo->nField );
! 1917: pColl = pKeyInfo->aColl[i];
! 1918: bRev = pKeyInfo->aSortOrder[i];
! 1919: iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl);
! 1920: if( iCompare ){
! 1921: if( bRev ) iCompare = -iCompare;
! 1922: break;
! 1923: }
! 1924: }
! 1925: aPermute = 0;
! 1926: break;
! 1927: }
! 1928:
! 1929: /* Opcode: Jump P1 P2 P3 * *
! 1930: **
! 1931: ** Jump to the instruction at address P1, P2, or P3 depending on whether
! 1932: ** in the most recent OP_Compare instruction the P1 vector was less than
! 1933: ** equal to, or greater than the P2 vector, respectively.
! 1934: */
! 1935: case OP_Jump: { /* jump */
! 1936: if( iCompare<0 ){
! 1937: pc = pOp->p1 - 1;
! 1938: }else if( iCompare==0 ){
! 1939: pc = pOp->p2 - 1;
! 1940: }else{
! 1941: pc = pOp->p3 - 1;
! 1942: }
! 1943: break;
! 1944: }
! 1945:
! 1946: /* Opcode: And P1 P2 P3 * *
! 1947: **
! 1948: ** Take the logical AND of the values in registers P1 and P2 and
! 1949: ** write the result into register P3.
! 1950: **
! 1951: ** If either P1 or P2 is 0 (false) then the result is 0 even if
! 1952: ** the other input is NULL. A NULL and true or two NULLs give
! 1953: ** a NULL output.
! 1954: */
! 1955: /* Opcode: Or P1 P2 P3 * *
! 1956: **
! 1957: ** Take the logical OR of the values in register P1 and P2 and
! 1958: ** store the answer in register P3.
! 1959: **
! 1960: ** If either P1 or P2 is nonzero (true) then the result is 1 (true)
! 1961: ** even if the other input is NULL. A NULL and false or two NULLs
! 1962: ** give a NULL output.
! 1963: */
! 1964: case OP_And: /* same as TK_AND, in1, in2, out3 */
! 1965: case OP_Or: { /* same as TK_OR, in1, in2, out3 */
! 1966: int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
! 1967: int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
! 1968:
! 1969: pIn1 = &aMem[pOp->p1];
! 1970: if( pIn1->flags & MEM_Null ){
! 1971: v1 = 2;
! 1972: }else{
! 1973: v1 = sqlite3VdbeIntValue(pIn1)!=0;
! 1974: }
! 1975: pIn2 = &aMem[pOp->p2];
! 1976: if( pIn2->flags & MEM_Null ){
! 1977: v2 = 2;
! 1978: }else{
! 1979: v2 = sqlite3VdbeIntValue(pIn2)!=0;
! 1980: }
! 1981: if( pOp->opcode==OP_And ){
! 1982: static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
! 1983: v1 = and_logic[v1*3+v2];
! 1984: }else{
! 1985: static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
! 1986: v1 = or_logic[v1*3+v2];
! 1987: }
! 1988: pOut = &aMem[pOp->p3];
! 1989: if( v1==2 ){
! 1990: MemSetTypeFlag(pOut, MEM_Null);
! 1991: }else{
! 1992: pOut->u.i = v1;
! 1993: MemSetTypeFlag(pOut, MEM_Int);
! 1994: }
! 1995: break;
! 1996: }
! 1997:
! 1998: /* Opcode: Not P1 P2 * * *
! 1999: **
! 2000: ** Interpret the value in register P1 as a boolean value. Store the
! 2001: ** boolean complement in register P2. If the value in register P1 is
! 2002: ** NULL, then a NULL is stored in P2.
! 2003: */
! 2004: case OP_Not: { /* same as TK_NOT, in1, out2 */
! 2005: pIn1 = &aMem[pOp->p1];
! 2006: pOut = &aMem[pOp->p2];
! 2007: if( pIn1->flags & MEM_Null ){
! 2008: sqlite3VdbeMemSetNull(pOut);
! 2009: }else{
! 2010: sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeIntValue(pIn1));
! 2011: }
! 2012: break;
! 2013: }
! 2014:
! 2015: /* Opcode: BitNot P1 P2 * * *
! 2016: **
! 2017: ** Interpret the content of register P1 as an integer. Store the
! 2018: ** ones-complement of the P1 value into register P2. If P1 holds
! 2019: ** a NULL then store a NULL in P2.
! 2020: */
! 2021: case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */
! 2022: pIn1 = &aMem[pOp->p1];
! 2023: pOut = &aMem[pOp->p2];
! 2024: if( pIn1->flags & MEM_Null ){
! 2025: sqlite3VdbeMemSetNull(pOut);
! 2026: }else{
! 2027: sqlite3VdbeMemSetInt64(pOut, ~sqlite3VdbeIntValue(pIn1));
! 2028: }
! 2029: break;
! 2030: }
! 2031:
! 2032: /* Opcode: Once P1 P2 * * *
! 2033: **
! 2034: ** Check if OP_Once flag P1 is set. If so, jump to instruction P2. Otherwise,
! 2035: ** set the flag and fall through to the next instruction.
! 2036: **
! 2037: ** See also: JumpOnce
! 2038: */
! 2039: case OP_Once: { /* jump */
! 2040: assert( pOp->p1<p->nOnceFlag );
! 2041: if( p->aOnceFlag[pOp->p1] ){
! 2042: pc = pOp->p2-1;
! 2043: }else{
! 2044: p->aOnceFlag[pOp->p1] = 1;
! 2045: }
! 2046: break;
! 2047: }
! 2048:
! 2049: /* Opcode: If P1 P2 P3 * *
! 2050: **
! 2051: ** Jump to P2 if the value in register P1 is true. The value
! 2052: ** is considered true if it is numeric and non-zero. If the value
! 2053: ** in P1 is NULL then take the jump if P3 is non-zero.
! 2054: */
! 2055: /* Opcode: IfNot P1 P2 P3 * *
! 2056: **
! 2057: ** Jump to P2 if the value in register P1 is False. The value
! 2058: ** is considered false if it has a numeric value of zero. If the value
! 2059: ** in P1 is NULL then take the jump if P3 is zero.
! 2060: */
! 2061: case OP_If: /* jump, in1 */
! 2062: case OP_IfNot: { /* jump, in1 */
! 2063: int c;
! 2064: pIn1 = &aMem[pOp->p1];
! 2065: if( pIn1->flags & MEM_Null ){
! 2066: c = pOp->p3;
! 2067: }else{
! 2068: #ifdef SQLITE_OMIT_FLOATING_POINT
! 2069: c = sqlite3VdbeIntValue(pIn1)!=0;
! 2070: #else
! 2071: c = sqlite3VdbeRealValue(pIn1)!=0.0;
! 2072: #endif
! 2073: if( pOp->opcode==OP_IfNot ) c = !c;
! 2074: }
! 2075: if( c ){
! 2076: pc = pOp->p2-1;
! 2077: }
! 2078: break;
! 2079: }
! 2080:
! 2081: /* Opcode: IsNull P1 P2 * * *
! 2082: **
! 2083: ** Jump to P2 if the value in register P1 is NULL.
! 2084: */
! 2085: case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */
! 2086: pIn1 = &aMem[pOp->p1];
! 2087: if( (pIn1->flags & MEM_Null)!=0 ){
! 2088: pc = pOp->p2 - 1;
! 2089: }
! 2090: break;
! 2091: }
! 2092:
! 2093: /* Opcode: NotNull P1 P2 * * *
! 2094: **
! 2095: ** Jump to P2 if the value in register P1 is not NULL.
! 2096: */
! 2097: case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */
! 2098: pIn1 = &aMem[pOp->p1];
! 2099: if( (pIn1->flags & MEM_Null)==0 ){
! 2100: pc = pOp->p2 - 1;
! 2101: }
! 2102: break;
! 2103: }
! 2104:
! 2105: /* Opcode: Column P1 P2 P3 P4 P5
! 2106: **
! 2107: ** Interpret the data that cursor P1 points to as a structure built using
! 2108: ** the MakeRecord instruction. (See the MakeRecord opcode for additional
! 2109: ** information about the format of the data.) Extract the P2-th column
! 2110: ** from this record. If there are less that (P2+1)
! 2111: ** values in the record, extract a NULL.
! 2112: **
! 2113: ** The value extracted is stored in register P3.
! 2114: **
! 2115: ** If the column contains fewer than P2 fields, then extract a NULL. Or,
! 2116: ** if the P4 argument is a P4_MEM use the value of the P4 argument as
! 2117: ** the result.
! 2118: **
! 2119: ** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor,
! 2120: ** then the cache of the cursor is reset prior to extracting the column.
! 2121: ** The first OP_Column against a pseudo-table after the value of the content
! 2122: ** register has changed should have this bit set.
! 2123: */
! 2124: case OP_Column: {
! 2125: u32 payloadSize; /* Number of bytes in the record */
! 2126: i64 payloadSize64; /* Number of bytes in the record */
! 2127: int p1; /* P1 value of the opcode */
! 2128: int p2; /* column number to retrieve */
! 2129: VdbeCursor *pC; /* The VDBE cursor */
! 2130: char *zRec; /* Pointer to complete record-data */
! 2131: BtCursor *pCrsr; /* The BTree cursor */
! 2132: u32 *aType; /* aType[i] holds the numeric type of the i-th column */
! 2133: u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */
! 2134: int nField; /* number of fields in the record */
! 2135: int len; /* The length of the serialized data for the column */
! 2136: int i; /* Loop counter */
! 2137: char *zData; /* Part of the record being decoded */
! 2138: Mem *pDest; /* Where to write the extracted value */
! 2139: Mem sMem; /* For storing the record being decoded */
! 2140: u8 *zIdx; /* Index into header */
! 2141: u8 *zEndHdr; /* Pointer to first byte after the header */
! 2142: u32 offset; /* Offset into the data */
! 2143: u32 szField; /* Number of bytes in the content of a field */
! 2144: int szHdr; /* Size of the header size field at start of record */
! 2145: int avail; /* Number of bytes of available data */
! 2146: u32 t; /* A type code from the record header */
! 2147: Mem *pReg; /* PseudoTable input register */
! 2148:
! 2149:
! 2150: p1 = pOp->p1;
! 2151: p2 = pOp->p2;
! 2152: pC = 0;
! 2153: memset(&sMem, 0, sizeof(sMem));
! 2154: assert( p1<p->nCursor );
! 2155: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 2156: pDest = &aMem[pOp->p3];
! 2157: memAboutToChange(p, pDest);
! 2158: zRec = 0;
! 2159:
! 2160: /* This block sets the variable payloadSize to be the total number of
! 2161: ** bytes in the record.
! 2162: **
! 2163: ** zRec is set to be the complete text of the record if it is available.
! 2164: ** The complete record text is always available for pseudo-tables
! 2165: ** If the record is stored in a cursor, the complete record text
! 2166: ** might be available in the pC->aRow cache. Or it might not be.
! 2167: ** If the data is unavailable, zRec is set to NULL.
! 2168: **
! 2169: ** We also compute the number of columns in the record. For cursors,
! 2170: ** the number of columns is stored in the VdbeCursor.nField element.
! 2171: */
! 2172: pC = p->apCsr[p1];
! 2173: assert( pC!=0 );
! 2174: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 2175: assert( pC->pVtabCursor==0 );
! 2176: #endif
! 2177: pCrsr = pC->pCursor;
! 2178: if( pCrsr!=0 ){
! 2179: /* The record is stored in a B-Tree */
! 2180: rc = sqlite3VdbeCursorMoveto(pC);
! 2181: if( rc ) goto abort_due_to_error;
! 2182: if( pC->nullRow ){
! 2183: payloadSize = 0;
! 2184: }else if( pC->cacheStatus==p->cacheCtr ){
! 2185: payloadSize = pC->payloadSize;
! 2186: zRec = (char*)pC->aRow;
! 2187: }else if( pC->isIndex ){
! 2188: assert( sqlite3BtreeCursorIsValid(pCrsr) );
! 2189: VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &payloadSize64);
! 2190: assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
! 2191: /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
! 2192: ** payload size, so it is impossible for payloadSize64 to be
! 2193: ** larger than 32 bits. */
! 2194: assert( (payloadSize64 & SQLITE_MAX_U32)==(u64)payloadSize64 );
! 2195: payloadSize = (u32)payloadSize64;
! 2196: }else{
! 2197: assert( sqlite3BtreeCursorIsValid(pCrsr) );
! 2198: VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &payloadSize);
! 2199: assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
! 2200: }
! 2201: }else if( ALWAYS(pC->pseudoTableReg>0) ){
! 2202: pReg = &aMem[pC->pseudoTableReg];
! 2203: assert( pReg->flags & MEM_Blob );
! 2204: assert( memIsValid(pReg) );
! 2205: payloadSize = pReg->n;
! 2206: zRec = pReg->z;
! 2207: pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr;
! 2208: assert( payloadSize==0 || zRec!=0 );
! 2209: }else{
! 2210: /* Consider the row to be NULL */
! 2211: payloadSize = 0;
! 2212: }
! 2213:
! 2214: /* If payloadSize is 0, then just store a NULL. This can happen because of
! 2215: ** nullRow or because of a corrupt database. */
! 2216: if( payloadSize==0 ){
! 2217: MemSetTypeFlag(pDest, MEM_Null);
! 2218: goto op_column_out;
! 2219: }
! 2220: assert( db->aLimit[SQLITE_LIMIT_LENGTH]>=0 );
! 2221: if( payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 2222: goto too_big;
! 2223: }
! 2224:
! 2225: nField = pC->nField;
! 2226: assert( p2<nField );
! 2227:
! 2228: /* Read and parse the table header. Store the results of the parse
! 2229: ** into the record header cache fields of the cursor.
! 2230: */
! 2231: aType = pC->aType;
! 2232: if( pC->cacheStatus==p->cacheCtr ){
! 2233: aOffset = pC->aOffset;
! 2234: }else{
! 2235: assert(aType);
! 2236: avail = 0;
! 2237: pC->aOffset = aOffset = &aType[nField];
! 2238: pC->payloadSize = payloadSize;
! 2239: pC->cacheStatus = p->cacheCtr;
! 2240:
! 2241: /* Figure out how many bytes are in the header */
! 2242: if( zRec ){
! 2243: zData = zRec;
! 2244: }else{
! 2245: if( pC->isIndex ){
! 2246: zData = (char*)sqlite3BtreeKeyFetch(pCrsr, &avail);
! 2247: }else{
! 2248: zData = (char*)sqlite3BtreeDataFetch(pCrsr, &avail);
! 2249: }
! 2250: /* If KeyFetch()/DataFetch() managed to get the entire payload,
! 2251: ** save the payload in the pC->aRow cache. That will save us from
! 2252: ** having to make additional calls to fetch the content portion of
! 2253: ** the record.
! 2254: */
! 2255: assert( avail>=0 );
! 2256: if( payloadSize <= (u32)avail ){
! 2257: zRec = zData;
! 2258: pC->aRow = (u8*)zData;
! 2259: }else{
! 2260: pC->aRow = 0;
! 2261: }
! 2262: }
! 2263: /* The following assert is true in all cases accept when
! 2264: ** the database file has been corrupted externally.
! 2265: ** assert( zRec!=0 || avail>=payloadSize || avail>=9 ); */
! 2266: szHdr = getVarint32((u8*)zData, offset);
! 2267:
! 2268: /* Make sure a corrupt database has not given us an oversize header.
! 2269: ** Do this now to avoid an oversize memory allocation.
! 2270: **
! 2271: ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte
! 2272: ** types use so much data space that there can only be 4096 and 32 of
! 2273: ** them, respectively. So the maximum header length results from a
! 2274: ** 3-byte type for each of the maximum of 32768 columns plus three
! 2275: ** extra bytes for the header length itself. 32768*3 + 3 = 98307.
! 2276: */
! 2277: if( offset > 98307 ){
! 2278: rc = SQLITE_CORRUPT_BKPT;
! 2279: goto op_column_out;
! 2280: }
! 2281:
! 2282: /* Compute in len the number of bytes of data we need to read in order
! 2283: ** to get nField type values. offset is an upper bound on this. But
! 2284: ** nField might be significantly less than the true number of columns
! 2285: ** in the table, and in that case, 5*nField+3 might be smaller than offset.
! 2286: ** We want to minimize len in order to limit the size of the memory
! 2287: ** allocation, especially if a corrupt database file has caused offset
! 2288: ** to be oversized. Offset is limited to 98307 above. But 98307 might
! 2289: ** still exceed Robson memory allocation limits on some configurations.
! 2290: ** On systems that cannot tolerate large memory allocations, nField*5+3
! 2291: ** will likely be much smaller since nField will likely be less than
! 2292: ** 20 or so. This insures that Robson memory allocation limits are
! 2293: ** not exceeded even for corrupt database files.
! 2294: */
! 2295: len = nField*5 + 3;
! 2296: if( len > (int)offset ) len = (int)offset;
! 2297:
! 2298: /* The KeyFetch() or DataFetch() above are fast and will get the entire
! 2299: ** record header in most cases. But they will fail to get the complete
! 2300: ** record header if the record header does not fit on a single page
! 2301: ** in the B-Tree. When that happens, use sqlite3VdbeMemFromBtree() to
! 2302: ** acquire the complete header text.
! 2303: */
! 2304: if( !zRec && avail<len ){
! 2305: sMem.flags = 0;
! 2306: sMem.db = 0;
! 2307: rc = sqlite3VdbeMemFromBtree(pCrsr, 0, len, pC->isIndex, &sMem);
! 2308: if( rc!=SQLITE_OK ){
! 2309: goto op_column_out;
! 2310: }
! 2311: zData = sMem.z;
! 2312: }
! 2313: zEndHdr = (u8 *)&zData[len];
! 2314: zIdx = (u8 *)&zData[szHdr];
! 2315:
! 2316: /* Scan the header and use it to fill in the aType[] and aOffset[]
! 2317: ** arrays. aType[i] will contain the type integer for the i-th
! 2318: ** column and aOffset[i] will contain the offset from the beginning
! 2319: ** of the record to the start of the data for the i-th column
! 2320: */
! 2321: for(i=0; i<nField; i++){
! 2322: if( zIdx<zEndHdr ){
! 2323: aOffset[i] = offset;
! 2324: if( zIdx[0]<0x80 ){
! 2325: t = zIdx[0];
! 2326: zIdx++;
! 2327: }else{
! 2328: zIdx += sqlite3GetVarint32(zIdx, &t);
! 2329: }
! 2330: aType[i] = t;
! 2331: szField = sqlite3VdbeSerialTypeLen(t);
! 2332: offset += szField;
! 2333: if( offset<szField ){ /* True if offset overflows */
! 2334: zIdx = &zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */
! 2335: break;
! 2336: }
! 2337: }else{
! 2338: /* If i is less that nField, then there are less fields in this
! 2339: ** record than SetNumColumns indicated there are columns in the
! 2340: ** table. Set the offset for any extra columns not present in
! 2341: ** the record to 0. This tells code below to store a NULL
! 2342: ** instead of deserializing a value from the record.
! 2343: */
! 2344: aOffset[i] = 0;
! 2345: }
! 2346: }
! 2347: sqlite3VdbeMemRelease(&sMem);
! 2348: sMem.flags = MEM_Null;
! 2349:
! 2350: /* If we have read more header data than was contained in the header,
! 2351: ** or if the end of the last field appears to be past the end of the
! 2352: ** record, or if the end of the last field appears to be before the end
! 2353: ** of the record (when all fields present), then we must be dealing
! 2354: ** with a corrupt database.
! 2355: */
! 2356: if( (zIdx > zEndHdr) || (offset > payloadSize)
! 2357: || (zIdx==zEndHdr && offset!=payloadSize) ){
! 2358: rc = SQLITE_CORRUPT_BKPT;
! 2359: goto op_column_out;
! 2360: }
! 2361: }
! 2362:
! 2363: /* Get the column information. If aOffset[p2] is non-zero, then
! 2364: ** deserialize the value from the record. If aOffset[p2] is zero,
! 2365: ** then there are not enough fields in the record to satisfy the
! 2366: ** request. In this case, set the value NULL or to P4 if P4 is
! 2367: ** a pointer to a Mem object.
! 2368: */
! 2369: if( aOffset[p2] ){
! 2370: assert( rc==SQLITE_OK );
! 2371: if( zRec ){
! 2372: VdbeMemRelease(pDest);
! 2373: sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], pDest);
! 2374: }else{
! 2375: len = sqlite3VdbeSerialTypeLen(aType[p2]);
! 2376: sqlite3VdbeMemMove(&sMem, pDest);
! 2377: rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, pC->isIndex, &sMem);
! 2378: if( rc!=SQLITE_OK ){
! 2379: goto op_column_out;
! 2380: }
! 2381: zData = sMem.z;
! 2382: sqlite3VdbeSerialGet((u8*)zData, aType[p2], pDest);
! 2383: }
! 2384: pDest->enc = encoding;
! 2385: }else{
! 2386: if( pOp->p4type==P4_MEM ){
! 2387: sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static);
! 2388: }else{
! 2389: MemSetTypeFlag(pDest, MEM_Null);
! 2390: }
! 2391: }
! 2392:
! 2393: /* If we dynamically allocated space to hold the data (in the
! 2394: ** sqlite3VdbeMemFromBtree() call above) then transfer control of that
! 2395: ** dynamically allocated space over to the pDest structure.
! 2396: ** This prevents a memory copy.
! 2397: */
! 2398: if( sMem.zMalloc ){
! 2399: assert( sMem.z==sMem.zMalloc );
! 2400: assert( !(pDest->flags & MEM_Dyn) );
! 2401: assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z );
! 2402: pDest->flags &= ~(MEM_Ephem|MEM_Static);
! 2403: pDest->flags |= MEM_Term;
! 2404: pDest->z = sMem.z;
! 2405: pDest->zMalloc = sMem.zMalloc;
! 2406: }
! 2407:
! 2408: rc = sqlite3VdbeMemMakeWriteable(pDest);
! 2409:
! 2410: op_column_out:
! 2411: UPDATE_MAX_BLOBSIZE(pDest);
! 2412: REGISTER_TRACE(pOp->p3, pDest);
! 2413: break;
! 2414: }
! 2415:
! 2416: /* Opcode: Affinity P1 P2 * P4 *
! 2417: **
! 2418: ** Apply affinities to a range of P2 registers starting with P1.
! 2419: **
! 2420: ** P4 is a string that is P2 characters long. The nth character of the
! 2421: ** string indicates the column affinity that should be used for the nth
! 2422: ** memory cell in the range.
! 2423: */
! 2424: case OP_Affinity: {
! 2425: const char *zAffinity; /* The affinity to be applied */
! 2426: char cAff; /* A single character of affinity */
! 2427:
! 2428: zAffinity = pOp->p4.z;
! 2429: assert( zAffinity!=0 );
! 2430: assert( zAffinity[pOp->p2]==0 );
! 2431: pIn1 = &aMem[pOp->p1];
! 2432: while( (cAff = *(zAffinity++))!=0 ){
! 2433: assert( pIn1 <= &p->aMem[p->nMem] );
! 2434: assert( memIsValid(pIn1) );
! 2435: ExpandBlob(pIn1);
! 2436: applyAffinity(pIn1, cAff, encoding);
! 2437: pIn1++;
! 2438: }
! 2439: break;
! 2440: }
! 2441:
! 2442: /* Opcode: MakeRecord P1 P2 P3 P4 *
! 2443: **
! 2444: ** Convert P2 registers beginning with P1 into the [record format]
! 2445: ** use as a data record in a database table or as a key
! 2446: ** in an index. The OP_Column opcode can decode the record later.
! 2447: **
! 2448: ** P4 may be a string that is P2 characters long. The nth character of the
! 2449: ** string indicates the column affinity that should be used for the nth
! 2450: ** field of the index key.
! 2451: **
! 2452: ** The mapping from character to affinity is given by the SQLITE_AFF_
! 2453: ** macros defined in sqliteInt.h.
! 2454: **
! 2455: ** If P4 is NULL then all index fields have the affinity NONE.
! 2456: */
! 2457: case OP_MakeRecord: {
! 2458: u8 *zNewRecord; /* A buffer to hold the data for the new record */
! 2459: Mem *pRec; /* The new record */
! 2460: u64 nData; /* Number of bytes of data space */
! 2461: int nHdr; /* Number of bytes of header space */
! 2462: i64 nByte; /* Data space required for this record */
! 2463: int nZero; /* Number of zero bytes at the end of the record */
! 2464: int nVarint; /* Number of bytes in a varint */
! 2465: u32 serial_type; /* Type field */
! 2466: Mem *pData0; /* First field to be combined into the record */
! 2467: Mem *pLast; /* Last field of the record */
! 2468: int nField; /* Number of fields in the record */
! 2469: char *zAffinity; /* The affinity string for the record */
! 2470: int file_format; /* File format to use for encoding */
! 2471: int i; /* Space used in zNewRecord[] */
! 2472: int len; /* Length of a field */
! 2473:
! 2474: /* Assuming the record contains N fields, the record format looks
! 2475: ** like this:
! 2476: **
! 2477: ** ------------------------------------------------------------------------
! 2478: ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
! 2479: ** ------------------------------------------------------------------------
! 2480: **
! 2481: ** Data(0) is taken from register P1. Data(1) comes from register P1+1
! 2482: ** and so froth.
! 2483: **
! 2484: ** Each type field is a varint representing the serial type of the
! 2485: ** corresponding data element (see sqlite3VdbeSerialType()). The
! 2486: ** hdr-size field is also a varint which is the offset from the beginning
! 2487: ** of the record to data0.
! 2488: */
! 2489: nData = 0; /* Number of bytes of data space */
! 2490: nHdr = 0; /* Number of bytes of header space */
! 2491: nZero = 0; /* Number of zero bytes at the end of the record */
! 2492: nField = pOp->p1;
! 2493: zAffinity = pOp->p4.z;
! 2494: assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=p->nMem+1 );
! 2495: pData0 = &aMem[nField];
! 2496: nField = pOp->p2;
! 2497: pLast = &pData0[nField-1];
! 2498: file_format = p->minWriteFileFormat;
! 2499:
! 2500: /* Identify the output register */
! 2501: assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
! 2502: pOut = &aMem[pOp->p3];
! 2503: memAboutToChange(p, pOut);
! 2504:
! 2505: /* Loop through the elements that will make up the record to figure
! 2506: ** out how much space is required for the new record.
! 2507: */
! 2508: for(pRec=pData0; pRec<=pLast; pRec++){
! 2509: assert( memIsValid(pRec) );
! 2510: if( zAffinity ){
! 2511: applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
! 2512: }
! 2513: if( pRec->flags&MEM_Zero && pRec->n>0 ){
! 2514: sqlite3VdbeMemExpandBlob(pRec);
! 2515: }
! 2516: serial_type = sqlite3VdbeSerialType(pRec, file_format);
! 2517: len = sqlite3VdbeSerialTypeLen(serial_type);
! 2518: nData += len;
! 2519: nHdr += sqlite3VarintLen(serial_type);
! 2520: if( pRec->flags & MEM_Zero ){
! 2521: /* Only pure zero-filled BLOBs can be input to this Opcode.
! 2522: ** We do not allow blobs with a prefix and a zero-filled tail. */
! 2523: nZero += pRec->u.nZero;
! 2524: }else if( len ){
! 2525: nZero = 0;
! 2526: }
! 2527: }
! 2528:
! 2529: /* Add the initial header varint and total the size */
! 2530: nHdr += nVarint = sqlite3VarintLen(nHdr);
! 2531: if( nVarint<sqlite3VarintLen(nHdr) ){
! 2532: nHdr++;
! 2533: }
! 2534: nByte = nHdr+nData-nZero;
! 2535: if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 2536: goto too_big;
! 2537: }
! 2538:
! 2539: /* Make sure the output register has a buffer large enough to store
! 2540: ** the new record. The output register (pOp->p3) is not allowed to
! 2541: ** be one of the input registers (because the following call to
! 2542: ** sqlite3VdbeMemGrow() could clobber the value before it is used).
! 2543: */
! 2544: if( sqlite3VdbeMemGrow(pOut, (int)nByte, 0) ){
! 2545: goto no_mem;
! 2546: }
! 2547: zNewRecord = (u8 *)pOut->z;
! 2548:
! 2549: /* Write the record */
! 2550: i = putVarint32(zNewRecord, nHdr);
! 2551: for(pRec=pData0; pRec<=pLast; pRec++){
! 2552: serial_type = sqlite3VdbeSerialType(pRec, file_format);
! 2553: i += putVarint32(&zNewRecord[i], serial_type); /* serial type */
! 2554: }
! 2555: for(pRec=pData0; pRec<=pLast; pRec++){ /* serial data */
! 2556: i += sqlite3VdbeSerialPut(&zNewRecord[i], (int)(nByte-i), pRec,file_format);
! 2557: }
! 2558: assert( i==nByte );
! 2559:
! 2560: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 2561: pOut->n = (int)nByte;
! 2562: pOut->flags = MEM_Blob | MEM_Dyn;
! 2563: pOut->xDel = 0;
! 2564: if( nZero ){
! 2565: pOut->u.nZero = nZero;
! 2566: pOut->flags |= MEM_Zero;
! 2567: }
! 2568: pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */
! 2569: REGISTER_TRACE(pOp->p3, pOut);
! 2570: UPDATE_MAX_BLOBSIZE(pOut);
! 2571: break;
! 2572: }
! 2573:
! 2574: /* Opcode: Count P1 P2 * * *
! 2575: **
! 2576: ** Store the number of entries (an integer value) in the table or index
! 2577: ** opened by cursor P1 in register P2
! 2578: */
! 2579: #ifndef SQLITE_OMIT_BTREECOUNT
! 2580: case OP_Count: { /* out2-prerelease */
! 2581: i64 nEntry;
! 2582: BtCursor *pCrsr;
! 2583:
! 2584: pCrsr = p->apCsr[pOp->p1]->pCursor;
! 2585: if( ALWAYS(pCrsr) ){
! 2586: rc = sqlite3BtreeCount(pCrsr, &nEntry);
! 2587: }else{
! 2588: nEntry = 0;
! 2589: }
! 2590: pOut->u.i = nEntry;
! 2591: break;
! 2592: }
! 2593: #endif
! 2594:
! 2595: /* Opcode: Savepoint P1 * * P4 *
! 2596: **
! 2597: ** Open, release or rollback the savepoint named by parameter P4, depending
! 2598: ** on the value of P1. To open a new savepoint, P1==0. To release (commit) an
! 2599: ** existing savepoint, P1==1, or to rollback an existing savepoint P1==2.
! 2600: */
! 2601: case OP_Savepoint: {
! 2602: int p1; /* Value of P1 operand */
! 2603: char *zName; /* Name of savepoint */
! 2604: int nName;
! 2605: Savepoint *pNew;
! 2606: Savepoint *pSavepoint;
! 2607: Savepoint *pTmp;
! 2608: int iSavepoint;
! 2609: int ii;
! 2610:
! 2611: p1 = pOp->p1;
! 2612: zName = pOp->p4.z;
! 2613:
! 2614: /* Assert that the p1 parameter is valid. Also that if there is no open
! 2615: ** transaction, then there cannot be any savepoints.
! 2616: */
! 2617: assert( db->pSavepoint==0 || db->autoCommit==0 );
! 2618: assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK );
! 2619: assert( db->pSavepoint || db->isTransactionSavepoint==0 );
! 2620: assert( checkSavepointCount(db) );
! 2621:
! 2622: if( p1==SAVEPOINT_BEGIN ){
! 2623: if( db->writeVdbeCnt>0 ){
! 2624: /* A new savepoint cannot be created if there are active write
! 2625: ** statements (i.e. open read/write incremental blob handles).
! 2626: */
! 2627: sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - "
! 2628: "SQL statements in progress");
! 2629: rc = SQLITE_BUSY;
! 2630: }else{
! 2631: nName = sqlite3Strlen30(zName);
! 2632:
! 2633: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 2634: /* This call is Ok even if this savepoint is actually a transaction
! 2635: ** savepoint (and therefore should not prompt xSavepoint()) callbacks.
! 2636: ** If this is a transaction savepoint being opened, it is guaranteed
! 2637: ** that the db->aVTrans[] array is empty. */
! 2638: assert( db->autoCommit==0 || db->nVTrans==0 );
! 2639: rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN,
! 2640: db->nStatement+db->nSavepoint);
! 2641: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 2642: #endif
! 2643:
! 2644: /* Create a new savepoint structure. */
! 2645: pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+nName+1);
! 2646: if( pNew ){
! 2647: pNew->zName = (char *)&pNew[1];
! 2648: memcpy(pNew->zName, zName, nName+1);
! 2649:
! 2650: /* If there is no open transaction, then mark this as a special
! 2651: ** "transaction savepoint". */
! 2652: if( db->autoCommit ){
! 2653: db->autoCommit = 0;
! 2654: db->isTransactionSavepoint = 1;
! 2655: }else{
! 2656: db->nSavepoint++;
! 2657: }
! 2658:
! 2659: /* Link the new savepoint into the database handle's list. */
! 2660: pNew->pNext = db->pSavepoint;
! 2661: db->pSavepoint = pNew;
! 2662: pNew->nDeferredCons = db->nDeferredCons;
! 2663: }
! 2664: }
! 2665: }else{
! 2666: iSavepoint = 0;
! 2667:
! 2668: /* Find the named savepoint. If there is no such savepoint, then an
! 2669: ** an error is returned to the user. */
! 2670: for(
! 2671: pSavepoint = db->pSavepoint;
! 2672: pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName);
! 2673: pSavepoint = pSavepoint->pNext
! 2674: ){
! 2675: iSavepoint++;
! 2676: }
! 2677: if( !pSavepoint ){
! 2678: sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", zName);
! 2679: rc = SQLITE_ERROR;
! 2680: }else if(
! 2681: db->writeVdbeCnt>0 || (p1==SAVEPOINT_ROLLBACK && db->activeVdbeCnt>1)
! 2682: ){
! 2683: /* It is not possible to release (commit) a savepoint if there are
! 2684: ** active write statements. It is not possible to rollback a savepoint
! 2685: ** if there are any active statements at all.
! 2686: */
! 2687: sqlite3SetString(&p->zErrMsg, db,
! 2688: "cannot %s savepoint - SQL statements in progress",
! 2689: (p1==SAVEPOINT_ROLLBACK ? "rollback": "release")
! 2690: );
! 2691: rc = SQLITE_BUSY;
! 2692: }else{
! 2693:
! 2694: /* Determine whether or not this is a transaction savepoint. If so,
! 2695: ** and this is a RELEASE command, then the current transaction
! 2696: ** is committed.
! 2697: */
! 2698: int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint;
! 2699: if( isTransaction && p1==SAVEPOINT_RELEASE ){
! 2700: if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
! 2701: goto vdbe_return;
! 2702: }
! 2703: db->autoCommit = 1;
! 2704: if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
! 2705: p->pc = pc;
! 2706: db->autoCommit = 0;
! 2707: p->rc = rc = SQLITE_BUSY;
! 2708: goto vdbe_return;
! 2709: }
! 2710: db->isTransactionSavepoint = 0;
! 2711: rc = p->rc;
! 2712: }else{
! 2713: iSavepoint = db->nSavepoint - iSavepoint - 1;
! 2714: for(ii=0; ii<db->nDb; ii++){
! 2715: rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint);
! 2716: if( rc!=SQLITE_OK ){
! 2717: goto abort_due_to_error;
! 2718: }
! 2719: }
! 2720: if( p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){
! 2721: sqlite3ExpirePreparedStatements(db);
! 2722: sqlite3ResetInternalSchema(db, -1);
! 2723: db->flags = (db->flags | SQLITE_InternChanges);
! 2724: }
! 2725: }
! 2726:
! 2727: /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all
! 2728: ** savepoints nested inside of the savepoint being operated on. */
! 2729: while( db->pSavepoint!=pSavepoint ){
! 2730: pTmp = db->pSavepoint;
! 2731: db->pSavepoint = pTmp->pNext;
! 2732: sqlite3DbFree(db, pTmp);
! 2733: db->nSavepoint--;
! 2734: }
! 2735:
! 2736: /* If it is a RELEASE, then destroy the savepoint being operated on
! 2737: ** too. If it is a ROLLBACK TO, then set the number of deferred
! 2738: ** constraint violations present in the database to the value stored
! 2739: ** when the savepoint was created. */
! 2740: if( p1==SAVEPOINT_RELEASE ){
! 2741: assert( pSavepoint==db->pSavepoint );
! 2742: db->pSavepoint = pSavepoint->pNext;
! 2743: sqlite3DbFree(db, pSavepoint);
! 2744: if( !isTransaction ){
! 2745: db->nSavepoint--;
! 2746: }
! 2747: }else{
! 2748: db->nDeferredCons = pSavepoint->nDeferredCons;
! 2749: }
! 2750:
! 2751: if( !isTransaction ){
! 2752: rc = sqlite3VtabSavepoint(db, p1, iSavepoint);
! 2753: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 2754: }
! 2755: }
! 2756: }
! 2757:
! 2758: break;
! 2759: }
! 2760:
! 2761: /* Opcode: AutoCommit P1 P2 * * *
! 2762: **
! 2763: ** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
! 2764: ** back any currently active btree transactions. If there are any active
! 2765: ** VMs (apart from this one), then a ROLLBACK fails. A COMMIT fails if
! 2766: ** there are active writing VMs or active VMs that use shared cache.
! 2767: **
! 2768: ** This instruction causes the VM to halt.
! 2769: */
! 2770: case OP_AutoCommit: {
! 2771: int desiredAutoCommit;
! 2772: int iRollback;
! 2773: int turnOnAC;
! 2774:
! 2775: desiredAutoCommit = pOp->p1;
! 2776: iRollback = pOp->p2;
! 2777: turnOnAC = desiredAutoCommit && !db->autoCommit;
! 2778: assert( desiredAutoCommit==1 || desiredAutoCommit==0 );
! 2779: assert( desiredAutoCommit==1 || iRollback==0 );
! 2780: assert( db->activeVdbeCnt>0 ); /* At least this one VM is active */
! 2781:
! 2782: if( turnOnAC && iRollback && db->activeVdbeCnt>1 ){
! 2783: /* If this instruction implements a ROLLBACK and other VMs are
! 2784: ** still running, and a transaction is active, return an error indicating
! 2785: ** that the other VMs must complete first.
! 2786: */
! 2787: sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - "
! 2788: "SQL statements in progress");
! 2789: rc = SQLITE_BUSY;
! 2790: }else if( turnOnAC && !iRollback && db->writeVdbeCnt>0 ){
! 2791: /* If this instruction implements a COMMIT and other VMs are writing
! 2792: ** return an error indicating that the other VMs must complete first.
! 2793: */
! 2794: sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - "
! 2795: "SQL statements in progress");
! 2796: rc = SQLITE_BUSY;
! 2797: }else if( desiredAutoCommit!=db->autoCommit ){
! 2798: if( iRollback ){
! 2799: assert( desiredAutoCommit==1 );
! 2800: sqlite3RollbackAll(db);
! 2801: db->autoCommit = 1;
! 2802: }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
! 2803: goto vdbe_return;
! 2804: }else{
! 2805: db->autoCommit = (u8)desiredAutoCommit;
! 2806: if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
! 2807: p->pc = pc;
! 2808: db->autoCommit = (u8)(1-desiredAutoCommit);
! 2809: p->rc = rc = SQLITE_BUSY;
! 2810: goto vdbe_return;
! 2811: }
! 2812: }
! 2813: assert( db->nStatement==0 );
! 2814: sqlite3CloseSavepoints(db);
! 2815: if( p->rc==SQLITE_OK ){
! 2816: rc = SQLITE_DONE;
! 2817: }else{
! 2818: rc = SQLITE_ERROR;
! 2819: }
! 2820: goto vdbe_return;
! 2821: }else{
! 2822: sqlite3SetString(&p->zErrMsg, db,
! 2823: (!desiredAutoCommit)?"cannot start a transaction within a transaction":(
! 2824: (iRollback)?"cannot rollback - no transaction is active":
! 2825: "cannot commit - no transaction is active"));
! 2826:
! 2827: rc = SQLITE_ERROR;
! 2828: }
! 2829: break;
! 2830: }
! 2831:
! 2832: /* Opcode: Transaction P1 P2 * * *
! 2833: **
! 2834: ** Begin a transaction. The transaction ends when a Commit or Rollback
! 2835: ** opcode is encountered. Depending on the ON CONFLICT setting, the
! 2836: ** transaction might also be rolled back if an error is encountered.
! 2837: **
! 2838: ** P1 is the index of the database file on which the transaction is
! 2839: ** started. Index 0 is the main database file and index 1 is the
! 2840: ** file used for temporary tables. Indices of 2 or more are used for
! 2841: ** attached databases.
! 2842: **
! 2843: ** If P2 is non-zero, then a write-transaction is started. A RESERVED lock is
! 2844: ** obtained on the database file when a write-transaction is started. No
! 2845: ** other process can start another write transaction while this transaction is
! 2846: ** underway. Starting a write transaction also creates a rollback journal. A
! 2847: ** write transaction must be started before any changes can be made to the
! 2848: ** database. If P2 is 2 or greater then an EXCLUSIVE lock is also obtained
! 2849: ** on the file.
! 2850: **
! 2851: ** If a write-transaction is started and the Vdbe.usesStmtJournal flag is
! 2852: ** true (this flag is set if the Vdbe may modify more than one row and may
! 2853: ** throw an ABORT exception), a statement transaction may also be opened.
! 2854: ** More specifically, a statement transaction is opened iff the database
! 2855: ** connection is currently not in autocommit mode, or if there are other
! 2856: ** active statements. A statement transaction allows the affects of this
! 2857: ** VDBE to be rolled back after an error without having to roll back the
! 2858: ** entire transaction. If no error is encountered, the statement transaction
! 2859: ** will automatically commit when the VDBE halts.
! 2860: **
! 2861: ** If P2 is zero, then a read-lock is obtained on the database file.
! 2862: */
! 2863: case OP_Transaction: {
! 2864: Btree *pBt;
! 2865:
! 2866: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 2867: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
! 2868: pBt = db->aDb[pOp->p1].pBt;
! 2869:
! 2870: if( pBt ){
! 2871: rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
! 2872: if( rc==SQLITE_BUSY ){
! 2873: p->pc = pc;
! 2874: p->rc = rc = SQLITE_BUSY;
! 2875: goto vdbe_return;
! 2876: }
! 2877: if( rc!=SQLITE_OK ){
! 2878: goto abort_due_to_error;
! 2879: }
! 2880:
! 2881: if( pOp->p2 && p->usesStmtJournal
! 2882: && (db->autoCommit==0 || db->activeVdbeCnt>1)
! 2883: ){
! 2884: assert( sqlite3BtreeIsInTrans(pBt) );
! 2885: if( p->iStatement==0 ){
! 2886: assert( db->nStatement>=0 && db->nSavepoint>=0 );
! 2887: db->nStatement++;
! 2888: p->iStatement = db->nSavepoint + db->nStatement;
! 2889: }
! 2890:
! 2891: rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1);
! 2892: if( rc==SQLITE_OK ){
! 2893: rc = sqlite3BtreeBeginStmt(pBt, p->iStatement);
! 2894: }
! 2895:
! 2896: /* Store the current value of the database handles deferred constraint
! 2897: ** counter. If the statement transaction needs to be rolled back,
! 2898: ** the value of this counter needs to be restored too. */
! 2899: p->nStmtDefCons = db->nDeferredCons;
! 2900: }
! 2901: }
! 2902: break;
! 2903: }
! 2904:
! 2905: /* Opcode: ReadCookie P1 P2 P3 * *
! 2906: **
! 2907: ** Read cookie number P3 from database P1 and write it into register P2.
! 2908: ** P3==1 is the schema version. P3==2 is the database format.
! 2909: ** P3==3 is the recommended pager cache size, and so forth. P1==0 is
! 2910: ** the main database file and P1==1 is the database file used to store
! 2911: ** temporary tables.
! 2912: **
! 2913: ** There must be a read-lock on the database (either a transaction
! 2914: ** must be started or there must be an open cursor) before
! 2915: ** executing this instruction.
! 2916: */
! 2917: case OP_ReadCookie: { /* out2-prerelease */
! 2918: int iMeta;
! 2919: int iDb;
! 2920: int iCookie;
! 2921:
! 2922: iDb = pOp->p1;
! 2923: iCookie = pOp->p3;
! 2924: assert( pOp->p3<SQLITE_N_BTREE_META );
! 2925: assert( iDb>=0 && iDb<db->nDb );
! 2926: assert( db->aDb[iDb].pBt!=0 );
! 2927: assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
! 2928:
! 2929: sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta);
! 2930: pOut->u.i = iMeta;
! 2931: break;
! 2932: }
! 2933:
! 2934: /* Opcode: SetCookie P1 P2 P3 * *
! 2935: **
! 2936: ** Write the content of register P3 (interpreted as an integer)
! 2937: ** into cookie number P2 of database P1. P2==1 is the schema version.
! 2938: ** P2==2 is the database format. P2==3 is the recommended pager cache
! 2939: ** size, and so forth. P1==0 is the main database file and P1==1 is the
! 2940: ** database file used to store temporary tables.
! 2941: **
! 2942: ** A transaction must be started before executing this opcode.
! 2943: */
! 2944: case OP_SetCookie: { /* in3 */
! 2945: Db *pDb;
! 2946: assert( pOp->p2<SQLITE_N_BTREE_META );
! 2947: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 2948: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
! 2949: pDb = &db->aDb[pOp->p1];
! 2950: assert( pDb->pBt!=0 );
! 2951: assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
! 2952: pIn3 = &aMem[pOp->p3];
! 2953: sqlite3VdbeMemIntegerify(pIn3);
! 2954: /* See note about index shifting on OP_ReadCookie */
! 2955: rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i);
! 2956: if( pOp->p2==BTREE_SCHEMA_VERSION ){
! 2957: /* When the schema cookie changes, record the new cookie internally */
! 2958: pDb->pSchema->schema_cookie = (int)pIn3->u.i;
! 2959: db->flags |= SQLITE_InternChanges;
! 2960: }else if( pOp->p2==BTREE_FILE_FORMAT ){
! 2961: /* Record changes in the file format */
! 2962: pDb->pSchema->file_format = (u8)pIn3->u.i;
! 2963: }
! 2964: if( pOp->p1==1 ){
! 2965: /* Invalidate all prepared statements whenever the TEMP database
! 2966: ** schema is changed. Ticket #1644 */
! 2967: sqlite3ExpirePreparedStatements(db);
! 2968: p->expired = 0;
! 2969: }
! 2970: break;
! 2971: }
! 2972:
! 2973: /* Opcode: VerifyCookie P1 P2 P3 * *
! 2974: **
! 2975: ** Check the value of global database parameter number 0 (the
! 2976: ** schema version) and make sure it is equal to P2 and that the
! 2977: ** generation counter on the local schema parse equals P3.
! 2978: **
! 2979: ** P1 is the database number which is 0 for the main database file
! 2980: ** and 1 for the file holding temporary tables and some higher number
! 2981: ** for auxiliary databases.
! 2982: **
! 2983: ** The cookie changes its value whenever the database schema changes.
! 2984: ** This operation is used to detect when that the cookie has changed
! 2985: ** and that the current process needs to reread the schema.
! 2986: **
! 2987: ** Either a transaction needs to have been started or an OP_Open needs
! 2988: ** to be executed (to establish a read lock) before this opcode is
! 2989: ** invoked.
! 2990: */
! 2991: case OP_VerifyCookie: {
! 2992: int iMeta;
! 2993: int iGen;
! 2994: Btree *pBt;
! 2995:
! 2996: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 2997: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
! 2998: assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
! 2999: pBt = db->aDb[pOp->p1].pBt;
! 3000: if( pBt ){
! 3001: sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta);
! 3002: iGen = db->aDb[pOp->p1].pSchema->iGeneration;
! 3003: }else{
! 3004: iGen = iMeta = 0;
! 3005: }
! 3006: if( iMeta!=pOp->p2 || iGen!=pOp->p3 ){
! 3007: sqlite3DbFree(db, p->zErrMsg);
! 3008: p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
! 3009: /* If the schema-cookie from the database file matches the cookie
! 3010: ** stored with the in-memory representation of the schema, do
! 3011: ** not reload the schema from the database file.
! 3012: **
! 3013: ** If virtual-tables are in use, this is not just an optimization.
! 3014: ** Often, v-tables store their data in other SQLite tables, which
! 3015: ** are queried from within xNext() and other v-table methods using
! 3016: ** prepared queries. If such a query is out-of-date, we do not want to
! 3017: ** discard the database schema, as the user code implementing the
! 3018: ** v-table would have to be ready for the sqlite3_vtab structure itself
! 3019: ** to be invalidated whenever sqlite3_step() is called from within
! 3020: ** a v-table method.
! 3021: */
! 3022: if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){
! 3023: sqlite3ResetInternalSchema(db, pOp->p1);
! 3024: }
! 3025:
! 3026: p->expired = 1;
! 3027: rc = SQLITE_SCHEMA;
! 3028: }
! 3029: break;
! 3030: }
! 3031:
! 3032: /* Opcode: OpenRead P1 P2 P3 P4 P5
! 3033: **
! 3034: ** Open a read-only cursor for the database table whose root page is
! 3035: ** P2 in a database file. The database file is determined by P3.
! 3036: ** P3==0 means the main database, P3==1 means the database used for
! 3037: ** temporary tables, and P3>1 means used the corresponding attached
! 3038: ** database. Give the new cursor an identifier of P1. The P1
! 3039: ** values need not be contiguous but all P1 values should be small integers.
! 3040: ** It is an error for P1 to be negative.
! 3041: **
! 3042: ** If P5!=0 then use the content of register P2 as the root page, not
! 3043: ** the value of P2 itself.
! 3044: **
! 3045: ** There will be a read lock on the database whenever there is an
! 3046: ** open cursor. If the database was unlocked prior to this instruction
! 3047: ** then a read lock is acquired as part of this instruction. A read
! 3048: ** lock allows other processes to read the database but prohibits
! 3049: ** any other process from modifying the database. The read lock is
! 3050: ** released when all cursors are closed. If this instruction attempts
! 3051: ** to get a read lock but fails, the script terminates with an
! 3052: ** SQLITE_BUSY error code.
! 3053: **
! 3054: ** The P4 value may be either an integer (P4_INT32) or a pointer to
! 3055: ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
! 3056: ** structure, then said structure defines the content and collating
! 3057: ** sequence of the index being opened. Otherwise, if P4 is an integer
! 3058: ** value, it is set to the number of columns in the table.
! 3059: **
! 3060: ** See also OpenWrite.
! 3061: */
! 3062: /* Opcode: OpenWrite P1 P2 P3 P4 P5
! 3063: **
! 3064: ** Open a read/write cursor named P1 on the table or index whose root
! 3065: ** page is P2. Or if P5!=0 use the content of register P2 to find the
! 3066: ** root page.
! 3067: **
! 3068: ** The P4 value may be either an integer (P4_INT32) or a pointer to
! 3069: ** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
! 3070: ** structure, then said structure defines the content and collating
! 3071: ** sequence of the index being opened. Otherwise, if P4 is an integer
! 3072: ** value, it is set to the number of columns in the table, or to the
! 3073: ** largest index of any column of the table that is actually used.
! 3074: **
! 3075: ** This instruction works just like OpenRead except that it opens the cursor
! 3076: ** in read/write mode. For a given table, there can be one or more read-only
! 3077: ** cursors or a single read/write cursor but not both.
! 3078: **
! 3079: ** See also OpenRead.
! 3080: */
! 3081: case OP_OpenRead:
! 3082: case OP_OpenWrite: {
! 3083: int nField;
! 3084: KeyInfo *pKeyInfo;
! 3085: int p2;
! 3086: int iDb;
! 3087: int wrFlag;
! 3088: Btree *pX;
! 3089: VdbeCursor *pCur;
! 3090: Db *pDb;
! 3091:
! 3092: if( p->expired ){
! 3093: rc = SQLITE_ABORT;
! 3094: break;
! 3095: }
! 3096:
! 3097: nField = 0;
! 3098: pKeyInfo = 0;
! 3099: p2 = pOp->p2;
! 3100: iDb = pOp->p3;
! 3101: assert( iDb>=0 && iDb<db->nDb );
! 3102: assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
! 3103: pDb = &db->aDb[iDb];
! 3104: pX = pDb->pBt;
! 3105: assert( pX!=0 );
! 3106: if( pOp->opcode==OP_OpenWrite ){
! 3107: wrFlag = 1;
! 3108: assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
! 3109: if( pDb->pSchema->file_format < p->minWriteFileFormat ){
! 3110: p->minWriteFileFormat = pDb->pSchema->file_format;
! 3111: }
! 3112: }else{
! 3113: wrFlag = 0;
! 3114: }
! 3115: if( pOp->p5 ){
! 3116: assert( p2>0 );
! 3117: assert( p2<=p->nMem );
! 3118: pIn2 = &aMem[p2];
! 3119: assert( memIsValid(pIn2) );
! 3120: assert( (pIn2->flags & MEM_Int)!=0 );
! 3121: sqlite3VdbeMemIntegerify(pIn2);
! 3122: p2 = (int)pIn2->u.i;
! 3123: /* The p2 value always comes from a prior OP_CreateTable opcode and
! 3124: ** that opcode will always set the p2 value to 2 or more or else fail.
! 3125: ** If there were a failure, the prepared statement would have halted
! 3126: ** before reaching this instruction. */
! 3127: if( NEVER(p2<2) ) {
! 3128: rc = SQLITE_CORRUPT_BKPT;
! 3129: goto abort_due_to_error;
! 3130: }
! 3131: }
! 3132: if( pOp->p4type==P4_KEYINFO ){
! 3133: pKeyInfo = pOp->p4.pKeyInfo;
! 3134: pKeyInfo->enc = ENC(p->db);
! 3135: nField = pKeyInfo->nField+1;
! 3136: }else if( pOp->p4type==P4_INT32 ){
! 3137: nField = pOp->p4.i;
! 3138: }
! 3139: assert( pOp->p1>=0 );
! 3140: pCur = allocateCursor(p, pOp->p1, nField, iDb, 1);
! 3141: if( pCur==0 ) goto no_mem;
! 3142: pCur->nullRow = 1;
! 3143: pCur->isOrdered = 1;
! 3144: rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->pCursor);
! 3145: pCur->pKeyInfo = pKeyInfo;
! 3146:
! 3147: /* Since it performs no memory allocation or IO, the only value that
! 3148: ** sqlite3BtreeCursor() may return is SQLITE_OK. */
! 3149: assert( rc==SQLITE_OK );
! 3150:
! 3151: /* Set the VdbeCursor.isTable and isIndex variables. Previous versions of
! 3152: ** SQLite used to check if the root-page flags were sane at this point
! 3153: ** and report database corruption if they were not, but this check has
! 3154: ** since moved into the btree layer. */
! 3155: pCur->isTable = pOp->p4type!=P4_KEYINFO;
! 3156: pCur->isIndex = !pCur->isTable;
! 3157: break;
! 3158: }
! 3159:
! 3160: /* Opcode: OpenEphemeral P1 P2 * P4 P5
! 3161: **
! 3162: ** Open a new cursor P1 to a transient table.
! 3163: ** The cursor is always opened read/write even if
! 3164: ** the main database is read-only. The ephemeral
! 3165: ** table is deleted automatically when the cursor is closed.
! 3166: **
! 3167: ** P2 is the number of columns in the ephemeral table.
! 3168: ** The cursor points to a BTree table if P4==0 and to a BTree index
! 3169: ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure
! 3170: ** that defines the format of keys in the index.
! 3171: **
! 3172: ** This opcode was once called OpenTemp. But that created
! 3173: ** confusion because the term "temp table", might refer either
! 3174: ** to a TEMP table at the SQL level, or to a table opened by
! 3175: ** this opcode. Then this opcode was call OpenVirtual. But
! 3176: ** that created confusion with the whole virtual-table idea.
! 3177: **
! 3178: ** The P5 parameter can be a mask of the BTREE_* flags defined
! 3179: ** in btree.h. These flags control aspects of the operation of
! 3180: ** the btree. The BTREE_OMIT_JOURNAL and BTREE_SINGLE flags are
! 3181: ** added automatically.
! 3182: */
! 3183: /* Opcode: OpenAutoindex P1 P2 * P4 *
! 3184: **
! 3185: ** This opcode works the same as OP_OpenEphemeral. It has a
! 3186: ** different name to distinguish its use. Tables created using
! 3187: ** by this opcode will be used for automatically created transient
! 3188: ** indices in joins.
! 3189: */
! 3190: case OP_OpenAutoindex:
! 3191: case OP_OpenEphemeral: {
! 3192: VdbeCursor *pCx;
! 3193: static const int vfsFlags =
! 3194: SQLITE_OPEN_READWRITE |
! 3195: SQLITE_OPEN_CREATE |
! 3196: SQLITE_OPEN_EXCLUSIVE |
! 3197: SQLITE_OPEN_DELETEONCLOSE |
! 3198: SQLITE_OPEN_TRANSIENT_DB;
! 3199:
! 3200: assert( pOp->p1>=0 );
! 3201: pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
! 3202: if( pCx==0 ) goto no_mem;
! 3203: pCx->nullRow = 1;
! 3204: rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt,
! 3205: BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
! 3206: if( rc==SQLITE_OK ){
! 3207: rc = sqlite3BtreeBeginTrans(pCx->pBt, 1);
! 3208: }
! 3209: if( rc==SQLITE_OK ){
! 3210: /* If a transient index is required, create it by calling
! 3211: ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before
! 3212: ** opening it. If a transient table is required, just use the
! 3213: ** automatically created table with root-page 1 (an BLOB_INTKEY table).
! 3214: */
! 3215: if( pOp->p4.pKeyInfo ){
! 3216: int pgno;
! 3217: assert( pOp->p4type==P4_KEYINFO );
! 3218: rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5);
! 3219: if( rc==SQLITE_OK ){
! 3220: assert( pgno==MASTER_ROOT+1 );
! 3221: rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1,
! 3222: (KeyInfo*)pOp->p4.z, pCx->pCursor);
! 3223: pCx->pKeyInfo = pOp->p4.pKeyInfo;
! 3224: pCx->pKeyInfo->enc = ENC(p->db);
! 3225: }
! 3226: pCx->isTable = 0;
! 3227: }else{
! 3228: rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor);
! 3229: pCx->isTable = 1;
! 3230: }
! 3231: }
! 3232: pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
! 3233: pCx->isIndex = !pCx->isTable;
! 3234: break;
! 3235: }
! 3236:
! 3237: /* Opcode: OpenSorter P1 P2 * P4 *
! 3238: **
! 3239: ** This opcode works like OP_OpenEphemeral except that it opens
! 3240: ** a transient index that is specifically designed to sort large
! 3241: ** tables using an external merge-sort algorithm.
! 3242: */
! 3243: case OP_SorterOpen: {
! 3244: VdbeCursor *pCx;
! 3245: #ifndef SQLITE_OMIT_MERGE_SORT
! 3246: pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
! 3247: if( pCx==0 ) goto no_mem;
! 3248: pCx->pKeyInfo = pOp->p4.pKeyInfo;
! 3249: pCx->pKeyInfo->enc = ENC(p->db);
! 3250: pCx->isSorter = 1;
! 3251: rc = sqlite3VdbeSorterInit(db, pCx);
! 3252: #else
! 3253: pOp->opcode = OP_OpenEphemeral;
! 3254: pc--;
! 3255: #endif
! 3256: break;
! 3257: }
! 3258:
! 3259: /* Opcode: OpenPseudo P1 P2 P3 * *
! 3260: **
! 3261: ** Open a new cursor that points to a fake table that contains a single
! 3262: ** row of data. The content of that one row in the content of memory
! 3263: ** register P2. In other words, cursor P1 becomes an alias for the
! 3264: ** MEM_Blob content contained in register P2.
! 3265: **
! 3266: ** A pseudo-table created by this opcode is used to hold a single
! 3267: ** row output from the sorter so that the row can be decomposed into
! 3268: ** individual columns using the OP_Column opcode. The OP_Column opcode
! 3269: ** is the only cursor opcode that works with a pseudo-table.
! 3270: **
! 3271: ** P3 is the number of fields in the records that will be stored by
! 3272: ** the pseudo-table.
! 3273: */
! 3274: case OP_OpenPseudo: {
! 3275: VdbeCursor *pCx;
! 3276:
! 3277: assert( pOp->p1>=0 );
! 3278: pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0);
! 3279: if( pCx==0 ) goto no_mem;
! 3280: pCx->nullRow = 1;
! 3281: pCx->pseudoTableReg = pOp->p2;
! 3282: pCx->isTable = 1;
! 3283: pCx->isIndex = 0;
! 3284: break;
! 3285: }
! 3286:
! 3287: /* Opcode: Close P1 * * * *
! 3288: **
! 3289: ** Close a cursor previously opened as P1. If P1 is not
! 3290: ** currently open, this instruction is a no-op.
! 3291: */
! 3292: case OP_Close: {
! 3293: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3294: sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
! 3295: p->apCsr[pOp->p1] = 0;
! 3296: break;
! 3297: }
! 3298:
! 3299: /* Opcode: SeekGe P1 P2 P3 P4 *
! 3300: **
! 3301: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
! 3302: ** use the value in register P3 as the key. If cursor P1 refers
! 3303: ** to an SQL index, then P3 is the first in an array of P4 registers
! 3304: ** that are used as an unpacked index key.
! 3305: **
! 3306: ** Reposition cursor P1 so that it points to the smallest entry that
! 3307: ** is greater than or equal to the key value. If there are no records
! 3308: ** greater than or equal to the key and P2 is not zero, then jump to P2.
! 3309: **
! 3310: ** See also: Found, NotFound, Distinct, SeekLt, SeekGt, SeekLe
! 3311: */
! 3312: /* Opcode: SeekGt P1 P2 P3 P4 *
! 3313: **
! 3314: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
! 3315: ** use the value in register P3 as a key. If cursor P1 refers
! 3316: ** to an SQL index, then P3 is the first in an array of P4 registers
! 3317: ** that are used as an unpacked index key.
! 3318: **
! 3319: ** Reposition cursor P1 so that it points to the smallest entry that
! 3320: ** is greater than the key value. If there are no records greater than
! 3321: ** the key and P2 is not zero, then jump to P2.
! 3322: **
! 3323: ** See also: Found, NotFound, Distinct, SeekLt, SeekGe, SeekLe
! 3324: */
! 3325: /* Opcode: SeekLt P1 P2 P3 P4 *
! 3326: **
! 3327: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
! 3328: ** use the value in register P3 as a key. If cursor P1 refers
! 3329: ** to an SQL index, then P3 is the first in an array of P4 registers
! 3330: ** that are used as an unpacked index key.
! 3331: **
! 3332: ** Reposition cursor P1 so that it points to the largest entry that
! 3333: ** is less than the key value. If there are no records less than
! 3334: ** the key and P2 is not zero, then jump to P2.
! 3335: **
! 3336: ** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLe
! 3337: */
! 3338: /* Opcode: SeekLe P1 P2 P3 P4 *
! 3339: **
! 3340: ** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
! 3341: ** use the value in register P3 as a key. If cursor P1 refers
! 3342: ** to an SQL index, then P3 is the first in an array of P4 registers
! 3343: ** that are used as an unpacked index key.
! 3344: **
! 3345: ** Reposition cursor P1 so that it points to the largest entry that
! 3346: ** is less than or equal to the key value. If there are no records
! 3347: ** less than or equal to the key and P2 is not zero, then jump to P2.
! 3348: **
! 3349: ** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLt
! 3350: */
! 3351: case OP_SeekLt: /* jump, in3 */
! 3352: case OP_SeekLe: /* jump, in3 */
! 3353: case OP_SeekGe: /* jump, in3 */
! 3354: case OP_SeekGt: { /* jump, in3 */
! 3355: int res;
! 3356: int oc;
! 3357: VdbeCursor *pC;
! 3358: UnpackedRecord r;
! 3359: int nField;
! 3360: i64 iKey; /* The rowid we are to seek to */
! 3361:
! 3362: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3363: assert( pOp->p2!=0 );
! 3364: pC = p->apCsr[pOp->p1];
! 3365: assert( pC!=0 );
! 3366: assert( pC->pseudoTableReg==0 );
! 3367: assert( OP_SeekLe == OP_SeekLt+1 );
! 3368: assert( OP_SeekGe == OP_SeekLt+2 );
! 3369: assert( OP_SeekGt == OP_SeekLt+3 );
! 3370: assert( pC->isOrdered );
! 3371: if( ALWAYS(pC->pCursor!=0) ){
! 3372: oc = pOp->opcode;
! 3373: pC->nullRow = 0;
! 3374: if( pC->isTable ){
! 3375: /* The input value in P3 might be of any type: integer, real, string,
! 3376: ** blob, or NULL. But it needs to be an integer before we can do
! 3377: ** the seek, so covert it. */
! 3378: pIn3 = &aMem[pOp->p3];
! 3379: applyNumericAffinity(pIn3);
! 3380: iKey = sqlite3VdbeIntValue(pIn3);
! 3381: pC->rowidIsValid = 0;
! 3382:
! 3383: /* If the P3 value could not be converted into an integer without
! 3384: ** loss of information, then special processing is required... */
! 3385: if( (pIn3->flags & MEM_Int)==0 ){
! 3386: if( (pIn3->flags & MEM_Real)==0 ){
! 3387: /* If the P3 value cannot be converted into any kind of a number,
! 3388: ** then the seek is not possible, so jump to P2 */
! 3389: pc = pOp->p2 - 1;
! 3390: break;
! 3391: }
! 3392: /* If we reach this point, then the P3 value must be a floating
! 3393: ** point number. */
! 3394: assert( (pIn3->flags & MEM_Real)!=0 );
! 3395:
! 3396: if( iKey==SMALLEST_INT64 && (pIn3->r<(double)iKey || pIn3->r>0) ){
! 3397: /* The P3 value is too large in magnitude to be expressed as an
! 3398: ** integer. */
! 3399: res = 1;
! 3400: if( pIn3->r<0 ){
! 3401: if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt );
! 3402: rc = sqlite3BtreeFirst(pC->pCursor, &res);
! 3403: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 3404: }
! 3405: }else{
! 3406: if( oc<=OP_SeekLe ){ assert( oc==OP_SeekLt || oc==OP_SeekLe );
! 3407: rc = sqlite3BtreeLast(pC->pCursor, &res);
! 3408: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 3409: }
! 3410: }
! 3411: if( res ){
! 3412: pc = pOp->p2 - 1;
! 3413: }
! 3414: break;
! 3415: }else if( oc==OP_SeekLt || oc==OP_SeekGe ){
! 3416: /* Use the ceiling() function to convert real->int */
! 3417: if( pIn3->r > (double)iKey ) iKey++;
! 3418: }else{
! 3419: /* Use the floor() function to convert real->int */
! 3420: assert( oc==OP_SeekLe || oc==OP_SeekGt );
! 3421: if( pIn3->r < (double)iKey ) iKey--;
! 3422: }
! 3423: }
! 3424: rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)iKey, 0, &res);
! 3425: if( rc!=SQLITE_OK ){
! 3426: goto abort_due_to_error;
! 3427: }
! 3428: if( res==0 ){
! 3429: pC->rowidIsValid = 1;
! 3430: pC->lastRowid = iKey;
! 3431: }
! 3432: }else{
! 3433: nField = pOp->p4.i;
! 3434: assert( pOp->p4type==P4_INT32 );
! 3435: assert( nField>0 );
! 3436: r.pKeyInfo = pC->pKeyInfo;
! 3437: r.nField = (u16)nField;
! 3438:
! 3439: /* The next line of code computes as follows, only faster:
! 3440: ** if( oc==OP_SeekGt || oc==OP_SeekLe ){
! 3441: ** r.flags = UNPACKED_INCRKEY;
! 3442: ** }else{
! 3443: ** r.flags = 0;
! 3444: ** }
! 3445: */
! 3446: r.flags = (u16)(UNPACKED_INCRKEY * (1 & (oc - OP_SeekLt)));
! 3447: assert( oc!=OP_SeekGt || r.flags==UNPACKED_INCRKEY );
! 3448: assert( oc!=OP_SeekLe || r.flags==UNPACKED_INCRKEY );
! 3449: assert( oc!=OP_SeekGe || r.flags==0 );
! 3450: assert( oc!=OP_SeekLt || r.flags==0 );
! 3451:
! 3452: r.aMem = &aMem[pOp->p3];
! 3453: #ifdef SQLITE_DEBUG
! 3454: { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
! 3455: #endif
! 3456: ExpandBlob(r.aMem);
! 3457: rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res);
! 3458: if( rc!=SQLITE_OK ){
! 3459: goto abort_due_to_error;
! 3460: }
! 3461: pC->rowidIsValid = 0;
! 3462: }
! 3463: pC->deferredMoveto = 0;
! 3464: pC->cacheStatus = CACHE_STALE;
! 3465: #ifdef SQLITE_TEST
! 3466: sqlite3_search_count++;
! 3467: #endif
! 3468: if( oc>=OP_SeekGe ){ assert( oc==OP_SeekGe || oc==OP_SeekGt );
! 3469: if( res<0 || (res==0 && oc==OP_SeekGt) ){
! 3470: rc = sqlite3BtreeNext(pC->pCursor, &res);
! 3471: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 3472: pC->rowidIsValid = 0;
! 3473: }else{
! 3474: res = 0;
! 3475: }
! 3476: }else{
! 3477: assert( oc==OP_SeekLt || oc==OP_SeekLe );
! 3478: if( res>0 || (res==0 && oc==OP_SeekLt) ){
! 3479: rc = sqlite3BtreePrevious(pC->pCursor, &res);
! 3480: if( rc!=SQLITE_OK ) goto abort_due_to_error;
! 3481: pC->rowidIsValid = 0;
! 3482: }else{
! 3483: /* res might be negative because the table is empty. Check to
! 3484: ** see if this is the case.
! 3485: */
! 3486: res = sqlite3BtreeEof(pC->pCursor);
! 3487: }
! 3488: }
! 3489: assert( pOp->p2>0 );
! 3490: if( res ){
! 3491: pc = pOp->p2 - 1;
! 3492: }
! 3493: }else{
! 3494: /* This happens when attempting to open the sqlite3_master table
! 3495: ** for read access returns SQLITE_EMPTY. In this case always
! 3496: ** take the jump (since there are no records in the table).
! 3497: */
! 3498: pc = pOp->p2 - 1;
! 3499: }
! 3500: break;
! 3501: }
! 3502:
! 3503: /* Opcode: Seek P1 P2 * * *
! 3504: **
! 3505: ** P1 is an open table cursor and P2 is a rowid integer. Arrange
! 3506: ** for P1 to move so that it points to the rowid given by P2.
! 3507: **
! 3508: ** This is actually a deferred seek. Nothing actually happens until
! 3509: ** the cursor is used to read a record. That way, if no reads
! 3510: ** occur, no unnecessary I/O happens.
! 3511: */
! 3512: case OP_Seek: { /* in2 */
! 3513: VdbeCursor *pC;
! 3514:
! 3515: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3516: pC = p->apCsr[pOp->p1];
! 3517: assert( pC!=0 );
! 3518: if( ALWAYS(pC->pCursor!=0) ){
! 3519: assert( pC->isTable );
! 3520: pC->nullRow = 0;
! 3521: pIn2 = &aMem[pOp->p2];
! 3522: pC->movetoTarget = sqlite3VdbeIntValue(pIn2);
! 3523: pC->rowidIsValid = 0;
! 3524: pC->deferredMoveto = 1;
! 3525: }
! 3526: break;
! 3527: }
! 3528:
! 3529:
! 3530: /* Opcode: Found P1 P2 P3 P4 *
! 3531: **
! 3532: ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If
! 3533: ** P4>0 then register P3 is the first of P4 registers that form an unpacked
! 3534: ** record.
! 3535: **
! 3536: ** Cursor P1 is on an index btree. If the record identified by P3 and P4
! 3537: ** is a prefix of any entry in P1 then a jump is made to P2 and
! 3538: ** P1 is left pointing at the matching entry.
! 3539: */
! 3540: /* Opcode: NotFound P1 P2 P3 P4 *
! 3541: **
! 3542: ** If P4==0 then register P3 holds a blob constructed by MakeRecord. If
! 3543: ** P4>0 then register P3 is the first of P4 registers that form an unpacked
! 3544: ** record.
! 3545: **
! 3546: ** Cursor P1 is on an index btree. If the record identified by P3 and P4
! 3547: ** is not the prefix of any entry in P1 then a jump is made to P2. If P1
! 3548: ** does contain an entry whose prefix matches the P3/P4 record then control
! 3549: ** falls through to the next instruction and P1 is left pointing at the
! 3550: ** matching entry.
! 3551: **
! 3552: ** See also: Found, NotExists, IsUnique
! 3553: */
! 3554: case OP_NotFound: /* jump, in3 */
! 3555: case OP_Found: { /* jump, in3 */
! 3556: int alreadyExists;
! 3557: VdbeCursor *pC;
! 3558: int res;
! 3559: char *pFree;
! 3560: UnpackedRecord *pIdxKey;
! 3561: UnpackedRecord r;
! 3562: char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
! 3563:
! 3564: #ifdef SQLITE_TEST
! 3565: sqlite3_found_count++;
! 3566: #endif
! 3567:
! 3568: alreadyExists = 0;
! 3569: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3570: assert( pOp->p4type==P4_INT32 );
! 3571: pC = p->apCsr[pOp->p1];
! 3572: assert( pC!=0 );
! 3573: pIn3 = &aMem[pOp->p3];
! 3574: if( ALWAYS(pC->pCursor!=0) ){
! 3575:
! 3576: assert( pC->isTable==0 );
! 3577: if( pOp->p4.i>0 ){
! 3578: r.pKeyInfo = pC->pKeyInfo;
! 3579: r.nField = (u16)pOp->p4.i;
! 3580: r.aMem = pIn3;
! 3581: #ifdef SQLITE_DEBUG
! 3582: { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
! 3583: #endif
! 3584: r.flags = UNPACKED_PREFIX_MATCH;
! 3585: pIdxKey = &r;
! 3586: }else{
! 3587: pIdxKey = sqlite3VdbeAllocUnpackedRecord(
! 3588: pC->pKeyInfo, aTempRec, sizeof(aTempRec), &pFree
! 3589: );
! 3590: if( pIdxKey==0 ) goto no_mem;
! 3591: assert( pIn3->flags & MEM_Blob );
! 3592: assert( (pIn3->flags & MEM_Zero)==0 ); /* zeroblobs already expanded */
! 3593: sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey);
! 3594: pIdxKey->flags |= UNPACKED_PREFIX_MATCH;
! 3595: }
! 3596: rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, pIdxKey, 0, 0, &res);
! 3597: if( pOp->p4.i==0 ){
! 3598: sqlite3DbFree(db, pFree);
! 3599: }
! 3600: if( rc!=SQLITE_OK ){
! 3601: break;
! 3602: }
! 3603: alreadyExists = (res==0);
! 3604: pC->deferredMoveto = 0;
! 3605: pC->cacheStatus = CACHE_STALE;
! 3606: }
! 3607: if( pOp->opcode==OP_Found ){
! 3608: if( alreadyExists ) pc = pOp->p2 - 1;
! 3609: }else{
! 3610: if( !alreadyExists ) pc = pOp->p2 - 1;
! 3611: }
! 3612: break;
! 3613: }
! 3614:
! 3615: /* Opcode: IsUnique P1 P2 P3 P4 *
! 3616: **
! 3617: ** Cursor P1 is open on an index b-tree - that is to say, a btree which
! 3618: ** no data and where the key are records generated by OP_MakeRecord with
! 3619: ** the list field being the integer ROWID of the entry that the index
! 3620: ** entry refers to.
! 3621: **
! 3622: ** The P3 register contains an integer record number. Call this record
! 3623: ** number R. Register P4 is the first in a set of N contiguous registers
! 3624: ** that make up an unpacked index key that can be used with cursor P1.
! 3625: ** The value of N can be inferred from the cursor. N includes the rowid
! 3626: ** value appended to the end of the index record. This rowid value may
! 3627: ** or may not be the same as R.
! 3628: **
! 3629: ** If any of the N registers beginning with register P4 contains a NULL
! 3630: ** value, jump immediately to P2.
! 3631: **
! 3632: ** Otherwise, this instruction checks if cursor P1 contains an entry
! 3633: ** where the first (N-1) fields match but the rowid value at the end
! 3634: ** of the index entry is not R. If there is no such entry, control jumps
! 3635: ** to instruction P2. Otherwise, the rowid of the conflicting index
! 3636: ** entry is copied to register P3 and control falls through to the next
! 3637: ** instruction.
! 3638: **
! 3639: ** See also: NotFound, NotExists, Found
! 3640: */
! 3641: case OP_IsUnique: { /* jump, in3 */
! 3642: u16 ii;
! 3643: VdbeCursor *pCx;
! 3644: BtCursor *pCrsr;
! 3645: u16 nField;
! 3646: Mem *aMx;
! 3647: UnpackedRecord r; /* B-Tree index search key */
! 3648: i64 R; /* Rowid stored in register P3 */
! 3649:
! 3650: pIn3 = &aMem[pOp->p3];
! 3651: aMx = &aMem[pOp->p4.i];
! 3652: /* Assert that the values of parameters P1 and P4 are in range. */
! 3653: assert( pOp->p4type==P4_INT32 );
! 3654: assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem );
! 3655: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3656:
! 3657: /* Find the index cursor. */
! 3658: pCx = p->apCsr[pOp->p1];
! 3659: assert( pCx->deferredMoveto==0 );
! 3660: pCx->seekResult = 0;
! 3661: pCx->cacheStatus = CACHE_STALE;
! 3662: pCrsr = pCx->pCursor;
! 3663:
! 3664: /* If any of the values are NULL, take the jump. */
! 3665: nField = pCx->pKeyInfo->nField;
! 3666: for(ii=0; ii<nField; ii++){
! 3667: if( aMx[ii].flags & MEM_Null ){
! 3668: pc = pOp->p2 - 1;
! 3669: pCrsr = 0;
! 3670: break;
! 3671: }
! 3672: }
! 3673: assert( (aMx[nField].flags & MEM_Null)==0 );
! 3674:
! 3675: if( pCrsr!=0 ){
! 3676: /* Populate the index search key. */
! 3677: r.pKeyInfo = pCx->pKeyInfo;
! 3678: r.nField = nField + 1;
! 3679: r.flags = UNPACKED_PREFIX_SEARCH;
! 3680: r.aMem = aMx;
! 3681: #ifdef SQLITE_DEBUG
! 3682: { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
! 3683: #endif
! 3684:
! 3685: /* Extract the value of R from register P3. */
! 3686: sqlite3VdbeMemIntegerify(pIn3);
! 3687: R = pIn3->u.i;
! 3688:
! 3689: /* Search the B-Tree index. If no conflicting record is found, jump
! 3690: ** to P2. Otherwise, copy the rowid of the conflicting record to
! 3691: ** register P3 and fall through to the next instruction. */
! 3692: rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &pCx->seekResult);
! 3693: if( (r.flags & UNPACKED_PREFIX_SEARCH) || r.rowid==R ){
! 3694: pc = pOp->p2 - 1;
! 3695: }else{
! 3696: pIn3->u.i = r.rowid;
! 3697: }
! 3698: }
! 3699: break;
! 3700: }
! 3701:
! 3702: /* Opcode: NotExists P1 P2 P3 * *
! 3703: **
! 3704: ** Use the content of register P3 as an integer key. If a record
! 3705: ** with that key does not exist in table of P1, then jump to P2.
! 3706: ** If the record does exist, then fall through. The cursor is left
! 3707: ** pointing to the record if it exists.
! 3708: **
! 3709: ** The difference between this operation and NotFound is that this
! 3710: ** operation assumes the key is an integer and that P1 is a table whereas
! 3711: ** NotFound assumes key is a blob constructed from MakeRecord and
! 3712: ** P1 is an index.
! 3713: **
! 3714: ** See also: Found, NotFound, IsUnique
! 3715: */
! 3716: case OP_NotExists: { /* jump, in3 */
! 3717: VdbeCursor *pC;
! 3718: BtCursor *pCrsr;
! 3719: int res;
! 3720: u64 iKey;
! 3721:
! 3722: pIn3 = &aMem[pOp->p3];
! 3723: assert( pIn3->flags & MEM_Int );
! 3724: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3725: pC = p->apCsr[pOp->p1];
! 3726: assert( pC!=0 );
! 3727: assert( pC->isTable );
! 3728: assert( pC->pseudoTableReg==0 );
! 3729: pCrsr = pC->pCursor;
! 3730: if( ALWAYS(pCrsr!=0) ){
! 3731: res = 0;
! 3732: iKey = pIn3->u.i;
! 3733: rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res);
! 3734: pC->lastRowid = pIn3->u.i;
! 3735: pC->rowidIsValid = res==0 ?1:0;
! 3736: pC->nullRow = 0;
! 3737: pC->cacheStatus = CACHE_STALE;
! 3738: pC->deferredMoveto = 0;
! 3739: if( res!=0 ){
! 3740: pc = pOp->p2 - 1;
! 3741: assert( pC->rowidIsValid==0 );
! 3742: }
! 3743: pC->seekResult = res;
! 3744: }else{
! 3745: /* This happens when an attempt to open a read cursor on the
! 3746: ** sqlite_master table returns SQLITE_EMPTY.
! 3747: */
! 3748: pc = pOp->p2 - 1;
! 3749: assert( pC->rowidIsValid==0 );
! 3750: pC->seekResult = 0;
! 3751: }
! 3752: break;
! 3753: }
! 3754:
! 3755: /* Opcode: Sequence P1 P2 * * *
! 3756: **
! 3757: ** Find the next available sequence number for cursor P1.
! 3758: ** Write the sequence number into register P2.
! 3759: ** The sequence number on the cursor is incremented after this
! 3760: ** instruction.
! 3761: */
! 3762: case OP_Sequence: { /* out2-prerelease */
! 3763: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3764: assert( p->apCsr[pOp->p1]!=0 );
! 3765: pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
! 3766: break;
! 3767: }
! 3768:
! 3769:
! 3770: /* Opcode: NewRowid P1 P2 P3 * *
! 3771: **
! 3772: ** Get a new integer record number (a.k.a "rowid") used as the key to a table.
! 3773: ** The record number is not previously used as a key in the database
! 3774: ** table that cursor P1 points to. The new record number is written
! 3775: ** written to register P2.
! 3776: **
! 3777: ** If P3>0 then P3 is a register in the root frame of this VDBE that holds
! 3778: ** the largest previously generated record number. No new record numbers are
! 3779: ** allowed to be less than this value. When this value reaches its maximum,
! 3780: ** an SQLITE_FULL error is generated. The P3 register is updated with the '
! 3781: ** generated record number. This P3 mechanism is used to help implement the
! 3782: ** AUTOINCREMENT feature.
! 3783: */
! 3784: case OP_NewRowid: { /* out2-prerelease */
! 3785: i64 v; /* The new rowid */
! 3786: VdbeCursor *pC; /* Cursor of table to get the new rowid */
! 3787: int res; /* Result of an sqlite3BtreeLast() */
! 3788: int cnt; /* Counter to limit the number of searches */
! 3789: Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */
! 3790: VdbeFrame *pFrame; /* Root frame of VDBE */
! 3791:
! 3792: v = 0;
! 3793: res = 0;
! 3794: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3795: pC = p->apCsr[pOp->p1];
! 3796: assert( pC!=0 );
! 3797: if( NEVER(pC->pCursor==0) ){
! 3798: /* The zero initialization above is all that is needed */
! 3799: }else{
! 3800: /* The next rowid or record number (different terms for the same
! 3801: ** thing) is obtained in a two-step algorithm.
! 3802: **
! 3803: ** First we attempt to find the largest existing rowid and add one
! 3804: ** to that. But if the largest existing rowid is already the maximum
! 3805: ** positive integer, we have to fall through to the second
! 3806: ** probabilistic algorithm
! 3807: **
! 3808: ** The second algorithm is to select a rowid at random and see if
! 3809: ** it already exists in the table. If it does not exist, we have
! 3810: ** succeeded. If the random rowid does exist, we select a new one
! 3811: ** and try again, up to 100 times.
! 3812: */
! 3813: assert( pC->isTable );
! 3814:
! 3815: #ifdef SQLITE_32BIT_ROWID
! 3816: # define MAX_ROWID 0x7fffffff
! 3817: #else
! 3818: /* Some compilers complain about constants of the form 0x7fffffffffffffff.
! 3819: ** Others complain about 0x7ffffffffffffffffLL. The following macro seems
! 3820: ** to provide the constant while making all compilers happy.
! 3821: */
! 3822: # define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
! 3823: #endif
! 3824:
! 3825: if( !pC->useRandomRowid ){
! 3826: v = sqlite3BtreeGetCachedRowid(pC->pCursor);
! 3827: if( v==0 ){
! 3828: rc = sqlite3BtreeLast(pC->pCursor, &res);
! 3829: if( rc!=SQLITE_OK ){
! 3830: goto abort_due_to_error;
! 3831: }
! 3832: if( res ){
! 3833: v = 1; /* IMP: R-61914-48074 */
! 3834: }else{
! 3835: assert( sqlite3BtreeCursorIsValid(pC->pCursor) );
! 3836: rc = sqlite3BtreeKeySize(pC->pCursor, &v);
! 3837: assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */
! 3838: if( v==MAX_ROWID ){
! 3839: pC->useRandomRowid = 1;
! 3840: }else{
! 3841: v++; /* IMP: R-29538-34987 */
! 3842: }
! 3843: }
! 3844: }
! 3845:
! 3846: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 3847: if( pOp->p3 ){
! 3848: /* Assert that P3 is a valid memory cell. */
! 3849: assert( pOp->p3>0 );
! 3850: if( p->pFrame ){
! 3851: for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
! 3852: /* Assert that P3 is a valid memory cell. */
! 3853: assert( pOp->p3<=pFrame->nMem );
! 3854: pMem = &pFrame->aMem[pOp->p3];
! 3855: }else{
! 3856: /* Assert that P3 is a valid memory cell. */
! 3857: assert( pOp->p3<=p->nMem );
! 3858: pMem = &aMem[pOp->p3];
! 3859: memAboutToChange(p, pMem);
! 3860: }
! 3861: assert( memIsValid(pMem) );
! 3862:
! 3863: REGISTER_TRACE(pOp->p3, pMem);
! 3864: sqlite3VdbeMemIntegerify(pMem);
! 3865: assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */
! 3866: if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){
! 3867: rc = SQLITE_FULL; /* IMP: R-12275-61338 */
! 3868: goto abort_due_to_error;
! 3869: }
! 3870: if( v<pMem->u.i+1 ){
! 3871: v = pMem->u.i + 1;
! 3872: }
! 3873: pMem->u.i = v;
! 3874: }
! 3875: #endif
! 3876:
! 3877: sqlite3BtreeSetCachedRowid(pC->pCursor, v<MAX_ROWID ? v+1 : 0);
! 3878: }
! 3879: if( pC->useRandomRowid ){
! 3880: /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the
! 3881: ** largest possible integer (9223372036854775807) then the database
! 3882: ** engine starts picking positive candidate ROWIDs at random until
! 3883: ** it finds one that is not previously used. */
! 3884: assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is
! 3885: ** an AUTOINCREMENT table. */
! 3886: /* on the first attempt, simply do one more than previous */
! 3887: v = lastRowid;
! 3888: v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
! 3889: v++; /* ensure non-zero */
! 3890: cnt = 0;
! 3891: while( ((rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)v,
! 3892: 0, &res))==SQLITE_OK)
! 3893: && (res==0)
! 3894: && (++cnt<100)){
! 3895: /* collision - try another random rowid */
! 3896: sqlite3_randomness(sizeof(v), &v);
! 3897: if( cnt<5 ){
! 3898: /* try "small" random rowids for the initial attempts */
! 3899: v &= 0xffffff;
! 3900: }else{
! 3901: v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
! 3902: }
! 3903: v++; /* ensure non-zero */
! 3904: }
! 3905: if( rc==SQLITE_OK && res==0 ){
! 3906: rc = SQLITE_FULL; /* IMP: R-38219-53002 */
! 3907: goto abort_due_to_error;
! 3908: }
! 3909: assert( v>0 ); /* EV: R-40812-03570 */
! 3910: }
! 3911: pC->rowidIsValid = 0;
! 3912: pC->deferredMoveto = 0;
! 3913: pC->cacheStatus = CACHE_STALE;
! 3914: }
! 3915: pOut->u.i = v;
! 3916: break;
! 3917: }
! 3918:
! 3919: /* Opcode: Insert P1 P2 P3 P4 P5
! 3920: **
! 3921: ** Write an entry into the table of cursor P1. A new entry is
! 3922: ** created if it doesn't already exist or the data for an existing
! 3923: ** entry is overwritten. The data is the value MEM_Blob stored in register
! 3924: ** number P2. The key is stored in register P3. The key must
! 3925: ** be a MEM_Int.
! 3926: **
! 3927: ** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is
! 3928: ** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set,
! 3929: ** then rowid is stored for subsequent return by the
! 3930: ** sqlite3_last_insert_rowid() function (otherwise it is unmodified).
! 3931: **
! 3932: ** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of
! 3933: ** the last seek operation (OP_NotExists) was a success, then this
! 3934: ** operation will not attempt to find the appropriate row before doing
! 3935: ** the insert but will instead overwrite the row that the cursor is
! 3936: ** currently pointing to. Presumably, the prior OP_NotExists opcode
! 3937: ** has already positioned the cursor correctly. This is an optimization
! 3938: ** that boosts performance by avoiding redundant seeks.
! 3939: **
! 3940: ** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an
! 3941: ** UPDATE operation. Otherwise (if the flag is clear) then this opcode
! 3942: ** is part of an INSERT operation. The difference is only important to
! 3943: ** the update hook.
! 3944: **
! 3945: ** Parameter P4 may point to a string containing the table-name, or
! 3946: ** may be NULL. If it is not NULL, then the update-hook
! 3947: ** (sqlite3.xUpdateCallback) is invoked following a successful insert.
! 3948: **
! 3949: ** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically
! 3950: ** allocated, then ownership of P2 is transferred to the pseudo-cursor
! 3951: ** and register P2 becomes ephemeral. If the cursor is changed, the
! 3952: ** value of register P2 will then change. Make sure this does not
! 3953: ** cause any problems.)
! 3954: **
! 3955: ** This instruction only works on tables. The equivalent instruction
! 3956: ** for indices is OP_IdxInsert.
! 3957: */
! 3958: /* Opcode: InsertInt P1 P2 P3 P4 P5
! 3959: **
! 3960: ** This works exactly like OP_Insert except that the key is the
! 3961: ** integer value P3, not the value of the integer stored in register P3.
! 3962: */
! 3963: case OP_Insert:
! 3964: case OP_InsertInt: {
! 3965: Mem *pData; /* MEM cell holding data for the record to be inserted */
! 3966: Mem *pKey; /* MEM cell holding key for the record */
! 3967: i64 iKey; /* The integer ROWID or key for the record to be inserted */
! 3968: VdbeCursor *pC; /* Cursor to table into which insert is written */
! 3969: int nZero; /* Number of zero-bytes to append */
! 3970: int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */
! 3971: const char *zDb; /* database name - used by the update hook */
! 3972: const char *zTbl; /* Table name - used by the opdate hook */
! 3973: int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
! 3974:
! 3975: pData = &aMem[pOp->p2];
! 3976: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 3977: assert( memIsValid(pData) );
! 3978: pC = p->apCsr[pOp->p1];
! 3979: assert( pC!=0 );
! 3980: assert( pC->pCursor!=0 );
! 3981: assert( pC->pseudoTableReg==0 );
! 3982: assert( pC->isTable );
! 3983: REGISTER_TRACE(pOp->p2, pData);
! 3984:
! 3985: if( pOp->opcode==OP_Insert ){
! 3986: pKey = &aMem[pOp->p3];
! 3987: assert( pKey->flags & MEM_Int );
! 3988: assert( memIsValid(pKey) );
! 3989: REGISTER_TRACE(pOp->p3, pKey);
! 3990: iKey = pKey->u.i;
! 3991: }else{
! 3992: assert( pOp->opcode==OP_InsertInt );
! 3993: iKey = pOp->p3;
! 3994: }
! 3995:
! 3996: if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
! 3997: if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey;
! 3998: if( pData->flags & MEM_Null ){
! 3999: pData->z = 0;
! 4000: pData->n = 0;
! 4001: }else{
! 4002: assert( pData->flags & (MEM_Blob|MEM_Str) );
! 4003: }
! 4004: seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0);
! 4005: if( pData->flags & MEM_Zero ){
! 4006: nZero = pData->u.nZero;
! 4007: }else{
! 4008: nZero = 0;
! 4009: }
! 4010: sqlite3BtreeSetCachedRowid(pC->pCursor, 0);
! 4011: rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey,
! 4012: pData->z, pData->n, nZero,
! 4013: pOp->p5 & OPFLAG_APPEND, seekResult
! 4014: );
! 4015: pC->rowidIsValid = 0;
! 4016: pC->deferredMoveto = 0;
! 4017: pC->cacheStatus = CACHE_STALE;
! 4018:
! 4019: /* Invoke the update-hook if required. */
! 4020: if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
! 4021: zDb = db->aDb[pC->iDb].zName;
! 4022: zTbl = pOp->p4.z;
! 4023: op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
! 4024: assert( pC->isTable );
! 4025: db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
! 4026: assert( pC->iDb>=0 );
! 4027: }
! 4028: break;
! 4029: }
! 4030:
! 4031: /* Opcode: Delete P1 P2 * P4 *
! 4032: **
! 4033: ** Delete the record at which the P1 cursor is currently pointing.
! 4034: **
! 4035: ** The cursor will be left pointing at either the next or the previous
! 4036: ** record in the table. If it is left pointing at the next record, then
! 4037: ** the next Next instruction will be a no-op. Hence it is OK to delete
! 4038: ** a record from within an Next loop.
! 4039: **
! 4040: ** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
! 4041: ** incremented (otherwise not).
! 4042: **
! 4043: ** P1 must not be pseudo-table. It has to be a real table with
! 4044: ** multiple rows.
! 4045: **
! 4046: ** If P4 is not NULL, then it is the name of the table that P1 is
! 4047: ** pointing to. The update hook will be invoked, if it exists.
! 4048: ** If P4 is not NULL then the P1 cursor must have been positioned
! 4049: ** using OP_NotFound prior to invoking this opcode.
! 4050: */
! 4051: case OP_Delete: {
! 4052: i64 iKey;
! 4053: VdbeCursor *pC;
! 4054:
! 4055: iKey = 0;
! 4056: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4057: pC = p->apCsr[pOp->p1];
! 4058: assert( pC!=0 );
! 4059: assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */
! 4060:
! 4061: /* If the update-hook will be invoked, set iKey to the rowid of the
! 4062: ** row being deleted.
! 4063: */
! 4064: if( db->xUpdateCallback && pOp->p4.z ){
! 4065: assert( pC->isTable );
! 4066: assert( pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */
! 4067: iKey = pC->lastRowid;
! 4068: }
! 4069:
! 4070: /* The OP_Delete opcode always follows an OP_NotExists or OP_Last or
! 4071: ** OP_Column on the same table without any intervening operations that
! 4072: ** might move or invalidate the cursor. Hence cursor pC is always pointing
! 4073: ** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation
! 4074: ** below is always a no-op and cannot fail. We will run it anyhow, though,
! 4075: ** to guard against future changes to the code generator.
! 4076: **/
! 4077: assert( pC->deferredMoveto==0 );
! 4078: rc = sqlite3VdbeCursorMoveto(pC);
! 4079: if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
! 4080:
! 4081: sqlite3BtreeSetCachedRowid(pC->pCursor, 0);
! 4082: rc = sqlite3BtreeDelete(pC->pCursor);
! 4083: pC->cacheStatus = CACHE_STALE;
! 4084:
! 4085: /* Invoke the update-hook if required. */
! 4086: if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
! 4087: const char *zDb = db->aDb[pC->iDb].zName;
! 4088: const char *zTbl = pOp->p4.z;
! 4089: db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, iKey);
! 4090: assert( pC->iDb>=0 );
! 4091: }
! 4092: if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
! 4093: break;
! 4094: }
! 4095: /* Opcode: ResetCount * * * * *
! 4096: **
! 4097: ** The value of the change counter is copied to the database handle
! 4098: ** change counter (returned by subsequent calls to sqlite3_changes()).
! 4099: ** Then the VMs internal change counter resets to 0.
! 4100: ** This is used by trigger programs.
! 4101: */
! 4102: case OP_ResetCount: {
! 4103: sqlite3VdbeSetChanges(db, p->nChange);
! 4104: p->nChange = 0;
! 4105: break;
! 4106: }
! 4107:
! 4108: /* Opcode: SorterCompare P1 P2 P3
! 4109: **
! 4110: ** P1 is a sorter cursor. This instruction compares the record blob in
! 4111: ** register P3 with the entry that the sorter cursor currently points to.
! 4112: ** If, excluding the rowid fields at the end, the two records are a match,
! 4113: ** fall through to the next instruction. Otherwise, jump to instruction P2.
! 4114: */
! 4115: case OP_SorterCompare: {
! 4116: VdbeCursor *pC;
! 4117: int res;
! 4118:
! 4119: pC = p->apCsr[pOp->p1];
! 4120: assert( isSorter(pC) );
! 4121: pIn3 = &aMem[pOp->p3];
! 4122: rc = sqlite3VdbeSorterCompare(pC, pIn3, &res);
! 4123: if( res ){
! 4124: pc = pOp->p2-1;
! 4125: }
! 4126: break;
! 4127: };
! 4128:
! 4129: /* Opcode: SorterData P1 P2 * * *
! 4130: **
! 4131: ** Write into register P2 the current sorter data for sorter cursor P1.
! 4132: */
! 4133: case OP_SorterData: {
! 4134: VdbeCursor *pC;
! 4135: #ifndef SQLITE_OMIT_MERGE_SORT
! 4136: pOut = &aMem[pOp->p2];
! 4137: pC = p->apCsr[pOp->p1];
! 4138: assert( pC->isSorter );
! 4139: rc = sqlite3VdbeSorterRowkey(pC, pOut);
! 4140: #else
! 4141: pOp->opcode = OP_RowKey;
! 4142: pc--;
! 4143: #endif
! 4144: break;
! 4145: }
! 4146:
! 4147: /* Opcode: RowData P1 P2 * * *
! 4148: **
! 4149: ** Write into register P2 the complete row data for cursor P1.
! 4150: ** There is no interpretation of the data.
! 4151: ** It is just copied onto the P2 register exactly as
! 4152: ** it is found in the database file.
! 4153: **
! 4154: ** If the P1 cursor must be pointing to a valid row (not a NULL row)
! 4155: ** of a real table, not a pseudo-table.
! 4156: */
! 4157: /* Opcode: RowKey P1 P2 * * *
! 4158: **
! 4159: ** Write into register P2 the complete row key for cursor P1.
! 4160: ** There is no interpretation of the data.
! 4161: ** The key is copied onto the P3 register exactly as
! 4162: ** it is found in the database file.
! 4163: **
! 4164: ** If the P1 cursor must be pointing to a valid row (not a NULL row)
! 4165: ** of a real table, not a pseudo-table.
! 4166: */
! 4167: case OP_RowKey:
! 4168: case OP_RowData: {
! 4169: VdbeCursor *pC;
! 4170: BtCursor *pCrsr;
! 4171: u32 n;
! 4172: i64 n64;
! 4173:
! 4174: pOut = &aMem[pOp->p2];
! 4175: memAboutToChange(p, pOut);
! 4176:
! 4177: /* Note that RowKey and RowData are really exactly the same instruction */
! 4178: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4179: pC = p->apCsr[pOp->p1];
! 4180: assert( pC->isSorter==0 );
! 4181: assert( pC->isTable || pOp->opcode!=OP_RowData );
! 4182: assert( pC->isIndex || pOp->opcode==OP_RowData );
! 4183: assert( pC!=0 );
! 4184: assert( pC->nullRow==0 );
! 4185: assert( pC->pseudoTableReg==0 );
! 4186: assert( !pC->isSorter );
! 4187: assert( pC->pCursor!=0 );
! 4188: pCrsr = pC->pCursor;
! 4189: assert( sqlite3BtreeCursorIsValid(pCrsr) );
! 4190:
! 4191: /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or
! 4192: ** OP_Rewind/Op_Next with no intervening instructions that might invalidate
! 4193: ** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always
! 4194: ** a no-op and can never fail. But we leave it in place as a safety.
! 4195: */
! 4196: assert( pC->deferredMoveto==0 );
! 4197: rc = sqlite3VdbeCursorMoveto(pC);
! 4198: if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
! 4199:
! 4200: if( pC->isIndex ){
! 4201: assert( !pC->isTable );
! 4202: VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &n64);
! 4203: assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */
! 4204: if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 4205: goto too_big;
! 4206: }
! 4207: n = (u32)n64;
! 4208: }else{
! 4209: VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &n);
! 4210: assert( rc==SQLITE_OK ); /* DataSize() cannot fail */
! 4211: if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
! 4212: goto too_big;
! 4213: }
! 4214: }
! 4215: if( sqlite3VdbeMemGrow(pOut, n, 0) ){
! 4216: goto no_mem;
! 4217: }
! 4218: pOut->n = n;
! 4219: MemSetTypeFlag(pOut, MEM_Blob);
! 4220: if( pC->isIndex ){
! 4221: rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z);
! 4222: }else{
! 4223: rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z);
! 4224: }
! 4225: pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */
! 4226: UPDATE_MAX_BLOBSIZE(pOut);
! 4227: break;
! 4228: }
! 4229:
! 4230: /* Opcode: Rowid P1 P2 * * *
! 4231: **
! 4232: ** Store in register P2 an integer which is the key of the table entry that
! 4233: ** P1 is currently point to.
! 4234: **
! 4235: ** P1 can be either an ordinary table or a virtual table. There used to
! 4236: ** be a separate OP_VRowid opcode for use with virtual tables, but this
! 4237: ** one opcode now works for both table types.
! 4238: */
! 4239: case OP_Rowid: { /* out2-prerelease */
! 4240: VdbeCursor *pC;
! 4241: i64 v;
! 4242: sqlite3_vtab *pVtab;
! 4243: const sqlite3_module *pModule;
! 4244:
! 4245: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4246: pC = p->apCsr[pOp->p1];
! 4247: assert( pC!=0 );
! 4248: assert( pC->pseudoTableReg==0 );
! 4249: if( pC->nullRow ){
! 4250: pOut->flags = MEM_Null;
! 4251: break;
! 4252: }else if( pC->deferredMoveto ){
! 4253: v = pC->movetoTarget;
! 4254: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 4255: }else if( pC->pVtabCursor ){
! 4256: pVtab = pC->pVtabCursor->pVtab;
! 4257: pModule = pVtab->pModule;
! 4258: assert( pModule->xRowid );
! 4259: rc = pModule->xRowid(pC->pVtabCursor, &v);
! 4260: importVtabErrMsg(p, pVtab);
! 4261: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 4262: }else{
! 4263: assert( pC->pCursor!=0 );
! 4264: rc = sqlite3VdbeCursorMoveto(pC);
! 4265: if( rc ) goto abort_due_to_error;
! 4266: if( pC->rowidIsValid ){
! 4267: v = pC->lastRowid;
! 4268: }else{
! 4269: rc = sqlite3BtreeKeySize(pC->pCursor, &v);
! 4270: assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */
! 4271: }
! 4272: }
! 4273: pOut->u.i = v;
! 4274: break;
! 4275: }
! 4276:
! 4277: /* Opcode: NullRow P1 * * * *
! 4278: **
! 4279: ** Move the cursor P1 to a null row. Any OP_Column operations
! 4280: ** that occur while the cursor is on the null row will always
! 4281: ** write a NULL.
! 4282: */
! 4283: case OP_NullRow: {
! 4284: VdbeCursor *pC;
! 4285:
! 4286: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4287: pC = p->apCsr[pOp->p1];
! 4288: assert( pC!=0 );
! 4289: pC->nullRow = 1;
! 4290: pC->rowidIsValid = 0;
! 4291: assert( pC->pCursor || pC->pVtabCursor );
! 4292: if( pC->pCursor ){
! 4293: sqlite3BtreeClearCursor(pC->pCursor);
! 4294: }
! 4295: break;
! 4296: }
! 4297:
! 4298: /* Opcode: Last P1 P2 * * *
! 4299: **
! 4300: ** The next use of the Rowid or Column or Next instruction for P1
! 4301: ** will refer to the last entry in the database table or index.
! 4302: ** If the table or index is empty and P2>0, then jump immediately to P2.
! 4303: ** If P2 is 0 or if the table or index is not empty, fall through
! 4304: ** to the following instruction.
! 4305: */
! 4306: case OP_Last: { /* jump */
! 4307: VdbeCursor *pC;
! 4308: BtCursor *pCrsr;
! 4309: int res;
! 4310:
! 4311: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4312: pC = p->apCsr[pOp->p1];
! 4313: assert( pC!=0 );
! 4314: pCrsr = pC->pCursor;
! 4315: res = 0;
! 4316: if( ALWAYS(pCrsr!=0) ){
! 4317: rc = sqlite3BtreeLast(pCrsr, &res);
! 4318: }
! 4319: pC->nullRow = (u8)res;
! 4320: pC->deferredMoveto = 0;
! 4321: pC->rowidIsValid = 0;
! 4322: pC->cacheStatus = CACHE_STALE;
! 4323: if( pOp->p2>0 && res ){
! 4324: pc = pOp->p2 - 1;
! 4325: }
! 4326: break;
! 4327: }
! 4328:
! 4329:
! 4330: /* Opcode: Sort P1 P2 * * *
! 4331: **
! 4332: ** This opcode does exactly the same thing as OP_Rewind except that
! 4333: ** it increments an undocumented global variable used for testing.
! 4334: **
! 4335: ** Sorting is accomplished by writing records into a sorting index,
! 4336: ** then rewinding that index and playing it back from beginning to
! 4337: ** end. We use the OP_Sort opcode instead of OP_Rewind to do the
! 4338: ** rewinding so that the global variable will be incremented and
! 4339: ** regression tests can determine whether or not the optimizer is
! 4340: ** correctly optimizing out sorts.
! 4341: */
! 4342: case OP_SorterSort: /* jump */
! 4343: #ifdef SQLITE_OMIT_MERGE_SORT
! 4344: pOp->opcode = OP_Sort;
! 4345: #endif
! 4346: case OP_Sort: { /* jump */
! 4347: #ifdef SQLITE_TEST
! 4348: sqlite3_sort_count++;
! 4349: sqlite3_search_count--;
! 4350: #endif
! 4351: p->aCounter[SQLITE_STMTSTATUS_SORT-1]++;
! 4352: /* Fall through into OP_Rewind */
! 4353: }
! 4354: /* Opcode: Rewind P1 P2 * * *
! 4355: **
! 4356: ** The next use of the Rowid or Column or Next instruction for P1
! 4357: ** will refer to the first entry in the database table or index.
! 4358: ** If the table or index is empty and P2>0, then jump immediately to P2.
! 4359: ** If P2 is 0 or if the table or index is not empty, fall through
! 4360: ** to the following instruction.
! 4361: */
! 4362: case OP_Rewind: { /* jump */
! 4363: VdbeCursor *pC;
! 4364: BtCursor *pCrsr;
! 4365: int res;
! 4366:
! 4367: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4368: pC = p->apCsr[pOp->p1];
! 4369: assert( pC!=0 );
! 4370: assert( pC->isSorter==(pOp->opcode==OP_SorterSort) );
! 4371: res = 1;
! 4372: if( isSorter(pC) ){
! 4373: rc = sqlite3VdbeSorterRewind(db, pC, &res);
! 4374: }else{
! 4375: pCrsr = pC->pCursor;
! 4376: assert( pCrsr );
! 4377: rc = sqlite3BtreeFirst(pCrsr, &res);
! 4378: pC->atFirst = res==0 ?1:0;
! 4379: pC->deferredMoveto = 0;
! 4380: pC->cacheStatus = CACHE_STALE;
! 4381: pC->rowidIsValid = 0;
! 4382: }
! 4383: pC->nullRow = (u8)res;
! 4384: assert( pOp->p2>0 && pOp->p2<p->nOp );
! 4385: if( res ){
! 4386: pc = pOp->p2 - 1;
! 4387: }
! 4388: break;
! 4389: }
! 4390:
! 4391: /* Opcode: Next P1 P2 * P4 P5
! 4392: **
! 4393: ** Advance cursor P1 so that it points to the next key/data pair in its
! 4394: ** table or index. If there are no more key/value pairs then fall through
! 4395: ** to the following instruction. But if the cursor advance was successful,
! 4396: ** jump immediately to P2.
! 4397: **
! 4398: ** The P1 cursor must be for a real table, not a pseudo-table.
! 4399: **
! 4400: ** P4 is always of type P4_ADVANCE. The function pointer points to
! 4401: ** sqlite3BtreeNext().
! 4402: **
! 4403: ** If P5 is positive and the jump is taken, then event counter
! 4404: ** number P5-1 in the prepared statement is incremented.
! 4405: **
! 4406: ** See also: Prev
! 4407: */
! 4408: /* Opcode: Prev P1 P2 * * P5
! 4409: **
! 4410: ** Back up cursor P1 so that it points to the previous key/data pair in its
! 4411: ** table or index. If there is no previous key/value pairs then fall through
! 4412: ** to the following instruction. But if the cursor backup was successful,
! 4413: ** jump immediately to P2.
! 4414: **
! 4415: ** The P1 cursor must be for a real table, not a pseudo-table.
! 4416: **
! 4417: ** P4 is always of type P4_ADVANCE. The function pointer points to
! 4418: ** sqlite3BtreePrevious().
! 4419: **
! 4420: ** If P5 is positive and the jump is taken, then event counter
! 4421: ** number P5-1 in the prepared statement is incremented.
! 4422: */
! 4423: case OP_SorterNext: /* jump */
! 4424: #ifdef SQLITE_OMIT_MERGE_SORT
! 4425: pOp->opcode = OP_Next;
! 4426: #endif
! 4427: case OP_Prev: /* jump */
! 4428: case OP_Next: { /* jump */
! 4429: VdbeCursor *pC;
! 4430: int res;
! 4431:
! 4432: CHECK_FOR_INTERRUPT;
! 4433: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4434: assert( pOp->p5<=ArraySize(p->aCounter) );
! 4435: pC = p->apCsr[pOp->p1];
! 4436: if( pC==0 ){
! 4437: break; /* See ticket #2273 */
! 4438: }
! 4439: assert( pC->isSorter==(pOp->opcode==OP_SorterNext) );
! 4440: if( isSorter(pC) ){
! 4441: assert( pOp->opcode==OP_SorterNext );
! 4442: rc = sqlite3VdbeSorterNext(db, pC, &res);
! 4443: }else{
! 4444: res = 1;
! 4445: assert( pC->deferredMoveto==0 );
! 4446: assert( pC->pCursor );
! 4447: assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext );
! 4448: assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious );
! 4449: rc = pOp->p4.xAdvance(pC->pCursor, &res);
! 4450: }
! 4451: pC->nullRow = (u8)res;
! 4452: pC->cacheStatus = CACHE_STALE;
! 4453: if( res==0 ){
! 4454: pc = pOp->p2 - 1;
! 4455: if( pOp->p5 ) p->aCounter[pOp->p5-1]++;
! 4456: #ifdef SQLITE_TEST
! 4457: sqlite3_search_count++;
! 4458: #endif
! 4459: }
! 4460: pC->rowidIsValid = 0;
! 4461: break;
! 4462: }
! 4463:
! 4464: /* Opcode: IdxInsert P1 P2 P3 * P5
! 4465: **
! 4466: ** Register P2 holds an SQL index key made using the
! 4467: ** MakeRecord instructions. This opcode writes that key
! 4468: ** into the index P1. Data for the entry is nil.
! 4469: **
! 4470: ** P3 is a flag that provides a hint to the b-tree layer that this
! 4471: ** insert is likely to be an append.
! 4472: **
! 4473: ** This instruction only works for indices. The equivalent instruction
! 4474: ** for tables is OP_Insert.
! 4475: */
! 4476: case OP_SorterInsert: /* in2 */
! 4477: #ifdef SQLITE_OMIT_MERGE_SORT
! 4478: pOp->opcode = OP_IdxInsert;
! 4479: #endif
! 4480: case OP_IdxInsert: { /* in2 */
! 4481: VdbeCursor *pC;
! 4482: BtCursor *pCrsr;
! 4483: int nKey;
! 4484: const char *zKey;
! 4485:
! 4486: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4487: pC = p->apCsr[pOp->p1];
! 4488: assert( pC!=0 );
! 4489: assert( pC->isSorter==(pOp->opcode==OP_SorterInsert) );
! 4490: pIn2 = &aMem[pOp->p2];
! 4491: assert( pIn2->flags & MEM_Blob );
! 4492: pCrsr = pC->pCursor;
! 4493: if( ALWAYS(pCrsr!=0) ){
! 4494: assert( pC->isTable==0 );
! 4495: rc = ExpandBlob(pIn2);
! 4496: if( rc==SQLITE_OK ){
! 4497: if( isSorter(pC) ){
! 4498: rc = sqlite3VdbeSorterWrite(db, pC, pIn2);
! 4499: }else{
! 4500: nKey = pIn2->n;
! 4501: zKey = pIn2->z;
! 4502: rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3,
! 4503: ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0)
! 4504: );
! 4505: assert( pC->deferredMoveto==0 );
! 4506: pC->cacheStatus = CACHE_STALE;
! 4507: }
! 4508: }
! 4509: }
! 4510: break;
! 4511: }
! 4512:
! 4513: /* Opcode: IdxDelete P1 P2 P3 * *
! 4514: **
! 4515: ** The content of P3 registers starting at register P2 form
! 4516: ** an unpacked index key. This opcode removes that entry from the
! 4517: ** index opened by cursor P1.
! 4518: */
! 4519: case OP_IdxDelete: {
! 4520: VdbeCursor *pC;
! 4521: BtCursor *pCrsr;
! 4522: int res;
! 4523: UnpackedRecord r;
! 4524:
! 4525: assert( pOp->p3>0 );
! 4526: assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 );
! 4527: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4528: pC = p->apCsr[pOp->p1];
! 4529: assert( pC!=0 );
! 4530: pCrsr = pC->pCursor;
! 4531: if( ALWAYS(pCrsr!=0) ){
! 4532: r.pKeyInfo = pC->pKeyInfo;
! 4533: r.nField = (u16)pOp->p3;
! 4534: r.flags = 0;
! 4535: r.aMem = &aMem[pOp->p2];
! 4536: #ifdef SQLITE_DEBUG
! 4537: { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
! 4538: #endif
! 4539: rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res);
! 4540: if( rc==SQLITE_OK && res==0 ){
! 4541: rc = sqlite3BtreeDelete(pCrsr);
! 4542: }
! 4543: assert( pC->deferredMoveto==0 );
! 4544: pC->cacheStatus = CACHE_STALE;
! 4545: }
! 4546: break;
! 4547: }
! 4548:
! 4549: /* Opcode: IdxRowid P1 P2 * * *
! 4550: **
! 4551: ** Write into register P2 an integer which is the last entry in the record at
! 4552: ** the end of the index key pointed to by cursor P1. This integer should be
! 4553: ** the rowid of the table entry to which this index entry points.
! 4554: **
! 4555: ** See also: Rowid, MakeRecord.
! 4556: */
! 4557: case OP_IdxRowid: { /* out2-prerelease */
! 4558: BtCursor *pCrsr;
! 4559: VdbeCursor *pC;
! 4560: i64 rowid;
! 4561:
! 4562: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4563: pC = p->apCsr[pOp->p1];
! 4564: assert( pC!=0 );
! 4565: pCrsr = pC->pCursor;
! 4566: pOut->flags = MEM_Null;
! 4567: if( ALWAYS(pCrsr!=0) ){
! 4568: rc = sqlite3VdbeCursorMoveto(pC);
! 4569: if( NEVER(rc) ) goto abort_due_to_error;
! 4570: assert( pC->deferredMoveto==0 );
! 4571: assert( pC->isTable==0 );
! 4572: if( !pC->nullRow ){
! 4573: rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid);
! 4574: if( rc!=SQLITE_OK ){
! 4575: goto abort_due_to_error;
! 4576: }
! 4577: pOut->u.i = rowid;
! 4578: pOut->flags = MEM_Int;
! 4579: }
! 4580: }
! 4581: break;
! 4582: }
! 4583:
! 4584: /* Opcode: IdxGE P1 P2 P3 P4 P5
! 4585: **
! 4586: ** The P4 register values beginning with P3 form an unpacked index
! 4587: ** key that omits the ROWID. Compare this key value against the index
! 4588: ** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
! 4589: **
! 4590: ** If the P1 index entry is greater than or equal to the key value
! 4591: ** then jump to P2. Otherwise fall through to the next instruction.
! 4592: **
! 4593: ** If P5 is non-zero then the key value is increased by an epsilon
! 4594: ** prior to the comparison. This make the opcode work like IdxGT except
! 4595: ** that if the key from register P3 is a prefix of the key in the cursor,
! 4596: ** the result is false whereas it would be true with IdxGT.
! 4597: */
! 4598: /* Opcode: IdxLT P1 P2 P3 P4 P5
! 4599: **
! 4600: ** The P4 register values beginning with P3 form an unpacked index
! 4601: ** key that omits the ROWID. Compare this key value against the index
! 4602: ** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
! 4603: **
! 4604: ** If the P1 index entry is less than the key value then jump to P2.
! 4605: ** Otherwise fall through to the next instruction.
! 4606: **
! 4607: ** If P5 is non-zero then the key value is increased by an epsilon prior
! 4608: ** to the comparison. This makes the opcode work like IdxLE.
! 4609: */
! 4610: case OP_IdxLT: /* jump */
! 4611: case OP_IdxGE: { /* jump */
! 4612: VdbeCursor *pC;
! 4613: int res;
! 4614: UnpackedRecord r;
! 4615:
! 4616: assert( pOp->p1>=0 && pOp->p1<p->nCursor );
! 4617: pC = p->apCsr[pOp->p1];
! 4618: assert( pC!=0 );
! 4619: assert( pC->isOrdered );
! 4620: if( ALWAYS(pC->pCursor!=0) ){
! 4621: assert( pC->deferredMoveto==0 );
! 4622: assert( pOp->p5==0 || pOp->p5==1 );
! 4623: assert( pOp->p4type==P4_INT32 );
! 4624: r.pKeyInfo = pC->pKeyInfo;
! 4625: r.nField = (u16)pOp->p4.i;
! 4626: if( pOp->p5 ){
! 4627: r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH;
! 4628: }else{
! 4629: r.flags = UNPACKED_PREFIX_MATCH;
! 4630: }
! 4631: r.aMem = &aMem[pOp->p3];
! 4632: #ifdef SQLITE_DEBUG
! 4633: { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
! 4634: #endif
! 4635: rc = sqlite3VdbeIdxKeyCompare(pC, &r, &res);
! 4636: if( pOp->opcode==OP_IdxLT ){
! 4637: res = -res;
! 4638: }else{
! 4639: assert( pOp->opcode==OP_IdxGE );
! 4640: res++;
! 4641: }
! 4642: if( res>0 ){
! 4643: pc = pOp->p2 - 1 ;
! 4644: }
! 4645: }
! 4646: break;
! 4647: }
! 4648:
! 4649: /* Opcode: Destroy P1 P2 P3 * *
! 4650: **
! 4651: ** Delete an entire database table or index whose root page in the database
! 4652: ** file is given by P1.
! 4653: **
! 4654: ** The table being destroyed is in the main database file if P3==0. If
! 4655: ** P3==1 then the table to be clear is in the auxiliary database file
! 4656: ** that is used to store tables create using CREATE TEMPORARY TABLE.
! 4657: **
! 4658: ** If AUTOVACUUM is enabled then it is possible that another root page
! 4659: ** might be moved into the newly deleted root page in order to keep all
! 4660: ** root pages contiguous at the beginning of the database. The former
! 4661: ** value of the root page that moved - its value before the move occurred -
! 4662: ** is stored in register P2. If no page
! 4663: ** movement was required (because the table being dropped was already
! 4664: ** the last one in the database) then a zero is stored in register P2.
! 4665: ** If AUTOVACUUM is disabled then a zero is stored in register P2.
! 4666: **
! 4667: ** See also: Clear
! 4668: */
! 4669: case OP_Destroy: { /* out2-prerelease */
! 4670: int iMoved;
! 4671: int iCnt;
! 4672: Vdbe *pVdbe;
! 4673: int iDb;
! 4674: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 4675: iCnt = 0;
! 4676: for(pVdbe=db->pVdbe; pVdbe; pVdbe = pVdbe->pNext){
! 4677: if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 ){
! 4678: iCnt++;
! 4679: }
! 4680: }
! 4681: #else
! 4682: iCnt = db->activeVdbeCnt;
! 4683: #endif
! 4684: pOut->flags = MEM_Null;
! 4685: if( iCnt>1 ){
! 4686: rc = SQLITE_LOCKED;
! 4687: p->errorAction = OE_Abort;
! 4688: }else{
! 4689: iDb = pOp->p3;
! 4690: assert( iCnt==1 );
! 4691: assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
! 4692: rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved);
! 4693: pOut->flags = MEM_Int;
! 4694: pOut->u.i = iMoved;
! 4695: #ifndef SQLITE_OMIT_AUTOVACUUM
! 4696: if( rc==SQLITE_OK && iMoved!=0 ){
! 4697: sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1);
! 4698: /* All OP_Destroy operations occur on the same btree */
! 4699: assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 );
! 4700: resetSchemaOnFault = iDb+1;
! 4701: }
! 4702: #endif
! 4703: }
! 4704: break;
! 4705: }
! 4706:
! 4707: /* Opcode: Clear P1 P2 P3
! 4708: **
! 4709: ** Delete all contents of the database table or index whose root page
! 4710: ** in the database file is given by P1. But, unlike Destroy, do not
! 4711: ** remove the table or index from the database file.
! 4712: **
! 4713: ** The table being clear is in the main database file if P2==0. If
! 4714: ** P2==1 then the table to be clear is in the auxiliary database file
! 4715: ** that is used to store tables create using CREATE TEMPORARY TABLE.
! 4716: **
! 4717: ** If the P3 value is non-zero, then the table referred to must be an
! 4718: ** intkey table (an SQL table, not an index). In this case the row change
! 4719: ** count is incremented by the number of rows in the table being cleared.
! 4720: ** If P3 is greater than zero, then the value stored in register P3 is
! 4721: ** also incremented by the number of rows in the table being cleared.
! 4722: **
! 4723: ** See also: Destroy
! 4724: */
! 4725: case OP_Clear: {
! 4726: int nChange;
! 4727:
! 4728: nChange = 0;
! 4729: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p2))!=0 );
! 4730: rc = sqlite3BtreeClearTable(
! 4731: db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0)
! 4732: );
! 4733: if( pOp->p3 ){
! 4734: p->nChange += nChange;
! 4735: if( pOp->p3>0 ){
! 4736: assert( memIsValid(&aMem[pOp->p3]) );
! 4737: memAboutToChange(p, &aMem[pOp->p3]);
! 4738: aMem[pOp->p3].u.i += nChange;
! 4739: }
! 4740: }
! 4741: break;
! 4742: }
! 4743:
! 4744: /* Opcode: CreateTable P1 P2 * * *
! 4745: **
! 4746: ** Allocate a new table in the main database file if P1==0 or in the
! 4747: ** auxiliary database file if P1==1 or in an attached database if
! 4748: ** P1>1. Write the root page number of the new table into
! 4749: ** register P2
! 4750: **
! 4751: ** The difference between a table and an index is this: A table must
! 4752: ** have a 4-byte integer key and can have arbitrary data. An index
! 4753: ** has an arbitrary key but no data.
! 4754: **
! 4755: ** See also: CreateIndex
! 4756: */
! 4757: /* Opcode: CreateIndex P1 P2 * * *
! 4758: **
! 4759: ** Allocate a new index in the main database file if P1==0 or in the
! 4760: ** auxiliary database file if P1==1 or in an attached database if
! 4761: ** P1>1. Write the root page number of the new table into
! 4762: ** register P2.
! 4763: **
! 4764: ** See documentation on OP_CreateTable for additional information.
! 4765: */
! 4766: case OP_CreateIndex: /* out2-prerelease */
! 4767: case OP_CreateTable: { /* out2-prerelease */
! 4768: int pgno;
! 4769: int flags;
! 4770: Db *pDb;
! 4771:
! 4772: pgno = 0;
! 4773: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 4774: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
! 4775: pDb = &db->aDb[pOp->p1];
! 4776: assert( pDb->pBt!=0 );
! 4777: if( pOp->opcode==OP_CreateTable ){
! 4778: /* flags = BTREE_INTKEY; */
! 4779: flags = BTREE_INTKEY;
! 4780: }else{
! 4781: flags = BTREE_BLOBKEY;
! 4782: }
! 4783: rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags);
! 4784: pOut->u.i = pgno;
! 4785: break;
! 4786: }
! 4787:
! 4788: /* Opcode: ParseSchema P1 * * P4 *
! 4789: **
! 4790: ** Read and parse all entries from the SQLITE_MASTER table of database P1
! 4791: ** that match the WHERE clause P4.
! 4792: **
! 4793: ** This opcode invokes the parser to create a new virtual machine,
! 4794: ** then runs the new virtual machine. It is thus a re-entrant opcode.
! 4795: */
! 4796: case OP_ParseSchema: {
! 4797: int iDb;
! 4798: const char *zMaster;
! 4799: char *zSql;
! 4800: InitData initData;
! 4801:
! 4802: /* Any prepared statement that invokes this opcode will hold mutexes
! 4803: ** on every btree. This is a prerequisite for invoking
! 4804: ** sqlite3InitCallback().
! 4805: */
! 4806: #ifdef SQLITE_DEBUG
! 4807: for(iDb=0; iDb<db->nDb; iDb++){
! 4808: assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) );
! 4809: }
! 4810: #endif
! 4811:
! 4812: iDb = pOp->p1;
! 4813: assert( iDb>=0 && iDb<db->nDb );
! 4814: assert( DbHasProperty(db, iDb, DB_SchemaLoaded) );
! 4815: /* Used to be a conditional */ {
! 4816: zMaster = SCHEMA_TABLE(iDb);
! 4817: initData.db = db;
! 4818: initData.iDb = pOp->p1;
! 4819: initData.pzErrMsg = &p->zErrMsg;
! 4820: zSql = sqlite3MPrintf(db,
! 4821: "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid",
! 4822: db->aDb[iDb].zName, zMaster, pOp->p4.z);
! 4823: if( zSql==0 ){
! 4824: rc = SQLITE_NOMEM;
! 4825: }else{
! 4826: assert( db->init.busy==0 );
! 4827: db->init.busy = 1;
! 4828: initData.rc = SQLITE_OK;
! 4829: assert( !db->mallocFailed );
! 4830: rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
! 4831: if( rc==SQLITE_OK ) rc = initData.rc;
! 4832: sqlite3DbFree(db, zSql);
! 4833: db->init.busy = 0;
! 4834: }
! 4835: }
! 4836: if( rc==SQLITE_NOMEM ){
! 4837: goto no_mem;
! 4838: }
! 4839: break;
! 4840: }
! 4841:
! 4842: #if !defined(SQLITE_OMIT_ANALYZE)
! 4843: /* Opcode: LoadAnalysis P1 * * * *
! 4844: **
! 4845: ** Read the sqlite_stat1 table for database P1 and load the content
! 4846: ** of that table into the internal index hash table. This will cause
! 4847: ** the analysis to be used when preparing all subsequent queries.
! 4848: */
! 4849: case OP_LoadAnalysis: {
! 4850: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 4851: rc = sqlite3AnalysisLoad(db, pOp->p1);
! 4852: break;
! 4853: }
! 4854: #endif /* !defined(SQLITE_OMIT_ANALYZE) */
! 4855:
! 4856: /* Opcode: DropTable P1 * * P4 *
! 4857: **
! 4858: ** Remove the internal (in-memory) data structures that describe
! 4859: ** the table named P4 in database P1. This is called after a table
! 4860: ** is dropped in order to keep the internal representation of the
! 4861: ** schema consistent with what is on disk.
! 4862: */
! 4863: case OP_DropTable: {
! 4864: sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
! 4865: break;
! 4866: }
! 4867:
! 4868: /* Opcode: DropIndex P1 * * P4 *
! 4869: **
! 4870: ** Remove the internal (in-memory) data structures that describe
! 4871: ** the index named P4 in database P1. This is called after an index
! 4872: ** is dropped in order to keep the internal representation of the
! 4873: ** schema consistent with what is on disk.
! 4874: */
! 4875: case OP_DropIndex: {
! 4876: sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
! 4877: break;
! 4878: }
! 4879:
! 4880: /* Opcode: DropTrigger P1 * * P4 *
! 4881: **
! 4882: ** Remove the internal (in-memory) data structures that describe
! 4883: ** the trigger named P4 in database P1. This is called after a trigger
! 4884: ** is dropped in order to keep the internal representation of the
! 4885: ** schema consistent with what is on disk.
! 4886: */
! 4887: case OP_DropTrigger: {
! 4888: sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
! 4889: break;
! 4890: }
! 4891:
! 4892:
! 4893: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
! 4894: /* Opcode: IntegrityCk P1 P2 P3 * P5
! 4895: **
! 4896: ** Do an analysis of the currently open database. Store in
! 4897: ** register P1 the text of an error message describing any problems.
! 4898: ** If no problems are found, store a NULL in register P1.
! 4899: **
! 4900: ** The register P3 contains the maximum number of allowed errors.
! 4901: ** At most reg(P3) errors will be reported.
! 4902: ** In other words, the analysis stops as soon as reg(P1) errors are
! 4903: ** seen. Reg(P1) is updated with the number of errors remaining.
! 4904: **
! 4905: ** The root page numbers of all tables in the database are integer
! 4906: ** stored in reg(P1), reg(P1+1), reg(P1+2), .... There are P2 tables
! 4907: ** total.
! 4908: **
! 4909: ** If P5 is not zero, the check is done on the auxiliary database
! 4910: ** file, not the main database file.
! 4911: **
! 4912: ** This opcode is used to implement the integrity_check pragma.
! 4913: */
! 4914: case OP_IntegrityCk: {
! 4915: int nRoot; /* Number of tables to check. (Number of root pages.) */
! 4916: int *aRoot; /* Array of rootpage numbers for tables to be checked */
! 4917: int j; /* Loop counter */
! 4918: int nErr; /* Number of errors reported */
! 4919: char *z; /* Text of the error report */
! 4920: Mem *pnErr; /* Register keeping track of errors remaining */
! 4921:
! 4922: nRoot = pOp->p2;
! 4923: assert( nRoot>0 );
! 4924: aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(nRoot+1) );
! 4925: if( aRoot==0 ) goto no_mem;
! 4926: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 4927: pnErr = &aMem[pOp->p3];
! 4928: assert( (pnErr->flags & MEM_Int)!=0 );
! 4929: assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 );
! 4930: pIn1 = &aMem[pOp->p1];
! 4931: for(j=0; j<nRoot; j++){
! 4932: aRoot[j] = (int)sqlite3VdbeIntValue(&pIn1[j]);
! 4933: }
! 4934: aRoot[j] = 0;
! 4935: assert( pOp->p5<db->nDb );
! 4936: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p5))!=0 );
! 4937: z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot,
! 4938: (int)pnErr->u.i, &nErr);
! 4939: sqlite3DbFree(db, aRoot);
! 4940: pnErr->u.i -= nErr;
! 4941: sqlite3VdbeMemSetNull(pIn1);
! 4942: if( nErr==0 ){
! 4943: assert( z==0 );
! 4944: }else if( z==0 ){
! 4945: goto no_mem;
! 4946: }else{
! 4947: sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
! 4948: }
! 4949: UPDATE_MAX_BLOBSIZE(pIn1);
! 4950: sqlite3VdbeChangeEncoding(pIn1, encoding);
! 4951: break;
! 4952: }
! 4953: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
! 4954:
! 4955: /* Opcode: RowSetAdd P1 P2 * * *
! 4956: **
! 4957: ** Insert the integer value held by register P2 into a boolean index
! 4958: ** held in register P1.
! 4959: **
! 4960: ** An assertion fails if P2 is not an integer.
! 4961: */
! 4962: case OP_RowSetAdd: { /* in1, in2 */
! 4963: pIn1 = &aMem[pOp->p1];
! 4964: pIn2 = &aMem[pOp->p2];
! 4965: assert( (pIn2->flags & MEM_Int)!=0 );
! 4966: if( (pIn1->flags & MEM_RowSet)==0 ){
! 4967: sqlite3VdbeMemSetRowSet(pIn1);
! 4968: if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
! 4969: }
! 4970: sqlite3RowSetInsert(pIn1->u.pRowSet, pIn2->u.i);
! 4971: break;
! 4972: }
! 4973:
! 4974: /* Opcode: RowSetRead P1 P2 P3 * *
! 4975: **
! 4976: ** Extract the smallest value from boolean index P1 and put that value into
! 4977: ** register P3. Or, if boolean index P1 is initially empty, leave P3
! 4978: ** unchanged and jump to instruction P2.
! 4979: */
! 4980: case OP_RowSetRead: { /* jump, in1, out3 */
! 4981: i64 val;
! 4982: CHECK_FOR_INTERRUPT;
! 4983: pIn1 = &aMem[pOp->p1];
! 4984: if( (pIn1->flags & MEM_RowSet)==0
! 4985: || sqlite3RowSetNext(pIn1->u.pRowSet, &val)==0
! 4986: ){
! 4987: /* The boolean index is empty */
! 4988: sqlite3VdbeMemSetNull(pIn1);
! 4989: pc = pOp->p2 - 1;
! 4990: }else{
! 4991: /* A value was pulled from the index */
! 4992: sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val);
! 4993: }
! 4994: break;
! 4995: }
! 4996:
! 4997: /* Opcode: RowSetTest P1 P2 P3 P4
! 4998: **
! 4999: ** Register P3 is assumed to hold a 64-bit integer value. If register P1
! 5000: ** contains a RowSet object and that RowSet object contains
! 5001: ** the value held in P3, jump to register P2. Otherwise, insert the
! 5002: ** integer in P3 into the RowSet and continue on to the
! 5003: ** next opcode.
! 5004: **
! 5005: ** The RowSet object is optimized for the case where successive sets
! 5006: ** of integers, where each set contains no duplicates. Each set
! 5007: ** of values is identified by a unique P4 value. The first set
! 5008: ** must have P4==0, the final set P4=-1. P4 must be either -1 or
! 5009: ** non-negative. For non-negative values of P4 only the lower 4
! 5010: ** bits are significant.
! 5011: **
! 5012: ** This allows optimizations: (a) when P4==0 there is no need to test
! 5013: ** the rowset object for P3, as it is guaranteed not to contain it,
! 5014: ** (b) when P4==-1 there is no need to insert the value, as it will
! 5015: ** never be tested for, and (c) when a value that is part of set X is
! 5016: ** inserted, there is no need to search to see if the same value was
! 5017: ** previously inserted as part of set X (only if it was previously
! 5018: ** inserted as part of some other set).
! 5019: */
! 5020: case OP_RowSetTest: { /* jump, in1, in3 */
! 5021: int iSet;
! 5022: int exists;
! 5023:
! 5024: pIn1 = &aMem[pOp->p1];
! 5025: pIn3 = &aMem[pOp->p3];
! 5026: iSet = pOp->p4.i;
! 5027: assert( pIn3->flags&MEM_Int );
! 5028:
! 5029: /* If there is anything other than a rowset object in memory cell P1,
! 5030: ** delete it now and initialize P1 with an empty rowset
! 5031: */
! 5032: if( (pIn1->flags & MEM_RowSet)==0 ){
! 5033: sqlite3VdbeMemSetRowSet(pIn1);
! 5034: if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
! 5035: }
! 5036:
! 5037: assert( pOp->p4type==P4_INT32 );
! 5038: assert( iSet==-1 || iSet>=0 );
! 5039: if( iSet ){
! 5040: exists = sqlite3RowSetTest(pIn1->u.pRowSet,
! 5041: (u8)(iSet>=0 ? iSet & 0xf : 0xff),
! 5042: pIn3->u.i);
! 5043: if( exists ){
! 5044: pc = pOp->p2 - 1;
! 5045: break;
! 5046: }
! 5047: }
! 5048: if( iSet>=0 ){
! 5049: sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
! 5050: }
! 5051: break;
! 5052: }
! 5053:
! 5054:
! 5055: #ifndef SQLITE_OMIT_TRIGGER
! 5056:
! 5057: /* Opcode: Program P1 P2 P3 P4 *
! 5058: **
! 5059: ** Execute the trigger program passed as P4 (type P4_SUBPROGRAM).
! 5060: **
! 5061: ** P1 contains the address of the memory cell that contains the first memory
! 5062: ** cell in an array of values used as arguments to the sub-program. P2
! 5063: ** contains the address to jump to if the sub-program throws an IGNORE
! 5064: ** exception using the RAISE() function. Register P3 contains the address
! 5065: ** of a memory cell in this (the parent) VM that is used to allocate the
! 5066: ** memory required by the sub-vdbe at runtime.
! 5067: **
! 5068: ** P4 is a pointer to the VM containing the trigger program.
! 5069: */
! 5070: case OP_Program: { /* jump */
! 5071: int nMem; /* Number of memory registers for sub-program */
! 5072: int nByte; /* Bytes of runtime space required for sub-program */
! 5073: Mem *pRt; /* Register to allocate runtime space */
! 5074: Mem *pMem; /* Used to iterate through memory cells */
! 5075: Mem *pEnd; /* Last memory cell in new array */
! 5076: VdbeFrame *pFrame; /* New vdbe frame to execute in */
! 5077: SubProgram *pProgram; /* Sub-program to execute */
! 5078: void *t; /* Token identifying trigger */
! 5079:
! 5080: pProgram = pOp->p4.pProgram;
! 5081: pRt = &aMem[pOp->p3];
! 5082: assert( pProgram->nOp>0 );
! 5083:
! 5084: /* If the p5 flag is clear, then recursive invocation of triggers is
! 5085: ** disabled for backwards compatibility (p5 is set if this sub-program
! 5086: ** is really a trigger, not a foreign key action, and the flag set
! 5087: ** and cleared by the "PRAGMA recursive_triggers" command is clear).
! 5088: **
! 5089: ** It is recursive invocation of triggers, at the SQL level, that is
! 5090: ** disabled. In some cases a single trigger may generate more than one
! 5091: ** SubProgram (if the trigger may be executed with more than one different
! 5092: ** ON CONFLICT algorithm). SubProgram structures associated with a
! 5093: ** single trigger all have the same value for the SubProgram.token
! 5094: ** variable. */
! 5095: if( pOp->p5 ){
! 5096: t = pProgram->token;
! 5097: for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent);
! 5098: if( pFrame ) break;
! 5099: }
! 5100:
! 5101: if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
! 5102: rc = SQLITE_ERROR;
! 5103: sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion");
! 5104: break;
! 5105: }
! 5106:
! 5107: /* Register pRt is used to store the memory required to save the state
! 5108: ** of the current program, and the memory required at runtime to execute
! 5109: ** the trigger program. If this trigger has been fired before, then pRt
! 5110: ** is already allocated. Otherwise, it must be initialized. */
! 5111: if( (pRt->flags&MEM_Frame)==0 ){
! 5112: /* SubProgram.nMem is set to the number of memory cells used by the
! 5113: ** program stored in SubProgram.aOp. As well as these, one memory
! 5114: ** cell is required for each cursor used by the program. Set local
! 5115: ** variable nMem (and later, VdbeFrame.nChildMem) to this value.
! 5116: */
! 5117: nMem = pProgram->nMem + pProgram->nCsr;
! 5118: nByte = ROUND8(sizeof(VdbeFrame))
! 5119: + nMem * sizeof(Mem)
! 5120: + pProgram->nCsr * sizeof(VdbeCursor *)
! 5121: + pProgram->nOnce * sizeof(u8);
! 5122: pFrame = sqlite3DbMallocZero(db, nByte);
! 5123: if( !pFrame ){
! 5124: goto no_mem;
! 5125: }
! 5126: sqlite3VdbeMemRelease(pRt);
! 5127: pRt->flags = MEM_Frame;
! 5128: pRt->u.pFrame = pFrame;
! 5129:
! 5130: pFrame->v = p;
! 5131: pFrame->nChildMem = nMem;
! 5132: pFrame->nChildCsr = pProgram->nCsr;
! 5133: pFrame->pc = pc;
! 5134: pFrame->aMem = p->aMem;
! 5135: pFrame->nMem = p->nMem;
! 5136: pFrame->apCsr = p->apCsr;
! 5137: pFrame->nCursor = p->nCursor;
! 5138: pFrame->aOp = p->aOp;
! 5139: pFrame->nOp = p->nOp;
! 5140: pFrame->token = pProgram->token;
! 5141: pFrame->aOnceFlag = p->aOnceFlag;
! 5142: pFrame->nOnceFlag = p->nOnceFlag;
! 5143:
! 5144: pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
! 5145: for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
! 5146: pMem->flags = MEM_Invalid;
! 5147: pMem->db = db;
! 5148: }
! 5149: }else{
! 5150: pFrame = pRt->u.pFrame;
! 5151: assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem );
! 5152: assert( pProgram->nCsr==pFrame->nChildCsr );
! 5153: assert( pc==pFrame->pc );
! 5154: }
! 5155:
! 5156: p->nFrame++;
! 5157: pFrame->pParent = p->pFrame;
! 5158: pFrame->lastRowid = lastRowid;
! 5159: pFrame->nChange = p->nChange;
! 5160: p->nChange = 0;
! 5161: p->pFrame = pFrame;
! 5162: p->aMem = aMem = &VdbeFrameMem(pFrame)[-1];
! 5163: p->nMem = pFrame->nChildMem;
! 5164: p->nCursor = (u16)pFrame->nChildCsr;
! 5165: p->apCsr = (VdbeCursor **)&aMem[p->nMem+1];
! 5166: p->aOp = aOp = pProgram->aOp;
! 5167: p->nOp = pProgram->nOp;
! 5168: p->aOnceFlag = (u8 *)&p->apCsr[p->nCursor];
! 5169: p->nOnceFlag = pProgram->nOnce;
! 5170: p->nOp = pProgram->nOp;
! 5171: pc = -1;
! 5172: memset(p->aOnceFlag, 0, p->nOnceFlag);
! 5173:
! 5174: break;
! 5175: }
! 5176:
! 5177: /* Opcode: Param P1 P2 * * *
! 5178: **
! 5179: ** This opcode is only ever present in sub-programs called via the
! 5180: ** OP_Program instruction. Copy a value currently stored in a memory
! 5181: ** cell of the calling (parent) frame to cell P2 in the current frames
! 5182: ** address space. This is used by trigger programs to access the new.*
! 5183: ** and old.* values.
! 5184: **
! 5185: ** The address of the cell in the parent frame is determined by adding
! 5186: ** the value of the P1 argument to the value of the P1 argument to the
! 5187: ** calling OP_Program instruction.
! 5188: */
! 5189: case OP_Param: { /* out2-prerelease */
! 5190: VdbeFrame *pFrame;
! 5191: Mem *pIn;
! 5192: pFrame = p->pFrame;
! 5193: pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1];
! 5194: sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem);
! 5195: break;
! 5196: }
! 5197:
! 5198: #endif /* #ifndef SQLITE_OMIT_TRIGGER */
! 5199:
! 5200: #ifndef SQLITE_OMIT_FOREIGN_KEY
! 5201: /* Opcode: FkCounter P1 P2 * * *
! 5202: **
! 5203: ** Increment a "constraint counter" by P2 (P2 may be negative or positive).
! 5204: ** If P1 is non-zero, the database constraint counter is incremented
! 5205: ** (deferred foreign key constraints). Otherwise, if P1 is zero, the
! 5206: ** statement counter is incremented (immediate foreign key constraints).
! 5207: */
! 5208: case OP_FkCounter: {
! 5209: if( pOp->p1 ){
! 5210: db->nDeferredCons += pOp->p2;
! 5211: }else{
! 5212: p->nFkConstraint += pOp->p2;
! 5213: }
! 5214: break;
! 5215: }
! 5216:
! 5217: /* Opcode: FkIfZero P1 P2 * * *
! 5218: **
! 5219: ** This opcode tests if a foreign key constraint-counter is currently zero.
! 5220: ** If so, jump to instruction P2. Otherwise, fall through to the next
! 5221: ** instruction.
! 5222: **
! 5223: ** If P1 is non-zero, then the jump is taken if the database constraint-counter
! 5224: ** is zero (the one that counts deferred constraint violations). If P1 is
! 5225: ** zero, the jump is taken if the statement constraint-counter is zero
! 5226: ** (immediate foreign key constraint violations).
! 5227: */
! 5228: case OP_FkIfZero: { /* jump */
! 5229: if( pOp->p1 ){
! 5230: if( db->nDeferredCons==0 ) pc = pOp->p2-1;
! 5231: }else{
! 5232: if( p->nFkConstraint==0 ) pc = pOp->p2-1;
! 5233: }
! 5234: break;
! 5235: }
! 5236: #endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */
! 5237:
! 5238: #ifndef SQLITE_OMIT_AUTOINCREMENT
! 5239: /* Opcode: MemMax P1 P2 * * *
! 5240: **
! 5241: ** P1 is a register in the root frame of this VM (the root frame is
! 5242: ** different from the current frame if this instruction is being executed
! 5243: ** within a sub-program). Set the value of register P1 to the maximum of
! 5244: ** its current value and the value in register P2.
! 5245: **
! 5246: ** This instruction throws an error if the memory cell is not initially
! 5247: ** an integer.
! 5248: */
! 5249: case OP_MemMax: { /* in2 */
! 5250: Mem *pIn1;
! 5251: VdbeFrame *pFrame;
! 5252: if( p->pFrame ){
! 5253: for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
! 5254: pIn1 = &pFrame->aMem[pOp->p1];
! 5255: }else{
! 5256: pIn1 = &aMem[pOp->p1];
! 5257: }
! 5258: assert( memIsValid(pIn1) );
! 5259: sqlite3VdbeMemIntegerify(pIn1);
! 5260: pIn2 = &aMem[pOp->p2];
! 5261: sqlite3VdbeMemIntegerify(pIn2);
! 5262: if( pIn1->u.i<pIn2->u.i){
! 5263: pIn1->u.i = pIn2->u.i;
! 5264: }
! 5265: break;
! 5266: }
! 5267: #endif /* SQLITE_OMIT_AUTOINCREMENT */
! 5268:
! 5269: /* Opcode: IfPos P1 P2 * * *
! 5270: **
! 5271: ** If the value of register P1 is 1 or greater, jump to P2.
! 5272: **
! 5273: ** It is illegal to use this instruction on a register that does
! 5274: ** not contain an integer. An assertion fault will result if you try.
! 5275: */
! 5276: case OP_IfPos: { /* jump, in1 */
! 5277: pIn1 = &aMem[pOp->p1];
! 5278: assert( pIn1->flags&MEM_Int );
! 5279: if( pIn1->u.i>0 ){
! 5280: pc = pOp->p2 - 1;
! 5281: }
! 5282: break;
! 5283: }
! 5284:
! 5285: /* Opcode: IfNeg P1 P2 * * *
! 5286: **
! 5287: ** If the value of register P1 is less than zero, jump to P2.
! 5288: **
! 5289: ** It is illegal to use this instruction on a register that does
! 5290: ** not contain an integer. An assertion fault will result if you try.
! 5291: */
! 5292: case OP_IfNeg: { /* jump, in1 */
! 5293: pIn1 = &aMem[pOp->p1];
! 5294: assert( pIn1->flags&MEM_Int );
! 5295: if( pIn1->u.i<0 ){
! 5296: pc = pOp->p2 - 1;
! 5297: }
! 5298: break;
! 5299: }
! 5300:
! 5301: /* Opcode: IfZero P1 P2 P3 * *
! 5302: **
! 5303: ** The register P1 must contain an integer. Add literal P3 to the
! 5304: ** value in register P1. If the result is exactly 0, jump to P2.
! 5305: **
! 5306: ** It is illegal to use this instruction on a register that does
! 5307: ** not contain an integer. An assertion fault will result if you try.
! 5308: */
! 5309: case OP_IfZero: { /* jump, in1 */
! 5310: pIn1 = &aMem[pOp->p1];
! 5311: assert( pIn1->flags&MEM_Int );
! 5312: pIn1->u.i += pOp->p3;
! 5313: if( pIn1->u.i==0 ){
! 5314: pc = pOp->p2 - 1;
! 5315: }
! 5316: break;
! 5317: }
! 5318:
! 5319: /* Opcode: AggStep * P2 P3 P4 P5
! 5320: **
! 5321: ** Execute the step function for an aggregate. The
! 5322: ** function has P5 arguments. P4 is a pointer to the FuncDef
! 5323: ** structure that specifies the function. Use register
! 5324: ** P3 as the accumulator.
! 5325: **
! 5326: ** The P5 arguments are taken from register P2 and its
! 5327: ** successors.
! 5328: */
! 5329: case OP_AggStep: {
! 5330: int n;
! 5331: int i;
! 5332: Mem *pMem;
! 5333: Mem *pRec;
! 5334: sqlite3_context ctx;
! 5335: sqlite3_value **apVal;
! 5336:
! 5337: n = pOp->p5;
! 5338: assert( n>=0 );
! 5339: pRec = &aMem[pOp->p2];
! 5340: apVal = p->apArg;
! 5341: assert( apVal || n==0 );
! 5342: for(i=0; i<n; i++, pRec++){
! 5343: assert( memIsValid(pRec) );
! 5344: apVal[i] = pRec;
! 5345: memAboutToChange(p, pRec);
! 5346: sqlite3VdbeMemStoreType(pRec);
! 5347: }
! 5348: ctx.pFunc = pOp->p4.pFunc;
! 5349: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 5350: ctx.pMem = pMem = &aMem[pOp->p3];
! 5351: pMem->n++;
! 5352: ctx.s.flags = MEM_Null;
! 5353: ctx.s.z = 0;
! 5354: ctx.s.zMalloc = 0;
! 5355: ctx.s.xDel = 0;
! 5356: ctx.s.db = db;
! 5357: ctx.isError = 0;
! 5358: ctx.pColl = 0;
! 5359: if( ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
! 5360: assert( pOp>p->aOp );
! 5361: assert( pOp[-1].p4type==P4_COLLSEQ );
! 5362: assert( pOp[-1].opcode==OP_CollSeq );
! 5363: ctx.pColl = pOp[-1].p4.pColl;
! 5364: }
! 5365: (ctx.pFunc->xStep)(&ctx, n, apVal); /* IMP: R-24505-23230 */
! 5366: if( ctx.isError ){
! 5367: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
! 5368: rc = ctx.isError;
! 5369: }
! 5370:
! 5371: sqlite3VdbeMemRelease(&ctx.s);
! 5372:
! 5373: break;
! 5374: }
! 5375:
! 5376: /* Opcode: AggFinal P1 P2 * P4 *
! 5377: **
! 5378: ** Execute the finalizer function for an aggregate. P1 is
! 5379: ** the memory location that is the accumulator for the aggregate.
! 5380: **
! 5381: ** P2 is the number of arguments that the step function takes and
! 5382: ** P4 is a pointer to the FuncDef for this function. The P2
! 5383: ** argument is not used by this opcode. It is only there to disambiguate
! 5384: ** functions that can take varying numbers of arguments. The
! 5385: ** P4 argument is only needed for the degenerate case where
! 5386: ** the step function was not previously called.
! 5387: */
! 5388: case OP_AggFinal: {
! 5389: Mem *pMem;
! 5390: assert( pOp->p1>0 && pOp->p1<=p->nMem );
! 5391: pMem = &aMem[pOp->p1];
! 5392: assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
! 5393: rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
! 5394: if( rc ){
! 5395: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(pMem));
! 5396: }
! 5397: sqlite3VdbeChangeEncoding(pMem, encoding);
! 5398: UPDATE_MAX_BLOBSIZE(pMem);
! 5399: if( sqlite3VdbeMemTooBig(pMem) ){
! 5400: goto too_big;
! 5401: }
! 5402: break;
! 5403: }
! 5404:
! 5405: #ifndef SQLITE_OMIT_WAL
! 5406: /* Opcode: Checkpoint P1 P2 P3 * *
! 5407: **
! 5408: ** Checkpoint database P1. This is a no-op if P1 is not currently in
! 5409: ** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL
! 5410: ** or RESTART. Write 1 or 0 into mem[P3] if the checkpoint returns
! 5411: ** SQLITE_BUSY or not, respectively. Write the number of pages in the
! 5412: ** WAL after the checkpoint into mem[P3+1] and the number of pages
! 5413: ** in the WAL that have been checkpointed after the checkpoint
! 5414: ** completes into mem[P3+2]. However on an error, mem[P3+1] and
! 5415: ** mem[P3+2] are initialized to -1.
! 5416: */
! 5417: case OP_Checkpoint: {
! 5418: int i; /* Loop counter */
! 5419: int aRes[3]; /* Results */
! 5420: Mem *pMem; /* Write results here */
! 5421:
! 5422: aRes[0] = 0;
! 5423: aRes[1] = aRes[2] = -1;
! 5424: assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE
! 5425: || pOp->p2==SQLITE_CHECKPOINT_FULL
! 5426: || pOp->p2==SQLITE_CHECKPOINT_RESTART
! 5427: );
! 5428: rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]);
! 5429: if( rc==SQLITE_BUSY ){
! 5430: rc = SQLITE_OK;
! 5431: aRes[0] = 1;
! 5432: }
! 5433: for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){
! 5434: sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]);
! 5435: }
! 5436: break;
! 5437: };
! 5438: #endif
! 5439:
! 5440: #ifndef SQLITE_OMIT_PRAGMA
! 5441: /* Opcode: JournalMode P1 P2 P3 * P5
! 5442: **
! 5443: ** Change the journal mode of database P1 to P3. P3 must be one of the
! 5444: ** PAGER_JOURNALMODE_XXX values. If changing between the various rollback
! 5445: ** modes (delete, truncate, persist, off and memory), this is a simple
! 5446: ** operation. No IO is required.
! 5447: **
! 5448: ** If changing into or out of WAL mode the procedure is more complicated.
! 5449: **
! 5450: ** Write a string containing the final journal-mode to register P2.
! 5451: */
! 5452: case OP_JournalMode: { /* out2-prerelease */
! 5453: Btree *pBt; /* Btree to change journal mode of */
! 5454: Pager *pPager; /* Pager associated with pBt */
! 5455: int eNew; /* New journal mode */
! 5456: int eOld; /* The old journal mode */
! 5457: const char *zFilename; /* Name of database file for pPager */
! 5458:
! 5459: eNew = pOp->p3;
! 5460: assert( eNew==PAGER_JOURNALMODE_DELETE
! 5461: || eNew==PAGER_JOURNALMODE_TRUNCATE
! 5462: || eNew==PAGER_JOURNALMODE_PERSIST
! 5463: || eNew==PAGER_JOURNALMODE_OFF
! 5464: || eNew==PAGER_JOURNALMODE_MEMORY
! 5465: || eNew==PAGER_JOURNALMODE_WAL
! 5466: || eNew==PAGER_JOURNALMODE_QUERY
! 5467: );
! 5468: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 5469:
! 5470: pBt = db->aDb[pOp->p1].pBt;
! 5471: pPager = sqlite3BtreePager(pBt);
! 5472: eOld = sqlite3PagerGetJournalMode(pPager);
! 5473: if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld;
! 5474: if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld;
! 5475:
! 5476: #ifndef SQLITE_OMIT_WAL
! 5477: zFilename = sqlite3PagerFilename(pPager);
! 5478:
! 5479: /* Do not allow a transition to journal_mode=WAL for a database
! 5480: ** in temporary storage or if the VFS does not support shared memory
! 5481: */
! 5482: if( eNew==PAGER_JOURNALMODE_WAL
! 5483: && (sqlite3Strlen30(zFilename)==0 /* Temp file */
! 5484: || !sqlite3PagerWalSupported(pPager)) /* No shared-memory support */
! 5485: ){
! 5486: eNew = eOld;
! 5487: }
! 5488:
! 5489: if( (eNew!=eOld)
! 5490: && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL)
! 5491: ){
! 5492: if( !db->autoCommit || db->activeVdbeCnt>1 ){
! 5493: rc = SQLITE_ERROR;
! 5494: sqlite3SetString(&p->zErrMsg, db,
! 5495: "cannot change %s wal mode from within a transaction",
! 5496: (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of")
! 5497: );
! 5498: break;
! 5499: }else{
! 5500:
! 5501: if( eOld==PAGER_JOURNALMODE_WAL ){
! 5502: /* If leaving WAL mode, close the log file. If successful, the call
! 5503: ** to PagerCloseWal() checkpoints and deletes the write-ahead-log
! 5504: ** file. An EXCLUSIVE lock may still be held on the database file
! 5505: ** after a successful return.
! 5506: */
! 5507: rc = sqlite3PagerCloseWal(pPager);
! 5508: if( rc==SQLITE_OK ){
! 5509: sqlite3PagerSetJournalMode(pPager, eNew);
! 5510: }
! 5511: }else if( eOld==PAGER_JOURNALMODE_MEMORY ){
! 5512: /* Cannot transition directly from MEMORY to WAL. Use mode OFF
! 5513: ** as an intermediate */
! 5514: sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF);
! 5515: }
! 5516:
! 5517: /* Open a transaction on the database file. Regardless of the journal
! 5518: ** mode, this transaction always uses a rollback journal.
! 5519: */
! 5520: assert( sqlite3BtreeIsInTrans(pBt)==0 );
! 5521: if( rc==SQLITE_OK ){
! 5522: rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1));
! 5523: }
! 5524: }
! 5525: }
! 5526: #endif /* ifndef SQLITE_OMIT_WAL */
! 5527:
! 5528: if( rc ){
! 5529: eNew = eOld;
! 5530: }
! 5531: eNew = sqlite3PagerSetJournalMode(pPager, eNew);
! 5532:
! 5533: pOut = &aMem[pOp->p2];
! 5534: pOut->flags = MEM_Str|MEM_Static|MEM_Term;
! 5535: pOut->z = (char *)sqlite3JournalModename(eNew);
! 5536: pOut->n = sqlite3Strlen30(pOut->z);
! 5537: pOut->enc = SQLITE_UTF8;
! 5538: sqlite3VdbeChangeEncoding(pOut, encoding);
! 5539: break;
! 5540: };
! 5541: #endif /* SQLITE_OMIT_PRAGMA */
! 5542:
! 5543: #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
! 5544: /* Opcode: Vacuum * * * * *
! 5545: **
! 5546: ** Vacuum the entire database. This opcode will cause other virtual
! 5547: ** machines to be created and run. It may not be called from within
! 5548: ** a transaction.
! 5549: */
! 5550: case OP_Vacuum: {
! 5551: rc = sqlite3RunVacuum(&p->zErrMsg, db);
! 5552: break;
! 5553: }
! 5554: #endif
! 5555:
! 5556: #if !defined(SQLITE_OMIT_AUTOVACUUM)
! 5557: /* Opcode: IncrVacuum P1 P2 * * *
! 5558: **
! 5559: ** Perform a single step of the incremental vacuum procedure on
! 5560: ** the P1 database. If the vacuum has finished, jump to instruction
! 5561: ** P2. Otherwise, fall through to the next instruction.
! 5562: */
! 5563: case OP_IncrVacuum: { /* jump */
! 5564: Btree *pBt;
! 5565:
! 5566: assert( pOp->p1>=0 && pOp->p1<db->nDb );
! 5567: assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
! 5568: pBt = db->aDb[pOp->p1].pBt;
! 5569: rc = sqlite3BtreeIncrVacuum(pBt);
! 5570: if( rc==SQLITE_DONE ){
! 5571: pc = pOp->p2 - 1;
! 5572: rc = SQLITE_OK;
! 5573: }
! 5574: break;
! 5575: }
! 5576: #endif
! 5577:
! 5578: /* Opcode: Expire P1 * * * *
! 5579: **
! 5580: ** Cause precompiled statements to become expired. An expired statement
! 5581: ** fails with an error code of SQLITE_SCHEMA if it is ever executed
! 5582: ** (via sqlite3_step()).
! 5583: **
! 5584: ** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
! 5585: ** then only the currently executing statement is affected.
! 5586: */
! 5587: case OP_Expire: {
! 5588: if( !pOp->p1 ){
! 5589: sqlite3ExpirePreparedStatements(db);
! 5590: }else{
! 5591: p->expired = 1;
! 5592: }
! 5593: break;
! 5594: }
! 5595:
! 5596: #ifndef SQLITE_OMIT_SHARED_CACHE
! 5597: /* Opcode: TableLock P1 P2 P3 P4 *
! 5598: **
! 5599: ** Obtain a lock on a particular table. This instruction is only used when
! 5600: ** the shared-cache feature is enabled.
! 5601: **
! 5602: ** P1 is the index of the database in sqlite3.aDb[] of the database
! 5603: ** on which the lock is acquired. A readlock is obtained if P3==0 or
! 5604: ** a write lock if P3==1.
! 5605: **
! 5606: ** P2 contains the root-page of the table to lock.
! 5607: **
! 5608: ** P4 contains a pointer to the name of the table being locked. This is only
! 5609: ** used to generate an error message if the lock cannot be obtained.
! 5610: */
! 5611: case OP_TableLock: {
! 5612: u8 isWriteLock = (u8)pOp->p3;
! 5613: if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){
! 5614: int p1 = pOp->p1;
! 5615: assert( p1>=0 && p1<db->nDb );
! 5616: assert( (p->btreeMask & (((yDbMask)1)<<p1))!=0 );
! 5617: assert( isWriteLock==0 || isWriteLock==1 );
! 5618: rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
! 5619: if( (rc&0xFF)==SQLITE_LOCKED ){
! 5620: const char *z = pOp->p4.z;
! 5621: sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z);
! 5622: }
! 5623: }
! 5624: break;
! 5625: }
! 5626: #endif /* SQLITE_OMIT_SHARED_CACHE */
! 5627:
! 5628: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5629: /* Opcode: VBegin * * * P4 *
! 5630: **
! 5631: ** P4 may be a pointer to an sqlite3_vtab structure. If so, call the
! 5632: ** xBegin method for that table.
! 5633: **
! 5634: ** Also, whether or not P4 is set, check that this is not being called from
! 5635: ** within a callback to a virtual table xSync() method. If it is, the error
! 5636: ** code will be set to SQLITE_LOCKED.
! 5637: */
! 5638: case OP_VBegin: {
! 5639: VTable *pVTab;
! 5640: pVTab = pOp->p4.pVtab;
! 5641: rc = sqlite3VtabBegin(db, pVTab);
! 5642: if( pVTab ) importVtabErrMsg(p, pVTab->pVtab);
! 5643: break;
! 5644: }
! 5645: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5646:
! 5647: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5648: /* Opcode: VCreate P1 * * P4 *
! 5649: **
! 5650: ** P4 is the name of a virtual table in database P1. Call the xCreate method
! 5651: ** for that table.
! 5652: */
! 5653: case OP_VCreate: {
! 5654: rc = sqlite3VtabCallCreate(db, pOp->p1, pOp->p4.z, &p->zErrMsg);
! 5655: break;
! 5656: }
! 5657: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5658:
! 5659: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5660: /* Opcode: VDestroy P1 * * P4 *
! 5661: **
! 5662: ** P4 is the name of a virtual table in database P1. Call the xDestroy method
! 5663: ** of that table.
! 5664: */
! 5665: case OP_VDestroy: {
! 5666: p->inVtabMethod = 2;
! 5667: rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z);
! 5668: p->inVtabMethod = 0;
! 5669: break;
! 5670: }
! 5671: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5672:
! 5673: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5674: /* Opcode: VOpen P1 * * P4 *
! 5675: **
! 5676: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
! 5677: ** P1 is a cursor number. This opcode opens a cursor to the virtual
! 5678: ** table and stores that cursor in P1.
! 5679: */
! 5680: case OP_VOpen: {
! 5681: VdbeCursor *pCur;
! 5682: sqlite3_vtab_cursor *pVtabCursor;
! 5683: sqlite3_vtab *pVtab;
! 5684: sqlite3_module *pModule;
! 5685:
! 5686: pCur = 0;
! 5687: pVtabCursor = 0;
! 5688: pVtab = pOp->p4.pVtab->pVtab;
! 5689: pModule = (sqlite3_module *)pVtab->pModule;
! 5690: assert(pVtab && pModule);
! 5691: rc = pModule->xOpen(pVtab, &pVtabCursor);
! 5692: importVtabErrMsg(p, pVtab);
! 5693: if( SQLITE_OK==rc ){
! 5694: /* Initialize sqlite3_vtab_cursor base class */
! 5695: pVtabCursor->pVtab = pVtab;
! 5696:
! 5697: /* Initialise vdbe cursor object */
! 5698: pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
! 5699: if( pCur ){
! 5700: pCur->pVtabCursor = pVtabCursor;
! 5701: pCur->pModule = pVtabCursor->pVtab->pModule;
! 5702: }else{
! 5703: db->mallocFailed = 1;
! 5704: pModule->xClose(pVtabCursor);
! 5705: }
! 5706: }
! 5707: break;
! 5708: }
! 5709: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5710:
! 5711: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5712: /* Opcode: VFilter P1 P2 P3 P4 *
! 5713: **
! 5714: ** P1 is a cursor opened using VOpen. P2 is an address to jump to if
! 5715: ** the filtered result set is empty.
! 5716: **
! 5717: ** P4 is either NULL or a string that was generated by the xBestIndex
! 5718: ** method of the module. The interpretation of the P4 string is left
! 5719: ** to the module implementation.
! 5720: **
! 5721: ** This opcode invokes the xFilter method on the virtual table specified
! 5722: ** by P1. The integer query plan parameter to xFilter is stored in register
! 5723: ** P3. Register P3+1 stores the argc parameter to be passed to the
! 5724: ** xFilter method. Registers P3+2..P3+1+argc are the argc
! 5725: ** additional parameters which are passed to
! 5726: ** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
! 5727: **
! 5728: ** A jump is made to P2 if the result set after filtering would be empty.
! 5729: */
! 5730: case OP_VFilter: { /* jump */
! 5731: int nArg;
! 5732: int iQuery;
! 5733: const sqlite3_module *pModule;
! 5734: Mem *pQuery;
! 5735: Mem *pArgc;
! 5736: sqlite3_vtab_cursor *pVtabCursor;
! 5737: sqlite3_vtab *pVtab;
! 5738: VdbeCursor *pCur;
! 5739: int res;
! 5740: int i;
! 5741: Mem **apArg;
! 5742:
! 5743: pQuery = &aMem[pOp->p3];
! 5744: pArgc = &pQuery[1];
! 5745: pCur = p->apCsr[pOp->p1];
! 5746: assert( memIsValid(pQuery) );
! 5747: REGISTER_TRACE(pOp->p3, pQuery);
! 5748: assert( pCur->pVtabCursor );
! 5749: pVtabCursor = pCur->pVtabCursor;
! 5750: pVtab = pVtabCursor->pVtab;
! 5751: pModule = pVtab->pModule;
! 5752:
! 5753: /* Grab the index number and argc parameters */
! 5754: assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int );
! 5755: nArg = (int)pArgc->u.i;
! 5756: iQuery = (int)pQuery->u.i;
! 5757:
! 5758: /* Invoke the xFilter method */
! 5759: {
! 5760: res = 0;
! 5761: apArg = p->apArg;
! 5762: for(i = 0; i<nArg; i++){
! 5763: apArg[i] = &pArgc[i+1];
! 5764: sqlite3VdbeMemStoreType(apArg[i]);
! 5765: }
! 5766:
! 5767: p->inVtabMethod = 1;
! 5768: rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
! 5769: p->inVtabMethod = 0;
! 5770: importVtabErrMsg(p, pVtab);
! 5771: if( rc==SQLITE_OK ){
! 5772: res = pModule->xEof(pVtabCursor);
! 5773: }
! 5774:
! 5775: if( res ){
! 5776: pc = pOp->p2 - 1;
! 5777: }
! 5778: }
! 5779: pCur->nullRow = 0;
! 5780:
! 5781: break;
! 5782: }
! 5783: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5784:
! 5785: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5786: /* Opcode: VColumn P1 P2 P3 * *
! 5787: **
! 5788: ** Store the value of the P2-th column of
! 5789: ** the row of the virtual-table that the
! 5790: ** P1 cursor is pointing to into register P3.
! 5791: */
! 5792: case OP_VColumn: {
! 5793: sqlite3_vtab *pVtab;
! 5794: const sqlite3_module *pModule;
! 5795: Mem *pDest;
! 5796: sqlite3_context sContext;
! 5797:
! 5798: VdbeCursor *pCur = p->apCsr[pOp->p1];
! 5799: assert( pCur->pVtabCursor );
! 5800: assert( pOp->p3>0 && pOp->p3<=p->nMem );
! 5801: pDest = &aMem[pOp->p3];
! 5802: memAboutToChange(p, pDest);
! 5803: if( pCur->nullRow ){
! 5804: sqlite3VdbeMemSetNull(pDest);
! 5805: break;
! 5806: }
! 5807: pVtab = pCur->pVtabCursor->pVtab;
! 5808: pModule = pVtab->pModule;
! 5809: assert( pModule->xColumn );
! 5810: memset(&sContext, 0, sizeof(sContext));
! 5811:
! 5812: /* The output cell may already have a buffer allocated. Move
! 5813: ** the current contents to sContext.s so in case the user-function
! 5814: ** can use the already allocated buffer instead of allocating a
! 5815: ** new one.
! 5816: */
! 5817: sqlite3VdbeMemMove(&sContext.s, pDest);
! 5818: MemSetTypeFlag(&sContext.s, MEM_Null);
! 5819:
! 5820: rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2);
! 5821: importVtabErrMsg(p, pVtab);
! 5822: if( sContext.isError ){
! 5823: rc = sContext.isError;
! 5824: }
! 5825:
! 5826: /* Copy the result of the function to the P3 register. We
! 5827: ** do this regardless of whether or not an error occurred to ensure any
! 5828: ** dynamic allocation in sContext.s (a Mem struct) is released.
! 5829: */
! 5830: sqlite3VdbeChangeEncoding(&sContext.s, encoding);
! 5831: sqlite3VdbeMemMove(pDest, &sContext.s);
! 5832: REGISTER_TRACE(pOp->p3, pDest);
! 5833: UPDATE_MAX_BLOBSIZE(pDest);
! 5834:
! 5835: if( sqlite3VdbeMemTooBig(pDest) ){
! 5836: goto too_big;
! 5837: }
! 5838: break;
! 5839: }
! 5840: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5841:
! 5842: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5843: /* Opcode: VNext P1 P2 * * *
! 5844: **
! 5845: ** Advance virtual table P1 to the next row in its result set and
! 5846: ** jump to instruction P2. Or, if the virtual table has reached
! 5847: ** the end of its result set, then fall through to the next instruction.
! 5848: */
! 5849: case OP_VNext: { /* jump */
! 5850: sqlite3_vtab *pVtab;
! 5851: const sqlite3_module *pModule;
! 5852: int res;
! 5853: VdbeCursor *pCur;
! 5854:
! 5855: res = 0;
! 5856: pCur = p->apCsr[pOp->p1];
! 5857: assert( pCur->pVtabCursor );
! 5858: if( pCur->nullRow ){
! 5859: break;
! 5860: }
! 5861: pVtab = pCur->pVtabCursor->pVtab;
! 5862: pModule = pVtab->pModule;
! 5863: assert( pModule->xNext );
! 5864:
! 5865: /* Invoke the xNext() method of the module. There is no way for the
! 5866: ** underlying implementation to return an error if one occurs during
! 5867: ** xNext(). Instead, if an error occurs, true is returned (indicating that
! 5868: ** data is available) and the error code returned when xColumn or
! 5869: ** some other method is next invoked on the save virtual table cursor.
! 5870: */
! 5871: p->inVtabMethod = 1;
! 5872: rc = pModule->xNext(pCur->pVtabCursor);
! 5873: p->inVtabMethod = 0;
! 5874: importVtabErrMsg(p, pVtab);
! 5875: if( rc==SQLITE_OK ){
! 5876: res = pModule->xEof(pCur->pVtabCursor);
! 5877: }
! 5878:
! 5879: if( !res ){
! 5880: /* If there is data, jump to P2 */
! 5881: pc = pOp->p2 - 1;
! 5882: }
! 5883: break;
! 5884: }
! 5885: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5886:
! 5887: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5888: /* Opcode: VRename P1 * * P4 *
! 5889: **
! 5890: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
! 5891: ** This opcode invokes the corresponding xRename method. The value
! 5892: ** in register P1 is passed as the zName argument to the xRename method.
! 5893: */
! 5894: case OP_VRename: {
! 5895: sqlite3_vtab *pVtab;
! 5896: Mem *pName;
! 5897:
! 5898: pVtab = pOp->p4.pVtab->pVtab;
! 5899: pName = &aMem[pOp->p1];
! 5900: assert( pVtab->pModule->xRename );
! 5901: assert( memIsValid(pName) );
! 5902: REGISTER_TRACE(pOp->p1, pName);
! 5903: assert( pName->flags & MEM_Str );
! 5904: testcase( pName->enc==SQLITE_UTF8 );
! 5905: testcase( pName->enc==SQLITE_UTF16BE );
! 5906: testcase( pName->enc==SQLITE_UTF16LE );
! 5907: rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8);
! 5908: if( rc==SQLITE_OK ){
! 5909: rc = pVtab->pModule->xRename(pVtab, pName->z);
! 5910: importVtabErrMsg(p, pVtab);
! 5911: p->expired = 0;
! 5912: }
! 5913: break;
! 5914: }
! 5915: #endif
! 5916:
! 5917: #ifndef SQLITE_OMIT_VIRTUALTABLE
! 5918: /* Opcode: VUpdate P1 P2 P3 P4 *
! 5919: **
! 5920: ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
! 5921: ** This opcode invokes the corresponding xUpdate method. P2 values
! 5922: ** are contiguous memory cells starting at P3 to pass to the xUpdate
! 5923: ** invocation. The value in register (P3+P2-1) corresponds to the
! 5924: ** p2th element of the argv array passed to xUpdate.
! 5925: **
! 5926: ** The xUpdate method will do a DELETE or an INSERT or both.
! 5927: ** The argv[0] element (which corresponds to memory cell P3)
! 5928: ** is the rowid of a row to delete. If argv[0] is NULL then no
! 5929: ** deletion occurs. The argv[1] element is the rowid of the new
! 5930: ** row. This can be NULL to have the virtual table select the new
! 5931: ** rowid for itself. The subsequent elements in the array are
! 5932: ** the values of columns in the new row.
! 5933: **
! 5934: ** If P2==1 then no insert is performed. argv[0] is the rowid of
! 5935: ** a row to delete.
! 5936: **
! 5937: ** P1 is a boolean flag. If it is set to true and the xUpdate call
! 5938: ** is successful, then the value returned by sqlite3_last_insert_rowid()
! 5939: ** is set to the value of the rowid for the row just inserted.
! 5940: */
! 5941: case OP_VUpdate: {
! 5942: sqlite3_vtab *pVtab;
! 5943: sqlite3_module *pModule;
! 5944: int nArg;
! 5945: int i;
! 5946: sqlite_int64 rowid;
! 5947: Mem **apArg;
! 5948: Mem *pX;
! 5949:
! 5950: assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback
! 5951: || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace
! 5952: );
! 5953: pVtab = pOp->p4.pVtab->pVtab;
! 5954: pModule = (sqlite3_module *)pVtab->pModule;
! 5955: nArg = pOp->p2;
! 5956: assert( pOp->p4type==P4_VTAB );
! 5957: if( ALWAYS(pModule->xUpdate) ){
! 5958: u8 vtabOnConflict = db->vtabOnConflict;
! 5959: apArg = p->apArg;
! 5960: pX = &aMem[pOp->p3];
! 5961: for(i=0; i<nArg; i++){
! 5962: assert( memIsValid(pX) );
! 5963: memAboutToChange(p, pX);
! 5964: sqlite3VdbeMemStoreType(pX);
! 5965: apArg[i] = pX;
! 5966: pX++;
! 5967: }
! 5968: db->vtabOnConflict = pOp->p5;
! 5969: rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid);
! 5970: db->vtabOnConflict = vtabOnConflict;
! 5971: importVtabErrMsg(p, pVtab);
! 5972: if( rc==SQLITE_OK && pOp->p1 ){
! 5973: assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
! 5974: db->lastRowid = lastRowid = rowid;
! 5975: }
! 5976: if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){
! 5977: if( pOp->p5==OE_Ignore ){
! 5978: rc = SQLITE_OK;
! 5979: }else{
! 5980: p->errorAction = ((pOp->p5==OE_Replace) ? OE_Abort : pOp->p5);
! 5981: }
! 5982: }else{
! 5983: p->nChange++;
! 5984: }
! 5985: }
! 5986: break;
! 5987: }
! 5988: #endif /* SQLITE_OMIT_VIRTUALTABLE */
! 5989:
! 5990: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
! 5991: /* Opcode: Pagecount P1 P2 * * *
! 5992: **
! 5993: ** Write the current number of pages in database P1 to memory cell P2.
! 5994: */
! 5995: case OP_Pagecount: { /* out2-prerelease */
! 5996: pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt);
! 5997: break;
! 5998: }
! 5999: #endif
! 6000:
! 6001:
! 6002: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
! 6003: /* Opcode: MaxPgcnt P1 P2 P3 * *
! 6004: **
! 6005: ** Try to set the maximum page count for database P1 to the value in P3.
! 6006: ** Do not let the maximum page count fall below the current page count and
! 6007: ** do not change the maximum page count value if P3==0.
! 6008: **
! 6009: ** Store the maximum page count after the change in register P2.
! 6010: */
! 6011: case OP_MaxPgcnt: { /* out2-prerelease */
! 6012: unsigned int newMax;
! 6013: Btree *pBt;
! 6014:
! 6015: pBt = db->aDb[pOp->p1].pBt;
! 6016: newMax = 0;
! 6017: if( pOp->p3 ){
! 6018: newMax = sqlite3BtreeLastPage(pBt);
! 6019: if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3;
! 6020: }
! 6021: pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax);
! 6022: break;
! 6023: }
! 6024: #endif
! 6025:
! 6026:
! 6027: #ifndef SQLITE_OMIT_TRACE
! 6028: /* Opcode: Trace * * * P4 *
! 6029: **
! 6030: ** If tracing is enabled (by the sqlite3_trace()) interface, then
! 6031: ** the UTF-8 string contained in P4 is emitted on the trace callback.
! 6032: */
! 6033: case OP_Trace: {
! 6034: char *zTrace;
! 6035: char *z;
! 6036:
! 6037: if( db->xTrace && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){
! 6038: z = sqlite3VdbeExpandSql(p, zTrace);
! 6039: db->xTrace(db->pTraceArg, z);
! 6040: sqlite3DbFree(db, z);
! 6041: }
! 6042: #ifdef SQLITE_DEBUG
! 6043: if( (db->flags & SQLITE_SqlTrace)!=0
! 6044: && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0
! 6045: ){
! 6046: sqlite3DebugPrintf("SQL-trace: %s\n", zTrace);
! 6047: }
! 6048: #endif /* SQLITE_DEBUG */
! 6049: break;
! 6050: }
! 6051: #endif
! 6052:
! 6053:
! 6054: /* Opcode: Noop * * * * *
! 6055: **
! 6056: ** Do nothing. This instruction is often useful as a jump
! 6057: ** destination.
! 6058: */
! 6059: /*
! 6060: ** The magic Explain opcode are only inserted when explain==2 (which
! 6061: ** is to say when the EXPLAIN QUERY PLAN syntax is used.)
! 6062: ** This opcode records information from the optimizer. It is the
! 6063: ** the same as a no-op. This opcodesnever appears in a real VM program.
! 6064: */
! 6065: default: { /* This is really OP_Noop and OP_Explain */
! 6066: assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain );
! 6067: break;
! 6068: }
! 6069:
! 6070: /*****************************************************************************
! 6071: ** The cases of the switch statement above this line should all be indented
! 6072: ** by 6 spaces. But the left-most 6 spaces have been removed to improve the
! 6073: ** readability. From this point on down, the normal indentation rules are
! 6074: ** restored.
! 6075: *****************************************************************************/
! 6076: }
! 6077:
! 6078: #ifdef VDBE_PROFILE
! 6079: {
! 6080: u64 elapsed = sqlite3Hwtime() - start;
! 6081: pOp->cycles += elapsed;
! 6082: pOp->cnt++;
! 6083: #if 0
! 6084: fprintf(stdout, "%10llu ", elapsed);
! 6085: sqlite3VdbePrintOp(stdout, origPc, &aOp[origPc]);
! 6086: #endif
! 6087: }
! 6088: #endif
! 6089:
! 6090: /* The following code adds nothing to the actual functionality
! 6091: ** of the program. It is only here for testing and debugging.
! 6092: ** On the other hand, it does burn CPU cycles every time through
! 6093: ** the evaluator loop. So we can leave it out when NDEBUG is defined.
! 6094: */
! 6095: #ifndef NDEBUG
! 6096: assert( pc>=-1 && pc<p->nOp );
! 6097:
! 6098: #ifdef SQLITE_DEBUG
! 6099: if( p->trace ){
! 6100: if( rc!=0 ) fprintf(p->trace,"rc=%d\n",rc);
! 6101: if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){
! 6102: registerTrace(p->trace, pOp->p2, &aMem[pOp->p2]);
! 6103: }
! 6104: if( pOp->opflags & OPFLG_OUT3 ){
! 6105: registerTrace(p->trace, pOp->p3, &aMem[pOp->p3]);
! 6106: }
! 6107: }
! 6108: #endif /* SQLITE_DEBUG */
! 6109: #endif /* NDEBUG */
! 6110: } /* The end of the for(;;) loop the loops through opcodes */
! 6111:
! 6112: /* If we reach this point, it means that execution is finished with
! 6113: ** an error of some kind.
! 6114: */
! 6115: vdbe_error_halt:
! 6116: assert( rc );
! 6117: p->rc = rc;
! 6118: testcase( sqlite3GlobalConfig.xLog!=0 );
! 6119: sqlite3_log(rc, "statement aborts at %d: [%s] %s",
! 6120: pc, p->zSql, p->zErrMsg);
! 6121: sqlite3VdbeHalt(p);
! 6122: if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
! 6123: rc = SQLITE_ERROR;
! 6124: if( resetSchemaOnFault>0 ){
! 6125: sqlite3ResetInternalSchema(db, resetSchemaOnFault-1);
! 6126: }
! 6127:
! 6128: /* This is the only way out of this procedure. We have to
! 6129: ** release the mutexes on btrees that were acquired at the
! 6130: ** top. */
! 6131: vdbe_return:
! 6132: db->lastRowid = lastRowid;
! 6133: sqlite3VdbeLeave(p);
! 6134: return rc;
! 6135:
! 6136: /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH
! 6137: ** is encountered.
! 6138: */
! 6139: too_big:
! 6140: sqlite3SetString(&p->zErrMsg, db, "string or blob too big");
! 6141: rc = SQLITE_TOOBIG;
! 6142: goto vdbe_error_halt;
! 6143:
! 6144: /* Jump to here if a malloc() fails.
! 6145: */
! 6146: no_mem:
! 6147: db->mallocFailed = 1;
! 6148: sqlite3SetString(&p->zErrMsg, db, "out of memory");
! 6149: rc = SQLITE_NOMEM;
! 6150: goto vdbe_error_halt;
! 6151:
! 6152: /* Jump to here for any other kind of fatal error. The "rc" variable
! 6153: ** should hold the error number.
! 6154: */
! 6155: abort_due_to_error:
! 6156: assert( p->zErrMsg==0 );
! 6157: if( db->mallocFailed ) rc = SQLITE_NOMEM;
! 6158: if( rc!=SQLITE_IOERR_NOMEM ){
! 6159: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
! 6160: }
! 6161: goto vdbe_error_halt;
! 6162:
! 6163: /* Jump to here if the sqlite3_interrupt() API sets the interrupt
! 6164: ** flag.
! 6165: */
! 6166: abort_due_to_interrupt:
! 6167: assert( db->u1.isInterrupted );
! 6168: rc = SQLITE_INTERRUPT;
! 6169: p->rc = rc;
! 6170: sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
! 6171: goto vdbe_error_halt;
! 6172: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>