| 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))
|
|
|