15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2001 September 15
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The code in this file implements execution method of the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Virtual Database Engine (VDBE).  A separate file ("vdbeaux.c")
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** handles housekeeping details such as creating and deleting
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE instances.  This file is solely interested in executing
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the VDBE program.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In the external interface, an "sqlite3_stmt*" is an opaque pointer
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to a VDBE.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The SQL parser generates a program which is then executed by
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the VDBE to do the work of the SQL statement.  VDBE programs are
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** similar in form to assembly language.  The program consists of
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a linear sequence of operations.  Each operation has an opcode
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and 5 operands.  Operands P1, P2, and P3 are integers.  Operand P4
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a null-terminated string.  Operand P5 is an unsigned character.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Few opcodes use all 5 operands.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Computation results are stored on a set of registers numbered beginning
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with 1 and going up to Vdbe.nMem.  Each register can store
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** either an integer, a null-terminated string, a floating point
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number, or the SQL "NULL" value.  An implicit conversion from one
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** type to the other occurs as necessary.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Most of the code in this file is taken up by the sqlite3VdbeExec()
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function which does the work of interpreting a VDBE program.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** But other routines are also provided to help in building up
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a program instruction by instruction.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Various scripts scan this source file in order to generate HTML
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** documentation, headers files, or other derived files.  The formatting
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the code in this file is, therefore, important.  See other comments
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in this file for details.  If in doubt, do not deviate from existing
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** commenting and indentation practices when changing or adding code.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqliteInt.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "vdbeInt.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke this macro on memory cells just prior to changing the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value of the cell.  This macro verifies that shallow copies are
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not misused.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define memAboutToChange(P,M) sqlite3VdbeMemPrepareToChange(P,M)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define memAboutToChange(P,M)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following global variable is incremented every time a cursor
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes.  The test
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** procedures use this information to make sure that indices are
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** working correctly.  This variable has no function other than to
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** help verify the correct operation of the library.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_search_count = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When this global variable is positive, it gets decremented once before
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** each instruction in the VDBE.  When reaches zero, the u1.isInterrupted
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** field of the sqlite3 structure is set in order to simulate and interrupt.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This facility is used for testing purposes only.  It does not function
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in an ordinary build.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_interrupt_count = 0;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next global variable is incremented each type the OP_Sort opcode
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is executed.  The test procedures use this information to make sure that
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sorting is occurring or not occurring at appropriate times.   This variable
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has no function other than to help verify the correct operation of the
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** library.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_sort_count = 0;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next global variable records the size of the largest MEM_Blob
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or MEM_Str that has been used by a VDBE opcode.  The test procedures
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use this information to make sure that the zero-blob functionality
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is working correctly.   This variable has no function other than to
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** help verify the correct operation of the library.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_max_blobsize = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void updateMaxBlobsize(Mem *p){
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (p->flags & (MEM_Str|MEM_Blob))!=0 && p->n>sqlite3_max_blobsize ){
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_max_blobsize = p->n;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next global variable is incremented each type the OP_Found opcode
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is executed. This is used to test whether or not the foreign key
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation implemented using OP_FkIsZero is working. This variable
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has no function other than to help verify the correct operation of the
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** library.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_found_count = 0;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Test a register to see if it exceeds the current maximum blob size.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If it does, record the new maximum blob size.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define UPDATE_MAX_BLOBSIZE(P)  updateMaxBlobsize(P)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define UPDATE_MAX_BLOBSIZE(P)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert the given register into a string if it isn't one
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** already. Return non-zero if a malloc() fails.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Stringify(P, enc) \
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if(((P)->flags&(MEM_Str|MEM_Blob))==0 && sqlite3VdbeMemStringify(P,enc)) \
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     { goto no_mem; }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An ephemeral string value (signified by the MEM_Ephem flag) contains
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a pointer to a dynamically allocated string where some other entity
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is responsible for deallocating that string.  Because the register
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** does not control the string, it might be deleted without the register
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** knowing it.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine converts an ephemeral string into a dynamically allocated
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string that the register itself controls.  In other words, it
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** converts an MEM_Ephem string into an MEM_Dyn string.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define Deephemeralize(P) \
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if( ((P)->flags&MEM_Ephem)!=0 \
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P if required.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Argument pMem points at a register that will be passed to a
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** user-defined function or returned to the user as the result of a query.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine sets the pMem->type variable used by the sqlite3_value_*()
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routines.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemStoreType(Mem *pMem){
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags = pMem->flags;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( flags & MEM_Null ){
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_NULL;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if( flags & MEM_Int ){
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_INTEGER;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if( flags & MEM_Real ){
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_FLOAT;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if( flags & MEM_Str ){
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_TEXT;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pMem->type = SQLITE_BLOB;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate VdbeCursor number iCur.  Return a pointer to it.  Return NULL
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if we run out of memory.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static VdbeCursor *allocateCursor(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p,              /* The virtual machine */
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCur,             /* Index of the new VdbeCursor */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField,           /* Number of fields in the table or index */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb,              /* When database the cursor belongs to, or -1 */
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isBtreeCursor     /* True for B-Tree.  False for pseudo-table or vtab */
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Find the memory cell that will be used to store the blob of memory
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** required for this VdbeCursor structure. It is convenient to use a
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** vdbe memory cell to manage the memory allocation required for a
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** VdbeCursor structure for the following reasons:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **   * Sometimes cursor numbers are used for a couple of different
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     purposes in a vdbe program. The different uses might require
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     different sized allocations. Memory cells provide growable
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     allocations.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **   * When using ENABLE_MEMORY_MANAGEMENT, memory cell buffers can
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     be freed lazily via the sqlite3_release_memory() API. This
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **     minimizes the number of malloc calls made by the system.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Memory cells for cursors are allocated at the top of the address
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** space. Memory cell (p->nMem) corresponds to cursor 0. Space for
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** cursor 1 is managed by memory cell (p->nMem-1), etc.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem = &p->aMem[p->nMem-iCur];
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCx = 0;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nByte =
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ROUND8(sizeof(VdbeCursor)) +
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (isBtreeCursor?sqlite3BtreeCursorSize():0) +
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      2*nField*sizeof(u32);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iCur<p->nCursor );
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->apCsr[iCur] ){
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeFreeCursor(p, p->apCsr[iCur]);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->apCsr[iCur] = 0;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK==sqlite3VdbeMemGrow(pMem, nByte, 0) ){
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memset(pCx, 0, sizeof(VdbeCursor));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCx->iDb = iDb;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCx->nField = nField;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( nField ){
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCx->aType = (u32 *)&pMem->z[ROUND8(sizeof(VdbeCursor))];
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( isBtreeCursor ){
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCx->pCursor = (BtCursor*)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &pMem->z[ROUND8(sizeof(VdbeCursor))+2*nField*sizeof(u32)];
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3BtreeCursorZero(pCx->pCursor);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pCx;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Try to convert a value into a numeric representation if we can
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** do so without loss of information.  In other words, if the string
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** looks like a number, convert it into a number.  If it does not
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** look like a number, leave it alone.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void applyNumericAffinity(Mem *pRec){
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pRec->flags & (MEM_Real|MEM_Int))==0 ){
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    double rValue;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i64 iValue;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    u8 enc = pRec->enc;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pRec->flags&MEM_Str)==0 ) return;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3AtoF(pRec->z, &rValue, pRec->n, enc)==0 ) return;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( 0==sqlite3Atoi64(pRec->z, &iValue, pRec->n, enc) ){
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRec->u.i = iValue;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRec->flags |= MEM_Int;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRec->r = rValue;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pRec->flags |= MEM_Real;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Processing is determine by the affinity parameter:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_INTEGER:
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_REAL:
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_NUMERIC:
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    Try to convert pRec to an integer representation or a
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    floating-point representation if an integer representation
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    is not possible.  Note that the integer representation is
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    always preferred, even if the affinity is REAL, because
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    an integer representation is more space efficient on disk.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_TEXT:
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    Convert pRec to a text representation.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_NONE:
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    No-op.  pRec is unchanged.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void applyAffinity(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pRec,          /* The value to apply affinity to */
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char affinity,      /* The affinity to be applied */
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc              /* Use this text encoding */
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( affinity==SQLITE_AFF_TEXT ){
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Only attempt the conversion to TEXT if there is an integer or real
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** representation (blob and NULL do not get converted) but no string
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** representation.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( 0==(pRec->flags&MEM_Str) && (pRec->flags&(MEM_Real|MEM_Int)) ){
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemStringify(pRec, enc);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pRec->flags &= ~(MEM_Real|MEM_Int);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( affinity!=SQLITE_AFF_NONE ){
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             || affinity==SQLITE_AFF_NUMERIC );
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    applyNumericAffinity(pRec);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pRec->flags & MEM_Real ){
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeIntegerAffinity(pRec);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Try to convert the type of a function argument or a result column
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into a numeric representation.  Use either INTEGER or REAL whichever
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is appropriate.  But only do the conversion if it is possible without
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loss of information and return the revised type of the argument.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3_value_numeric_type(sqlite3_value *pVal){
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem = (Mem*)pVal;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pMem->type==SQLITE_TEXT ){
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    applyNumericAffinity(pMem);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStoreType(pMem);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pMem->type;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Exported version of applyAffinity(). This one works on sqlite3_value*,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not the internal Mem* type.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3ValueApplyAffinity(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value *pVal,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 affinity,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 enc
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  applyAffinity((Mem *)pVal, affinity, enc);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write a nice string representation of the contents of cell pMem
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into buffer zBuf, length nBuf.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zCsr = zBuf;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f = pMem->flags;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char *const encnames[] = {"(X)", "(8)", "(16LE)", "(16BE)"};
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( f&MEM_Blob ){
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char c;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( f & MEM_Dyn ){
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = 'z';
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Static|MEM_Ephem))==0 );
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( f & MEM_Static ){
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = 't';
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( f & MEM_Ephem ){
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = 'e';
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Static|MEM_Dyn))==0 );
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c = 's';
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(100, zCsr, "%c", c);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zCsr += sqlite3Strlen30(zCsr);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(100, zCsr, "%d[", pMem->n);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zCsr += sqlite3Strlen30(zCsr);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<16 && i<pMem->n; i++){
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zCsr += sqlite3Strlen30(zCsr);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<16 && i<pMem->n; i++){
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char z = pMem->z[i];
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( z<32 || z>126 ) *zCsr++ = '.';
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else *zCsr++ = z;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zCsr += sqlite3Strlen30(zCsr);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( f & MEM_Zero ){
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zCsr += sqlite3Strlen30(zCsr);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *zCsr = '\0';
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( f & MEM_Str ){
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int j, k;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zBuf[0] = ' ';
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( f & MEM_Dyn ){
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zBuf[1] = 'z';
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Static|MEM_Ephem))==0 );
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( f & MEM_Static ){
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zBuf[1] = 't';
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Dyn|MEM_Ephem))==0 );
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( f & MEM_Ephem ){
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zBuf[1] = 'e';
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (f & (MEM_Static|MEM_Dyn))==0 );
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zBuf[1] = 's';
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k = 2;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k += sqlite3Strlen30(&zBuf[k]);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zBuf[k++] = '[';
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(j=0; j<15 && j<pMem->n; j++){
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      u8 c = pMem->z[j];
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( c>=0x20 && c<0x7f ){
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zBuf[k++] = c;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zBuf[k++] = '.';
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zBuf[k++] = ']';
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_snprintf(100,&zBuf[k], encnames[pMem->enc]);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    k += sqlite3Strlen30(&zBuf[k]);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zBuf[k++] = 0;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Print the value of a register for tracing purposes:
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void memTracePrint(FILE *out, Mem *p){
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->flags & MEM_Null ){
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " NULL");
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " si:%lld", p->u.i);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p->flags & MEM_Int ){
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " i:%lld", p->u.i);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p->flags & MEM_Real ){
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " r:%g", p->r);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p->flags & MEM_RowSet ){
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " (rowset)");
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char zBuf[200];
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemPrettyPrint(p, zBuf);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, " ");
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fprintf(out, "%s", zBuf);
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void registerTrace(FILE *out, int iReg, Mem *p){
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(out, "REG[%d] = ", iReg);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memTracePrint(out, p);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fprintf(out, "\n");
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define REGISTER_TRACE(R,M) if(p->trace)registerTrace(p->trace,R,M)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#  define REGISTER_TRACE(R,M)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef VDBE_PROFILE
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** hwtime.h contains inline assembler code for implementing
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** high-performance timing routines.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hwtime.h"
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The CHECK_FOR_INTERRUPT macro defined here looks to see if the
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_interrupt() routine has been called.  If it has been, then
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** processing of the VDBE program is interrupted.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This macro added to every instruction that does a jump in order to
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement a loop.  This test used to be on every single instruction,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** but that meant we more testing that we needed.  By only testing the
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** flag on jump instructions, we get a (small) speed improvement.
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHECK_FOR_INTERRUPT \
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if( db->u1.isInterrupted ) goto abort_due_to_interrupt;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This function is only called from within an assert() expression. It
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** checks that the sqlite3.nTransaction variable is correctly set to
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the number of non-transaction savepoints currently in the
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** linked list starting at sqlite3.pSavepoint.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usage:
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     assert( checkSavepointCount(db) );
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int checkSavepointCount(sqlite3 *db){
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n = 0;
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Savepoint *p;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(p=db->pSavepoint; p; p=p->pNext) n++;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n==(db->nSavepoint + db->isTransactionSavepoint) );
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in memory obtained from sqlite3DbMalloc).
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void importVtabErrMsg(Vdbe *p, sqlite3_vtab *pVtab){
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = p->db;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, p->zErrMsg);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_free(pVtab->zErrMsg);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab->zErrMsg = 0;
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute as much of a VDBE program as we can then return.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3VdbeMakeReady() must be called before this routine in order to
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** close the program with a final OP_Halt and to set up the callbacks
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and the error message pointer.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Whenever a row or result data is available, this routine will either
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invoke the result callback (if there is one) or return with
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_ROW.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an attempt is made to open a locked database, then this routine
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will either invoke the busy callback (if there is one) or it will
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** return SQLITE_BUSY.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If an error occurs, an error message is written to memory obtained
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from sqlite3_malloc() and p->zErrMsg is made to point to that memory.
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The error code is stored in p->rc and this routine returns SQLITE_ERROR.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the callback ever returns non-zero, then the program exits
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** immediately.  There will be no error message but the p->rc field is
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set to SQLITE_ABORT and this routine will return SQLITE_ERROR.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A memory allocation error causes p->rc to be set to SQLITE_NOMEM and this
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** routine to return SQLITE_ERROR.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Other fatal errors return SQLITE_ERROR.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** After this routine has finished, sqlite3VdbeFinalize() should be
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used to clean up the mess that was left behind.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeExec(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *p                    /* The VDBE */
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pc=0;                  /* The program counter */
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Op *aOp = p->aOp;          /* Copy of p->aOp */
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Op *pOp;                   /* Current operation */
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;        /* Value to return */
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db = p->db;       /* The database */
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 encoding = ENC(db);     /* The database encoding */
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int checkProgress;         /* True if progress callbacks are enabled */
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nProgressOps = 0;      /* Opcodes executed since progress callback. */
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aMem = p->aMem;       /* Copy of p->aMem */
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pIn1 = 0;             /* 1st input operand */
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pIn2 = 0;             /* 2nd input operand */
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pIn3 = 0;             /* 3rd input operand */
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pOut = 0;             /* Output operand */
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCompare = 0;          /* Result of last OP_Compare operation */
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *aPermute = 0;         /* Permutation of columns for OP_Compare */
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef VDBE_PROFILE
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u64 start;                 /* CPU clock count at start of opcode */
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int origPc;                /* Program counter at start of opcode */
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*** INSERT STACK UNION HERE ***/
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->magic==VDBE_MAGIC_RUN );  /* sqlite3_step() verifies this */
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeEnter(p);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->rc==SQLITE_NOMEM ){
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This happens if a malloc() inside a call to sqlite3_column_text() or
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3_column_text16() failed.  */
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY );
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->rc = SQLITE_OK;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->explain==0 );
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pResultSet = 0;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->busyHandler.nBusy = 0;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_FOR_INTERRUPT;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeIOTraceSql(p);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  checkProgress = db->xProgress!=0;
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BeginBenignMalloc();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pc==0  && (p->db->flags & SQLITE_VdbeListing)!=0 ){
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int i;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printf("VDBE Program Listing:\n");
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbePrintSql(p);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<p->nOp; i++){
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbePrintOp(stdout, i, &aOp[i]);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3EndBenignMalloc();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pc=p->pc; rc==SQLITE_OK; pc++){
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pc>=0 && pc<p->nOp );
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->mallocFailed ) goto no_mem;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef VDBE_PROFILE
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    origPc = pc;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    start = sqlite3Hwtime();
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp = &aOp[pc];
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Only allow tracing if SQLITE_DEBUG is defined.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->trace ){
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pc==0 ){
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        printf("VDBE Execution Trace:\n");
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbePrintSql(p);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbePrintOp(p->trace, pc, pOp);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Check to see if we need to simulate an interrupt.  This only happens
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** if we have a special test build.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3_interrupt_count>0 ){
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3_interrupt_count--;
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3_interrupt_count==0 ){
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_interrupt(db);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PROGRESS_CALLBACK
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Call the progress callback if it is configured and the required number
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** of VDBE ops have been executed (either since this invocation of
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3VdbeExec() or since last time the progress callback was called).
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** If the progress callback returns non-zero, exit the virtual machine with
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a return code SQLITE_ABORT.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( checkProgress ){
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( db->nProgressOps==nProgressOps ){
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int prc;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prc = db->xProgress(db->pProgressArg);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( prc!=0 ){
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rc = SQLITE_INTERRUPT;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto vdbe_error_halt;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nProgressOps = 0;
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nProgressOps++;
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* On any opcode with the "out2-prerelase" tag, free any
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** external allocations out of mem[p2] and set mem[p2] to be
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** an undefined integer.  Opcodes will either fill in the integer
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** value or convert mem[p2] to a different type.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] );
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2>0 );
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2<=p->nMem );
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOut = &aMem[pOp->p2];
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memAboutToChange(p, pOut);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemReleaseExternal(pOut);
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOut->flags = MEM_Int;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Sanity checking on other operands */
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pOp->opflags & OPFLG_IN1)!=0 ){
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p1>0 );
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p1<=p->nMem );
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( memIsValid(&aMem[pOp->p1]) );
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pOp->opflags & OPFLG_IN2)!=0 ){
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2>0 );
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2<=p->nMem );
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( memIsValid(&aMem[pOp->p2]) );
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pOp->opflags & OPFLG_IN3)!=0 ){
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p3>0 );
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p3<=p->nMem );
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( memIsValid(&aMem[pOp->p3]) );
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]);
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pOp->opflags & OPFLG_OUT2)!=0 ){
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2>0 );
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p2<=p->nMem );
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memAboutToChange(p, &aMem[pOp->p2]);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pOp->opflags & OPFLG_OUT3)!=0 ){
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p3>0 );
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p3<=p->nMem );
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memAboutToChange(p, &aMem[pOp->p3]);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( pOp->opcode ){
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*****************************************************************************
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** What follows is a massive switch statement where each case implements a
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** separate instruction in the virtual machine.  If we follow the usual
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indentation conventions, each case should be indented by 6 spaces.  But
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is a lot of wasted space on the left margin.  So the code within
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the switch statement will break with convention and be flush-left. Another
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** big comment (similar to this one) will mark the point in the code where
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** we transition back to normal indentation.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The formatting of each case is important.  The makefile for SQLite
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** generates two C files "opcodes.h" and "opcodes.c" by scanning this
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file looking for lines that begin with "case OP_".  The opcodes.h files
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will be filled with #defines that give unique integer values to each
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opcode and the opcodes.c file is filled with an array of strings where
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** each string is the symbolic name for the corresponding opcode.  If the
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** case statement is followed by a comment of the form "/# same as ... #/"
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that comment is used to determine the particular value of the opcode.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Other keywords in the comment that follows each case are used to
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[].
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Keywords include: in1, in2, in3, out2_prerelease, out2, out3.  See
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the mkopcodeh.awk script for additional information.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Documentation about VDBE opcodes is generated by scanning this file
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for lines of that contain "Opcode:".  That line and all subsequent
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comment lines are used in the generation of the opcode.html documentation
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SUMMARY:
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     Formatting is important to scripts that scan this file.
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**     Do not deviate from the formatting style currently in use.
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*****************************************************************************/
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  Goto * P2 * * *
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An unconditional jump to address P2.
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next instruction executed will be
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the one at index P2 from the beginning of
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the program.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Goto: {             /* jump */
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_FOR_INTERRUPT;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pc = pOp->p2 - 1;
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  Gosub P1 P2 * * *
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write the current address onto register P1
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and then jump to address P2.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Gosub: {            /* jump, in1 */
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pIn1->flags & MEM_Dyn)==0 );
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pIn1);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->flags = MEM_Int;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->u.i = pc;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p1, pIn1);
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pc = pOp->p2 - 1;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  Return P1 * * * *
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to the next instruction after the address in register P1.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Return: {           /* in1 */
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1->flags & MEM_Int );
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pc = (int)pIn1->u.i;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  Yield P1 * * * *
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Swap the program counter with the value in register P1.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Yield: {            /* in1 */
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pcDest;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pIn1->flags & MEM_Dyn)==0 );
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->flags = MEM_Int;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pcDest = (int)pIn1->u.i;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->u.i = pc;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p1, pIn1);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pc = pcDest;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  HaltIfNull  P1 P2 P3 P4 *
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check the value in register P3.  If is is NULL then Halt using
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** parameter P1, P2, and P4 as if this were a Halt instruction.  If the
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value in register P3 is not NULL, then this routine is a no-op.
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_HaltIfNull: {      /* in3 */
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn3->flags & MEM_Null)==0 ) break;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Fall through into OP_Halt */
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode:  Halt P1 P2 * P4 *
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Exit immediately.  All open cursors, etc are closed
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** automatically.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is the result code returned by sqlite3_exec(), sqlite3_reset(),
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or sqlite3_finalize().  For a normal halt, this should be SQLITE_OK (0).
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** For errors, it can be some other value.  If P1!=0 then P2 will determine
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** whether or not to rollback the current transaction.  Do not rollback
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if P2==OE_Fail. Do the rollback if P2==OE_Rollback.  If P2==OE_Abort,
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then back out all changes that have occurred during this execution of the
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE, but do not rollback the transaction.
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4 is not null then it is an error message string.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is an implied "Halt 0 0 0" instruction inserted at the very end of
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** every program.  So a jump past the last instruction of the program
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is the same as executing Halt.
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Halt: {
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p1==SQLITE_OK && p->pFrame ){
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Halt the sub-program. Return control to the parent frame. */
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VdbeFrame *pFrame = p->pFrame;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->pFrame = pFrame->pParent;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->nFrame--;
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeSetChanges(db, p->nChange);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = sqlite3VdbeFrameRestore(pFrame);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p2==OE_Ignore ){
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Instruction pc is the OP_Program that invoked the sub-program
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** currently being halted. If the p2 instruction of this OP_Halt
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** instruction is set to OE_Ignore, then the sub-program is throwing
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** an IGNORE exception. In this case jump to the address specified
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** as the p2 of the calling OP_Program.  */
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = p->aOp[pc].p2-1;
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aOp = p->aOp;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aMem = p->aMem;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->rc = pOp->p1;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->errorAction = (u8)pOp->p2;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pc = pc;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p4.z ){
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p->rc!=SQLITE_OK );
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( sqlite3GlobalConfig.xLog!=0 );
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pc, p->zSql, pOp->p4.z);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( p->rc ){
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testcase( sqlite3GlobalConfig.xLog!=0 );
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_log(pOp->p1, "constraint failed at %d in [%s]", pc, p->zSql);
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeHalt(p);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR );
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_BUSY ){
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->rc = rc = SQLITE_BUSY;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK || p->rc==SQLITE_CONSTRAINT );
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK || db->nDeferredCons>0 );
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = p->rc ? SQLITE_ERROR : SQLITE_DONE;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_return;
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Integer P1 P2 * * *
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The 32-bit integer value P1 is written into register P2.
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Integer: {         /* out2-prerelease */
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = pOp->p1;
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Int64 * P2 * P4 *
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a 64-bit integer value.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write that value into register P2.
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Int64: {           /* out2-prerelease */
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4.pI64!=0 );
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = *pOp->p4.pI64;
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Real * P2 * P4 *
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a 64-bit floating point value.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write that value into register P2.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Real: {            /* same as TK_FLOAT, out2-prerelease */
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Real;
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( !sqlite3IsNaN(*pOp->p4.pReal) );
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->r = *pOp->p4.pReal;
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: String8 * P2 * P4 *
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 points to a nul terminated UTF-8 string. This opcode is transformed
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into an OP_String before it is executed for the first time.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_String8: {         /* same as TK_STRING, out2-prerelease */
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4.z!=0 );
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOp->opcode = OP_String;
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOp->p1 = sqlite3Strlen30(pOp->p4.z);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_UTF16
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( encoding!=SQLITE_UTF8 ){
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC);
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_TOOBIG ) goto too_big;
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem;
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOut->zMalloc==pOut->z );
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOut->flags & MEM_Dyn );
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->zMalloc = 0;
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags |= MEM_Static;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags &= ~MEM_Dyn;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p4type==P4_DYNAMIC ){
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, pOp->p4.z);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp->p4type = P4_DYNAMIC;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp->p4.z = pOut->z;
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp->p1 = pOut->n;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Fall through to the next case, OP_String */
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: String P1 P2 * P4 *
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The string value P4 of length P1 (bytes) is stored in register P2.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_String: {          /* out2-prerelease */
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4.z!=0 );
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Str|MEM_Static|MEM_Term;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->z = pOp->p4.z;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->n = pOp->p1;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = encoding;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Null * P2 * * *
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write a NULL into register P2.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Null: {           /* out2-prerelease */
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Null;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Blob P1 P2 * P4
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 points to a blob of data P1 bytes long.  Store this
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** blob in register P2.
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Blob: {                /* out2-prerelease */
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1 <= SQLITE_MAX_LENGTH );
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = encoding;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Variable P1 P2 * P4 *
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Transfer the values of bound parameter P1 into register P2
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the parameter is named, then its name appears in P4 and P3==1.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P4 value is used by sqlite3_bind_parameter_name().
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Variable: {            /* out2-prerelease */
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pVar;       /* Value being transferred */
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>0 && pOp->p1<=p->nVar );
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVar = &p->aVar[pOp->p1 - 1];
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemTooBig(pVar) ){
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Move P1 P2 P3 * *
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Move the values in register P1..P1+P3-1 over into
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** registers P2..P2+P3-1.  Registers P1..P1+P1-1 are
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** left holding a NULL.  It is an error for register ranges
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1..P1+P3-1 and P2..P2+P3-1 to overlap.
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Move: {
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zMalloc;   /* Holding variable for allocated memory */
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;           /* Number of registers left to copy */
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p1;          /* Register to copy from */
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p2;          /* Register to copy to */
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pOp->p3;
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1 = pOp->p1;
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2 = pOp->p2;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n>0 && p1>0 && p2>0 );
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p1+n<=p2 || p2+n<=p1 );
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[p1];
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[p2];
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( n-- ){
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOut<=&aMem[p->nMem] );
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pIn1<=&aMem[p->nMem] );
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pIn1) );
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memAboutToChange(p, pOut);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zMalloc = pOut->zMalloc;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->zMalloc = 0;
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemMove(pOut, pIn1);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1->zMalloc = zMalloc;
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(p2++, pOut);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1++;
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut++;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Copy P1 P2 * * *
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make a copy of register P1 into register P2.
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction makes a deep copy of the value.  A duplicate
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is made of any string or blob constant.  See also OP_SCopy.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Copy: {             /* in1, out2 */
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOut!=pIn1 );
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Deephemeralize(pOut);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p2, pOut);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SCopy P1 P2 * * *
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Make a shallow copy of register P1 into register P2.
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction makes a shallow copy of the value.  If the value
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a string or blob, then the copy is only a pointer to the
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** original and hence if the original changes so will the copy.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Worse, if the original is deallocated, the copy becomes invalid.
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Thus the program must guarantee that the original will not change
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** during the lifetime of the copy.  Use OP_Copy to make a complete
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** copy.
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SCopy: {            /* in1, out2 */
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOut!=pIn1 );
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOut->pScopyFrom==0 ) pOut->pScopyFrom = pIn1;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p2, pOut);
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ResultRow P1 P2 * * *
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The registers P1 through P1+P2-1 contain a single row of
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** results. This opcode causes the sqlite3_step() call to terminate
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with an SQLITE_ROW return code and it sets up the sqlite3_stmt
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure to provide access to the top P1 values as the result
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** row.
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ResultRow: {
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->nResColumn==pOp->p2 );
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>0 );
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1+pOp->p2<=p->nMem+1 );
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If this statement has violated immediate foreign key constraints, do
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** not return the number of rows modified. And do not RELEASE the statement
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** transaction. It needs to be rolled back.  */
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->flags&SQLITE_CountRows );
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p->usesStmtJournal );
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** DML statements invoke this opcode to return the number of rows
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** modified to the user. This is the only way that a VM that
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** opens a statement transaction may invoke this opcode.
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** In case this is such a statement, close any statement transaction
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** opened by this VM before returning control to the user. This is to
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ensure that statement-transactions are always nested, not overlapping.
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If the open statement-transaction is not closed here, then the user
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** may step another VM that opens its own statement transaction. This
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** may lead to overlapping statement transactions.
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The statement transaction is never a top-level transaction.  Hence
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the RELEASE call below can never fail.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->iStatement==0 || db->flags&SQLITE_CountRows );
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE);
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(rc!=SQLITE_OK) ){
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invalidate all ephemeral cursor row caches */
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->cacheCtr = (p->cacheCtr + 2)|1;
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Make sure the results of the current row are \000 terminated
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and have an assigned type.  The results are de-ephemeralized as
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** as side effect.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem = p->pResultSet = &aMem[pOp->p1];
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<pOp->p2; i++){
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(&pMem[i]) );
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Deephemeralize(&pMem[i]);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pMem[i].flags & MEM_Ephem)==0
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 );
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemNulTerminate(&pMem[i]);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStoreType(&pMem[i]);
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(pOp->p1+i, &pMem[i]);
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ) goto no_mem;
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Return SQLITE_ROW
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pc = pc + 1;
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = SQLITE_ROW;
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_return;
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Concat P1 P2 P3 * *
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add the text in register P1 onto the end of the text in
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P2 and store the result in register P3.
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either the P1 or P2 text are NULL then store NULL in P3.
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**   P3 = P2 || P1
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is illegal for P1 and P3 to be the same register. Sometimes,
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if P3 is the same register as P2, the implementation is able
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to avoid a memcpy().
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Concat: {           /* same as TK_CONCAT, in1, in2, out3 */
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nByte;
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1!=pOut );
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags | pIn2->flags) & MEM_Null ){
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pOut);
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stringify(pIn1, encoding);
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Stringify(pIn2, encoding);
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nByte = pIn1->n + pIn2->n;
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pOut, MEM_Str);
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOut!=pIn2 ){
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(pOut->z, pIn2->z, pIn2->n);
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n);
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->z[nByte] = 0;
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->z[nByte+1] = 0;
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags |= MEM_Term;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->n = (int)nByte;
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = encoding;
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Add P1 P2 P3 * *
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add the value in register P1 to the value in register P2
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and store the result in register P3.
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Multiply P1 P2 P3 * *
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Multiply the value in register P1 by the value in register P2
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and store the result in register P3.
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Subtract P1 P2 P3 * *
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Subtract the value in register P1 from the value in register P2
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and store the result in register P3.
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Divide P1 P2 P3 * *
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Divide the value in register P1 by the value in register P2
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and store the result in register P3 (P3=P2/P1). If the value in
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1 is zero, then the result is NULL. If either input is
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL, the result is NULL.
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Remainder P1 P2 P3 * *
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compute the remainder after integer division of the value in
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1 by the value in register P2 and store the result in P3.
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value in register P2 is zero the result is NULL.
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either operand is NULL, the result is NULL.
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Add:                   /* same as TK_PLUS, in1, in2, out3 */
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Subtract:              /* same as TK_MINUS, in1, in2, out3 */
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Multiply:              /* same as TK_STAR, in1, in2, out3 */
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Divide:                /* same as TK_SLASH, in1, in2, out3 */
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Remainder: {           /* same as TK_REM, in1, in2, out3 */
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags;      /* Combined MEM_* flags from both inputs */
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iA;         /* Integer value of left operand */
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iB;         /* Integer value of right operand */
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rA;      /* Real value of left operand */
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double rB;      /* Real value of right operand */
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  applyNumericAffinity(pIn1);
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  applyNumericAffinity(pIn2);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags = pIn1->flags | pIn2->flags;
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null;
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iA = pIn1->u.i;
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iB = pIn2->u.i;
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( pOp->opcode ){
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Add:       if( sqlite3AddInt64(&iB,iA) ) goto fp_math;  break;
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Subtract:  if( sqlite3SubInt64(&iB,iA) ) goto fp_math;  break;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Multiply:  if( sqlite3MulInt64(&iB,iA) ) goto fp_math;  break;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Divide: {
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==0 ) goto arithmetic_result_is_null;
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==-1 && iB==SMALLEST_INT64 ) goto fp_math;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iB /= iA;
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==0 ) goto arithmetic_result_is_null;
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==-1 ) iA = 1;
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iB %= iA;
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.i = iB;
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Int);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fp_math:
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rA = sqlite3VdbeRealValue(pIn1);
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rB = sqlite3VdbeRealValue(pIn2);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( pOp->opcode ){
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Add:         rB += rA;       break;
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Subtract:    rB -= rA;       break;
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Multiply:    rB *= rA;       break;
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OP_Divide: {
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rA==(double)0 ) goto arithmetic_result_is_null;
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rB /= rA;
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default: {
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iA = (i64)rA;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iB = (i64)rB;
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==0 ) goto arithmetic_result_is_null;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA==-1 ) iA = 1;
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rB = (double)(iB % iA);
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.i = rB;
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Int);
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( sqlite3IsNaN(rB) ){
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto arithmetic_result_is_null;
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->r = rB;
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Real);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (flags & MEM_Real)==0 ){
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeIntegerAffinity(pOut);
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)arithmetic_result_is_null:
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetNull(pOut);
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: CollSeq * * P4
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a CollSeq struct. If the next call to a user function
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be returned. This is used by the built-in min(), max() and nullif()
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** functions.
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The interface used by the implementation of the aforementioned functions
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to retrieve the collation sequence set by this opcode is not available
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** publicly, only to user functions defined in func.c.
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_CollSeq: {
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_COLLSEQ );
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Function P1 P2 P3 P4 P5
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Invoke a user function (P4 is a pointer to a Function structure that
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** defines the function) with P5 arguments taken from register P2 and
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** successors.  The result of the function is stored in register P3.
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register P3 must not be one of the function inputs.
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is a 32-bit bitmask indicating whether or not each argument to the
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function was determined to be constant at compile time. If the first
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument was constant then bit 0 of P1 is set. This is used to determine
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** whether meta data associated with a user function argument using the
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_set_auxdata() API may be safely retained until the next
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invocation of this opcode.
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: AggStep and AggFinal
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Function: {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pArg;
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context ctx;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **apVal;
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pOp->p5;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apVal = p->apArg;
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( apVal || n==0 );
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pOut);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n==0 || (pOp->p2>0 && pOp->p2+n<=p->nMem+1) );
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n );
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pArg = &aMem[pOp->p2];
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<n; i++, pArg++){
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pArg) );
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apVal[i] = pArg;
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Deephemeralize(pArg);
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStoreType(pArg);
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(pOp->p2+i, pArg);
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC );
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p4type==P4_FUNCDEF ){
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pFunc = pOp->p4.pFunc;
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pVdbeFunc = 0;
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc;
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pFunc = ctx.pVdbeFunc->pFunc;
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.flags = MEM_Null;
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.db = db;
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.xDel = 0;
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.zMalloc = 0;
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The output cell may already have a buffer allocated. Move
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the pointer to ctx.s so in case the user-function can use
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the already allocated buffer instead of allocating a new one.
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemMove(&ctx.s, pOut);
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(&ctx.s, MEM_Null);
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.isError = 0;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp>aOp );
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp[-1].p4type==P4_COLLSEQ );
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp[-1].opcode==OP_CollSeq );
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pColl = pOp[-1].p4.pColl;
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ){
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Even though a malloc() has failed, the implementation of the
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** user function may have called an sqlite3_result_XXX() function
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to return a value. The following call releases any resources
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** associated with such a value.
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(&ctx.s);
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If any auxiliary data functions have been called by this user function,
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** immediately call the destructor for any non-static values.
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ctx.pVdbeFunc ){
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeDeleteAuxData(ctx.pVdbeFunc, pOp->p1);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp->p4.pVdbeFunc = ctx.pVdbeFunc;
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOp->p4type = P4_VDBEFUNC;
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the function returned an error, throw an exception */
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ctx.isError ){
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = ctx.isError;
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Copy the result of the function into register P3 */
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(&ctx.s, encoding);
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemMove(pOut, &ctx.s);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemTooBig(pOut) ){
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The app-defined function has done something that as caused this
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** statement to expire.  (Perhaps the function called sqlite3_exec()
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** with a CREATE TABLE statement.)
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->expired ) rc = SQLITE_ABORT;
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p3, pOut);
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: BitAnd P1 P2 P3 * *
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Take the bit-wise AND of the values in register P1 and P2 and
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** store the result in register P3.
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: BitOr P1 P2 P3 * *
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Take the bit-wise OR of the values in register P1 and P2 and
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** store the result in register P3.
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ShiftLeft P1 P2 P3 * *
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Shift the integer value in register P2 to the left by the
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number of bits specified by the integer in register P1.
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the result in register P3.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ShiftRight P1 P2 P3 * *
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Shift the integer value in register P2 to the right by the
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number of bits specified by the integer in register P1.
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the result in register P3.
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either input is NULL, the result is NULL.
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_BitAnd:                 /* same as TK_BITAND, in1, in2, out3 */
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_BitOr:                  /* same as TK_BITOR, in1, in2, out3 */
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ShiftLeft:              /* same as TK_LSHIFT, in1, in2, out3 */
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ShiftRight: {           /* same as TK_RSHIFT, in1, in2, out3 */
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iA;
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u64 uA;
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iB;
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 op;
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags | pIn2->flags) & MEM_Null ){
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pOut);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iA = sqlite3VdbeIntValue(pIn2);
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iB = sqlite3VdbeIntValue(pIn1);
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  op = pOp->opcode;
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( op==OP_BitAnd ){
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iA &= iB;
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( op==OP_BitOr ){
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iA |= iB;
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( iB!=0 ){
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( op==OP_ShiftRight || op==OP_ShiftLeft );
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If shifting by a negative amount, shift in the other direction */
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iB<0 ){
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( OP_ShiftRight==OP_ShiftLeft+1 );
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      op = 2*OP_ShiftLeft + 1 - op;
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iB = iB>(-64) ? -iB : 64;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iB>=64 ){
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iA = (iA>=0 || op==OP_ShiftLeft) ? 0 : -1;
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(&uA, &iA, sizeof(uA));
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( op==OP_ShiftLeft ){
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uA <<= iB;
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uA >>= iB;
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Sign-extend on a right shift of a negative number */
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iA<0 ) uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-iB);
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(&iA, &uA, sizeof(iA));
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = iA;
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pOut, MEM_Int);
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: AddImm  P1 P2 * * *
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Add the constant P2 to the value in register P1.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The result is always an integer.
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** To force any register to be an integer, just add 0.
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_AddImm: {            /* in1 */
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pIn1);
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemIntegerify(pIn1);
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->u.i += pOp->p2;
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: MustBeInt P1 P2 * * *
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be an integer.  If the value
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in P1 is not an integer and cannot be converted into an integer
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** without data loss, then jump immediately to P2, or if P2==0
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** raise an SQLITE_MISMATCH exception.
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_MustBeInt: {            /* jump, in1 */
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Int)==0 ){
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p2==0 ){
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_MISMATCH;
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto abort_due_to_error;
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pIn1, MEM_Int);
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FLOATING_POINT
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RealAffinity P1 * * * *
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If register P1 holds an integer convert it to a real value.
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode is used when extracting information from a column that
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has REAL affinity.  Such column values may still be stored as
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integers, for space efficiency, but after extraction we want them
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to have only a real value.
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RealAffinity: {                  /* in1 */
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Int ){
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRealify(pIn1);
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_CAST
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ToText P1 * * * *
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be text.
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value is numeric, convert it to a string using the
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** equivalent of printf().  Blob values are unchanged and
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are afterwards simply interpreted as text.
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A NULL value is not changed by this routine.  It remains NULL.
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ToText: {                  /* same as TK_TO_TEXT, in1 */
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pIn1);
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ) break;
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( MEM_Str==(MEM_Blob>>3) );
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->flags |= (pIn1->flags&MEM_Blob)>>3;
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = ExpandBlob(pIn1);
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1->flags & MEM_Str || db->mallocFailed );
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->flags &= ~(MEM_Int|MEM_Real|MEM_Blob|MEM_Zero);
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pIn1);
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ToBlob P1 * * * *
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be a BLOB.
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value is numeric, convert it to a string first.
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Strings are simply reinterpreted as blobs with no change
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the underlying data.
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A NULL value is not changed by this routine.  It remains NULL.
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ToBlob: {                  /* same as TK_TO_BLOB, in1 */
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ) break;
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Blob)==0 ){
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    applyAffinity(pIn1, SQLITE_AFF_TEXT, encoding);
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pIn1->flags & MEM_Str || db->mallocFailed );
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pIn1, MEM_Blob);
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1->flags &= ~(MEM_TypeMask&~MEM_Blob);
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pIn1);
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ToNumeric P1 * * * *
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be numeric (either an
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer or a floating-point number.)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value is text or blob, try to convert it to an using the
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** equivalent of atoi() or atof() and store 0 if no such conversion
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is possible.
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A NULL value is not changed by this routine.  It remains NULL.
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ToNumeric: {                  /* same as TK_TO_NUMERIC, in1 */
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemNumerify(pIn1);
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_CAST */
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ToInt P1 * * * *
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be an integer.  If
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value is currently a real number, drop its fractional part.
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value is text or blob, try to convert it to an integer using the
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** equivalent of atoi() and store 0 if no such conversion is possible.
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A NULL value is not changed by this routine.  It remains NULL.
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ToInt: {                  /* same as TK_TO_INT, in1 */
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Null)==0 ){
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemIntegerify(pIn1);
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT)
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ToReal P1 * * * *
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Force the value in register P1 to be a floating point number.
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If The value is currently an integer, convert it.
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value is text or blob, try to convert it to an integer using the
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** equivalent of atoi() and store 0.0 if no such conversion is possible.
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A NULL value is not changed by this routine.  It remains NULL.
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ToReal: {                  /* same as TK_TO_REAL, in1 */
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pIn1);
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Null)==0 ){
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRealify(pIn1);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_CAST) && !defined(SQLITE_OMIT_FLOATING_POINT) */
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Lt P1 P2 P3 P4 P5
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare the values in register P1 and P3.  If reg(P3)<reg(P1) then
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump to address P2.
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** reg(P3) is NULL then take the jump.  If the SQLITE_JUMPIFNULL
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** bit is clear then fall through if either operand is NULL.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The SQLITE_AFF_MASK portion of P5 must be an affinity character -
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to coerce both inputs according to this affinity before the
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** affinity is used. Note that the affinity conversions are stored
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** back into the input registers P1 and P3.  So this opcode can cause
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** persistent changes to registers P1 and P3.
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Once any conversions have taken place, and neither value is NULL,
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the values are compared. If both values are blobs then memcmp() is
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used to determine the results of the comparison.  If both values
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are text, then the appropriate collating function specified in
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is  used to do the comparison.  If P4 is not specified then
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** memcmp() is used to compare text string.  If both values are
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** numeric, then a numeric comparison is used. If the two values
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are of different types, then numbers are considered less than
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** strings and strings are considered less than blobs.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the SQLITE_STOREP2 bit of P5 is set, then do not jump.  Instead,
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** store a boolean result (either 0, or 1, or NULL) in register P2.
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Ne P1 P2 P3 P4 P5
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works just like the Lt opcode except that the jump is taken if
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the operands in registers P1 and P3 are not equal.  See the Lt opcode for
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** additional information.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true or false and is never NULL.  If both operands are NULL then the result
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of comparison is false.  If either operand is NULL then the result is true.
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If neither operand is NULL the the result is the same as it would be if
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SQLITE_NULLEQ flag were omitted from P5.
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Eq P1 P2 P3 P4 P5
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works just like the Lt opcode except that the jump is taken if
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the operands in registers P1 and P3 are equal.
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See the Lt opcode for additional information.
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true or false and is never NULL.  If both operands are NULL then the result
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of comparison is true.  If either operand is NULL then the result is false.
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If neither operand is NULL the the result is the same as it would be if
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the SQLITE_NULLEQ flag were omitted from P5.
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Le P1 P2 P3 P4 P5
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works just like the Lt opcode except that the jump is taken if
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the content of register P3 is less than or equal to the content of
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1.  See the Lt opcode for additional information.
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Gt P1 P2 P3 P4 P5
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works just like the Lt opcode except that the jump is taken if
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the content of register P3 is greater than the content of
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1.  See the Lt opcode for additional information.
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Ge P1 P2 P3 P4 P5
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works just like the Lt opcode except that the jump is taken if
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the content of register P3 is greater than or equal to the content of
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1.  See the Lt opcode for additional information.
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Eq:               /* same as TK_EQ, jump, in1, in3 */
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Ne:               /* same as TK_NE, jump, in1, in3 */
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Lt:               /* same as TK_LT, jump, in1, in3 */
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Le:               /* same as TK_LE, jump, in1, in3 */
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Gt:               /* same as TK_GT, jump, in1, in3 */
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Ge: {             /* same as TK_GE, jump, in1, in3 */
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;            /* Result of the comparison of pIn1 against pIn3 */
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char affinity;      /* Affinity to use for comparison */
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 flags1;         /* Copy of initial value of pIn1->flags */
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 flags3;         /* Copy of initial value of pIn3->flags */
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags1 = pIn1->flags;
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  flags3 = pIn3->flags;
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags | pIn3->flags)&MEM_Null ){
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* One or both operands are NULL */
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p5 & SQLITE_NULLEQ ){
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If SQLITE_NULLEQ is set (which will only happen if the operator is
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** OP_Eq or OP_Ne) then take the jump or not depending on whether
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** or not both operands are null.
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne );
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      res = (pIn1->flags & pIn3->flags & MEM_Null)==0;
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* SQLITE_NULLEQ is clear and at least one operand is NULL,
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** then the result is always NULL.
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** The jump is taken if the SQLITE_JUMPIFNULL bit is set.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pOp->p5 & SQLITE_STOREP2 ){
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pOut = &aMem[pOp->p2];
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MemSetTypeFlag(pOut, MEM_Null);
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        REGISTER_TRACE(pOp->p2, pOut);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( pOp->p5 & SQLITE_JUMPIFNULL ){
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pc = pOp->p2-1;
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Neither operand is NULL.  Do a comparison. */
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    affinity = pOp->p5 & SQLITE_AFF_MASK;
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( affinity ){
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      applyAffinity(pIn1, affinity, encoding);
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      applyAffinity(pIn3, affinity, encoding);
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( db->mallocFailed ) goto no_mem;
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 );
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpandBlob(pIn1);
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpandBlob(pIn3);
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl);
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch( pOp->opcode ){
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OP_Eq:    res = res==0;     break;
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OP_Ne:    res = res!=0;     break;
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OP_Lt:    res = res<0;      break;
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OP_Le:    res = res<=0;     break;
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case OP_Gt:    res = res>0;      break;
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:       res = res>=0;     break;
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p5 & SQLITE_STOREP2 ){
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut = &aMem[pOp->p2];
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memAboutToChange(p, pOut);
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Int);
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.i = res;
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(pOp->p2, pOut);
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( res ){
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2-1;
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Undo any changes made by applyAffinity() to the input registers. */
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (flags1&MEM_TypeMask);
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (flags3&MEM_TypeMask);
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Permutation * * * P4 *
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the permutation used by the OP_Compare operator to be the array
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of integers in P4.
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The permutation is only valid until the next OP_Permutation, OP_Compare,
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OP_Halt, or OP_ResultRow.  Typically the OP_Permutation should occur
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** immediately prior to the OP_Compare.
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Permutation: {
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_INTARRAY );
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4.ai );
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aPermute = pOp->p4.ai;
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Compare P1 P2 P3 P4 *
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Compare two vectors of registers in reg(P1)..reg(P1+P3-1) (call this
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** vector "A") and in reg(P2)..reg(P2+P3-1) ("B").  Save the result of
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the comparison for use by the next OP_Jump instruct.
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a KeyInfo structure that defines collating sequences and sort
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** orders for the comparison.  The permutation applies to registers
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** only.  The KeyInfo elements are used sequentially.
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The comparison is a sort comparison, so NULLs compare equal,
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULLs are less than numbers, numbers are less than strings,
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and strings are less than blobs.
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Compare: {
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p1;
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p2;
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const KeyInfo *pKeyInfo;
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int idx;
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;    /* Collating sequence to use on this term */
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bRev;          /* True for DESCENDING sort order */
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pOp->p3;
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pKeyInfo = pOp->p4.pKeyInfo;
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n>0 );
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pKeyInfo!=0 );
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1 = pOp->p1;
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2 = pOp->p2;
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if SQLITE_DEBUG
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( aPermute ){
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int k, mx = 0;
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(k=0; k<n; k++) if( aPermute[k]>mx ) mx = aPermute[k];
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p1>0 && p1+mx<=p->nMem+1 );
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p2>0 && p2+mx<=p->nMem+1 );
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p1>0 && p1+n<=p->nMem+1 );
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p2>0 && p2+n<=p->nMem+1 );
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_DEBUG */
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<n; i++){
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    idx = aPermute ? aPermute[i] : i;
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(&aMem[p1+idx]) );
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(&aMem[p2+idx]) );
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(p1+idx, &aMem[p1+idx]);
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(p2+idx, &aMem[p2+idx]);
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( i<pKeyInfo->nField );
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pColl = pKeyInfo->aColl[i];
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bRev = pKeyInfo->aSortOrder[i];
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl);
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iCompare ){
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( bRev ) iCompare = -iCompare;
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aPermute = 0;
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Jump P1 P2 P3 * *
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to the instruction at address P1, P2, or P3 depending on whether
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the most recent OP_Compare instruction the P1 vector was less than
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** equal to, or greater than the P2 vector, respectively.
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Jump: {             /* jump */
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iCompare<0 ){
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p1 - 1;
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( iCompare==0 ){
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p3 - 1;
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: And P1 P2 P3 * *
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Take the logical AND of the values in registers P1 and P2 and
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** write the result into register P3.
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either P1 or P2 is 0 (false) then the result is 0 even if
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the other input is NULL.  A NULL and true or two NULLs give
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a NULL output.
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Or P1 P2 P3 * *
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Take the logical OR of the values in register P1 and P2 and
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** store the answer in register P3.
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If either P1 or P2 is nonzero (true) then the result is 1 (true)
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** even if the other input is NULL.  A NULL and false or two NULLs
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** give a NULL output.
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_And:              /* same as TK_AND, in1, in2, out3 */
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Or: {             /* same as TK_OR, in1, in2, out3 */
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int v1;    /* Left operand:  0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int v2;    /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ){
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v1 = 2;
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v1 = sqlite3VdbeIntValue(pIn1)!=0;
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn2->flags & MEM_Null ){
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v2 = 2;
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v2 = sqlite3VdbeIntValue(pIn2)!=0;
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->opcode==OP_And ){
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 };
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v1 = and_logic[v1*3+v2];
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 };
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v1 = or_logic[v1*3+v2];
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( v1==2 ){
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Null);
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.i = v1;
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MemSetTypeFlag(pOut, MEM_Int);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Not P1 P2 * * *
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the value in register P1 as a boolean value.  Store the
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** boolean complement in register P2.  If the value in register P1 is
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NULL, then a NULL is stored in P2.
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Not: {                /* same as TK_NOT, in1, out2 */
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ){
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pOut);
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeIntValue(pIn1));
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: BitNot P1 P2 * * *
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the content of register P1 as an integer.  Store the
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** ones-complement of the P1 value into register P2.  If P1 holds
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a NULL then store a NULL in P2.
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_BitNot: {             /* same as TK_BITNOT, in1, out2 */
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ){
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pOut);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetInt64(pOut, ~sqlite3VdbeIntValue(pIn1));
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: If P1 P2 P3 * *
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to P2 if the value in register P1 is true.  The value is
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered true if it is numeric and non-zero.  If the value
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in P1 is NULL then take the jump if P3 is true.
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IfNot P1 P2 P3 * *
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to P2 if the value in register P1 is False.  The value is
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is considered true if it has a numeric value of zero.  If the value
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in P1 is NULL then take the jump if P3 is true.
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_If:                 /* jump, in1 */
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IfNot: {            /* jump, in1 */
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int c;
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->flags & MEM_Null ){
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = pOp->p3;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = sqlite3VdbeIntValue(pIn1)!=0;
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c = sqlite3VdbeRealValue(pIn1)!=0.0;
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->opcode==OP_IfNot ) c = !c;
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( c ){
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2-1;
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IsNull P1 P2 * * *
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to P2 if the value in register P1 is NULL.
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IsNull: {            /* same as TK_ISNULL, jump, in1 */
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Null)!=0 ){
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: NotNull P1 P2 * * *
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Jump to P2 if the value in register P1 is not NULL.
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_NotNull: {            /* same as TK_NOTNULL, jump, in1 */
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_Null)==0 ){
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Column P1 P2 P3 P4 P5
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Interpret the data that cursor P1 points to as a structure built using
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the MakeRecord instruction.  (See the MakeRecord opcode for additional
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** information about the format of the data.)  Extract the P2-th column
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** from this record.  If there are less that (P2+1)
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** values in the record, extract a NULL.
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value extracted is stored in register P3.
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the column contains fewer than P2 fields, then extract a NULL.  Or,
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if the P4 argument is a P4_MEM use the value of the P4 argument as
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result.
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor,
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then the cache of the cursor is reset prior to extracting the column.
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The first OP_Column against a pseudo-table after the value of the content
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register has changed should have this bit set.
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Column: {
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 payloadSize;   /* Number of bytes in the record */
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 payloadSize64; /* Number of bytes in the record */
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p1;            /* P1 value of the opcode */
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p2;            /* column number to retrieve */
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;    /* The VDBE cursor */
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zRec;        /* Pointer to complete record-data */
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;   /* The BTree cursor */
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 *aType;        /* aType[i] holds the numeric type of the i-th column */
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 *aOffset;      /* aOffset[i] is offset to start of data for i-th column */
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField;        /* number of fields in the record */
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;           /* The length of the serialized data for the column */
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;             /* Loop counter */
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zData;       /* Part of the record being decoded */
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pDest;        /* Where to write the extracted value */
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem sMem;          /* For storing the record being decoded */
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 *zIdx;          /* Index into header */
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 *zEndHdr;       /* Pointer to first byte after the header */
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 offset;        /* Offset into the data */
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 szField;       /* Number of bytes in the content of a field */
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int szHdr;         /* Size of the header size field at start of record */
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int avail;         /* Number of bytes of available data */
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pReg;         /* PseudoTable input register */
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1 = pOp->p1;
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2 = pOp->p2;
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = 0;
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&sMem, 0, sizeof(sMem));
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p1<p->nCursor );
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDest = &aMem[pOp->p3];
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pDest);
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pDest, MEM_Null);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zRec = 0;
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This block sets the variable payloadSize to be the total number of
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** bytes in the record.
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** zRec is set to be the complete text of the record if it is available.
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** The complete record text is always available for pseudo-tables
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If the record is stored in a cursor, the complete record text
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** might be available in the  pC->aRow cache.  Or it might not be.
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** If the data is unavailable,  zRec is set to NULL.
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** We also compute the number of columns in the record.  For cursors,
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the number of columns is stored in the VdbeCursor.nField element.
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[p1];
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pVtabCursor==0 );
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr!=0 ){
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The record is stored in a B-Tree */
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeCursorMoveto(pC);
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc ) goto abort_due_to_error;
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pC->nullRow ){
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      payloadSize = 0;
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( pC->cacheStatus==p->cacheCtr ){
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      payloadSize = pC->payloadSize;
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zRec = (char*)pC->aRow;
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( pC->isIndex ){
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3BtreeCursorIsValid(pCrsr) );
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeKeySize(pCrsr, &payloadSize64);
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( rc==SQLITE_OK );   /* True because of CursorMoveto() call above */
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** payload size, so it is impossible for payloadSize64 to be
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** larger than 32 bits. */
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (payloadSize64 & SQLITE_MAX_U32)==(u64)payloadSize64 );
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      payloadSize = (u32)payloadSize64;
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3BtreeCursorIsValid(pCrsr) );
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeDataSize(pCrsr, &payloadSize);
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( rc==SQLITE_OK );   /* DataSize() cannot fail */
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pC->pseudoTableReg>0 ){
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pReg = &aMem[pC->pseudoTableReg];
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pReg->flags & MEM_Blob );
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pReg) );
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    payloadSize = pReg->n;
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zRec = pReg->z;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr;
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( payloadSize==0 || zRec!=0 );
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Consider the row to be NULL */
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    payloadSize = 0;
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If payloadSize is 0, then just store a NULL */
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( payloadSize==0 ){
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pDest->flags&MEM_Null );
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto op_column_out;
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->aLimit[SQLITE_LIMIT_LENGTH]>=0 );
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nField = pC->nField;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p2<nField );
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Read and parse the table header.  Store the results of the parse
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** into the record header cache fields of the cursor.
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aType = pC->aType;
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->cacheStatus==p->cacheCtr ){
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aOffset = pC->aOffset;
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(aType);
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    avail = 0;
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->aOffset = aOffset = &aType[nField];
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->payloadSize = payloadSize;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = p->cacheCtr;
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Figure out how many bytes are in the header */
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zRec ){
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zData = zRec;
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pC->isIndex ){
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zData = (char*)sqlite3BtreeKeyFetch(pCrsr, &avail);
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zData = (char*)sqlite3BtreeDataFetch(pCrsr, &avail);
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If KeyFetch()/DataFetch() managed to get the entire payload,
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** save the payload in the pC->aRow cache.  That will save us from
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** having to make additional calls to fetch the content portion of
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the record.
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( avail>=0 );
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( payloadSize <= (u32)avail ){
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zRec = zData;
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->aRow = (u8*)zData;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->aRow = 0;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The following assert is true in all cases accept when
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the database file has been corrupted externally.
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **    assert( zRec!=0 || avail>=payloadSize || avail>=9 ); */
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    szHdr = getVarint32((u8*)zData, offset);
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Make sure a corrupt database has not given us an oversize header.
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Do this now to avoid an oversize memory allocation.
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Type entries can be between 1 and 5 bytes each.  But 4 and 5 byte
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** types use so much data space that there can only be 4096 and 32 of
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** them, respectively.  So the maximum header length results from a
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** 3-byte type for each of the maximum of 32768 columns plus three
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** extra bytes for the header length itself.  32768*3 + 3 = 98307.
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( offset > 98307 ){
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_CORRUPT_BKPT;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto op_column_out;
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Compute in len the number of bytes of data we need to read in order
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to get nField type values.  offset is an upper bound on this.  But
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** nField might be significantly less than the true number of columns
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** in the table, and in that case, 5*nField+3 might be smaller than offset.
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** We want to minimize len in order to limit the size of the memory
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** allocation, especially if a corrupt database file has caused offset
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to be oversized. Offset is limited to 98307 above.  But 98307 might
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** still exceed Robson memory allocation limits on some configurations.
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** On systems that cannot tolerate large memory allocations, nField*5+3
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** will likely be much smaller since nField will likely be less than
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** 20 or so.  This insures that Robson memory allocation limits are
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** not exceeded even for corrupt database files.
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = nField*5 + 3;
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( len > (int)offset ) len = (int)offset;
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The KeyFetch() or DataFetch() above are fast and will get the entire
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** record header in most cases.  But they will fail to get the complete
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** record header if the record header does not fit on a single page
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** in the B-Tree.  When that happens, use sqlite3VdbeMemFromBtree() to
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** acquire the complete header text.
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !zRec && avail<len ){
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sMem.flags = 0;
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sMem.db = 0;
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3VdbeMemFromBtree(pCrsr, 0, len, pC->isIndex, &sMem);
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_OK ){
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto op_column_out;
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zData = sMem.z;
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zEndHdr = (u8 *)&zData[len];
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zIdx = (u8 *)&zData[szHdr];
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Scan the header and use it to fill in the aType[] and aOffset[]
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** arrays.  aType[i] will contain the type integer for the i-th
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** column and aOffset[i] will contain the offset from the beginning
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** of the record to the start of the data for the i-th column
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<nField; i++){
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( zIdx<zEndHdr ){
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aOffset[i] = offset;
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        zIdx += getVarint32(zIdx, aType[i]);
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        szField = sqlite3VdbeSerialTypeLen(aType[i]);
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        offset += szField;
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( offset<szField ){  /* True if offset overflows */
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          zIdx = &zEndHdr[1];  /* Forces SQLITE_CORRUPT return below */
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* If i is less that nField, then there are less fields in this
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** record than SetNumColumns indicated there are columns in the
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** table. Set the offset for any extra columns not present in
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** the record to 0. This tells code below to store a NULL
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** instead of deserializing a value from the record.
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aOffset[i] = 0;
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(&sMem);
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sMem.flags = MEM_Null;
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If we have read more header data than was contained in the header,
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** or if the end of the last field appears to be past the end of the
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** record, or if the end of the last field appears to be before the end
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** of the record (when all fields present), then we must be dealing
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** with a corrupt database.
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (zIdx > zEndHdr) || (offset > payloadSize)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         || (zIdx==zEndHdr && offset!=payloadSize) ){
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_CORRUPT_BKPT;
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto op_column_out;
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Get the column information. If aOffset[p2] is non-zero, then
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** deserialize the value from the record. If aOffset[p2] is zero,
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** then there are not enough fields in the record to satisfy the
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** request.  In this case, set the value NULL or to P4 if P4 is
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** a pointer to a Mem object.
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( aOffset[p2] ){
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK );
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zRec ){
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemReleaseExternal(pDest);
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeSerialGet((u8 *)&zRec[aOffset[p2]], aType[p2], pDest);
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      len = sqlite3VdbeSerialTypeLen(aType[p2]);
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemMove(&sMem, pDest);
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, pC->isIndex, &sMem);
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_OK ){
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto op_column_out;
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zData = sMem.z;
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeSerialGet((u8*)zData, aType[p2], pDest);
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDest->enc = encoding;
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p4type==P4_MEM ){
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static);
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pDest->flags&MEM_Null );
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If we dynamically allocated space to hold the data (in the
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3VdbeMemFromBtree() call above) then transfer control of that
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** dynamically allocated space over to the pDest structure.
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** This prevents a memory copy.
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sMem.zMalloc ){
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sMem.z==sMem.zMalloc );
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !(pDest->flags & MEM_Dyn) );
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !(pDest->flags & (MEM_Blob|MEM_Str)) || pDest->z==sMem.z );
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDest->flags &= ~(MEM_Ephem|MEM_Static);
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDest->flags |= MEM_Term;
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDest->z = sMem.z;
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDest->zMalloc = sMem.zMalloc;
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeMemMakeWriteable(pDest);
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)op_column_out:
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pDest);
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p3, pDest);
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Affinity P1 P2 * P4 *
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Apply affinities to a range of P2 registers starting with P1.
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a string that is P2 characters long. The nth character of the
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string indicates the column affinity that should be used for the nth
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** memory cell in the range.
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Affinity: {
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zAffinity;   /* The affinity to be applied */
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char cAff;               /* A single character of affinity */
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zAffinity = pOp->p4.z;
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zAffinity!=0 );
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( zAffinity[pOp->p2]==0 );
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( (cAff = *(zAffinity++))!=0 ){
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pIn1 <= &p->aMem[p->nMem] );
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pIn1) );
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExpandBlob(pIn1);
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    applyAffinity(pIn1, cAff, encoding);
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1++;
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: MakeRecord P1 P2 P3 P4 *
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Convert P2 registers beginning with P1 into the [record format]
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use as a data record in a database table or as a key
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in an index.  The OP_Column opcode can decode the record later.
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 may be a string that is P2 characters long.  The nth character of the
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string indicates the column affinity that should be used for the nth
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** field of the index key.
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The mapping from character to affinity is given by the SQLITE_AFF_
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** macros defined in sqliteInt.h.
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4 is NULL then all index fields have the affinity NONE.
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_MakeRecord: {
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 *zNewRecord;        /* A buffer to hold the data for the new record */
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pRec;             /* The new record */
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u64 nData;             /* Number of bytes of data space */
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nHdr;              /* Number of bytes of header space */
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nByte;             /* Data space required for this record */
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nZero;             /* Number of zero bytes at the end of the record */
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nVarint;           /* Number of bytes in a varint */
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 serial_type;       /* Type field */
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pData0;           /* First field to be combined into the record */
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pLast;            /* Last field of the record */
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField;            /* Number of fields in the record */
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zAffinity;       /* The affinity string for the record */
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int file_format;       /* File format to use for encoding */
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;                 /* Space used in zNewRecord[] */
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int len;               /* Length of a field */
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Assuming the record contains N fields, the record format looks
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** like this:
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ------------------------------------------------------------------------
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** | hdr-size | type 0 | type 1 | ... | type N-1 | data0 | ... | data N-1 |
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ------------------------------------------------------------------------
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Data(0) is taken from register P1.  Data(1) comes from register P1+1
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and so froth.
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Each type field is a varint representing the serial type of the
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** corresponding data element (see sqlite3VdbeSerialType()). The
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** hdr-size field is also a varint which is the offset from the beginning
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** of the record to data0.
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nData = 0;         /* Number of bytes of data space */
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nHdr = 0;          /* Number of bytes of header space */
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nZero = 0;         /* Number of zero bytes at the end of the record */
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nField = pOp->p1;
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zAffinity = pOp->p4.z;
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=p->nMem+1 );
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pData0 = &aMem[nField];
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nField = pOp->p2;
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pLast = &pData0[nField-1];
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_format = p->minWriteFileFormat;
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Identify the output register */
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 );
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p3];
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pOut);
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Loop through the elements that will make up the record to figure
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** out how much space is required for the new record.
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pRec=pData0; pRec<=pLast; pRec++){
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pRec) );
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zAffinity ){
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      applyAffinity(pRec, zAffinity[pRec-pData0], encoding);
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pRec->flags&MEM_Zero && pRec->n>0 ){
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemExpandBlob(pRec);
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serial_type = sqlite3VdbeSerialType(pRec, file_format);
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    len = sqlite3VdbeSerialTypeLen(serial_type);
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nData += len;
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nHdr += sqlite3VarintLen(serial_type);
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pRec->flags & MEM_Zero ){
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Only pure zero-filled BLOBs can be input to this Opcode.
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** We do not allow blobs with a prefix and a zero-filled tail. */
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nZero += pRec->u.nZero;
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( len ){
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nZero = 0;
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Add the initial header varint and total the size */
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nHdr += nVarint = sqlite3VarintLen(nHdr);
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nVarint<sqlite3VarintLen(nHdr) ){
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nHdr++;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nByte = nHdr+nData-nZero;
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Make sure the output register has a buffer large enough to store
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the new record. The output register (pOp->p3) is not allowed to
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** be one of the input registers (because the following call to
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3VdbeMemGrow() could clobber the value before it is used).
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemGrow(pOut, (int)nByte, 0) ){
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zNewRecord = (u8 *)pOut->z;
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Write the record */
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i = putVarint32(zNewRecord, nHdr);
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pRec=pData0; pRec<=pLast; pRec++){
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    serial_type = sqlite3VdbeSerialType(pRec, file_format);
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i += putVarint32(&zNewRecord[i], serial_type);      /* serial type */
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pRec=pData0; pRec<=pLast; pRec++){  /* serial data */
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i += sqlite3VdbeSerialPut(&zNewRecord[i], (int)(nByte-i), pRec,file_format);
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( i==nByte );
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->n = (int)nByte;
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Blob | MEM_Dyn;
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->xDel = 0;
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nZero ){
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.nZero = nZero;
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags |= MEM_Zero;
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = SQLITE_UTF8;  /* In case the blob is ever converted to text */
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p3, pOut);
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Count P1 P2 * * *
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the number of entries (an integer value) in the table or index
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opened by cursor P1 in register P2
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_BTREECOUNT
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Count: {         /* out2-prerelease */
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nEntry;
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = p->apCsr[pOp->p1]->pCursor;
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr ){
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeCount(pCrsr, &nEntry);
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nEntry = 0;
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = nEntry;
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Savepoint P1 * * P4 *
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open, release or rollback the savepoint named by parameter P4, depending
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the value of P1. To open a new savepoint, P1==0. To release (commit) an
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** existing savepoint, P1==1, or to rollback an existing savepoint P1==2.
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Savepoint: {
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p1;                         /* Value of P1 operand */
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zName;                    /* Name of savepoint */
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nName;
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Savepoint *pNew;
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Savepoint *pSavepoint;
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Savepoint *pTmp;
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iSavepoint;
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ii;
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1 = pOp->p1;
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zName = pOp->p4.z;
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Assert that the p1 parameter is valid. Also that if there is no open
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** transaction, then there cannot be any savepoints.
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->pSavepoint==0 || db->autoCommit==0 );
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p1==SAVEPOINT_BEGIN||p1==SAVEPOINT_RELEASE||p1==SAVEPOINT_ROLLBACK );
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->pSavepoint || db->isTransactionSavepoint==0 );
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( checkSavepointCount(db) );
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p1==SAVEPOINT_BEGIN ){
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->writeVdbeCnt>0 ){
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* A new savepoint cannot be created if there are active write
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** statements (i.e. open read/write incremental blob handles).
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - "
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SQL statements in progress");
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_BUSY;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nName = sqlite3Strlen30(zName);
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Create a new savepoint structure. */
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+nName+1);
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pNew ){
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->zName = (char *)&pNew[1];
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        memcpy(pNew->zName, zName, nName+1);
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* If there is no open transaction, then mark this as a special
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** "transaction savepoint". */
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( db->autoCommit ){
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->autoCommit = 0;
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->isTransactionSavepoint = 1;
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->nSavepoint++;
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Link the new savepoint into the database handle's list. */
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->pNext = db->pSavepoint;
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->pSavepoint = pNew;
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pNew->nDeferredCons = db->nDeferredCons;
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iSavepoint = 0;
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Find the named savepoint. If there is no such savepoint, then an
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** an error is returned to the user.  */
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSavepoint = db->pSavepoint;
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSavepoint && sqlite3StrICmp(pSavepoint->zName, zName);
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pSavepoint = pSavepoint->pNext
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ){
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iSavepoint++;
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pSavepoint ){
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", zName);
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_ERROR;
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if(
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->writeVdbeCnt>0 || (p1==SAVEPOINT_ROLLBACK && db->activeVdbeCnt>1)
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ){
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* It is not possible to release (commit) a savepoint if there are
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** active write statements. It is not possible to rollback a savepoint
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** if there are any active statements at all.
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SetString(&p->zErrMsg, db,
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "cannot %s savepoint - SQL statements in progress",
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (p1==SAVEPOINT_ROLLBACK ? "rollback": "release")
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_BUSY;
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Determine whether or not this is a transaction savepoint. If so,
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** and this is a RELEASE command, then the current transaction
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** is committed.
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int isTransaction = pSavepoint->pNext==0 && db->isTransactionSavepoint;
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( isTransaction && p1==SAVEPOINT_RELEASE ){
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto vdbe_return;
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->autoCommit = 1;
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          p->pc = pc;
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->autoCommit = 0;
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          p->rc = rc = SQLITE_BUSY;
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto vdbe_return;
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->isTransactionSavepoint = 0;
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = p->rc;
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        iSavepoint = db->nSavepoint - iSavepoint - 1;
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for(ii=0; ii<db->nDb; ii++){
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rc = sqlite3BtreeSavepoint(db->aDb[ii].pBt, p1, iSavepoint);
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( rc!=SQLITE_OK ){
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            goto abort_due_to_error;
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ExpirePreparedStatements(db);
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3ResetInternalSchema(db, -1);
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->flags = (db->flags | SQLITE_InternChanges);
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Regardless of whether this is a RELEASE or ROLLBACK, destroy all
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** savepoints nested inside of the savepoint being operated on. */
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while( db->pSavepoint!=pSavepoint ){
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pTmp = db->pSavepoint;
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->pSavepoint = pTmp->pNext;
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3DbFree(db, pTmp);
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->nSavepoint--;
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If it is a RELEASE, then destroy the savepoint being operated on
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** too. If it is a ROLLBACK TO, then set the number of deferred
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** constraint violations present in the database to the value stored
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** when the savepoint was created.  */
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p1==SAVEPOINT_RELEASE ){
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pSavepoint==db->pSavepoint );
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->pSavepoint = pSavepoint->pNext;
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3DbFree(db, pSavepoint);
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( !isTransaction ){
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          db->nSavepoint--;
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->nDeferredCons = pSavepoint->nDeferredCons;
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: AutoCommit P1 P2 * * *
26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Set the database auto-commit flag to P1 (1 or 0). If P2 is true, roll
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** back any currently active btree transactions. If there are any active
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VMs (apart from this one), then a ROLLBACK fails.  A COMMIT fails if
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** there are active writing VMs or active VMs that use shared cache.
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction causes the VM to halt.
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_AutoCommit: {
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int desiredAutoCommit;
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iRollback;
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int turnOnAC;
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  desiredAutoCommit = pOp->p1;
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iRollback = pOp->p2;
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  turnOnAC = desiredAutoCommit && !db->autoCommit;
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( desiredAutoCommit==1 || desiredAutoCommit==0 );
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( desiredAutoCommit==1 || iRollback==0 );
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->activeVdbeCnt>0 );  /* At least this one VM is active */
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( turnOnAC && iRollback && db->activeVdbeCnt>1 ){
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If this instruction implements a ROLLBACK and other VMs are
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** still running, and a transaction is active, return an error indicating
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** that the other VMs must complete first.
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - "
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SQL statements in progress");
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_BUSY;
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( turnOnAC && !iRollback && db->writeVdbeCnt>0 ){
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If this instruction implements a COMMIT and other VMs are writing
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** return an error indicating that the other VMs must complete first.
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
27285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - "
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "SQL statements in progress");
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_BUSY;
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( desiredAutoCommit!=db->autoCommit ){
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( iRollback ){
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( desiredAutoCommit==1 );
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3RollbackAll(db);
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->autoCommit = 1;
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto vdbe_return;
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->autoCommit = (u8)desiredAutoCommit;
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->pc = pc;
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->autoCommit = (u8)(1-desiredAutoCommit);
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->rc = rc = SQLITE_BUSY;
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto vdbe_return;
27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
27465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( db->nStatement==0 );
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3CloseSavepoints(db);
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->rc==SQLITE_OK ){
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_DONE;
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_ERROR;
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto vdbe_return;
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db,
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (!desiredAutoCommit)?"cannot start a transaction within a transaction":(
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (iRollback)?"cannot rollback - no transaction is active":
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   "cannot commit - no transaction is active"));
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_ERROR;
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Transaction P1 P2 * * *
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Begin a transaction.  The transaction ends when a Commit or Rollback
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** opcode is encountered.  Depending on the ON CONFLICT setting, the
27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** transaction might also be rolled back if an error is encountered.
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is the index of the database file on which the transaction is
27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** started.  Index 0 is the main database file and index 1 is the
27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file used for temporary tables.  Indices of 2 or more are used for
27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** attached databases.
27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P2 is non-zero, then a write-transaction is started.  A RESERVED lock is
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** obtained on the database file when a write-transaction is started.  No
27795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** other process can start another write transaction while this transaction is
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** underway.  Starting a write transaction also creates a rollback journal. A
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** write transaction must be started before any changes can be made to the
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database.  If P2 is 2 or greater then an EXCLUSIVE lock is also obtained
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on the file.
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If a write-transaction is started and the Vdbe.usesStmtJournal flag is
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** true (this flag is set if the Vdbe may modify more than one row and may
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** throw an ABORT exception), a statement transaction may also be opened.
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** More specifically, a statement transaction is opened iff the database
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** connection is currently not in autocommit mode, or if there are other
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** active statements. A statement transaction allows the affects of this
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE to be rolled back after an error without having to roll back the
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entire transaction. If no error is encountered, the statement transaction
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will automatically commit when the VDBE halts.
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P2 is zero, then a read-lock is obtained on the database file.
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Transaction: {
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBt = db->aDb[pOp->p1].pBt;
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pBt ){
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeBeginTrans(pBt, pOp->p2);
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_BUSY ){
28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->pc = pc;
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->rc = rc = SQLITE_BUSY;
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto vdbe_return;
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc!=SQLITE_OK ){
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto abort_due_to_error;
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p2 && p->usesStmtJournal
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     && (db->autoCommit==0 || db->activeVdbeCnt>1)
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ){
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3BtreeIsInTrans(pBt) );
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( p->iStatement==0 ){
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( db->nStatement>=0 && db->nSavepoint>=0 );
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        db->nStatement++;
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        p->iStatement = db->nSavepoint + db->nStatement;
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeBeginStmt(pBt, p->iStatement);
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Store the current value of the database handles deferred constraint
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** counter. If the statement transaction needs to be rolled back,
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the value of this counter needs to be restored too.  */
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->nStmtDefCons = db->nDeferredCons;
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ReadCookie P1 P2 P3 * *
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read cookie number P3 from database P1 and write it into register P2.
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3==1 is the schema version.  P3==2 is the database format.
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3==3 is the recommended pager cache size, and so forth.  P1==0 is
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the main database file and P1==1 is the database file used to store
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** temporary tables.
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There must be a read-lock on the database (either a transaction
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must be started or there must be an open cursor) before
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** executing this instruction.
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ReadCookie: {               /* out2-prerelease */
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iMeta;
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCookie;
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = pOp->p1;
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iCookie = pOp->p3;
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3<SQLITE_N_BTREE_META );
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 && iDb<db->nDb );
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->aDb[iDb].pBt!=0 );
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta);
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = iMeta;
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SetCookie P1 P2 P3 * *
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write the content of register P3 (interpreted as an integer)
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into cookie number P2 of database P1.  P2==1 is the schema version.
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2==2 is the database format. P2==3 is the recommended pager cache
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** size, and so forth.  P1==0 is the main database file and P1==1 is the
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database file used to store temporary tables.
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A transaction must be started before executing this opcode.
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SetCookie: {       /* in3 */
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p2<SQLITE_N_BTREE_META );
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[pOp->p1];
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pDb->pBt!=0 );
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemIntegerify(pIn3);
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* See note about index shifting on OP_ReadCookie */
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i);
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p2==BTREE_SCHEMA_VERSION ){
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* When the schema cookie changes, record the new cookie internally */
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDb->pSchema->schema_cookie = (int)pIn3->u.i;
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->flags |= SQLITE_InternChanges;
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pOp->p2==BTREE_FILE_FORMAT ){
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Record changes in the file format */
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pDb->pSchema->file_format = (u8)pIn3->u.i;
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p1==1 ){
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Invalidate all prepared statements whenever the TEMP database
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** schema is changed.  Ticket #1644 */
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExpirePreparedStatements(db);
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->expired = 0;
28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VerifyCookie P1 P2 P3 * *
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Check the value of global database parameter number 0 (the
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema version) and make sure it is equal to P2 and that the
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** generation counter on the local schema parse equals P3.
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is the database number which is 0 for the main database file
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and 1 for the file holding temporary tables and some higher number
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for auxiliary databases.
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cookie changes its value whenever the database schema changes.
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This operation is used to detect when that the cookie has changed
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and that the current process needs to reread the schema.
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Either a transaction needs to have been started or an OP_Open needs
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to be executed (to establish a read lock) before this opcode is
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invoked.
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VerifyCookie: {
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iMeta;
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iGen;
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) );
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBt = db->aDb[pOp->p1].pBt;
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pBt ){
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta);
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iGen = db->aDb[pOp->p1].pSchema->iGeneration;
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iGen = iMeta = 0;
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iMeta!=pOp->p2 || iGen!=pOp->p3 ){
29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3DbFree(db, p->zErrMsg);
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed");
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If the schema-cookie from the database file matches the cookie
29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** stored with the in-memory representation of the schema, do
29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** not reload the schema from the database file.
29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** If virtual-tables are in use, this is not just an optimization.
29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Often, v-tables store their data in other SQLite tables, which
29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** are queried from within xNext() and other v-table methods using
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** prepared queries. If such a query is out-of-date, we do not want to
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** discard the database schema, as the user code implementing the
29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** v-table would have to be ready for the sqlite3_vtab structure itself
29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to be invalidated whenever sqlite3_step() is called from within
29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** a v-table method.
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3ResetInternalSchema(db, pOp->p1);
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->expired = 1;
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_SCHEMA;
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: OpenRead P1 P2 P3 P4 P5
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open a read-only cursor for the database table whose root page is
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2 in a database file.  The database file is determined by P3.
29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3==0 means the main database, P3==1 means the database used for
29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** temporary tables, and P3>1 means used the corresponding attached
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database.  Give the new cursor an identifier of P1.  The P1
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** values need not be contiguous but all P1 values should be small integers.
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is an error for P1 to be negative.
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5!=0 then use the content of register P2 as the root page, not
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value of P2 itself.
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There will be a read lock on the database whenever there is an
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** open cursor.  If the database was unlocked prior to this instruction
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then a read lock is acquired as part of this instruction.  A read
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** lock allows other processes to read the database but prohibits
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any other process from modifying the database.  The read lock is
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** released when all cursors are closed.  If this instruction attempts
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to get a read lock but fails, the script terminates with an
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_BUSY error code.
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P4 value may be either an integer (P4_INT32) or a pointer to
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure, then said structure defines the content and collating
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence of the index being opened. Otherwise, if P4 is an integer
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value, it is set to the number of columns in the table.
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also OpenWrite.
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: OpenWrite P1 P2 P3 P4 P5
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open a read/write cursor named P1 on the table or index whose root
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** page is P2.  Or if P5!=0 use the content of register P2 to find the
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** root page.
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P4 value may be either an integer (P4_INT32) or a pointer to
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a KeyInfo structure (P4_KEYINFO). If it is a pointer to a KeyInfo
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure, then said structure defines the content and collating
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sequence of the index being opened. Otherwise, if P4 is an integer
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value, it is set to the number of columns in the table, or to the
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** largest index of any column of the table that is actually used.
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction works just like OpenRead except that it opens the cursor
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in read/write mode.  For a given table, there can be one or more read-only
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cursors or a single read/write cursor but not both.
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also OpenRead.
30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_OpenRead:
30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_OpenWrite: {
30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField;
30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyInfo *pKeyInfo;
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int p2;
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int wrFlag;
30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pX;
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCur;
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->expired ){
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_ABORT;
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nField = 0;
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pKeyInfo = 0;
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2 = pOp->p2;
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = pOp->p3;
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 && iDb<db->nDb );
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[iDb];
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pX = pDb->pBt;
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pX!=0 );
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->opcode==OP_OpenWrite ){
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wrFlag = 1;
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pDb->pSchema->file_format < p->minWriteFileFormat ){
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      p->minWriteFileFormat = pDb->pSchema->file_format;
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    wrFlag = 0;
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p5 ){
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p2>0 );
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p2<=p->nMem );
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn2 = &aMem[p2];
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pIn2) );
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (pIn2->flags & MEM_Int)!=0 );
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemIntegerify(pIn2);
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p2 = (int)pIn2->u.i;
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The p2 value always comes from a prior OP_CreateTable opcode and
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** that opcode will always set the p2 value to 2 or more or else fail.
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** If there were a failure, the prepared statement would have halted
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** before reaching this instruction. */
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( NEVER(p2<2) ) {
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_CORRUPT_BKPT;
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto abort_due_to_error;
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p4type==P4_KEYINFO ){
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKeyInfo = pOp->p4.pKeyInfo;
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKeyInfo->enc = ENC(p->db);
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nField = pKeyInfo->nField+1;
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pOp->p4type==P4_INT32 ){
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nField = pOp->p4.i;
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 );
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur = allocateCursor(p, pOp->p1, nField, iDb, 1);
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCur==0 ) goto no_mem;
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->nullRow = 1;
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->isOrdered = 1;
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->pCursor);
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->pKeyInfo = pKeyInfo;
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Since it performs no memory allocation or IO, the only values that
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3BtreeCursor() may return are SQLITE_EMPTY and SQLITE_OK.
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** SQLITE_EMPTY is only returned when attempting to open the table
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** rooted at page 1 of a zero-byte database.  */
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( rc==SQLITE_EMPTY || rc==SQLITE_OK );
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_EMPTY ){
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCur->pCursor = 0;
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_OK;
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Set the VdbeCursor.isTable and isIndex variables. Previous versions of
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** SQLite used to check if the root-page flags were sane at this point
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and report database corruption if they were not, but this check has
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** since moved into the btree layer.  */
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->isTable = pOp->p4type!=P4_KEYINFO;
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->isIndex = !pCur->isTable;
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: OpenEphemeral P1 P2 * P4 *
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open a new cursor P1 to a transient table.
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cursor is always opened read/write even if
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the main database is read-only.  The ephemeral
31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table is deleted automatically when the cursor is closed.
31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2 is the number of columns in the ephemeral table.
31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cursor points to a BTree table if P4==0 and to a BTree index
31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** if P4 is not 0.  If P4 is not NULL, it points to a KeyInfo structure
31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that defines the format of keys in the index.
31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode was once called OpenTemp.  But that created
31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** confusion because the term "temp table", might refer either
31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to a TEMP table at the SQL level, or to a table opened by
31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this opcode.  Then this opcode was call OpenVirtual.  But
31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that created confusion with the whole virtual-table idea.
31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: OpenAutoindex P1 P2 * P4 *
31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode works the same as OP_OpenEphemeral.  It has a
31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** different name to distinguish its use.  Tables created using
31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by this opcode will be used for automatically created transient
31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** indices in joins.
31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_OpenAutoindex:
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_OpenEphemeral: {
31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCx;
31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int vfsFlags =
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_OPEN_READWRITE |
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_OPEN_CREATE |
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_OPEN_EXCLUSIVE |
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_OPEN_DELETEONCLOSE |
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SQLITE_OPEN_TRANSIENT_DB;
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 );
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1);
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCx==0 ) goto no_mem;
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->nullRow = 1;
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeOpen(0, db, &pCx->pBt,
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags);
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeBeginTrans(pCx->pBt, 1);
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If a transient index is required, create it by calling
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before
31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** opening it. If a transient table is required, just use the
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** automatically created table with root-page 1 (an BLOB_INTKEY table).
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p4.pKeyInfo ){
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int pgno;
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p4type==P4_KEYINFO );
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY);
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc==SQLITE_OK ){
31515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pgno==MASTER_ROOT+1 );
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1,
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                (KeyInfo*)pOp->p4.z, pCx->pCursor);
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pCx->pKeyInfo = pOp->p4.pKeyInfo;
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pCx->pKeyInfo->enc = ENC(p->db);
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCx->isTable = 0;
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor);
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCx->isTable = 1;
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED);
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->isIndex = !pCx->isTable;
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: OpenPseudo P1 P2 P3 * *
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Open a new cursor that points to a fake table that contains a single
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** row of data.  The content of that one row in the content of memory
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P2.  In other words, cursor P1 becomes an alias for the
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** MEM_Blob content contained in register P2.
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A pseudo-table created by this opcode is used to hold a single
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** row output from the sorter so that the row can be decomposed into
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** individual columns using the OP_Column opcode.  The OP_Column opcode
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is the only cursor opcode that works with a pseudo-table.
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3 is the number of fields in the records that will be stored by
31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the pseudo-table.
31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_OpenPseudo: {
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCx;
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 );
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0);
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCx==0 ) goto no_mem;
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->nullRow = 1;
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->pseudoTableReg = pOp->p2;
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->isTable = 1;
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->isIndex = 0;
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Close P1 * * * *
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Close a cursor previously opened as P1.  If P1 is not
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently open, this instruction is a no-op.
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Close: {
32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeFreeCursor(p, p->apCsr[pOp->p1]);
32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->apCsr[pOp->p1] = 0;
32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SeekGe P1 P2 P3 P4 *
32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use the value in register P3 as the key.  If cursor P1 refers
32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an SQL index, then P3 is the first in an array of P4 registers
32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that are used as an unpacked index key.
32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reposition cursor P1 so that  it points to the smallest entry that
32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is greater than or equal to the key value. If there are no records
32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** greater than or equal to the key and P2 is not zero, then jump to P2.
32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotFound, Distinct, SeekLt, SeekGt, SeekLe
32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SeekGt P1 P2 P3 P4 *
32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use the value in register P3 as a key. If cursor P1 refers
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an SQL index, then P3 is the first in an array of P4 registers
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that are used as an unpacked index key.
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reposition cursor P1 so that  it points to the smallest entry that
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is greater than the key value. If there are no records greater than
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the key and P2 is not zero, then jump to P2.
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotFound, Distinct, SeekLt, SeekGe, SeekLe
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SeekLt P1 P2 P3 P4 *
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use the value in register P3 as a key. If cursor P1 refers
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an SQL index, then P3 is the first in an array of P4 registers
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that are used as an unpacked index key.
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reposition cursor P1 so that  it points to the largest entry that
32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is less than the key value. If there are no records less than
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the key and P2 is not zero, then jump to P2.
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLe
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: SeekLe P1 P2 P3 P4 *
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If cursor P1 refers to an SQL table (B-Tree that uses integer keys),
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** use the value in register P3 as a key. If cursor P1 refers
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to an SQL index, then P3 is the first in an array of P4 registers
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that are used as an unpacked index key.
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Reposition cursor P1 so that it points to the largest entry that
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is less than or equal to the key value. If there are no records
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** less than or equal to the key and P2 is not zero, then jump to P2.
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotFound, Distinct, SeekGt, SeekGe, SeekLt
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SeekLt:         /* jump, in3 */
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SeekLe:         /* jump, in3 */
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SeekGe:         /* jump, in3 */
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_SeekGt: {       /* jump, in3 */
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int oc;
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord r;
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField;
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iKey;      /* The rowid we are to seek to */
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p2!=0 );
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pseudoTableReg==0 );
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( OP_SeekLe == OP_SeekLt+1 );
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( OP_SeekGe == OP_SeekLt+2 );
32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( OP_SeekGt == OP_SeekLt+3 );
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isOrdered );
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->pCursor!=0 ){
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    oc = pOp->opcode;
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->nullRow = 0;
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pC->isTable ){
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The input value in P3 might be of any type: integer, real, string,
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** blob, or NULL.  But it needs to be an integer before we can do
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** the seek, so covert it. */
32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIn3 = &aMem[pOp->p3];
32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      applyNumericAffinity(pIn3);
32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iKey = sqlite3VdbeIntValue(pIn3);
32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pC->rowidIsValid = 0;
32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* If the P3 value could not be converted into an integer without
32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** loss of information, then special processing is required... */
32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( (pIn3->flags & MEM_Int)==0 ){
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( (pIn3->flags & MEM_Real)==0 ){
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* If the P3 value cannot be converted into any kind of a number,
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** then the seek is not possible, so jump to P2 */
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pc = pOp->p2 - 1;
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* If we reach this point, then the P3 value must be a floating
33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** point number. */
33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( (pIn3->flags & MEM_Real)!=0 );
33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( iKey==SMALLEST_INT64 && (pIn3->r<(double)iKey || pIn3->r>0) ){
33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* The P3 value is too large in magnitude to be expressed as an
33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ** integer. */
33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          res = 1;
33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( pIn3->r<0 ){
33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( oc>=OP_SeekGe ){  assert( oc==OP_SeekGe || oc==OP_SeekGt );
33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              rc = sqlite3BtreeFirst(pC->pCursor, &res);
33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( rc!=SQLITE_OK ) goto abort_due_to_error;
33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if( oc<=OP_SeekLe ){  assert( oc==OP_SeekLt || oc==OP_SeekLe );
33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              rc = sqlite3BtreeLast(pC->pCursor, &res);
33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              if( rc!=SQLITE_OK ) goto abort_due_to_error;
33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            }
33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( res ){
33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pc = pOp->p2 - 1;
33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else if( oc==OP_SeekLt || oc==OP_SeekGe ){
33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Use the ceiling() function to convert real->int */
33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( pIn3->r > (double)iKey ) iKey++;
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Use the floor() function to convert real->int */
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( oc==OP_SeekLe || oc==OP_SeekGt );
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( pIn3->r < (double)iKey ) iKey--;
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)iKey, 0, &res);
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_OK ){
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto abort_due_to_error;
33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( res==0 ){
33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->rowidIsValid = 1;
33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->lastRowid = iKey;
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nField = pOp->p4.i;
33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p4type==P4_INT32 );
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( nField>0 );
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.pKeyInfo = pC->pKeyInfo;
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.nField = (u16)nField;
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* The next line of code computes as follows, only faster:
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   if( oc==OP_SeekGt || oc==OP_SeekLe ){
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **     r.flags = UNPACKED_INCRKEY;
33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   }else{
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **     r.flags = 0;
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      **   }
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.flags = (u16)(UNPACKED_INCRKEY * (1 & (oc - OP_SeekLt)));
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( oc!=OP_SeekGt || r.flags==UNPACKED_INCRKEY );
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( oc!=OP_SeekLe || r.flags==UNPACKED_INCRKEY );
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( oc!=OP_SeekGe || r.flags==0 );
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( oc!=OP_SeekLt || r.flags==0 );
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.aMem = &aMem[pOp->p3];
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExpandBlob(r.aMem);
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res);
33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_OK ){
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto abort_due_to_error;
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pC->rowidIsValid = 0;
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 0;
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_search_count++;
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( oc>=OP_SeekGe ){  assert( oc==OP_SeekGe || oc==OP_SeekGt );
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( res<0 || (res==0 && oc==OP_SeekGt) ){
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3BtreeNext(pC->pCursor, &res);
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc!=SQLITE_OK ) goto abort_due_to_error;
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->rowidIsValid = 0;
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = 0;
33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( oc==OP_SeekLt || oc==OP_SeekLe );
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( res>0 || (res==0 && oc==OP_SeekLt) ){
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3BtreePrevious(pC->pCursor, &res);
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc!=SQLITE_OK ) goto abort_due_to_error;
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pC->rowidIsValid = 0;
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else{
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* res might be negative because the table is empty.  Check to
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** see if this is the case.
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        res = sqlite3BtreeEof(pC->pCursor);
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->p2>0 );
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( res ){
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This happens when attempting to open the sqlite3_master table
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** for read access returns SQLITE_EMPTY. In this case always
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** take the jump (since there are no records in the table).
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Seek P1 P2 * * *
34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is an open table cursor and P2 is a rowid integer.  Arrange
34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for P1 to move so that it points to the rowid given by P2.
34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is actually a deferred seek.  Nothing actually happens until
34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the cursor is used to read a record.  That way, if no reads
34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** occur, no unnecessary I/O happens.
34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Seek: {    /* in2 */
34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pC->pCursor!=0) ){
34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable );
34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->nullRow = 0;
34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn2 = &aMem[pOp->p2];
34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->movetoTarget = sqlite3VdbeIntValue(pIn2);
34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->rowidIsValid = 0;
34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 1;
34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Found P1 P2 P3 P4 *
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4>0 then register P3 is the first of P4 registers that form an unpacked
34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** record.
34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Cursor P1 is on an index btree.  If the record identified by P3 and P4
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is a prefix of any entry in P1 then a jump is made to P2 and
34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is left pointing at the matching entry.
34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: NotFound P1 P2 P3 P4 *
34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
34525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4>0 then register P3 is the first of P4 registers that form an unpacked
34535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** record.
34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Cursor P1 is on an index btree.  If the record identified by P3 and P4
34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is not the prefix of any entry in P1 then a jump is made to P2.  If P1
34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** does contain an entry whose prefix matches the P3/P4 record then control
34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** falls through to the next instruction and P1 is left pointing at the
34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** matching entry.
34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotExists, IsUnique
34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_NotFound:       /* jump, in3 */
34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Found: {        /* jump, in3 */
34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int alreadyExists;
34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
34675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord *pIdxKey;
34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord r;
34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7];
34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_found_count++;
34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alreadyExists = 0;
34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_INT32 );
34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
34815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pC->pCursor!=0) ){
34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable==0 );
34855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p4.i>0 ){
34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.pKeyInfo = pC->pKeyInfo;
34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.nField = (u16)pOp->p4.i;
34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.aMem = pIn3;
34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.flags = UNPACKED_PREFIX_MATCH;
34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIdxKey = &r;
34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pIn3->flags & MEM_Blob );
34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( (pIn3->flags & MEM_Zero)==0 );  /* zeroblobs already expanded */
34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIdxKey = sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z,
34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        aTempRec, sizeof(aTempRec));
34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pIdxKey==0 ){
35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto no_mem;
35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIdxKey->flags |= UNPACKED_PREFIX_MATCH;
35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, pIdxKey, 0, 0, &res);
35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p4.i==0 ){
35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeDeleteUnpackedRecord(pIdxKey);
35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc!=SQLITE_OK ){
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    alreadyExists = (res==0);
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 0;
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->opcode==OP_Found ){
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( alreadyExists ) pc = pOp->p2 - 1;
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !alreadyExists ) pc = pOp->p2 - 1;
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IsUnique P1 P2 P3 P4 *
35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Cursor P1 is open on an index b-tree - that is to say, a btree which
35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** no data and where the key are records generated by OP_MakeRecord with
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the list field being the integer ROWID of the entry that the index
35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entry refers to.
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P3 register contains an integer record number. Call this record
35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number R. Register P4 is the first in a set of N contiguous registers
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that make up an unpacked index key that can be used with cursor P1.
35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value of N can be inferred from the cursor. N includes the rowid
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value appended to the end of the index record. This rowid value may
35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or may not be the same as R.
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If any of the N registers beginning with register P4 contains a NULL
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value, jump immediately to P2.
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Otherwise, this instruction checks if cursor P1 contains an entry
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** where the first (N-1) fields match but the rowid value at the end
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the index entry is not R. If there is no such entry, control jumps
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to instruction P2. Otherwise, the rowid of the conflicting index
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entry is copied to register P3 and control falls through to the next
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instruction.
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: NotFound, NotExists, Found
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IsUnique: {        /* jump, in3 */
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 ii;
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCx;
35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 nField;
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aMx;
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord r;                  /* B-Tree index search key */
35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 R;                             /* Rowid stored in register P3 */
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aMx = &aMem[pOp->p4.i];
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Assert that the values of parameters P1 and P4 are in range. */
35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_INT32 );
35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem );
35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Find the index cursor. */
35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx = p->apCsr[pOp->p1];
35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pCx->deferredMoveto==0 );
35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->seekResult = 0;
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCx->cacheStatus = CACHE_STALE;
35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pCx->pCursor;
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If any of the values are NULL, take the jump. */
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nField = pCx->pKeyInfo->nField;
35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(ii=0; ii<nField; ii++){
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( aMx[ii].flags & MEM_Null ){
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCrsr = 0;
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (aMx[nField].flags & MEM_Null)==0 );
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr!=0 ){
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Populate the index search key. */
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.pKeyInfo = pCx->pKeyInfo;
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.nField = nField + 1;
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.flags = UNPACKED_PREFIX_SEARCH;
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.aMem = aMx;
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
35905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Extract the value of R from register P3. */
35945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemIntegerify(pIn3);
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    R = pIn3->u.i;
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Search the B-Tree index. If no conflicting record is found, jump
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to P2. Otherwise, copy the rowid of the conflicting record to
35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** register P3 and fall through to the next instruction.  */
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &pCx->seekResult);
36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (r.flags & UNPACKED_PREFIX_SEARCH) || r.rowid==R ){
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pIn3->u.i = r.rowid;
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: NotExists P1 P2 P3 * *
36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Use the content of register P3 as a integer key.  If a record
36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** with that key does not exist in table of P1, then jump to P2.
36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the record does exist, then fall through.  The cursor is left
36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointing to the record if it exists.
36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The difference between this operation and NotFound is that this
36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation assumes the key is an integer and that P1 is a table whereas
36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** NotFound assumes key is a blob constructed from MakeRecord and
36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is an index.
36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Found, NotFound, IsUnique
36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_NotExists: {        /* jump, in3 */
36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u64 iKey;
36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn3->flags & MEM_Int );
36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isTable );
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pseudoTableReg==0 );
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr!=0 ){
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = 0;
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iKey = pIn3->u.i;
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res);
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->lastRowid = pIn3->u.i;
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->rowidIsValid = res==0 ?1:0;
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->nullRow = 0;
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 0;
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( res!=0 ){
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pC->rowidIsValid==0 );
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->seekResult = res;
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* This happens when an attempt to open a read cursor on the
36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** sqlite_master table returns SQLITE_EMPTY.
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->rowidIsValid==0 );
36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->seekResult = 0;
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Sequence P1 P2 * * *
36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Find the next available sequence number for cursor P1.
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write the sequence number into register P2.
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The sequence number on the cursor is incremented after this
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instruction.
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Sequence: {           /* out2-prerelease */
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->apCsr[pOp->p1]!=0 );
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = p->apCsr[pOp->p1]->seqCount++;
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: NewRowid P1 P2 P3 * *
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Get a new integer record number (a.k.a "rowid") used as the key to a table.
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The record number is not previously used as a key in the database
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table that cursor P1 points to.  The new record number is written
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** written to register P2.
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P3>0 then P3 is a register in the root frame of this VDBE that holds
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the largest previously generated record number. No new record numbers are
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** allowed to be less than this value. When this value reaches its maximum,
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a SQLITE_FULL error is generated. The P3 register is updated with the '
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** generated record number. This P3 mechanism is used to help implement the
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** AUTOINCREMENT feature.
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_NewRowid: {           /* out2-prerelease */
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 v;                 /* The new rowid */
36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;        /* Cursor of table to get the new rowid */
36955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;               /* Result of an sqlite3BtreeLast() */
36965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int cnt;               /* Counter to limit the number of searches */
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;             /* Register holding largest rowid for AUTOINCREMENT */
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pFrame;     /* Root frame of VDBE */
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v = 0;
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  res = 0;
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(pC->pCursor==0) ){
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The zero initialization above is all that is needed */
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The next rowid or record number (different terms for the same
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** thing) is obtained in a two-step algorithm.
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** First we attempt to find the largest existing rowid and add one
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to that.  But if the largest existing rowid is already the maximum
37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** positive integer, we have to fall through to the second
37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** probabilistic algorithm
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    **
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** The second algorithm is to select a rowid at random and see if
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** it already exists in the table.  If it does not exist, we have
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** succeeded.  If the random rowid does exist, we select a new one
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** and try again, up to 100 times.
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable );
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_32BIT_ROWID
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define MAX_ROWID 0x7fffffff
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Some compilers complain about constants of the form 0x7fffffffffffffff.
37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** Others complain about 0x7ffffffffffffffffLL.  The following macro seems
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** to provide the constant while making all compilers happy.
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#   define MAX_ROWID  (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff )
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pC->useRandomRowid ){
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v = sqlite3BtreeGetCachedRowid(pC->pCursor);
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( v==0 ){
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3BtreeLast(pC->pCursor, &res);
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc!=SQLITE_OK ){
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto abort_due_to_error;
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( res ){
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v = 1;   /* IMP: R-61914-48074 */
37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( sqlite3BtreeCursorIsValid(pC->pCursor) );
37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rc = sqlite3BtreeKeySize(pC->pCursor, &v);
37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( rc==SQLITE_OK );   /* Cannot fail following BtreeLast() */
37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if( v==MAX_ROWID ){
37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            pC->useRandomRowid = 1;
37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }else{
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            v++;   /* IMP: R-29538-34987 */
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pOp->p3 ){
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Assert that P3 is a valid memory cell. */
37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( pOp->p3>0 );
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( p->pFrame ){
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Assert that P3 is a valid memory cell. */
37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( pOp->p3<=pFrame->nMem );
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pMem = &pFrame->aMem[pOp->p3];
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* Assert that P3 is a valid memory cell. */
37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          assert( pOp->p3<=p->nMem );
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pMem = &aMem[pOp->p3];
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          memAboutToChange(p, pMem);
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( memIsValid(pMem) );
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        REGISTER_TRACE(pOp->p3, pMem);
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbeMemIntegerify(pMem);
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( (pMem->flags & MEM_Int)!=0 );  /* mem(P3) holds an integer */
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rc = SQLITE_FULL;   /* IMP: R-12275-61338 */
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          goto abort_due_to_error;
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( v<pMem->u.i+1 ){
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v = pMem->u.i + 1;
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pMem->u.i = v;
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3BtreeSetCachedRowid(pC->pCursor, v<MAX_ROWID ? v+1 : 0);
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pC->useRandomRowid ){
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** largest possible integer (9223372036854775807) then the database
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** engine starts picking positive candidate ROWIDs at random until
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** it finds one that is not previously used. */
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->p3==0 );  /* We cannot be in random rowid mode if this is
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ** an AUTOINCREMENT table. */
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* on the first attempt, simply do one more than previous */
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v = db->lastRowid;
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v++; /* ensure non-zero */
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cnt = 0;
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      while(   ((rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)v,
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 0, &res))==SQLITE_OK)
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            && (res==0)
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            && (++cnt<100)){
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* collision - try another random rowid */
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3_randomness(sizeof(v), &v);
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( cnt<5 ){
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          /* try "small" random rowids for the initial attempts */
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v &= 0xffffff;
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }else{
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          v &= (MAX_ROWID>>1); /* ensure doesn't go negative */
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        v++; /* ensure non-zero */
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc==SQLITE_OK && res==0 ){
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = SQLITE_FULL;   /* IMP: R-38219-53002 */
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto abort_due_to_error;
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( v>0 );  /* EV: R-40812-03570 */
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->rowidIsValid = 0;
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 0;
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = v;
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Insert P1 P2 P3 P4 P5
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write an entry into the table of cursor P1.  A new entry is
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** created if it doesn't already exist or the data for an existing
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entry is overwritten.  The data is the value MEM_Blob stored in register
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number P2. The key is stored in register P3. The key must
38335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be a MEM_Int.
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the OPFLAG_NCHANGE flag of P5 is set, then the row change count is
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** incremented (otherwise not).  If the OPFLAG_LASTROWID flag of P5 is set,
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then rowid is stored for subsequent return by the
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3_last_insert_rowid() function (otherwise it is unmodified).
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the last seek operation (OP_NotExists) was a success, then this
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation will not attempt to find the appropriate row before doing
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the insert but will instead overwrite the row that the cursor is
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** currently pointing to.  Presumably, the prior OP_NotExists opcode
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has already positioned the cursor correctly.  This is an optimization
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that boosts performance by avoiding redundant seeks.
38475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** UPDATE operation.  Otherwise (if the flag is clear) then this opcode
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is part of an INSERT operation.  The difference is only important to
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the update hook.
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Parameter P4 may point to a string containing the table-name, or
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** may be NULL. If it is not NULL, then the update-hook
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (sqlite3.xUpdateCallback) is invoked following a successful insert.
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** allocated, then ownership of P2 is transferred to the pseudo-cursor
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and register P2 becomes ephemeral.  If the cursor is changed, the
38605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value of register P2 will then change.  Make sure this does not
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cause any problems.)
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction only works on tables.  The equivalent instruction
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for indices is OP_IdxInsert.
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: InsertInt P1 P2 P3 P4 P5
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This works exactly like OP_Insert except that the key is the
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer value P3, not the value of the integer stored in register P3.
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Insert:
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_InsertInt: {
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pData;       /* MEM cell holding data for the record to be inserted */
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pKey;        /* MEM cell holding key  for the record */
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iKey;         /* The integer ROWID or key for the record to be inserted */
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;   /* Cursor to table into which insert is written */
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nZero;        /* Number of zero-bytes to append */
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seekResult;   /* Result of prior seek or 0 if no USESEEKRESULT flag */
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zDb;  /* database name - used by the update hook */
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zTbl; /* Table name - used by the opdate hook */
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int op;           /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */
38825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pData = &aMem[pOp->p2];
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
38855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( memIsValid(pData) );
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
38885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pCursor!=0 );
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pseudoTableReg==0 );
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isTable );
38915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p2, pData);
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->opcode==OP_Insert ){
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pKey = &aMem[pOp->p3];
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pKey->flags & MEM_Int );
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pKey) );
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    REGISTER_TRACE(pOp->p3, pKey);
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iKey = pKey->u.i;
38995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
39005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->opcode==OP_InsertInt );
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iKey = pOp->p3;
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = iKey;
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pData->flags & MEM_Null ){
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pData->z = 0;
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pData->n = 0;
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pData->flags & (MEM_Blob|MEM_Str) );
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0);
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pData->flags & MEM_Zero ){
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nZero = pData->u.nZero;
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nZero = 0;
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BtreeSetCachedRowid(pC->pCursor, 0);
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey,
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          pData->z, pData->n, nZero,
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          pOp->p5 & OPFLAG_APPEND, seekResult
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->rowidIsValid = 0;
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->deferredMoveto = 0;
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->cacheStatus = CACHE_STALE;
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invoke the update-hook if required. */
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zDb = db->aDb[pC->iDb].zName;
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zTbl = pOp->p4.z;
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable );
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->iDb>=0 );
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Delete P1 P2 * P4 *
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete the record at which the P1 cursor is currently pointing.
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
39435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cursor will be left pointing at either the next or the previous
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** record in the table. If it is left pointing at the next record, then
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the next Next instruction will be a no-op.  Hence it is OK to delete
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a record from within an Next loop.
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** incremented (otherwise not).
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 must not be pseudo-table.  It has to be a real table with
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** multiple rows.
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4 is not NULL, then it is the name of the table that P1 is
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** pointing to.  The update hook will be invoked, if it exists.
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P4 is not NULL then the P1 cursor must have been positioned
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** using OP_NotFound prior to invoking this opcode.
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
39595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Delete: {
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 iKey;
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iKey = 0;
39645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
39665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
39675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pCursor!=0 );  /* Only valid for real tables, no pseudotables */
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the update-hook will be invoked, set iKey to the rowid of the
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** row being deleted.
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
39725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->xUpdateCallback && pOp->p4.z ){
39735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable );
39745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->rowidIsValid );  /* lastRowid set by previous OP_NotFound */
39755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iKey = pC->lastRowid;
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The OP_Delete opcode always follows an OP_NotExists or OP_Last or
39795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OP_Column on the same table without any intervening operations that
39805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** might move or invalidate the cursor.  Hence cursor pC is always pointing
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** below is always a no-op and cannot fail.  We will run it anyhow, though,
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** to guard against future changes to the code generator.
39845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **/
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->deferredMoveto==0 );
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeCursorMoveto(pC);
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3BtreeSetCachedRowid(pC->pCursor, 0);
39905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeDelete(pC->pCursor);
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->cacheStatus = CACHE_STALE;
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invoke the update-hook if required. */
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
39955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zDb = db->aDb[pC->iDb].zName;
39965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char *zTbl = pOp->p4.z;
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, iKey);
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->iDb>=0 );
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
40015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
40025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ResetCount * * * * *
40045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The value of the change counter is copied to the database handle
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** change counter (returned by subsequent calls to sqlite3_changes()).
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Then the VMs internal change counter resets to 0.
40085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This is used by trigger programs.
40095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ResetCount: {
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeSetChanges(db, p->nChange);
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nChange = 0;
40135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RowData P1 P2 * * *
40175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write into register P2 the complete row data for cursor P1.
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is no interpretation of the data.
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is just copied onto the P2 register exactly as
40215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is found in the database file.
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the P1 cursor must be pointing to a valid row (not a NULL row)
40245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a real table, not a pseudo-table.
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
40265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RowKey P1 P2 * * *
40275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write into register P2 the complete row key for cursor P1.
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is no interpretation of the data.
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The key is copied onto the P3 register exactly as
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it is found in the database file.
40325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the P1 cursor must be pointing to a valid row (not a NULL row)
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a real table, not a pseudo-table.
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RowKey:
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RowData: {
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 n;
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 n64;
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pOut);
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Note that RowKey and RowData are really exactly the same instruction */
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isTable || pOp->opcode==OP_RowKey );
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isIndex || pOp->opcode==OP_RowData );
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->nullRow==0 );
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pseudoTableReg==0 );
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pCursor!=0 );
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( sqlite3BtreeCursorIsValid(pCrsr) );
40575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or
40595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OP_Rewind/Op_Next with no intervening instructions that might invalidate
40605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the cursor.  Hence the following sqlite3VdbeCursorMoveto() call is always
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** a no-op and can never fail.  But we leave it in place as a safety.
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->deferredMoveto==0 );
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeCursorMoveto(pC);
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->isIndex ){
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( !pC->isTable );
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeKeySize(pCrsr, &n64);
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK );    /* True because of CursorMoveto() call above */
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto too_big;
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    n = (u32)n64;
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeDataSize(pCrsr, &n);
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( rc==SQLITE_OK );    /* DataSize() cannot fail */
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto too_big;
40805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
40815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemGrow(pOut, n, 0) ){
40835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
40845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->n = n;
40865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(pOut, MEM_Blob);
40875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->isIndex ){
40885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z);
40895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
40905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z);
40915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
40925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = SQLITE_UTF8;  /* In case the blob is ever cast to text */
40935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pOut);
40945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
40955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Rowid P1 P2 * * *
40985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
40995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store in register P2 an integer which is the key of the table entry that
41005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is currently point to.
41015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
41025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 can be either an ordinary table or a virtual table.  There used to
41035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** be a separate OP_VRowid opcode for use with virtual tables, but this
41045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** one opcode now works for both table types.
41055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
41065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Rowid: {                 /* out2-prerelease */
41075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
41085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 v;
41095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
41105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sqlite3_module *pModule;
41115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->pseudoTableReg==0 );
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->nullRow ){
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags = MEM_Null;
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pC->deferredMoveto ){
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    v = pC->movetoTarget;
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( pC->pVtabCursor ){
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVtab = pC->pVtabCursor->pVtab;
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pModule = pVtab->pModule;
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pModule->xRowid );
41265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = pModule->xRowid(pC->pVtabCursor, &v);
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    importVtabErrMsg(p, pVtab);
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->pCursor!=0 );
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeCursorMoveto(pC);
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc ) goto abort_due_to_error;
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pC->rowidIsValid ){
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v = pC->lastRowid;
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeKeySize(pC->pCursor, &v);
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( rc==SQLITE_OK );  /* Always so because of CursorMoveto() above */
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = v;
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: NullRow P1 * * * *
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Move the cursor P1 to a null row.  Any OP_Column operations
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that occur while the cursor is on the null row will always
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** write a NULL.
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_NullRow: {
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->nullRow = 1;
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->rowidIsValid = 0;
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC->pCursor ){
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3BtreeClearCursor(pC->pCursor);
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Last P1 P2 * * *
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next use of the Rowid or Column or Next instruction for P1
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will refer to the last entry in the database table or index.
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the table or index is empty and P2>0, then jump immediately to P2.
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P2 is 0 or if the table or index is not empty, fall through
41705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the following instruction.
41715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
41725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Last: {        /* jump */
41735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
41745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
41755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
41765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
41785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
41795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
41805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
41815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr==0 ){
41825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = 1;
41835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
41845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeLast(pCrsr, &res);
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->nullRow = (u8)res;
41875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->deferredMoveto = 0;
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->rowidIsValid = 0;
41895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->cacheStatus = CACHE_STALE;
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p2>0 && res ){
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Sort P1 P2 * * *
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode does exactly the same thing as OP_Rewind except that
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** it increments an undocumented global variable used for testing.
42015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Sorting is accomplished by writing records into a sorting index,
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then rewinding that index and playing it back from beginning to
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** end.  We use the OP_Sort opcode instead of OP_Rewind to do the
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rewinding so that the global variable will be incremented and
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** regression tests can determine whether or not the optimizer is
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** correctly optimizing out sorts.
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Sort: {        /* jump */
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_sort_count++;
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_search_count--;
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->aCounter[SQLITE_STMTSTATUS_SORT-1]++;
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Fall through into OP_Rewind */
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Rewind P1 P2 * * *
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The next use of the Rowid or Column or Next instruction for P1
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** will refer to the first entry in the database table or index.
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the table or index is empty and P2>0, then jump immediately to P2.
42225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P2 is 0 or if the table or index is not empty, fall through
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the following instruction.
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Rewind: {        /* jump */
42265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
42275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
42315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  res = 1;
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pCrsr = pC->pCursor)!=0 ){
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeFirst(pCrsr, &res);
42365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->atFirst = res==0 ?1:0;
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->deferredMoveto = 0;
42385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->rowidIsValid = 0;
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->nullRow = (u8)res;
42425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p2>0 && pOp->p2<p->nOp );
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( res ){
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Next P1 P2 * * P5
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Advance cursor P1 so that it points to the next key/data pair in its
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table or index.  If there are no more key/value pairs then fall through
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the following instruction.  But if the cursor advance was successful,
42545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump immediately to P2.
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P1 cursor must be for a real table, not a pseudo-table.
42575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5 is positive and the jump is taken, then event counter
42595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number P5-1 in the prepared statement is incremented.
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Prev
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Prev P1 P2 * * P5
42645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Back up cursor P1 so that it points to the previous key/data pair in its
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table or index.  If there is no previous key/value pairs then fall through
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the following instruction.  But if the cursor backup was successful,
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump immediately to P2.
42695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P1 cursor must be for a real table, not a pseudo-table.
42715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5 is positive and the jump is taken, then event counter
42735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** number P5-1 in the prepared statement is incremented.
42745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Prev:          /* jump */
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Next: {        /* jump */
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_FOR_INTERRUPT;
42825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p5<=ArraySize(p->aCounter) );
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pC==0 ){
42865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;  /* See ticket #2273 */
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCrsr==0 ){
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->nullRow = 1;
42915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
42925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  res = 1;
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->deferredMoveto==0 );
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pOp->opcode==OP_Next ? sqlite3BtreeNext(pCrsr, &res) :
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              sqlite3BtreePrevious(pCrsr, &res);
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->nullRow = (u8)res;
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->cacheStatus = CACHE_STALE;
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( res==0 ){
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p5 ) p->aCounter[pOp->p5-1]++;
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_TEST
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3_search_count++;
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC->rowidIsValid = 0;
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IdxInsert P1 P2 P3 * P5
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register P2 holds a SQL index key made using the
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** MakeRecord instructions.  This opcode writes that key
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** into the index P1.  Data for the entry is nil.
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3 is a flag that provides a hint to the b-tree layer that this
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** insert is likely to be an append.
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction only works for indices.  The equivalent instruction
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for tables is OP_Insert.
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IdxInsert: {        /* in2 */
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nKey;
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zKey;
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn2->flags & MEM_Blob );
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pCrsr!=0) ){
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable==0 );
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = ExpandBlob(pIn2);
43375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_OK ){
43385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nKey = pIn2->n;
43395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      zKey = pIn2->z;
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3,
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0)
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pC->deferredMoveto==0 );
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pC->cacheStatus = CACHE_STALE;
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IdxDelete P1 P2 P3 * *
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The content of P3 registers starting at register P2 form
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an unpacked index key. This opcode removes that entry from the
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** index opened by cursor P1.
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
43565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IdxDelete: {
43575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
43605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord r;
43615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 );
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 );
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pCrsr!=0) ){
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.pKeyInfo = pC->pKeyInfo;
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.nField = (u16)pOp->p3;
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.flags = 0;
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.aMem = &aMem[pOp->p2];
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res);
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_OK && res==0 ){
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3BtreeDelete(pCrsr);
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->deferredMoveto==0 );
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pC->cacheStatus = CACHE_STALE;
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IdxRowid P1 P2 * * *
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write into register P2 an integer which is the last entry in the record at
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the end of the index key pointed to by cursor P1.  This integer should be
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the rowid of the table entry to which this index entry points.
43915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
43925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Rowid, MakeRecord.
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IdxRowid: {              /* out2-prerelease */
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCrsr;
43965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 rowid;
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCrsr = pC->pCursor;
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Null;
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pCrsr!=0) ){
44055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeCursorMoveto(pC);
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( NEVER(rc) ) goto abort_due_to_error;
44075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->deferredMoveto==0 );
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->isTable==0 );
44095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pC->nullRow ){
44105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid);
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=SQLITE_OK ){
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        goto abort_due_to_error;
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOut->u.i = rowid;
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOut->flags = MEM_Int;
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IdxGE P1 P2 P3 P4 P5
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P4 register values beginning with P3 form an unpacked index
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** key that omits the ROWID.  Compare this key value against the index
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the P1 index entry is greater than or equal to the key value
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then jump to P2.  Otherwise fall through to the next instruction.
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5 is non-zero then the key value is increased by an epsilon
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** prior to the comparison.  This make the opcode work like IdxGT except
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that if the key from register P3 is a prefix of the key in the cursor,
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the result is false whereas it would be true with IdxGT.
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IdxLT P1 P2 P3 P4 P5
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P4 register values beginning with P3 form an unpacked index
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** key that omits the ROWID.  Compare this key value against the index
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that P1 is currently pointing to, ignoring the ROWID on the P1 index.
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the P1 index entry is less than the key value then jump to P2.
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Otherwise fall through to the next instruction.
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5 is non-zero then the key value is increased by an epsilon prior
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the comparison.  This makes the opcode work like IdxLE.
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IdxLT:          /* jump */
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IdxGE: {        /* jump */
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pC;
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UnpackedRecord r;
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pC = p->apCsr[pOp->p1];
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC!=0 );
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pC->isOrdered );
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pC->pCursor!=0) ){
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pC->deferredMoveto==0 );
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->p5==0 || pOp->p5==1 );
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp->p4type==P4_INT32 );
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.pKeyInfo = pC->pKeyInfo;
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.nField = (u16)pOp->p4.i;
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p5 ){
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.flags = UNPACKED_INCRKEY | UNPACKED_IGNORE_ROWID;
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      r.flags = UNPACKED_IGNORE_ROWID;
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    r.aMem = &aMem[pOp->p3];
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); }
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3VdbeIdxKeyCompare(pC, &r, &res);
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->opcode==OP_IdxLT ){
44745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      res = -res;
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( pOp->opcode==OP_IdxGE );
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      res++;
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( res>0 ){
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1 ;
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Destroy P1 P2 P3 * *
44875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete an entire database table or index whose root page in the database
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file is given by P1.
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The table being destroyed is in the main database file if P3==0.  If
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3==1 then the table to be clear is in the auxiliary database file
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is used to store tables create using CREATE TEMPORARY TABLE.
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If AUTOVACUUM is enabled then it is possible that another root page
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** might be moved into the newly deleted root page in order to keep all
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** root pages contiguous at the beginning of the database.  The former
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value of the root page that moved - its value before the move occurred -
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is stored in register P2.  If no page
45005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** movement was required (because the table being dropped was already
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the last one in the database) then a zero is stored in register P2.
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If AUTOVACUUM is disabled then a zero is stored in register P2.
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Clear
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Destroy: {     /* out2-prerelease */
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iMoved;
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iCnt;
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pVdbe;
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iCnt = 0;
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(pVdbe=db->pVdbe; pVdbe; pVdbe = pVdbe->pNext){
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 ){
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      iCnt++;
45165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
45195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iCnt = db->activeVdbeCnt;
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Null;
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iCnt>1 ){
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_LOCKED;
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->errorAction = OE_Abort;
45255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
45265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    iDb = pOp->p3;
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( iCnt==1 );
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (p->btreeMask & (((yDbMask)1)<<iDb))!=0 );
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved);
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->flags = MEM_Int;
45315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pOut->u.i = iMoved;
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOVACUUM
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_OK && iMoved!=0 ){
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1);
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* All OP_Destroy operations occur on the same btree */
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 );
45375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      resetSchemaOnFault = iDb+1;
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
45415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
45425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Clear P1 P2 P3
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Delete all contents of the database table or index whose root page
45475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the database file is given by P1.  But, unlike Destroy, do not
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** remove the table or index from the database file.
45495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The table being clear is in the main database file if P2==0.  If
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2==1 then the table to be clear is in the auxiliary database file
45525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that is used to store tables create using CREATE TEMPORARY TABLE.
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the P3 value is non-zero, then the table referred to must be an
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** intkey table (an SQL table, not an index). In this case the row change
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** count is incremented by the number of rows in the table being cleared.
45575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P3 is greater than zero, then the value stored in register P3 is
45585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** also incremented by the number of rows in the table being cleared.
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: Destroy
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Clear: {
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChange;
45645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nChange = 0;
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p2))!=0 );
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeClearTable(
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &nChange : 0)
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
45705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p3 ){
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->nChange += nChange;
45725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pOp->p3>0 ){
45735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( memIsValid(&aMem[pOp->p3]) );
45745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memAboutToChange(p, &aMem[pOp->p3]);
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      aMem[pOp->p3].u.i += nChange;
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: CreateTable P1 P2 * * *
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a new table in the main database file if P1==0 or in the
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** auxiliary database file if P1==1 or in an attached database if
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1>1.  Write the root page number of the new table into
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P2
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The difference between a table and an index is this:  A table must
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** have a 4-byte integer key and can have arbitrary data.  An index
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** has an arbitrary key but no data.
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See also: CreateIndex
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: CreateIndex P1 P2 * * *
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Allocate a new index in the main database file if P1==0 or in the
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** auxiliary database file if P1==1 or in an attached database if
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1>1.  Write the root page number of the new table into
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P2.
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** See documentation on OP_CreateTable for additional information.
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_CreateIndex:            /* out2-prerelease */
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_CreateTable: {          /* out2-prerelease */
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pgno;
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags;
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Db *pDb;
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pgno = 0;
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDb = &db->aDb[pOp->p1];
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pDb->pBt!=0 );
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->opcode==OP_CreateTable ){
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* flags = BTREE_INTKEY; */
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags = BTREE_INTKEY;
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flags = BTREE_BLOBKEY;
46195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags);
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = pgno;
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: ParseSchema P1 * * P4 *
46265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read and parse all entries from the SQLITE_MASTER table of database P1
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that match the WHERE clause P4.
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode invokes the parser to create a new virtual machine,
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then runs the new virtual machine.  It is thus a re-entrant opcode.
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_ParseSchema: {
46345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zMaster;
46365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zSql;
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitData initData;
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Any prepared statement that invokes this opcode will hold mutexes
46405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** on every btree.  This is a prerequisite for invoking
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** sqlite3InitCallback().
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(iDb=0; iDb<db->nDb; iDb++){
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) );
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iDb = pOp->p1;
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iDb>=0 && iDb<db->nDb );
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( DbHasProperty(db, iDb, DB_SchemaLoaded) );
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Used to be a conditional */ {
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zMaster = SCHEMA_TABLE(iDb);
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initData.db = db;
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initData.iDb = pOp->p1;
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    initData.pzErrMsg = &p->zErrMsg;
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zSql = sqlite3MPrintf(db,
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid",
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       db->aDb[iDb].zName, zMaster, pOp->p4.z);
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( zSql==0 ){
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_NOMEM;
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( db->init.busy==0 );
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->init.busy = 1;
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      initData.rc = SQLITE_OK;
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( !db->mallocFailed );
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0);
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc==SQLITE_OK ) rc = initData.rc;
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, zSql);
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->init.busy = 0;
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_NOMEM ){
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_ANALYZE)
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: LoadAnalysis P1 * * * *
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Read the sqlite_stat1 table for database P1 and load the content
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of that table into the internal index hash table.  This will cause
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the analysis to be used when preparing all subsequent queries.
46855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
46865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_LoadAnalysis: {
46875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3AnalysisLoad(db, pOp->p1);
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(SQLITE_OMIT_ANALYZE) */
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: DropTable P1 * * P4 *
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the internal (in-memory) data structures that describe
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the table named P4 in database P1.  This is called after a table
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is dropped in order to keep the internal representation of the
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema consistent with what is on disk.
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_DropTable: {
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z);
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: DropIndex P1 * * P4 *
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the internal (in-memory) data structures that describe
47085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the index named P4 in database P1.  This is called after an index
47095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is dropped in order to keep the internal representation of the
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema consistent with what is on disk.
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_DropIndex: {
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z);
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: DropTrigger P1 * * P4 *
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Remove the internal (in-memory) data structures that describe
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the trigger named P4 in database P1.  This is called after a trigger
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is dropped in order to keep the internal representation of the
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** schema consistent with what is on disk.
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_DropTrigger: {
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z);
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INTEGRITY_CHECK
47315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IntegrityCk P1 P2 P3 * P5
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Do an analysis of the currently open database.  Store in
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P1 the text of an error message describing any problems.
47355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If no problems are found, store a NULL in register P1.
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The register P3 contains the maximum number of allowed errors.
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** At most reg(P3) errors will be reported.
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** In other words, the analysis stops as soon as reg(P1) errors are
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** seen.  Reg(P1) is updated with the number of errors remaining.
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The root page numbers of all tables in the database are integer
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** stored in reg(P1), reg(P1+1), reg(P1+2), ....  There are P2 tables
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** total.
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P5 is not zero, the check is done on the auxiliary database
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** file, not the main database file.
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode is used to implement the integrity_check pragma.
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IntegrityCk: {
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nRoot;      /* Number of tables to check.  (Number of root pages.) */
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *aRoot;     /* Array of rootpage numbers for tables to be checked */
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int j;          /* Loop counter */
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nErr;       /* Number of errors reported */
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;        /* Text of the error report */
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pnErr;     /* Register keeping track of errors remaining */
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nRoot = pOp->p2;
47605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( nRoot>0 );
47615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(nRoot+1) );
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( aRoot==0 ) goto no_mem;
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
47645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pnErr = &aMem[pOp->p3];
47655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pnErr->flags & MEM_Int)!=0 );
47665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 );
47675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
47685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(j=0; j<nRoot; j++){
47695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aRoot[j] = (int)sqlite3VdbeIntValue(&pIn1[j]);
47705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aRoot[j] = 0;
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p5<db->nDb );
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p5))!=0 );
47745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot,
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 (int)pnErr->u.i, &nErr);
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3DbFree(db, aRoot);
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pnErr->u.i -= nErr;
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemSetNull(pIn1);
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( nErr==0 ){
47805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( z==0 );
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else if( z==0 ){
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto no_mem;
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free);
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pIn1);
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(pIn1, encoding);
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_INTEGRITY_CHECK */
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RowSetAdd P1 P2 * * *
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Insert the integer value held by register P2 into a boolean index
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** held in register P1.
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An assertion fails if P2 is not an integer.
47985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
47995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RowSetAdd: {       /* in1, in2 */
48005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
48015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pIn2->flags & MEM_Int)!=0 );
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_RowSet)==0 ){
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetRowSet(pIn1);
48055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3RowSetInsert(pIn1->u.pRowSet, pIn2->u.i);
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RowSetRead P1 P2 P3 * *
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Extract the smallest value from boolean index P1 and put that value into
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** register P3.  Or, if boolean index P1 is initially empty, leave P3
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** unchanged and jump to instruction P2.
48165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RowSetRead: {       /* jump, in1, out3 */
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 val;
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK_FOR_INTERRUPT;
48205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_RowSet)==0
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   || sqlite3RowSetNext(pIn1->u.pRowSet, &val)==0
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The boolean index is empty */
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pIn1);
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* A value was pulled from the index */
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val);
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: RowSetTest P1 P2 P3 P4
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Register P3 is assumed to hold a 64-bit integer value. If register P1
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contains a RowSet object and that RowSet object contains
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value held in P3, jump to register P2. Otherwise, insert the
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer in P3 into the RowSet and continue on to the
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** next opcode.
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The RowSet object is optimized for the case where successive sets
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of integers, where each set contains no duplicates. Each set
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of values is identified by a unique P4 value. The first set
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** must have P4==0, the final set P4=-1.  P4 must be either -1 or
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** non-negative.  For non-negative values of P4 only the lower 4
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** bits are significant.
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This allows optimizations: (a) when P4==0 there is no need to test
48505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the rowset object for P3, as it is guaranteed not to contain it,
48515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (b) when P4==-1 there is no need to insert the value, as it will
48525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** never be tested for, and (c) when a value that is part of set X is
48535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** inserted, there is no need to search to see if the same value was
48545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** previously inserted as part of set X (only if it was previously
48555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** inserted as part of some other set).
48565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
48575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_RowSetTest: {                     /* jump, in1, in3 */
48585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iSet;
48595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int exists;
48605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn3 = &aMem[pOp->p3];
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iSet = pOp->p4.i;
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn3->flags&MEM_Int );
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If there is anything other than a rowset object in memory cell P1,
48675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** delete it now and initialize P1 with an empty rowset
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pIn1->flags & MEM_RowSet)==0 ){
48705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetRowSet(pIn1);
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (pIn1->flags & MEM_RowSet)==0 ) goto no_mem;
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_INT32 );
48755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( iSet==-1 || iSet>=0 );
48765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iSet ){
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exists = sqlite3RowSetTest(pIn1->u.pRowSet,
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               (u8)(iSet>=0 ? iSet & 0xf : 0xff),
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               pIn3->u.i);
48805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( exists ){
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( iSet>=0 ){
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i);
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRIGGER
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Program P1 P2 P3 P4 *
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute the trigger program passed as P4 (type P4_SUBPROGRAM).
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 contains the address of the memory cell that contains the first memory
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cell in an array of values used as arguments to the sub-program. P2
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** contains the address to jump to if the sub-program throws an IGNORE
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** exception using the RAISE() function. Register P3 contains the address
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of a memory cell in this (the parent) VM that is used to allocate the
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** memory required by the sub-vdbe at runtime.
49045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to the VM containing the trigger program.
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
49075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Program: {        /* jump */
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nMem;               /* Number of memory registers for sub-program */
49095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nByte;              /* Bytes of runtime space required for sub-program */
49105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pRt;               /* Register to allocate runtime space */
49115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;              /* Used to iterate through memory cells */
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pEnd;              /* Last memory cell in new array */
49135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pFrame;      /* New vdbe frame to execute in */
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SubProgram *pProgram;   /* Sub-program to execute */
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *t;                /* Token identifying trigger */
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pProgram = pOp->p4.pProgram;
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pRt = &aMem[pOp->p3];
49195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( memIsValid(pRt) );
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pProgram->nOp>0 );
49215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If the p5 flag is clear, then recursive invocation of triggers is
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** disabled for backwards compatibility (p5 is set if this sub-program
49245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is really a trigger, not a foreign key action, and the flag set
49255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** and cleared by the "PRAGMA recursive_triggers" command is clear).
49265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
49275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** It is recursive invocation of triggers, at the SQL level, that is
49285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** disabled. In some cases a single trigger may generate more than one
49295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** SubProgram (if the trigger may be executed with more than one different
49305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** ON CONFLICT algorithm). SubProgram structures associated with a
49315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** single trigger all have the same value for the SubProgram.token
49325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** variable.  */
49335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p5 ){
49345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    t = pProgram->token;
49355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pFrame=p->pFrame; pFrame && pFrame->token!=t; pFrame=pFrame->pParent);
49365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pFrame ) break;
49375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){
49405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_ERROR;
49415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion");
49425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
49435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Register pRt is used to store the memory required to save the state
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** of the current program, and the memory required at runtime to execute
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the trigger program. If this trigger has been fired before, then pRt
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is already allocated. Otherwise, it must be initialized.  */
49495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (pRt->flags&MEM_Frame)==0 ){
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* SubProgram.nMem is set to the number of memory cells used by the
49515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** program stored in SubProgram.aOp. As well as these, one memory
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** cell is required for each cursor used by the program. Set local
49535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** variable nMem (and later, VdbeFrame.nChildMem) to this value.
49545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
49555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nMem = pProgram->nMem + pProgram->nCsr;
49565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nByte = ROUND8(sizeof(VdbeFrame))
49575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              + nMem * sizeof(Mem)
49585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              + pProgram->nCsr * sizeof(VdbeCursor *);
49595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame = sqlite3DbMallocZero(db, nByte);
49605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !pFrame ){
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      goto no_mem;
49625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemRelease(pRt);
49645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pRt->flags = MEM_Frame;
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pRt->u.pFrame = pFrame;
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->v = p;
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->nChildMem = nMem;
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->nChildCsr = pProgram->nCsr;
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->pc = pc;
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->aMem = p->aMem;
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->nMem = p->nMem;
49735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->apCsr = p->apCsr;
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->nCursor = p->nCursor;
49755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->aOp = p->aOp;
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->nOp = p->nOp;
49775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame->token = pProgram->token;
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pEnd = &VdbeFrameMem(pFrame)[pFrame->nChildMem];
49805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pMem=VdbeFrameMem(pFrame); pMem!=pEnd; pMem++){
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->flags = MEM_Null;
49825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pMem->db = db;
49835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pFrame = pRt->u.pFrame;
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem );
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pProgram->nCsr==pFrame->nChildCsr );
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pc==pFrame->pc );
49895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nFrame++;
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrame->pParent = p->pFrame;
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrame->lastRowid = db->lastRowid;
49945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrame->nChange = p->nChange;
49955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nChange = 0;
49965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->pFrame = pFrame;
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->aMem = aMem = &VdbeFrameMem(pFrame)[-1];
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nMem = pFrame->nChildMem;
49995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nCursor = (u16)pFrame->nChildCsr;
50005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->apCsr = (VdbeCursor **)&aMem[p->nMem+1];
50015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->aOp = aOp = pProgram->aOp;
50025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->nOp = pProgram->nOp;
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pc = -1;
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Param P1 P2 * * *
50095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode is only ever present in sub-programs called via the
50115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** OP_Program instruction. Copy a value currently stored in a memory
50125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cell of the calling (parent) frame to cell P2 in the current frames
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** address space. This is used by trigger programs to access the new.*
50145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and old.* values.
50155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The address of the cell in the parent frame is determined by adding
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the value of the P1 argument to the value of the P1 argument to the
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** calling OP_Program instruction.
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Param: {           /* out2-prerelease */
50215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pFrame;
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pIn;
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pFrame = p->pFrame;
50245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1];
50255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem);
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
50275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* #ifndef SQLITE_OMIT_TRIGGER */
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: FkCounter P1 P2 * * *
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Increment a "constraint counter" by P2 (P2 may be negative or positive).
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P1 is non-zero, the database constraint counter is incremented
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (deferred foreign key constraints). Otherwise, if P1 is zero, the
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** statement counter is incremented (immediate foreign key constraints).
50385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_FkCounter: {
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p1 ){
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db->nDeferredCons += pOp->p2;
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
50435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->nFkConstraint += pOp->p2;
50445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: FkIfZero P1 P2 * * *
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode tests if a foreign key constraint-counter is currently zero.
50515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If so, jump to instruction P2. Otherwise, fall through to the next
50525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instruction.
50535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P1 is non-zero, then the jump is taken if the database constraint-counter
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is zero (the one that counts deferred constraint violations). If P1 is
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** zero, the jump is taken if the statement constraint-counter is zero
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (immediate foreign key constraint violations).
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_FkIfZero: {         /* jump */
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p1 ){
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->nDeferredCons==0 ) pc = pOp->p2-1;
50625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
50635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->nFkConstraint==0 ) pc = pOp->p2-1;
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* #ifndef SQLITE_OMIT_FOREIGN_KEY */
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_AUTOINCREMENT
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: MemMax P1 P2 * * *
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is a register in the root frame of this VM (the root frame is
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** different from the current frame if this instruction is being executed
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within a sub-program). Set the value of register P1 to the maximum of
50755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** its current value and the value in register P2.
50765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
50775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This instruction throws an error if the memory cell is not initially
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** an integer.
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
50805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_MemMax: {        /* in2 */
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pIn1;
50825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pFrame;
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( p->pFrame ){
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1 = &pFrame->aMem[pOp->p1];
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
50875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1 = &aMem[pOp->p1];
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( memIsValid(pIn1) );
50905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemIntegerify(pIn1);
50915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn2 = &aMem[pOp->p2];
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemIntegerify(pIn2);
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->u.i<pIn2->u.i){
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pIn1->u.i = pIn2->u.i;
50955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
50975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_AUTOINCREMENT */
50995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IfPos P1 P2 * * *
51015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value of register P1 is 1 or greater, jump to P2.
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is illegal to use this instruction on a register that does
51055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not contain an integer.  An assertion fault will result if you try.
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IfPos: {        /* jump, in1 */
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1->flags&MEM_Int );
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->u.i>0 ){
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     pc = pOp->p2 - 1;
51125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IfNeg P1 P2 * * *
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the value of register P1 is less than zero, jump to P2.
51195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is illegal to use this instruction on a register that does
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not contain an integer.  An assertion fault will result if you try.
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IfNeg: {        /* jump, in1 */
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1->flags&MEM_Int );
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->u.i<0 ){
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     pc = pOp->p2 - 1;
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IfZero P1 P2 P3 * *
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The register P1 must contain an integer.  Add literal P3 to the
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** value in register P1.  If the result is exactly 0, jump to P2.
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** It is illegal to use this instruction on a register that does
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** not contain an integer.  An assertion fault will result if you try.
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IfZero: {        /* jump, in1 */
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1 = &aMem[pOp->p1];
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pIn1->flags&MEM_Int );
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pIn1->u.i += pOp->p3;
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pIn1->u.i==0 ){
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     pc = pOp->p2 - 1;
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: AggStep * P2 P3 P4 P5
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute the step function for an aggregate.  The
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** function has P5 arguments.   P4 is a pointer to the FuncDef
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure that specifies the function.  Use register
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3 as the accumulator.
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
51575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The P5 arguments are taken from register P2 and its
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** successors.
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_AggStep: {
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pRec;
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context ctx;
51665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_value **apVal;
51675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  n = pOp->p5;
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( n>=0 );
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pRec = &aMem[pOp->p2];
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  apVal = p->apArg;
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( apVal || n==0 );
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0; i<n; i++, pRec++){
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( memIsValid(pRec) );
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apVal[i] = pRec;
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memAboutToChange(p, pRec);
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemStoreType(pRec);
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.pFunc = pOp->p4.pFunc;
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.pMem = pMem = &aMem[pOp->p3];
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem->n++;
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.flags = MEM_Null;
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.z = 0;
51855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.zMalloc = 0;
51865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.xDel = 0;
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.s.db = db;
51885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.isError = 0;
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ctx.pColl = 0;
51905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){
51915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp>p->aOp );
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp[-1].p4type==P4_COLLSEQ );
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pOp[-1].opcode==OP_CollSeq );
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ctx.pColl = pOp[-1].p4.pColl;
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (ctx.pFunc->xStep)(&ctx, n, apVal); /* IMP: R-24505-23230 */
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ctx.isError ){
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&ctx.s));
51995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = ctx.isError;
52005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemRelease(&ctx.s);
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: AggFinal P1 P2 * P4 *
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Execute the finalizer function for an aggregate.  P1 is
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the memory location that is the accumulator for the aggregate.
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2 is the number of arguments that the step function takes and
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to the FuncDef for this function.  The P2
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** argument is not used by this opcode.  It is only there to disambiguate
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** functions that can take varying numbers of arguments.  The
52165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 argument is only needed for the degenerate case where
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the step function was not previously called.
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_AggFinal: {
52205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>0 && pOp->p1<=p->nMem );
52225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pMem = &aMem[pOp->p1];
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 );
52245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc);
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc ){
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(pMem));
52275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(pMem, encoding);
52295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pMem);
52305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemTooBig(pMem) ){
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Checkpoint P1 P2 P3 * *
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Checkpoint database P1. This is a no-op if P1 is not currently in
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WAL mode. Parameter P2 is one of SQLITE_CHECKPOINT_PASSIVE, FULL
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** or RESTART.  Write 1 or 0 into mem[P3] if the checkpoint returns
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQLITE_BUSY or not, respectively.  Write the number of pages in the
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** WAL after the checkpoint into mem[P3+1] and the number of pages
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in the WAL that have been checkpointed after the checkpoint
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** completes into mem[P3+2].  However on an error, mem[P3+1] and
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** mem[P3+2] are initialized to -1.
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Checkpoint: {
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;                          /* Loop counter */
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int aRes[3];                    /* Results */
52515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;                      /* Write results here */
52525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aRes[0] = 0;
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aRes[1] = aRes[2] = -1;
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || pOp->p2==SQLITE_CHECKPOINT_FULL
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || pOp->p2==SQLITE_CHECKPOINT_RESTART
52585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]);
52605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_BUSY ){
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_OK;
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aRes[0] = 1;
52635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for(i=0, pMem = &aMem[pOp->p3]; i<3; i++, pMem++){
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetInt64(pMem, (i64)aRes[i]);
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
52695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_PRAGMA
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: JournalMode P1 P2 P3 * P5
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Change the journal mode of database P1 to P3. P3 must be one of the
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** PAGER_JOURNALMODE_XXX values. If changing between the various rollback
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** modes (delete, truncate, persist, off and memory), this is a simple
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** operation. No IO is required.
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If changing into or out of WAL mode the procedure is more complicated.
52805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
52815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write a string containing the final journal-mode to register P2.
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
52835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_JournalMode: {    /* out2-prerelease */
52845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;                     /* Btree to change journal mode of */
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pager *pPager;                  /* Pager associated with pBt */
52865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eNew;                       /* New journal mode */
52875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eOld;                       /* The old journal mode */
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zFilename;          /* Name of database file for pPager */
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eNew = pOp->p3;
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( eNew==PAGER_JOURNALMODE_DELETE
52925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_TRUNCATE
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_PERSIST
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_OFF
52955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_MEMORY
52965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_WAL
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || eNew==PAGER_JOURNALMODE_QUERY
52985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBt = db->aDb[pOp->p1].pBt;
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pPager = sqlite3BtreePager(pBt);
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eOld = sqlite3PagerGetJournalMode(pPager);
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eNew==PAGER_JOURNALMODE_QUERY ) eNew = eOld;
53055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !sqlite3PagerOkToChangeJournalMode(pPager) ) eNew = eOld;
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_WAL
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zFilename = sqlite3PagerFilename(pPager);
53095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Do not allow a transition to journal_mode=WAL for a database
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** in temporary storage or if the VFS does not support shared memory
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eNew==PAGER_JOURNALMODE_WAL
53145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   && (zFilename[0]==0                         /* Temp file */
53155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       || !sqlite3PagerWalSupported(pPager))   /* No shared-memory support */
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eNew = eOld;
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( (eNew!=eOld)
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   && (eOld==PAGER_JOURNALMODE_WAL || eNew==PAGER_JOURNALMODE_WAL)
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ){
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( !db->autoCommit || db->activeVdbeCnt>1 ){
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rc = SQLITE_ERROR;
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SetString(&p->zErrMsg, db,
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "cannot change %s wal mode from within a transaction",
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of")
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      );
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( eOld==PAGER_JOURNALMODE_WAL ){
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* If leaving WAL mode, close the log file. If successful, the call
53345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** to PagerCloseWal() checkpoints and deletes the write-ahead-log
53355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** file. An EXCLUSIVE lock may still be held on the database file
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** after a successful return.
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        */
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3PagerCloseWal(pPager);
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( rc==SQLITE_OK ){
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          sqlite3PagerSetJournalMode(pPager, eNew);
53415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
53425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }else if( eOld==PAGER_JOURNALMODE_MEMORY ){
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        /* Cannot transition directly from MEMORY to WAL.  Use mode OFF
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ** as an intermediate */
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3PagerSetJournalMode(pPager, PAGER_JOURNALMODE_OFF);
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      /* Open a transaction on the database file. Regardless of the journal
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ** mode, this transaction always uses a rollback journal.
53505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( sqlite3BtreeIsInTrans(pBt)==0 );
53525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc==SQLITE_OK ){
53535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rc = sqlite3BtreeSetVersion(pBt, (eNew==PAGER_JOURNALMODE_WAL ? 2 : 1));
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* ifndef SQLITE_OMIT_WAL */
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc ){
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eNew = eOld;
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eNew = sqlite3PagerSetJournalMode(pPager, eNew);
53635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut = &aMem[pOp->p2];
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->flags = MEM_Str|MEM_Static|MEM_Term;
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->z = (char *)sqlite3JournalModename(eNew);
53675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->n = sqlite3Strlen30(pOut->z);
53685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->enc = SQLITE_UTF8;
53695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(pOut, encoding);
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
53715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
53725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_PRAGMA */
53735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH)
53755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Vacuum * * * * *
53765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Vacuum the entire database.  This opcode will cause other virtual
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** machines to be created and run.  It may not be called from within
53795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a transaction.
53805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Vacuum: {
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3RunVacuum(&p->zErrMsg, db);
53835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
53865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_AUTOVACUUM)
53885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: IncrVacuum P1 P2 * * *
53895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
53905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Perform a single step of the incremental vacuum procedure on
53915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the P1 database. If the vacuum has finished, jump to instruction
53925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2. Otherwise, fall through to the next instruction.
53935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
53945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_IncrVacuum: {        /* jump */
53955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;
53965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p1>=0 && pOp->p1<db->nDb );
53985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 );
53995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBt = db->aDb[pOp->p1].pBt;
54005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3BtreeIncrVacuum(pBt);
54015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_DONE ){
54025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
54035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = SQLITE_OK;
54045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
54065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
54085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Expire P1 * * * *
54105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Cause precompiled statements to become expired. An expired statement
54125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** fails with an error code of SQLITE_SCHEMA if it is ever executed
54135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (via sqlite3_step()).
54145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P1 is 0, then all SQL statements become expired. If P1 is non-zero,
54165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** then only the currently executing statement is affected.
54175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
54185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Expire: {
54195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !pOp->p1 ){
54205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ExpirePreparedStatements(db);
54215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
54225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->expired = 1;
54235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
54255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_SHARED_CACHE
54285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: TableLock P1 P2 P3 P4 *
54295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Obtain a lock on a particular table. This instruction is only used when
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the shared-cache feature is enabled.
54325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is the index of the database in sqlite3.aDb[] of the database
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** on which the lock is acquired.  A readlock is obtained if P3==0 or
54355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a write lock if P3==1.
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P2 contains the root-page of the table to lock.
54385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 contains a pointer to the name of the table being locked. This is only
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** used to generate an error message if the lock cannot be obtained.
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_TableLock: {
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 isWriteLock = (u8)pOp->p3;
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int p1 = pOp->p1;
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( p1>=0 && p1<db->nDb );
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( (p->btreeMask & (((yDbMask)1)<<p1))!=0 );
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( isWriteLock==0 || isWriteLock==1 );
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock);
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (rc&0xFF)==SQLITE_LOCKED ){
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char *z = pOp->p4.z;
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z);
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_SHARED_CACHE */
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VBegin * * * P4 *
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 may be a pointer to an sqlite3_vtab structure. If so, call the
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xBegin method for that table.
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Also, whether or not P4 is set, check that this is not being called from
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** within a callback to a virtual table xSync() method. If it is, the error
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** code will be set to SQLITE_LOCKED.
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VBegin: {
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VTable *pVTab;
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVTab = pOp->p4.pVtab;
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VtabBegin(db, pVTab);
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pVTab ) importVtabErrMsg(p, pVTab->pVtab);
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
54775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VCreate P1 * * P4 *
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is the name of a virtual table in database P1. Call the xCreate method
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** for that table.
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VCreate: {
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VtabCallCreate(db, pOp->p1, pOp->p4.z, &p->zErrMsg);
54865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
54875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
54885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VDestroy P1 * * P4 *
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is the name of a virtual table in database P1.  Call the xDestroy method
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of that table.
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VDestroy: {
54975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->inVtabMethod = 2;
54985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z);
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->inVtabMethod = 0;
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
55035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
55055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VOpen P1 * * P4 *
55065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is a cursor number.  This opcode opens a cursor to the virtual
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** table and stores that cursor in P1.
55105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
55115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VOpen: {
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCur;
55135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab_cursor *pVtabCursor;
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
55155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_module *pModule;
55165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur = 0;
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtabCursor = 0;
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pOp->p4.pVtab->pVtab;
55205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pModule = (sqlite3_module *)pVtab->pModule;
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert(pVtab && pModule);
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pModule->xOpen(pVtab, &pVtabCursor);
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importVtabErrMsg(p, pVtab);
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( SQLITE_OK==rc ){
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Initialize sqlite3_vtab_cursor base class */
55265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pVtabCursor->pVtab = pVtab;
55275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* Initialise vdbe cursor object */
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pCur = allocateCursor(p, pOp->p1, 0, -1, 0);
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( pCur ){
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCur->pVtabCursor = pVtabCursor;
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pCur->pModule = pVtabCursor->pVtab->pModule;
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }else{
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->mallocFailed = 1;
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pModule->xClose(pVtabCursor);
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
55415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VFilter P1 P2 P3 P4 *
55445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is a cursor opened using VOpen.  P2 is an address to jump to if
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the filtered result set is empty.
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is either NULL or a string that was generated by the xBestIndex
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** method of the module.  The interpretation of the P4 string is left
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** to the module implementation.
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode invokes the xFilter method on the virtual table specified
55535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by P1.  The integer query plan parameter to xFilter is stored in register
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P3. Register P3+1 stores the argc parameter to be passed to the
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xFilter method. Registers P3+2..P3+1+argc are the argc
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** additional parameters which are passed to
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** xFilter as argv. Register P3+2 becomes argv[0] when passed to xFilter.
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A jump is made to P2 if the result set after filtering would be empty.
55605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
55615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VFilter: {   /* jump */
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nArg;
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iQuery;
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sqlite3_module *pModule;
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pQuery;
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pArgc;
55675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab_cursor *pVtabCursor;
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCur;
55705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
55725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem **apArg;
55735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pQuery = &aMem[pOp->p3];
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pArgc = &pQuery[1];
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur = p->apCsr[pOp->p1];
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( memIsValid(pQuery) );
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p3, pQuery);
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pCur->pVtabCursor );
55805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtabCursor = pCur->pVtabCursor;
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pVtabCursor->pVtab;
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pModule = pVtab->pModule;
55835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Grab the index number and argc parameters */
55855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( (pQuery->flags&MEM_Int)!=0 && pArgc->flags==MEM_Int );
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nArg = (int)pArgc->u.i;
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iQuery = (int)pQuery->u.i;
55885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invoke the xFilter method */
55905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
55915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = 0;
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apArg = p->apArg;
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i = 0; i<nArg; i++){
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      apArg[i] = &pArgc[i+1];
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemStoreType(apArg[i]);
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->inVtabMethod = 1;
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg);
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->inVtabMethod = 0;
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    importVtabErrMsg(p, pVtab);
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_OK ){
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      res = pModule->xEof(pVtabCursor);
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( res ){
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pc = pOp->p2 - 1;
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur->nullRow = 0;
56115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VColumn P1 P2 P3 * *
56185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the value of the P2-th column of
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the row of the virtual-table that the
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 cursor is pointing to into register P3.
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VColumn: {
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sqlite3_module *pModule;
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pDest;
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_context sContext;
56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCur = p->apCsr[pOp->p1];
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pCur->pVtabCursor );
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p3>0 && pOp->p3<=p->nMem );
56325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pDest = &aMem[pOp->p3];
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memAboutToChange(p, pDest);
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCur->nullRow ){
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3VdbeMemSetNull(pDest);
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pCur->pVtabCursor->pVtab;
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pModule = pVtab->pModule;
56405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pModule->xColumn );
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&sContext, 0, sizeof(sContext));
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* The output cell may already have a buffer allocated. Move
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the current contents to sContext.s so in case the user-function
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** can use the already allocated buffer instead of allocating a
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** new one.
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
56485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemMove(&sContext.s, pDest);
56495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemSetTypeFlag(&sContext.s, MEM_Null);
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2);
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importVtabErrMsg(p, pVtab);
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sContext.isError ){
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sContext.isError;
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Copy the result of the function to the P3 register. We
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** do this regardless of whether or not an error occurred to ensure any
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** dynamic allocation in sContext.s (a Mem struct) is  released.
56605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
56615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeChangeEncoding(&sContext.s, encoding);
56625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeMemMove(pDest, &sContext.s);
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p3, pDest);
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UPDATE_MAX_BLOBSIZE(pDest);
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( sqlite3VdbeMemTooBig(pDest) ){
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    goto too_big;
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VNext P1 P2 * * *
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Advance virtual table P1 to the next row in its result set and
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** jump to instruction P2.  Or, if the virtual table has reached
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the end of its result set, then fall through to the next instruction.
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VNext: {   /* jump */
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sqlite3_module *pModule;
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int res;
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor *pCur;
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  res = 0;
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pCur = p->apCsr[pOp->p1];
56885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pCur->pVtabCursor );
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pCur->nullRow ){
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    break;
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pCur->pVtabCursor->pVtab;
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pModule = pVtab->pModule;
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pModule->xNext );
56955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Invoke the xNext() method of the module. There is no way for the
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** underlying implementation to return an error if one occurs during
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** xNext(). Instead, if an error occurs, true is returned (indicating that
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** data is available) and the error code returned when xColumn or
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** some other method is next invoked on the save virtual table cursor.
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->inVtabMethod = 1;
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pModule->xNext(pCur->pVtabCursor);
57045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->inVtabMethod = 0;
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importVtabErrMsg(p, pVtab);
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    res = pModule->xEof(pCur->pVtabCursor);
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !res ){
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* If there is data, jump to P2 */
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pc = pOp->p2 - 1;
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VRename P1 * * P4 *
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode invokes the corresponding xRename method. The value
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** in register P1 is passed as the zName argument to the xRename method.
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VRename: {
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pName;
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pOp->p4.pVtab->pVtab;
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pName = &aMem[pOp->p1];
57315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pVtab->pModule->xRename );
57325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( memIsValid(pName) );
57335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  REGISTER_TRACE(pOp->p1, pName);
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pName->flags & MEM_Str );
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = pVtab->pModule->xRename(pVtab, pName->z);
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  importVtabErrMsg(p, pVtab);
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->expired = 0;
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
57425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_VIRTUALTABLE
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: VUpdate P1 P2 P3 P4 *
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P4 is a pointer to a virtual table object, an sqlite3_vtab structure.
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode invokes the corresponding xUpdate method. P2 values
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** are contiguous memory cells starting at P3 to pass to the xUpdate
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invocation. The value in register (P3+P2-1) corresponds to the
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** p2th element of the argv array passed to xUpdate.
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The xUpdate method will do a DELETE or an INSERT or both.
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The argv[0] element (which corresponds to memory cell P3)
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is the rowid of a row to delete.  If argv[0] is NULL then no
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** deletion occurs.  The argv[1] element is the rowid of the new
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** row.  This can be NULL to have the virtual table select the new
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** rowid for itself.  The subsequent elements in the array are
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the values of columns in the new row.
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If P2==1 then no insert is performed.  argv[0] is the rowid of
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a row to delete.
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** P1 is a boolean flag. If it is set to true and the xUpdate call
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is successful, then the value returned by sqlite3_last_insert_rowid()
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is set to the value of the rowid for the row just inserted.
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_VUpdate: {
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab *pVtab;
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_module *pModule;
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nArg;
57715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i;
57725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite_int64 rowid;
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem **apArg;
57745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pX;
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pVtab = pOp->p4.pVtab->pVtab;
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pModule = (sqlite3_module *)pVtab->pModule;
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nArg = pOp->p2;
57795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->p4type==P4_VTAB );
57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( ALWAYS(pModule->xUpdate) ){
57815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    apArg = p->apArg;
57825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pX = &aMem[pOp->p3];
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for(i=0; i<nArg; i++){
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( memIsValid(pX) );
57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memAboutToChange(p, pX);
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3VdbeMemStoreType(pX);
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      apArg[i] = pX;
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pX++;
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = pModule->xUpdate(pVtab, nArg, apArg, &rowid);
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    importVtabErrMsg(p, pVtab);
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( rc==SQLITE_OK && pOp->p1 ){
57935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) );
57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->lastRowid = rowid;
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
57965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    p->nChange++;
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
57995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_OMIT_VIRTUALTABLE */
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef  SQLITE_OMIT_PAGER_PRAGMAS
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Pagecount P1 P2 * * *
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Write the current number of pages in database P1 to memory cell P2.
58065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Pagecount: {            /* out2-prerelease */
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt);
58095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
58125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef  SQLITE_OMIT_PAGER_PRAGMAS
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: MaxPgcnt P1 P2 P3 * *
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Try to set the maximum page count for database P1 to the value in P3.
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Do not let the maximum page count fall below the current page count and
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** do not change the maximum page count value if P3==0.
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
58215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Store the maximum page count after the change in register P2.
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_MaxPgcnt: {            /* out2-prerelease */
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int newMax;
58255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pBt = db->aDb[pOp->p1].pBt;
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  newMax = 0;
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( pOp->p3 ){
58305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    newMax = sqlite3BtreeLastPage(pBt);
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( newMax < (unsigned)pOp->p3 ) newMax = (unsigned)pOp->p3;
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pOut->u.i = sqlite3BtreeMaxPageCount(pBt, newMax);
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Trace * * * P4 *
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If tracing is enabled (by the sqlite3_trace()) interface, then
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the UTF-8 string contained in P4 is emitted on the trace callback.
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)case OP_Trace: {
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zTrace;
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql);
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( zTrace ){
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( db->xTrace ){
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char *z = sqlite3VdbeExpandSql(p, zTrace);
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      db->xTrace(db->pTraceArg, z);
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DbFree(db, z);
58545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( (db->flags & SQLITE_SqlTrace)!=0 ){
58575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sqlite3DebugPrintf("SQL-trace: %s\n", zTrace);
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* SQLITE_DEBUG */
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Opcode: Noop * * * * *
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Do nothing.  This instruction is often useful as a jump
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** destination.
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
58715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
58725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The magic Explain opcode are only inserted when explain==2 (which
58735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is to say when the EXPLAIN QUERY PLAN syntax is used.)
58745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This opcode records information from the optimizer.  It is the
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the same as a no-op.  This opcodesnever appears in a real VM program.
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)default: {          /* This is really OP_Noop and OP_Explain */
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain );
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  break;
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*****************************************************************************
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cases of the switch statement above this line should all be indented
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** by 6 spaces.  But the left-most 6 spaces have been removed to improve the
58855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** readability.  From this point on down, the normal indentation rules are
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** restored.
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*****************************************************************************/
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef VDBE_PROFILE
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      u64 elapsed = sqlite3Hwtime() - start;
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOp->cycles += elapsed;
58945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pOp->cnt++;
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        fprintf(stdout, "%10llu ", elapsed);
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sqlite3VdbePrintOp(stdout, origPc, &aOp[origPc]);
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /* The following code adds nothing to the actual functionality
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** of the program.  It is only here for testing and debugging.
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** On the other hand, it does burn CPU cycles every time through
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ** the evaluator loop.  So we can leave it out when NDEBUG is defined.
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    */
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert( pc>=-1 && pc<p->nOp );
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if( p->trace ){
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( rc!=0 ) fprintf(p->trace,"rc=%d\n",rc);
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registerTrace(p->trace, pOp->p2, &aMem[pOp->p2]);
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if( pOp->opflags & OPFLG_OUT3 ){
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        registerTrace(p->trace, pOp->p3, &aMem[pOp->p3]);
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* SQLITE_DEBUG */
59215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* NDEBUG */
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }  /* The end of the for(;;) loop the loops through opcodes */
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* If we reach this point, it means that execution is finished with
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** an error of some kind.
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vdbe_error_halt:
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( rc );
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->rc = rc;
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testcase( sqlite3GlobalConfig.xLog!=0 );
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_log(rc, "statement aborts at %d: [%s] %s",
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   pc, p->zSql, p->zErrMsg);
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeHalt(p);
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = SQLITE_ERROR;
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( resetSchemaOnFault>0 ){
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3ResetInternalSchema(db, resetSchemaOnFault-1);
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* This is the only way out of this procedure.  We have to
59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** release the mutexes on btrees that were acquired at the
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** top. */
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vdbe_return:
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3VdbeLeave(p);
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rc;
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** is encountered.
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
59505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)too_big:
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SetString(&p->zErrMsg, db, "string or blob too big");
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = SQLITE_TOOBIG;
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_error_halt;
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Jump to here if a malloc() fails.
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)no_mem:
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db->mallocFailed = 1;
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SetString(&p->zErrMsg, db, "out of memory");
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = SQLITE_NOMEM;
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_error_halt;
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Jump to here for any other kind of fatal error.  The "rc" variable
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** should hold the error number.
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)abort_due_to_error:
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( p->zErrMsg==0 );
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( db->mallocFailed ) rc = SQLITE_NOMEM;
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=SQLITE_IOERR_NOMEM ){
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
59715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_error_halt;
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Jump to here if the sqlite3_interrupt() API sets the interrupt
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** flag.
59765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
59775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)abort_due_to_interrupt:
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  assert( db->u1.isInterrupted );
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = SQLITE_INTERRUPT;
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p->rc = rc;
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc));
59825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  goto vdbe_error_halt;
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5984