Index: third_party/sqlite/src/src/vdbeInt.h |
diff --git a/third_party/sqlite/src/src/vdbeInt.h b/third_party/sqlite/src/src/vdbeInt.h |
index bb504d64a1f282be0ee3685164139941d4df612c..d1de55eb1c61e61b9e46ec9e6a97fe8aa153e853 100644 |
--- a/third_party/sqlite/src/src/vdbeInt.h |
+++ b/third_party/sqlite/src/src/vdbeInt.h |
@@ -27,6 +27,17 @@ |
#endif |
/* |
+** VDBE_DISPLAY_P4 is true or false depending on whether or not the |
+** "explain" P4 display logic is enabled. |
+*/ |
+#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ |
+ || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) |
+# define VDBE_DISPLAY_P4 1 |
+#else |
+# define VDBE_DISPLAY_P4 0 |
+#endif |
+ |
+/* |
** SQL is translated into a sequence of instructions to be |
** executed by a virtual machine. Each instruction is an instance |
** of the following structure. |
@@ -47,42 +58,51 @@ typedef struct Explain Explain; |
/* Elements of the linked list at Vdbe.pAuxData */ |
typedef struct AuxData AuxData; |
+/* Types of VDBE cursors */ |
+#define CURTYPE_BTREE 0 |
+#define CURTYPE_SORTER 1 |
+#define CURTYPE_VTAB 2 |
+#define CURTYPE_PSEUDO 3 |
+ |
/* |
-** A cursor is a pointer into a single BTree within a database file. |
-** The cursor can seek to a BTree entry with a particular key, or |
-** loop over all entries of the Btree. You can also insert new BTree |
-** entries or retrieve the key or data from the entry that the cursor |
-** is currently pointing to. |
+** A VdbeCursor is an superclass (a wrapper) for various cursor objects: |
** |
-** Cursors can also point to virtual tables, sorters, or "pseudo-tables". |
-** A pseudo-table is a single-row table implemented by registers. |
-** |
-** Every cursor that the virtual machine has open is represented by an |
-** instance of the following structure. |
+** * A b-tree cursor |
+** - In the main database or in an ephemeral database |
+** - On either an index or a table |
+** * A sorter |
+** * A virtual table |
+** * A one-row "pseudotable" stored in a single register |
*/ |
struct VdbeCursor { |
- BtCursor *pCursor; /* The cursor structure of the backend */ |
- Btree *pBt; /* Separate file holding temporary table */ |
- KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ |
- int seekResult; /* Result of previous sqlite3BtreeMoveto() */ |
- int pseudoTableReg; /* Register holding pseudotable content. */ |
- i16 nField; /* Number of fields in the header */ |
- u16 nHdrParsed; /* Number of header fields parsed so far */ |
-#ifdef SQLITE_DEBUG |
- u8 seekOp; /* Most recent seek operation on this cursor */ |
-#endif |
+ u8 eCurType; /* One of the CURTYPE_* values above */ |
i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ |
u8 nullRow; /* True if pointing to a row with no data */ |
u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ |
+ u8 isTable; /* True for rowid tables. False for indexes */ |
+#ifdef SQLITE_DEBUG |
+ u8 seekOp; /* Most recent seek operation on this cursor */ |
+#endif |
Bool isEphemeral:1; /* True for an ephemeral table */ |
Bool useRandomRowid:1;/* Generate new record numbers semi-randomly */ |
- Bool isTable:1; /* True if a table requiring integer keys */ |
Bool isOrdered:1; /* True if the underlying table is BTREE_UNORDERED */ |
Pgno pgnoRoot; /* Root page of the open btree cursor */ |
- sqlite3_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */ |
+ i16 nField; /* Number of fields in the header */ |
+ u16 nHdrParsed; /* Number of header fields parsed so far */ |
+ union { |
+ BtCursor *pCursor; /* CURTYPE_BTREE. Btree cursor */ |
+ sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ |
+ int pseudoTableReg; /* CURTYPE_PSEUDO. Reg holding content. */ |
+ VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ |
+ } uc; |
+ Btree *pBt; /* Separate file holding temporary table */ |
+ KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ |
+ int seekResult; /* Result of previous sqlite3BtreeMoveto() */ |
i64 seqCount; /* Sequence counter */ |
i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ |
- VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */ |
+#ifdef SQLITE_ENABLE_COLUMN_USED_MASK |
+ u64 maskUsed; /* Mask of columns used by this cursor */ |
+#endif |
/* Cached information about the header for the data record that the |
** cursor is currently pointing to. Only valid if cacheStatus matches |
@@ -132,6 +152,7 @@ struct VdbeFrame { |
Vdbe *v; /* VM this frame belongs to */ |
VdbeFrame *pParent; /* Parent of this frame, or NULL if parent is main */ |
Op *aOp; /* Program instructions for parent frame */ |
+ i64 *anExec; /* Event counters from parent frame */ |
Mem *aMem; /* Array of memory cells for parent frame */ |
u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */ |
VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ |
@@ -144,7 +165,8 @@ struct VdbeFrame { |
int nOnceFlag; /* Number of entries in aOnceFlag */ |
int nChildMem; /* Number of memory cells for child frame */ |
int nChildCsr; /* Number of cursors for child frame */ |
- int nChange; /* Statement changes (Vdbe.nChanges) */ |
+ int nChange; /* Statement changes (Vdbe.nChange) */ |
+ int nDbChange; /* Value of db->nChange */ |
}; |
#define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) |
@@ -170,6 +192,7 @@ struct Mem { |
} u; |
u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ |
u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ |
+ u8 eSubtype; /* Subtype for this value */ |
int n; /* Number of characters in string value, excluding '\0' */ |
char *z; /* String or BLOB value */ |
/* ShallowCopy only needs to copy the information above */ |
@@ -184,6 +207,12 @@ struct Mem { |
#endif |
}; |
+/* |
+** Size of struct Mem not including the Mem.zMalloc member or anything that |
+** follows. |
+*/ |
+#define MEMCELLSIZE offsetof(Mem,zMalloc) |
+ |
/* One or more of the following flags are set to indicate the validOK |
** representations of the value stored in the Mem struct. |
** |
@@ -268,14 +297,16 @@ struct AuxData { |
** (Mem) which are only defined there. |
*/ |
struct sqlite3_context { |
- Mem *pOut; /* The return value is stored here */ |
- FuncDef *pFunc; /* Pointer to function information */ |
- Mem *pMem; /* Memory cell used to store aggregate context */ |
- Vdbe *pVdbe; /* The VM that owns this context */ |
- int iOp; /* Instruction number of OP_Function */ |
- int isError; /* Error code returned by the function. */ |
- u8 skipFlag; /* Skip accumulator loading if true */ |
- u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */ |
+ Mem *pOut; /* The return value is stored here */ |
+ FuncDef *pFunc; /* Pointer to function information */ |
+ Mem *pMem; /* Memory cell used to store aggregate context */ |
+ Vdbe *pVdbe; /* The VM that owns this context */ |
+ int iOp; /* Instruction number of OP_Function */ |
+ int isError; /* Error code returned by the function. */ |
+ u8 skipFlag; /* Skip accumulator loading if true */ |
+ u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */ |
+ u8 argc; /* Number of arguments */ |
+ sqlite3_value *argv[1]; /* Argument set */ |
}; |
/* |
@@ -295,20 +326,22 @@ struct Explain { |
*/ |
typedef unsigned bft; /* Bit Field Type */ |
+typedef struct ScanStatus ScanStatus; |
+struct ScanStatus { |
+ int addrExplain; /* OP_Explain for loop */ |
+ int addrLoop; /* Address of "loops" counter */ |
+ int addrVisit; /* Address of "rows visited" counter */ |
+ int iSelectID; /* The "Select-ID" for this loop */ |
+ LogEst nEst; /* Estimated output rows per loop */ |
+ char *zName; /* Name of table or index */ |
+}; |
+ |
/* |
** An instance of the virtual machine. This structure contains the complete |
** state of the virtual machine. |
** |
** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare() |
** is really a pointer to an instance of this structure. |
-** |
-** The Vdbe.inVtabMethod variable is set to non-zero for the duration of |
-** any virtual table method invocations made by the vdbe program. It is |
-** set to 2 for xDestroy method calls and 1 for all other methods. This |
-** variable is used for two purposes: to allow xDestroy methods to execute |
-** "DROP TABLE" statements and to prevent some nasty side effects of |
-** malloc failure when SQLite is invoked recursively by a virtual table |
-** method function. |
*/ |
struct Vdbe { |
sqlite3 *db; /* The database connection that owns this statement */ |
@@ -332,11 +365,13 @@ struct Vdbe { |
u32 cacheCtr; /* VdbeCursor row cache generation counter */ |
int pc; /* The program counter */ |
int rc; /* Value to return */ |
+#ifdef SQLITE_DEBUG |
+ int rcApp; /* errcode set by sqlite3_result_error_code() */ |
+#endif |
u16 nResColumn; /* Number of columns in one row of the result set */ |
u8 errorAction; /* Recovery action to do in case of an error */ |
u8 minWriteFileFormat; /* Minimum file format for writable database files */ |
bft explain:2; /* True if EXPLAIN present on SQL command */ |
- bft inVtabMethod:2; /* See comments above */ |
bft changeCntOn:1; /* True to update the change-counter */ |
bft expired:1; /* True if the VM needs to be recompiled */ |
bft runOnlyOnce:1; /* Automatically expire on reset */ |
@@ -367,6 +402,11 @@ struct Vdbe { |
int nOnceFlag; /* Size of array aOnceFlag[] */ |
u8 *aOnceFlag; /* Flags for OP_Once */ |
AuxData *pAuxData; /* Linked list of auxdata allocations */ |
+#ifdef SQLITE_ENABLE_STMT_SCANSTATUS |
+ i64 *anExec; /* Number of times each op has been executed */ |
+ int nScan; /* Entries in aScan[] */ |
+ ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */ |
+#endif |
}; |
/* |
@@ -380,6 +420,7 @@ struct Vdbe { |
/* |
** Function prototypes |
*/ |
+void sqlite3VdbeError(Vdbe*, const char *, ...); |
void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); |
void sqliteVdbePopStack(Vdbe*,int); |
int sqlite3VdbeCursorMoveto(VdbeCursor*); |
@@ -388,7 +429,8 @@ int sqlite3VdbeCursorRestore(VdbeCursor*); |
void sqlite3VdbePrintOp(FILE*, int, Op*); |
#endif |
u32 sqlite3VdbeSerialTypeLen(u32); |
-u32 sqlite3VdbeSerialType(Mem*, int); |
+u8 sqlite3VdbeOneByteSerialTypeLen(u8); |
+u32 sqlite3VdbeSerialType(Mem*, int, u32*); |
u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); |
u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); |
void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); |