Index: third_party/sqlite/src/src/btreeInt.h |
diff --git a/third_party/sqlite/src/src/btreeInt.h b/third_party/sqlite/src/src/btreeInt.h |
index 55469cff906b286083dfa71698106b096f93dea5..a28a6a297e5730d92b9dc5fde639f71d4a83e8b4 100644 |
--- a/third_party/sqlite/src/src/btreeInt.h |
+++ b/third_party/sqlite/src/src/btreeInt.h |
@@ -9,7 +9,7 @@ |
** May you share freely, never taking more than you give. |
** |
************************************************************************* |
-** This file implements a external (disk-based) database using BTrees. |
+** This file implements an external (disk-based) database using BTrees. |
** For a detailed discussion of BTrees, refer to |
** |
** Donald E. Knuth, THE ART OF COMPUTER PROGRAMMING, Volume 3: |
@@ -56,13 +56,13 @@ |
** |
** OFFSET SIZE DESCRIPTION |
** 0 16 Header string: "SQLite format 3\000" |
-** 16 2 Page size in bytes. |
+** 16 2 Page size in bytes. (1 means 65536) |
** 18 1 File format write version |
** 19 1 File format read version |
** 20 1 Bytes of unused space at the end of each page |
-** 21 1 Max embedded payload fraction |
-** 22 1 Min embedded payload fraction |
-** 23 1 Min leaf payload fraction |
+** 21 1 Max embedded payload fraction (must be 64) |
+** 22 1 Min embedded payload fraction (must be 32) |
+** 23 1 Min leaf payload fraction (must be 32) |
** 24 4 File change counter |
** 28 4 Reserved for future use |
** 32 4 First freelist page |
@@ -76,9 +76,10 @@ |
** 56 4 1=UTF-8 2=UTF16le 3=UTF16be |
** 60 4 User version |
** 64 4 Incremental vacuum mode |
-** 68 4 unused |
-** 72 4 unused |
-** 76 4 unused |
+** 68 4 Application-ID |
+** 72 20 unused |
+** 92 4 The version-valid-for number |
+** 96 4 SQLITE_VERSION_NUMBER |
** |
** All of the integer values are big-endian (most significant byte first). |
** |
@@ -134,7 +135,7 @@ |
** |
** The flags define the format of this btree page. The leaf flag means that |
** this page has no children. The zerodata flag means that this page carries |
-** only keys and no data. The intkey flag means that the key is a integer |
+** only keys and no data. The intkey flag means that the key is an integer |
** which is stored in the key size entry of the cell header rather than in |
** the payload area. |
** |
@@ -272,23 +273,26 @@ typedef struct BtLock BtLock; |
struct MemPage { |
u8 isInit; /* True if previously initialized. MUST BE FIRST! */ |
u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ |
- u8 intKey; /* True if intkey flag is set */ |
- u8 leaf; /* True if leaf flag is set */ |
- u8 hasData; /* True if this page stores data */ |
+ u8 intKey; /* True if table b-trees. False for index b-trees */ |
+ u8 intKeyLeaf; /* True if the leaf of an intKey table */ |
+ u8 noPayload; /* True if internal intKey page (thus w/o data) */ |
+ u8 leaf; /* True if a leaf page */ |
u8 hdrOffset; /* 100 for page 1. 0 otherwise */ |
u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ |
+ u8 max1bytePayload; /* min(maxLocal,127) */ |
u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ |
u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ |
u16 cellOffset; /* Index in aData of first cell pointer */ |
u16 nFree; /* Number of free bytes on the page */ |
u16 nCell; /* Number of cells on this page, local and ovfl */ |
u16 maskPage; /* Mask for page offset */ |
- struct _OvflCell { /* Cells that will not fit on aData[] */ |
- u8 *pCell; /* Pointers to the body of the overflow cell */ |
- u16 idx; /* Insert this cell before idx-th non-overflow cell */ |
- } aOvfl[5]; |
+ u16 aiOvfl[5]; /* Insert the i-th overflow cell before the aiOvfl-th |
+ ** non-overflow cell */ |
+ u8 *apOvfl[5]; /* Pointers to the body of overflow cells */ |
BtShared *pBt; /* Pointer to BtShared that this page is part of */ |
u8 *aData; /* Pointer to disk image of the page data */ |
+ u8 *aDataEnd; /* One byte past the end of usable data */ |
+ u8 *aCellIdx; /* The cell index area */ |
DbPage *pDbPage; /* Pager page handle */ |
Pgno pgno; /* Page number for this page */ |
}; |
@@ -368,7 +372,7 @@ struct Btree { |
/* |
** An instance of this object represents a single database file. |
** |
-** A single database file can be in use as the same time by two |
+** A single database file can be in use at the same time by two |
** or more database connections. When two or more connections are |
** sharing the same database file, each connection has it own |
** private Btree object for the file and each of those Btrees points |
@@ -405,17 +409,15 @@ struct BtShared { |
sqlite3 *db; /* Database connection currently using this Btree */ |
BtCursor *pCursor; /* A list of all open cursors */ |
MemPage *pPage1; /* First page of the database */ |
- u8 readOnly; /* True if the underlying file is readonly */ |
- u8 pageSizeFixed; /* True if the page size can no longer be changed */ |
- u8 secureDelete; /* True if secure_delete is enabled */ |
- u8 initiallyEmpty; /* Database is empty at start of transaction */ |
u8 openFlags; /* Flags to sqlite3BtreeOpen() */ |
#ifndef SQLITE_OMIT_AUTOVACUUM |
u8 autoVacuum; /* True if auto-vacuum is enabled */ |
u8 incrVacuum; /* True if incr-vacuum is enabled */ |
+ u8 bDoTruncate; /* True to truncate db on commit */ |
#endif |
u8 inTransaction; /* Transaction state */ |
- u8 doNotUseWAL; /* If true, do not open write-ahead-log file */ |
+ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ |
+ u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ |
u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ |
u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ |
u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ |
@@ -433,25 +435,32 @@ struct BtShared { |
BtShared *pNext; /* Next on a list of sharable BtShared structs */ |
BtLock *pLock; /* List of locks held on this shared-btree struct */ |
Btree *pWriter; /* Btree with currently open write transaction */ |
- u8 isExclusive; /* True if pWriter has an EXCLUSIVE lock on the db */ |
- u8 isPending; /* If waiting for read-locks to clear */ |
#endif |
- u8 *pTmpSpace; /* BtShared.pageSize bytes of space for tmp use */ |
+ u8 *pTmpSpace; /* Temp space sufficient to hold a single cell */ |
}; |
/* |
+** Allowed values for BtShared.btsFlags |
+*/ |
+#define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ |
+#define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ |
+#define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ |
+#define BTS_INITIALLY_EMPTY 0x0008 /* Database was empty at trans start */ |
+#define BTS_NO_WAL 0x0010 /* Do not open write-ahead-log files */ |
+#define BTS_EXCLUSIVE 0x0020 /* pWriter has an exclusive lock */ |
+#define BTS_PENDING 0x0040 /* Waiting for read-locks to clear */ |
+ |
+/* |
** An instance of the following structure is used to hold information |
** about a cell. The parseCellPtr() function fills in this structure |
** based on information extract from the raw disk page. |
*/ |
typedef struct CellInfo CellInfo; |
struct CellInfo { |
- i64 nKey; /* The key for INTKEY tables, or number of bytes in key */ |
- u8 *pCell; /* Pointer to the start of cell content */ |
- u32 nData; /* Number of bytes of data */ |
- u32 nPayload; /* Total amount of payload */ |
- u16 nHeader; /* Size of the cell content header in bytes */ |
- u16 nLocal; /* Amount of payload held locally */ |
+ i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ |
+ u8 *pPayload; /* Pointer to the start of payload */ |
+ u32 nPayload; /* Bytes of payload */ |
+ u16 nLocal; /* Amount of payload held locally, not on overflow */ |
u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */ |
u16 nSize; /* Size of the cell content on the main b-tree page */ |
}; |
@@ -474,48 +483,64 @@ struct CellInfo { |
** The entry is identified by its MemPage and the index in |
** MemPage.aCell[] of the entry. |
** |
-** A single database file can shared by two more database connections, |
+** A single database file can be shared by two more database connections, |
** but cursors cannot be shared. Each cursor is associated with a |
** particular database connection identified BtCursor.pBtree.db. |
** |
** Fields in this structure are accessed under the BtShared.mutex |
** found at self->pBt->mutex. |
+** |
+** skipNext meaning: |
+** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. |
+** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. |
+** eState==FAULT: Cursor fault with skipNext as error code. |
*/ |
struct BtCursor { |
Btree *pBtree; /* The Btree to which this cursor belongs */ |
BtShared *pBt; /* The BtShared this cursor points to */ |
BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */ |
struct KeyInfo *pKeyInfo; /* Argument passed to comparison function */ |
- Pgno pgnoRoot; /* The root page of this tree */ |
- sqlite3_int64 cachedRowid; /* Next rowid cache. 0 means not valid */ |
+ Pgno *aOverflow; /* Cache of overflow page locations */ |
CellInfo info; /* A parse of the cell we are pointing at */ |
- i64 nKey; /* Size of pKey, or last integer key */ |
- void *pKey; /* Saved key that was cursor's last known position */ |
- int skipNext; /* Prev() is noop if negative. Next() is noop if positive */ |
- u8 wrFlag; /* True if writable */ |
- u8 atLast; /* Cursor pointing to the last entry */ |
- u8 validNKey; /* True if info.nKey is valid */ |
+ i64 nKey; /* Size of pKey, or last integer key */ |
+ void *pKey; /* Saved key that was cursor last known position */ |
+ Pgno pgnoRoot; /* The root page of this tree */ |
+ int nOvflAlloc; /* Allocated size of aOverflow[] array */ |
+ int skipNext; /* Prev() is noop if negative. Next() is noop if positive. |
+ ** Error code if eState==CURSOR_FAULT */ |
+ u8 curFlags; /* zero or more BTCF_* flags defined below */ |
u8 eState; /* One of the CURSOR_XXX constants (see below) */ |
-#ifndef SQLITE_OMIT_INCRBLOB |
- Pgno *aOverflow; /* Cache of overflow page locations */ |
- u8 isIncrblobHandle; /* True if this cursor is an incr. io handle */ |
-#endif |
+ u8 hints; /* As configured by CursorSetHints() */ |
i16 iPage; /* Index of current page in apPage */ |
u16 aiIdx[BTCURSOR_MAX_DEPTH]; /* Current index in apPage[i] */ |
MemPage *apPage[BTCURSOR_MAX_DEPTH]; /* Pages from root to current page */ |
}; |
/* |
+** Legal values for BtCursor.curFlags |
+*/ |
+#define BTCF_WriteFlag 0x01 /* True if a write cursor */ |
+#define BTCF_ValidNKey 0x02 /* True if info.nKey is valid */ |
+#define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ |
+#define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ |
+#define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ |
+ |
+/* |
** Potential values for BtCursor.eState. |
** |
-** CURSOR_VALID: |
-** Cursor points to a valid entry. getPayload() etc. may be called. |
-** |
** CURSOR_INVALID: |
** Cursor does not point to a valid entry. This can happen (for example) |
** because the table is empty or because BtreeCursorFirst() has not been |
** called. |
** |
+** CURSOR_VALID: |
+** Cursor points to a valid entry. getPayload() etc. may be called. |
+** |
+** CURSOR_SKIPNEXT: |
+** Cursor is valid except that the Cursor.skipNext field is non-zero |
+** indicating that the next sqlite3BtreeNext() or sqlite3BtreePrevious() |
+** operation should be a no-op. |
+** |
** CURSOR_REQUIRESEEK: |
** The table that this cursor was opened on still exists, but has been |
** modified since the cursor was last used. The cursor position is saved |
@@ -524,16 +549,17 @@ struct BtCursor { |
** seek the cursor to the saved position. |
** |
** CURSOR_FAULT: |
-** A unrecoverable error (an I/O error or a malloc failure) has occurred |
+** An unrecoverable error (an I/O error or a malloc failure) has occurred |
** on a different connection that shares the BtShared cache with this |
** cursor. The error has left the cache in an inconsistent state. |
** Do nothing else with this cursor. Any attempt to use the cursor |
-** should return the error code stored in BtCursor.skip |
+** should return the error code stored in BtCursor.skipNext |
*/ |
#define CURSOR_INVALID 0 |
#define CURSOR_VALID 1 |
-#define CURSOR_REQUIRESEEK 2 |
-#define CURSOR_FAULT 3 |
+#define CURSOR_SKIPNEXT 2 |
+#define CURSOR_REQUIRESEEK 3 |
+#define CURSOR_FAULT 4 |
/* |
** The database page the PENDING_BYTE occupies. This page is never used. |
@@ -621,21 +647,29 @@ struct BtCursor { |
/* |
** This structure is passed around through all the sanity checking routines |
** in order to keep track of some global state information. |
+** |
+** The aRef[] array is allocated so that there is 1 bit for each page in |
+** the database. As the integrity-check proceeds, for each page used in |
+** the database the corresponding bit is set. This allows integrity-check to |
+** detect pages that are used twice and orphaned pages (both of which |
+** indicate corruption). |
*/ |
typedef struct IntegrityCk IntegrityCk; |
struct IntegrityCk { |
BtShared *pBt; /* The tree being checked out */ |
Pager *pPager; /* The associated pager. Also accessible by pBt->pPager */ |
+ u8 *aPgRef; /* 1 bit per page in the db (see above) */ |
Pgno nPage; /* Number of pages in the database */ |
- int *anRef; /* Number of times each page is referenced */ |
int mxErr; /* Stop accumulating errors when this reaches zero */ |
int nErr; /* Number of messages written to zErrMsg so far */ |
int mallocFailed; /* A memory allocation error has occurred */ |
+ const char *zPfx; /* Error message prefix */ |
+ int v1, v2; /* Values for up to two %d fields in zPfx */ |
StrAccum errMsg; /* Accumulate the error message text here */ |
}; |
/* |
-** Read or write a two- and four-byte big-endian integer values. |
+** Routines to read or write a two- and four-byte big-endian integer values. |
*/ |
#define get2byte(x) ((x)[0]<<8 | (x)[1]) |
#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v)) |