vdbeInt.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2003 September 6
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)** This is the header file for information that is private to the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** VDBE.  This information used to all be at the top of the single
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** source code file "vdbe.c".  When that file became too big (over
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 6000 lines long) it was split up into several smaller files and
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this header information was factored out.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _VDBEINT_H_
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _VDBEINT_H_
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** SQL is translated into a sequence of instructions to be
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** executed by a virtual machine.  Each instruction is an instance
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the following structure.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct VdbeOp Op;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Boolean values
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned char Bool;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A cursor is a pointer into a single BTree within a database file.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The cursor can seek to a BTree entry with a particular key, or
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** loop over all entries of the Btree.  You can also insert new BTree
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** entries or retrieve the key or data from the entry that the cursor
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is currently pointing to.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Every cursor that the virtual machine has open is represented by an
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instance of the following structure.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VdbeCursor {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BtCursor *pCursor;    /* The cursor structure of the backend */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Btree *pBt;           /* Separate file holding temporary table */
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyInfo *pKeyInfo;    /* Info about index keys needed by index cursors */
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iDb;              /* Index of cursor database in db->aDb[] (or -1) */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pseudoTableReg;   /* Register holding pseudotable content. */
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nField;           /* Number of fields in the header */
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool zeroed;          /* True if zeroed out and ready for reuse */
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool rowidIsValid;    /* True if lastRowid is valid */
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool atFirst;         /* True if pointing to first entry */
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool useRandomRowid;  /* Generate new record numbers semi-randomly */
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool nullRow;         /* True if pointing to a row with no data */
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool deferredMoveto;  /* A call to sqlite3BtreeMoveto() is needed */
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool isTable;         /* True if a table requiring integer keys */
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool isIndex;         /* True if an index containing keys only - no data */
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bool isOrdered;       /* True if the underlying table is BTREE_UNORDERED */
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_vtab_cursor *pVtabCursor;  /* The cursor for a virtual table */
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sqlite3_module *pModule;     /* Module for cursor pVtabCursor */
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 seqCount;         /* Sequence counter */
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 movetoTarget;     /* Argument to the deferred sqlite3BtreeMoveto() */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 lastRowid;        /* Last rowid from a Next or NextIdx operation */
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Result of last sqlite3BtreeMoveto() done by an OP_NotExists or
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** OP_IsUnique opcode on this cursor. */
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seekResult;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* Cached information about the header for the data record that the
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** cursor is currently pointing to.  Only valid if cacheStatus matches
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** Vdbe.cacheCtr.  Vdbe.cacheCtr will never take on the value of
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** the cache is out of date.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  **
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** aRow might point to (ephemeral) data for the current row, or it might
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ** be NULL.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 cacheStatus;      /* Cache is valid if this matches Vdbe.cacheCtr */
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int payloadSize;      /* Total number of bytes in the record */
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 *aType;           /* Type values for all entries in the record */
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 *aOffset;         /* Cached offsets to the start of each columns data */
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 *aRow;             /* Data for the current row, if all on one page */
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct VdbeCursor VdbeCursor;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** When a sub-program is executed (OP_Program), a structure of this type
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is allocated to store the current value of the program counter, as
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** well as the current memory cell array and various other frame specific
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** values stored in the Vdbe struct. When the sub-program is finished,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** these values are copied back to the Vdbe from the VdbeFrame structure,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** restoring the state of the VM to as it was before the sub-program
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** began executing.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The memory for a VdbeFrame object is allocated and managed by a memory
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** cell in the parent (calling) frame. When the memory cell is deleted or
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** overwritten, the VdbeFrame object is not freed immediately. Instead, it
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is linked into the Vdbe.pDelFrame list. The contents of the Vdbe.pDelFrame
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** list is deleted when the VM is reset in VdbeHalt(). The reason for doing
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** this instead of deleting the VdbeFrame immediately is to avoid recursive
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** calls to sqlite3VdbeMemRelease() when the memory cells belonging to the
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** child frame are released.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The currently executing frame is stored in Vdbe.pFrame. Vdbe.pFrame is
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set to NULL if the currently executing frame is the main program.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct VdbeFrame VdbeFrame;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VdbeFrame {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *v;                /* VM this frame belongs to */
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pc;                 /* Program Counter in parent (calling) frame */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Op *aOp;                /* Program instructions for parent frame */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nOp;                /* Size of aOp array */
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aMem;              /* Array of memory cells for parent frame */
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nMem;               /* Number of entries in aMem */
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor **apCsr;     /* Array of Vdbe cursors for parent frame */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 nCursor;            /* Number of entries in apCsr */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *token;            /* Copy of SubProgram.token */
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChildMem;          /* Number of memory cells for child frame */
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChildCsr;          /* Number of cursors for child frame */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 lastRowid;          /* Last insert rowid (sqlite3.lastRowid) */
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChange;            /* Statement changes (Vdbe.nChanges)     */
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pParent;     /* Parent of this frame, or NULL if parent is main */
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))])
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** A value for VdbeCursor.cacheValid that means the cache is always invalid.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CACHE_STALE 0
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Internally, the vdbe manipulates nearly all SQL values as Mem
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structures. Each Mem struct may cache multiple representations (string,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** integer etc.) of the same value.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Mem {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;        /* The associated database connection */
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *z;            /* String or BLOB value */
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double r;           /* Real value */
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    i64 i;              /* Integer value used when MEM_Int is set in flags */
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nZero;          /* Used when bit MEM_Zero is set in flags */
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FuncDef *pDef;      /* Used only when flags==MEM_Agg */
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RowSet *pRowSet;    /* Used only when flags==MEM_RowSet */
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VdbeFrame *pFrame;  /* Used when flags==MEM_Frame */
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } u;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int n;              /* Number of characters in string value, excluding '\0' */
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 flags;          /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8  type;           /* One of SQLITE_NULL, SQLITE_TEXT, SQLITE_INTEGER, etc */
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8  enc;            /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pScopyFrom;    /* This Mem is a shallow copy of pScopyFrom */
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pFiller;      /* So that sizeof(Mem) is a multiple of 8 */
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void (*xDel)(void *);  /* If not null, call this function to delete Mem.z */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zMalloc;      /* Dynamic buffer allocated by sqlite3_malloc() */
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* One or more of the following flags are set to indicate the validOK
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** representations of the value stored in the Mem struct.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the MEM_Null flag is set, then the value is an SQL NULL value.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** No other flags may be set in this case.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the MEM_Str flag is set then Mem.z points at a string representation.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Usually this is encoded in the same unicode encoding as the main
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** database (see below for exceptions). If the MEM_Term flag is also
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set, then the string is nul terminated. The MEM_Int and MEM_Real
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** flags may coexist with the MEM_Str flag.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Null      0x0001   /* Value is NULL */
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Str       0x0002   /* Value is a string */
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Int       0x0004   /* Value is an integer */
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Real      0x0008   /* Value is a real number */
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Blob      0x0010   /* Value is a BLOB */
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_RowSet    0x0020   /* Value is a RowSet object */
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Frame     0x0040   /* Value is a VdbeFrame object */
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Invalid   0x0080   /* Value is undefined */
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_TypeMask  0x00ff   /* Mask of type bits */
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Whenever Mem contains a valid string or blob representation, one of
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** the following flags must be set to determine the memory management
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** policy for Mem.z.  The MEM_Term flag tells us whether or not the
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** string is \000 or \u0000 terminated
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Term      0x0200   /* String rep is nul terminated */
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Dyn       0x0400   /* Need to call sqliteFree() on Mem.z */
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Static    0x0800   /* Mem.z points to a static string */
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Ephem     0x1000   /* Mem.z points to an ephemeral string */
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Agg       0x2000   /* Mem.z points to an agg function context */
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEM_Zero      0x4000   /* Mem.i contains count of 0s appended to blob */
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_INCRBLOB
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #undef MEM_Zero
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define MEM_Zero 0x0000
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Clear any existing type flags from a Mem and replace them with f
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MemSetTypeFlag(p, f) \
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ((p)->flags = ((p)->flags&~(MEM_TypeMask|MEM_Zero))|f)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Return true if a memory cell is not marked as invalid.  This macro
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is for use inside assert() statements only.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define memIsValid(M)  ((M)->flags & MEM_Invalid)==0
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* A VdbeFunc is just a FuncDef (defined in sqliteInt.h) that contains
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** additional information about auxiliary information bound to arguments
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of the function.  This is used to implement the sqlite3_get_auxdata()
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** and sqlite3_set_auxdata() APIs.  The "auxdata" is some auxiliary data
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** that can be associated with a constant argument to a function.  This
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** allows functions such as "regexp" to compile their constant regular
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** expression argument once and reused the compiled code for multiple
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** invocations.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct VdbeFunc {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDef *pFunc;               /* The definition of the function */
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nAux;                     /* Number of entries allocated for apAux[] */
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct AuxData {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void *pAux;                   /* Aux data for the i-th argument */
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void (*xDelete)(void *);      /* Destructor for the aux data */
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } apAux[1];                   /* One slot for each function argument */
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The "context" argument for a installable function.  A pointer to an
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** instance of this structure is the first argument to the routines used
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** implement the SQL functions.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** There is a typedef for this structure in sqlite.h.  So all routines,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** even the public interface to SQLite, can use a pointer to this structure.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** But this file is the only place where the internal details of this
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** structure are known.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This structure is defined inside of vdbeInt.h because it uses substructures
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (Mem) which are only defined there.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct sqlite3_context {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FuncDef *pFunc;       /* Pointer to function information.  MUST BE FIRST */
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFunc *pVdbeFunc;  /* Auxilary data, if created. */
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem s;                /* The return value is stored here */
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pMem;            /* Memory cell used to store aggregate context */
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isError;          /* Error code returned by the function. */
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CollSeq *pColl;       /* Collating sequence */
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** An instance of the virtual machine.  This structure contains the complete
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** state of the virtual machine.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare()
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** is really a pointer to an instance of this structure.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The Vdbe.inVtabMethod variable is set to non-zero for the duration of
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** any virtual table method invocations made by the vdbe program. It is
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** set to 2 for xDestroy method calls and 1 for all other methods. This
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** variable is used for two purposes: to allow xDestroy methods to execute
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** "DROP TABLE" statements and to prevent some nasty side effects of
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** malloc failure when SQLite is invoked recursively by a virtual table
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** method function.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Vdbe {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 *db;            /* The database connection that owns this statement */
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Op *aOp;                /* Space to hold the virtual machine's program */
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aMem;              /* The memory locations */
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem **apArg;            /* Arguments to currently executing user function */
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aColName;          /* Column names to return */
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *pResultSet;        /* Pointer to an array of results */
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nMem;               /* Number of memory locations currently allocated */
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nOp;                /* Number of instructions in the program */
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nOpAlloc;           /* Number of slots allocated for aOp[] */
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nLabel;             /* Number of labels used */
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nLabelAlloc;        /* Number of slots allocated in aLabel[] */
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int *aLabel;            /* Space to hold the labels */
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 nResColumn;         /* Number of columns in one row of the result set */
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u16 nCursor;            /* Number of slots in apCsr[] */
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 magic;              /* Magic number for sanity checking */
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zErrMsg;          /* Error message written here */
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Vdbe *pPrev,*pNext;     /* Linked list of VDBEs with the same Vdbe.db */
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeCursor **apCsr;     /* One element of this array for each open cursor */
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mem *aVar;              /* Values for the OP_Variable opcode. */
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char **azVar;           /* Name of variables */
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ynVar nVar;             /* Number of entries in aVar[] */
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 cacheCtr;           /* VdbeCursor row cache generation counter */
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int pc;                 /* The program counter */
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;                 /* Value to return */
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 errorAction;         /* Recovery action to do in case of an error */
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 okVar;               /* True if azVar[] has been initialized */
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 explain;             /* True if EXPLAIN present on SQL command */
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 changeCntOn;         /* True to update the change-counter */
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 expired;             /* True if the VM needs to be recompiled */
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 runOnlyOnce;         /* Automatically expire on reset */
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 minWriteFileFormat;  /* Minimum file format for writable database files */
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 inVtabMethod;        /* See comments above */
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 usesStmtJournal;     /* True if uses a statement journal */
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 readOnly;            /* True for read-only statements */
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u8 isPrepareV2;         /* True if prepared with prepare_v2() */
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nChange;            /* Number of db changes made since last reset */
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  yDbMask btreeMask;      /* Bitmask of db->aDb[] entries referenced */
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  yDbMask lockMask;       /* Subset of btreeMask that requires a lock */
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iStatement;         /* Statement number (or 0 if has not opened stmt) */
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int aCounter[3];        /* Counters used by sqlite3_stmt_status() */
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_TRACE
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 startTime;          /* Time when query started - used for profiling */
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nFkConstraint;      /* Number of imm. FK constraints this VM */
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  i64 nStmtDefCons;       /* Number of def. constraints when stmt started */
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char *zSql;             /* Text of the SQL statement that generated this */
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void *pFree;            /* Free this when deleting the vdbe */
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FILE *trace;            /* Write an execution trace here, if not NULL */
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pFrame;      /* Parent frame */
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VdbeFrame *pDelFrame;   /* List of frame objects to free on VM reset */
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int nFrame;             /* Number of frames in pFrame list */
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  u32 expmask;            /* Binding to these vars invalidates VM */
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SubProgram *pProgram;   /* Linked list of all sub-programs used by VM */
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The following are allowed values for Vdbe.magic
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VDBE_MAGIC_INIT     0x26bceaa5    /* Building a VDBE program */
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VDBE_MAGIC_RUN      0xbdf20da3    /* VDBE is ready to execute */
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VDBE_MAGIC_HALT     0x519c2973    /* VDBE has completed execution */
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define VDBE_MAGIC_DEAD     0xb606c3c8    /* The VDBE has been deallocated */
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Function prototypes
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqliteVdbePopStack(Vdbe*,int);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeCursorMoveto(VdbeCursor*);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbePrintOp(FILE*, int, Op*);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u32 sqlite3VdbeSerialTypeLen(u32);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u32 sqlite3VdbeSerialType(Mem*, int);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u32 sqlite3VdbeSerialPut(unsigned char*, int, Mem*, int);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeDeleteAuxData(VdbeFunc*, int);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeIdxKeyCompare(VdbeCursor*,UnpackedRecord*,int*);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeIdxRowid(sqlite3*, BtCursor *, i64 *);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeExec(Vdbe*);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeList(Vdbe*);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeHalt(Vdbe*);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeChangeEncoding(Mem *, int);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemTooBig(Mem*);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemCopy(Mem*, const Mem*);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemShallowCopy(Mem*, const Mem*, int);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemMove(Mem*, Mem*);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemNulTerminate(Mem*);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemSetStr(Mem*, const char*, int, u8, void(*)(void*));
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetInt64(Mem*, i64);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_OMIT_FLOATING_POINT
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3VdbeMemSetDouble sqlite3VdbeMemSetInt64
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void sqlite3VdbeMemSetDouble(Mem*, double);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetNull(Mem*);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetZeroBlob(Mem*,int);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemSetRowSet(Mem*);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemMakeWriteable(Mem*);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemStringify(Mem*, int);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)i64 sqlite3VdbeIntValue(Mem*);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemIntegerify(Mem*);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double sqlite3VdbeRealValue(Mem*);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeIntegerAffinity(Mem*);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemRealify(Mem*);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemNumerify(Mem*);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemFromBtree(BtCursor*,int,int,int,Mem*);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemRelease(Mem *p);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemReleaseExternal(Mem *p);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemFinalize(Mem*, FuncDef*);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3OpcodeName(int);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeCloseStatement(Vdbe *, int);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeFrameDelete(VdbeFrame*);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeFrameRestore(VdbeFrame *);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemStoreType(Mem *pMem);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void sqlite3VdbeEnter(Vdbe*);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void sqlite3VdbeLeave(Vdbe*);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3VdbeEnter(X)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3VdbeLeave(X)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void sqlite3VdbeMemPrepareToChange(Vdbe*,Mem*);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_FOREIGN_KEY
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeCheckFk(Vdbe *, int);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define sqlite3VdbeCheckFk(p,i) 0
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemTranslate(Mem*, u8);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_DEBUG
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void sqlite3VdbePrintSql(Vdbe*);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int sqlite3VdbeMemHandleBom(Mem *pMem);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SQLITE_OMIT_INCRBLOB
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sqlite3VdbeMemExpandBlob(Mem *);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define sqlite3VdbeMemExpandBlob(x) SQLITE_OK
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* !defined(_VDBEINT_H_) */
423