| Index: third_party/sqlite/amalgamation/sqlite3.c
|
| diff --git a/third_party/sqlite/amalgamation/sqlite3.c b/third_party/sqlite/amalgamation/sqlite3.c
|
| index 46a2b2c30a8a2003ba8419e948ff06816d918b0c..4335ff0a9d1294bd437941fadc9e96808689362e 100644
|
| --- a/third_party/sqlite/amalgamation/sqlite3.c
|
| +++ b/third_party/sqlite/amalgamation/sqlite3.c
|
| @@ -136711,20 +136711,24 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){
|
|
|
| /* #include <assert.h> */
|
| /* #include <ctype.h> */
|
| +/* #include <stdint.h> */
|
| /* #include <stdio.h> */
|
| /* #include <string.h> */
|
|
|
| -/* Internal SQLite things that are used:
|
| - * u32, u64, i64 types.
|
| - * Btree, Pager, and DbPage structs.
|
| - * DbPage.pData, .pPager, and .pgno
|
| - * sqlite3 struct.
|
| - * sqlite3BtreePager() and sqlite3BtreeGetPageSize()
|
| - * sqlite3BtreeGetOptimalReserve()
|
| - * sqlite3PagerGet() and sqlite3PagerUnref()
|
| - * getVarint().
|
| - */
|
| -/* #include "sqliteInt.h" */
|
| +/* #include "sqlite3.h" */
|
| +
|
| +/* Some SQLite internals use, cribbed from fts5int.h. */
|
| +#ifndef SQLITE_AMALGAMATION
|
| +typedef uint8_t u8;
|
| +typedef uint32_t u32;
|
| +typedef sqlite3_int64 i64;
|
| +typedef sqlite3_uint64 u64;
|
| +
|
| +#define ArraySize(x) (sizeof(x) / sizeof(x[0]))
|
| +#endif
|
| +
|
| +/* From recover_varint.c. */
|
| +u8 recoverGetVarint(const unsigned char *p, u64 *v);
|
|
|
| /* For debugging. */
|
| #if 0
|
| @@ -136921,7 +136925,7 @@ static int pagerCreate(sqlite3_file *pSqliteFile, u32 nPageSize,
|
| const int kExcessSpace = 128;
|
| typedef struct RecoverPage RecoverPage;
|
| struct RecoverPage {
|
| - Pgno pgno; /* Page number for this page */
|
| + u32 pgno; /* Page number for this page */
|
| void *pData; /* Page data for pgno */
|
| RecoverPager *pPager; /* The pager this page is part of */
|
| };
|
| @@ -137959,11 +137963,11 @@ static int leafCursorCellDecode(RecoverLeafCursor *pCursor){
|
| return ValidateError();
|
| }
|
|
|
| - nRead = getVarint(pCell, &nRecordBytes);
|
| + nRead = recoverGetVarint(pCell, &nRecordBytes);
|
| assert( iCellOffset+nRead<=pCursor->nPageSize );
|
| pCursor->nRecordBytes = nRecordBytes;
|
|
|
| - nRead += getVarint(pCell + nRead, &iRowid);
|
| + nRead += recoverGetVarint(pCell + nRead, &iRowid);
|
| assert( iCellOffset+nRead<=pCursor->nPageSize );
|
| pCursor->iRowid = (i64)iRowid;
|
|
|
| @@ -137989,7 +137993,7 @@ static int leafCursorCellDecode(RecoverLeafCursor *pCursor){
|
| }
|
| }
|
|
|
| - nRecordHeaderRead = getVarint(pCell + nRead, &nRecordHeaderBytes);
|
| + nRecordHeaderRead = recoverGetVarint(pCell + nRead, &nRecordHeaderBytes);
|
| assert( nRecordHeaderBytes<=nRecordBytes );
|
| pCursor->nRecordHeaderBytes = nRecordHeaderBytes;
|
|
|
| @@ -138011,8 +138015,8 @@ static int leafCursorCellDecode(RecoverLeafCursor *pCursor){
|
| nRecordHeaderBytes - nRecordHeaderRead) ){
|
| return ValidateError();
|
| }
|
| - nRecordHeaderRead += getVarint(pCursor->pRecordHeader + nRecordHeaderRead,
|
| - &iSerialType);
|
| + nRecordHeaderRead += recoverGetVarint(
|
| + pCursor->pRecordHeader + nRecordHeaderRead, &iSerialType);
|
| if( iSerialType==10 || iSerialType==11 ){
|
| return ValidateError();
|
| }
|
| @@ -138078,7 +138082,7 @@ static int leafCursorCellColInfo(RecoverLeafCursor *pCursor,
|
| /* Rather than caching the header size and how many bytes it took,
|
| * decode it every time.
|
| */
|
| - nRead = getVarint(pRecordHeader, &nRecordHeaderBytes);
|
| + nRead = recoverGetVarint(pRecordHeader, &nRecordHeaderBytes);
|
| assert( nRecordHeaderBytes==pCursor->nRecordHeaderBytes );
|
|
|
| /* Scan forward to the indicated column. Scans to _after_ column
|
| @@ -138097,7 +138101,7 @@ static int leafCursorCellColInfo(RecoverLeafCursor *pCursor,
|
| if( !checkVarint(pRecordHeader + nRead, nRecordHeaderBytes - nRead) ){
|
| return SQLITE_CORRUPT;
|
| }
|
| - nRead += getVarint(pRecordHeader + nRead, &iSerialType);
|
| + nRead += recoverGetVarint(pRecordHeader + nRead, &iSerialType);
|
| iColEndOffset += SerialTypeLength(iSerialType);
|
| nColsSkipped++;
|
| }
|
| @@ -138730,7 +138734,7 @@ static int recoverInit(
|
| /* Parse out db.table, assuming main if no dot. */
|
| zDot = strchr(argv[3], '.');
|
| if( !zDot ){
|
| - pRecover->zDb = sqlite3_strdup(db->aDb[0].zName);
|
| + pRecover->zDb = sqlite3_strdup("main");
|
| pRecover->zTable = sqlite3_strdup(argv[3]);
|
| }else if( zDot>argv[3] && zDot[1]!='\0' ){
|
| pRecover->zDb = sqlite3_strndup(argv[3], zDot - argv[3]);
|
| @@ -138782,6 +138786,210 @@ static int recoverInit(
|
| }
|
|
|
| /************** End of recover.c *********************************************/
|
| +/************** Begin file recover_varint.c **********************************/
|
| +/*
|
| +** 2016 Feb 29
|
| +**
|
| +** The author disclaims copyright to this source code. In place of
|
| +** a legal notice, here is a blessing:
|
| +**
|
| +** May you do good and not evil.
|
| +** May you find forgiveness for yourself and forgive others.
|
| +** May you share freely, never taking more than you give.
|
| +**
|
| +******************************************************************************
|
| +**
|
| +** Copy of sqlite3Fts5GetVarint() from fts3_varint.c, which in turn is copied
|
| +** from SQLite core.
|
| +*/
|
| +
|
| +/* #include <assert.h> */
|
| +/* #include "sqlite3.h" */
|
| +
|
| +/* Copied from fts3int.h. */
|
| +#ifndef SQLITE_AMALGAMATION
|
| +typedef unsigned char u8;
|
| +typedef unsigned int u32;
|
| +typedef sqlite3_uint64 u64;
|
| +#endif
|
| +
|
| +/*
|
| +** Bitmasks used by recoverGetVarint(). These precomputed constants
|
| +** are defined here rather than simply putting the constant expressions
|
| +** inline in order to work around bugs in the RVT compiler.
|
| +**
|
| +** SLOT_2_0 A mask for (0x7f<<14) | 0x7f
|
| +**
|
| +** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0
|
| +*/
|
| +#define SLOT_2_0 0x001fc07f
|
| +#define SLOT_4_2_0 0xf01fc07f
|
| +
|
| +/*
|
| +** Read a 64-bit variable-length integer from memory starting at p[0].
|
| +** Return the number of bytes read. The value is stored in *v.
|
| +*/
|
| +u8 recoverGetVarint(const unsigned char *p, u64 *v){
|
| + u32 a,b,s;
|
| +
|
| + a = *p;
|
| + /* a: p0 (unmasked) */
|
| + if (!(a&0x80))
|
| + {
|
| + *v = a;
|
| + return 1;
|
| + }
|
| +
|
| + p++;
|
| + b = *p;
|
| + /* b: p1 (unmasked) */
|
| + if (!(b&0x80))
|
| + {
|
| + a &= 0x7f;
|
| + a = a<<7;
|
| + a |= b;
|
| + *v = a;
|
| + return 2;
|
| + }
|
| +
|
| + /* Verify that constants are precomputed correctly */
|
| + assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) );
|
| + assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) );
|
| +
|
| + p++;
|
| + a = a<<14;
|
| + a |= *p;
|
| + /* a: p0<<14 | p2 (unmasked) */
|
| + if (!(a&0x80))
|
| + {
|
| + a &= SLOT_2_0;
|
| + b &= 0x7f;
|
| + b = b<<7;
|
| + a |= b;
|
| + *v = a;
|
| + return 3;
|
| + }
|
| +
|
| + /* CSE1 from below */
|
| + a &= SLOT_2_0;
|
| + p++;
|
| + b = b<<14;
|
| + b |= *p;
|
| + /* b: p1<<14 | p3 (unmasked) */
|
| + if (!(b&0x80))
|
| + {
|
| + b &= SLOT_2_0;
|
| + /* moved CSE1 up */
|
| + /* a &= (0x7f<<14)|(0x7f); */
|
| + a = a<<7;
|
| + a |= b;
|
| + *v = a;
|
| + return 4;
|
| + }
|
| +
|
| + /* a: p0<<14 | p2 (masked) */
|
| + /* b: p1<<14 | p3 (unmasked) */
|
| + /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
|
| + /* moved CSE1 up */
|
| + /* a &= (0x7f<<14)|(0x7f); */
|
| + b &= SLOT_2_0;
|
| + s = a;
|
| + /* s: p0<<14 | p2 (masked) */
|
| +
|
| + p++;
|
| + a = a<<14;
|
| + a |= *p;
|
| + /* a: p0<<28 | p2<<14 | p4 (unmasked) */
|
| + if (!(a&0x80))
|
| + {
|
| + /* we can skip these cause they were (effectively) done above in calc'ing s */
|
| + /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
|
| + /* b &= (0x7f<<14)|(0x7f); */
|
| + b = b<<7;
|
| + a |= b;
|
| + s = s>>18;
|
| + *v = ((u64)s)<<32 | a;
|
| + return 5;
|
| + }
|
| +
|
| + /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
|
| + s = s<<7;
|
| + s |= b;
|
| + /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
|
| +
|
| + p++;
|
| + b = b<<14;
|
| + b |= *p;
|
| + /* b: p1<<28 | p3<<14 | p5 (unmasked) */
|
| + if (!(b&0x80))
|
| + {
|
| + /* we can skip this cause it was (effectively) done above in calc'ing s */
|
| + /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
|
| + a &= SLOT_2_0;
|
| + a = a<<7;
|
| + a |= b;
|
| + s = s>>18;
|
| + *v = ((u64)s)<<32 | a;
|
| + return 6;
|
| + }
|
| +
|
| + p++;
|
| + a = a<<14;
|
| + a |= *p;
|
| + /* a: p2<<28 | p4<<14 | p6 (unmasked) */
|
| + if (!(a&0x80))
|
| + {
|
| + a &= SLOT_4_2_0;
|
| + b &= SLOT_2_0;
|
| + b = b<<7;
|
| + a |= b;
|
| + s = s>>11;
|
| + *v = ((u64)s)<<32 | a;
|
| + return 7;
|
| + }
|
| +
|
| + /* CSE2 from below */
|
| + a &= SLOT_2_0;
|
| + p++;
|
| + b = b<<14;
|
| + b |= *p;
|
| + /* b: p3<<28 | p5<<14 | p7 (unmasked) */
|
| + if (!(b&0x80))
|
| + {
|
| + b &= SLOT_4_2_0;
|
| + /* moved CSE2 up */
|
| + /* a &= (0x7f<<14)|(0x7f); */
|
| + a = a<<7;
|
| + a |= b;
|
| + s = s>>4;
|
| + *v = ((u64)s)<<32 | a;
|
| + return 8;
|
| + }
|
| +
|
| + p++;
|
| + a = a<<15;
|
| + a |= *p;
|
| + /* a: p4<<29 | p6<<15 | p8 (unmasked) */
|
| +
|
| + /* moved CSE2 up */
|
| + /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
|
| + b &= SLOT_2_0;
|
| + b = b<<8;
|
| + a |= b;
|
| +
|
| + s = s<<4;
|
| + b = p[-4];
|
| + b &= 0x7f;
|
| + b = b>>3;
|
| + s |= b;
|
| +
|
| + *v = ((u64)s)<<32 | a;
|
| +
|
| + return 9;
|
| +}
|
| +
|
| +
|
| +/************** End of recover_varint.c **************************************/
|
| /************** Begin file fts3.c ********************************************/
|
| /*
|
| ** 2006 Oct 10
|
|
|