|
|
@@ -338,7 +338,7 @@ extern "C" {
|
|
|
*/
|
|
|
#define SQLITE_VERSION "3.13.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3013000
|
|
|
-#define SQLITE_SOURCE_ID "2016-04-05 23:39:53 da81d7afeb0566a09a505ba5fce901e991e4a029"
|
|
|
+#define SQLITE_SOURCE_ID "2016-04-09 18:04:28 6c56b3a04778bc62ca50307ad838dd301cd91ac2"
|
|
|
|
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
|
@@ -8343,20 +8343,29 @@ SQLITE_API SQLITE_EXPERIMENTAL int SQLITE_STDCALL sqlite3_snapshot_get(
|
|
|
** CAPI3REF: Start a read transaction on an historical snapshot
|
|
|
** EXPERIMENTAL
|
|
|
**
|
|
|
-** ^The [sqlite3_snapshot_open(D,S,P)] interface attempts to move the
|
|
|
-** read transaction that is currently open on schema S of
|
|
|
-** [database connection] D so that it refers to historical [snapshot] P.
|
|
|
+** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a
|
|
|
+** read transaction for schema S of
|
|
|
+** [database connection] D such that the read transaction
|
|
|
+** refers to historical [snapshot] P, rather than the most
|
|
|
+** recent change to the database.
|
|
|
** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success
|
|
|
** or an appropriate [error code] if it fails.
|
|
|
**
|
|
|
** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be
|
|
|
-** the first operation, apart from other sqlite3_snapshot_open() calls,
|
|
|
-** following the [BEGIN] that starts a new read transaction.
|
|
|
-** ^A [snapshot] will fail to open if it has been overwritten by a
|
|
|
+** the first operation following the [BEGIN] that takes the schema S
|
|
|
+** out of [autocommit mode].
|
|
|
+** ^In other words, schema S must not currently be in
|
|
|
+** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the
|
|
|
+** database connection D must be out of [autocommit mode].
|
|
|
+** ^A [snapshot] will fail to open if it has been overwritten by a
|
|
|
** [checkpoint].
|
|
|
-** ^A [snapshot] will fail to open if the database connection D has not
|
|
|
-** previously completed at least one read operation against the database
|
|
|
-** file. (Hint: Run "[PRAGMA application_id]" against a newly opened
|
|
|
+** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the
|
|
|
+** database connection D does not know that the database file for
|
|
|
+** schema S is in [WAL mode]. A database connection might not know
|
|
|
+** that the database file is in [WAL mode] if there has been no prior
|
|
|
+** I/O on that database connection, or if the database entered [WAL mode]
|
|
|
+** after the most recent I/O on the database connection.)^
|
|
|
+** (Hint: Run "[PRAGMA application_id]" against a newly opened
|
|
|
** database connection in order to make it ready to use snapshots.)
|
|
|
**
|
|
|
** The [sqlite3_snapshot_open()] interface is only available when the
|
|
|
@@ -30612,7 +30621,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
|
|
** lock transitions in terms of the POSIX advisory shared and exclusive
|
|
|
** lock primitives (called read-locks and write-locks below, to avoid
|
|
|
** confusion with SQLite lock names). The algorithms are complicated
|
|
|
- ** slightly in order to be compatible with windows systems simultaneously
|
|
|
+ ** slightly in order to be compatible with Windows95 systems simultaneously
|
|
|
** accessing the same database file, in case that is ever required.
|
|
|
**
|
|
|
** Symbols defined in os.h indentify the 'pending byte' and the 'reserved
|
|
|
@@ -30620,8 +30629,14 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
|
|
** range', a range of 510 bytes at a well known offset.
|
|
|
**
|
|
|
** To obtain a SHARED lock, a read-lock is obtained on the 'pending
|
|
|
- ** byte'. If this is successful, a random byte from the 'shared byte
|
|
|
- ** range' is read-locked and the lock on the 'pending byte' released.
|
|
|
+ ** byte'. If this is successful, 'shared byte range' is read-locked
|
|
|
+ ** and the lock on the 'pending byte' released. (Legacy note: When
|
|
|
+ ** SQLite was first developed, Windows95 systems were still very common,
|
|
|
+ ** and Widnows95 lacks a shared-lock capability. So on Windows95, a
|
|
|
+ ** single randomly selected by from the 'shared byte range' is locked.
|
|
|
+ ** Windows95 is now pretty much extinct, but this work-around for the
|
|
|
+ ** lack of shared-locks on Windows95 lives on, for backwards
|
|
|
+ ** compatibility.)
|
|
|
**
|
|
|
** A process may only obtain a RESERVED lock after it has a SHARED lock.
|
|
|
** A RESERVED lock is implemented by grabbing a write-lock on the
|
|
|
@@ -30640,11 +30655,6 @@ static int unixLock(sqlite3_file *id, int eFileLock){
|
|
|
** range'. Since all other locks require a read-lock on one of the bytes
|
|
|
** within this range, this ensures that no other locks are held on the
|
|
|
** database.
|
|
|
- **
|
|
|
- ** The reason a single byte cannot be used instead of the 'shared byte
|
|
|
- ** range' is that some versions of windows do not support read-locks. By
|
|
|
- ** locking a random byte from a range, concurrent SHARED locks may exist
|
|
|
- ** even if the locking primitive used is always a write-lock.
|
|
|
*/
|
|
|
int rc = SQLITE_OK;
|
|
|
unixFile *pFile = (unixFile*)id;
|
|
|
@@ -65661,6 +65671,28 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
|
|
|
pPage = pCur->apPage[iCellDepth];
|
|
|
pCell = findCell(pPage, iCellIdx);
|
|
|
|
|
|
+ /* If the bPreserve flag is set to true, then the cursor position must
|
|
|
+ ** be preserved following this delete operation. If the current delete
|
|
|
+ ** will cause a b-tree rebalance, then this is done by saving the cursor
|
|
|
+ ** key and leaving the cursor in CURSOR_REQUIRESEEK state before
|
|
|
+ ** returning.
|
|
|
+ **
|
|
|
+ ** Or, if the current delete will not cause a rebalance, then the cursor
|
|
|
+ ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately
|
|
|
+ ** before or after the deleted entry. In this case set bSkipnext to true. */
|
|
|
+ if( bPreserve ){
|
|
|
+ if( !pPage->leaf
|
|
|
+ || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3)
|
|
|
+ ){
|
|
|
+ /* A b-tree rebalance will be required after deleting this entry.
|
|
|
+ ** Save the cursor key. */
|
|
|
+ rc = saveCursorKey(pCur);
|
|
|
+ if( rc ) return rc;
|
|
|
+ }else{
|
|
|
+ bSkipnext = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/* If the page containing the entry to delete is not a leaf page, move
|
|
|
** the cursor to the largest entry in the tree that is smaller than
|
|
|
** the entry being deleted. This cell will replace the cell being deleted
|
|
|
@@ -65687,28 +65719,6 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
|
|
|
invalidateIncrblobCursors(p, pCur->info.nKey, 0);
|
|
|
}
|
|
|
|
|
|
- /* If the bPreserve flag is set to true, then the cursor position must
|
|
|
- ** be preserved following this delete operation. If the current delete
|
|
|
- ** will cause a b-tree rebalance, then this is done by saving the cursor
|
|
|
- ** key and leaving the cursor in CURSOR_REQUIRESEEK state before
|
|
|
- ** returning.
|
|
|
- **
|
|
|
- ** Or, if the current delete will not cause a rebalance, then the cursor
|
|
|
- ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately
|
|
|
- ** before or after the deleted entry. In this case set bSkipnext to true. */
|
|
|
- if( bPreserve ){
|
|
|
- if( !pPage->leaf
|
|
|
- || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3)
|
|
|
- ){
|
|
|
- /* A b-tree rebalance will be required after deleting this entry.
|
|
|
- ** Save the cursor key. */
|
|
|
- rc = saveCursorKey(pCur);
|
|
|
- if( rc ) return rc;
|
|
|
- }else{
|
|
|
- bSkipnext = 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/* Make the page containing the entry to be deleted writable. Then free any
|
|
|
** overflow pages associated with the entry and finally remove the cell
|
|
|
** itself from within the page. */
|
|
|
@@ -70533,52 +70543,50 @@ static void vdbeFreeOpArray(sqlite3 *, Op *, int);
|
|
|
** Delete a P4 value if necessary.
|
|
|
*/
|
|
|
static void freeP4(sqlite3 *db, int p4type, void *p4){
|
|
|
- if( p4 ){
|
|
|
- assert( db );
|
|
|
- switch( p4type ){
|
|
|
- case P4_FUNCCTX: {
|
|
|
- freeEphemeralFunction(db, ((sqlite3_context*)p4)->pFunc);
|
|
|
- /* Fall through into the next case */
|
|
|
- }
|
|
|
- case P4_REAL:
|
|
|
- case P4_INT64:
|
|
|
- case P4_DYNAMIC:
|
|
|
- case P4_INTARRAY: {
|
|
|
- sqlite3DbFree(db, p4);
|
|
|
- break;
|
|
|
- }
|
|
|
- case P4_KEYINFO: {
|
|
|
- if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4);
|
|
|
- break;
|
|
|
- }
|
|
|
+ assert( db );
|
|
|
+ switch( p4type ){
|
|
|
+ case P4_FUNCCTX: {
|
|
|
+ freeEphemeralFunction(db, ((sqlite3_context*)p4)->pFunc);
|
|
|
+ /* Fall through into the next case */
|
|
|
+ }
|
|
|
+ case P4_REAL:
|
|
|
+ case P4_INT64:
|
|
|
+ case P4_DYNAMIC:
|
|
|
+ case P4_INTARRAY: {
|
|
|
+ sqlite3DbFree(db, p4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case P4_KEYINFO: {
|
|
|
+ if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
#ifdef SQLITE_ENABLE_CURSOR_HINTS
|
|
|
- case P4_EXPR: {
|
|
|
- sqlite3ExprDelete(db, (Expr*)p4);
|
|
|
- break;
|
|
|
- }
|
|
|
+ case P4_EXPR: {
|
|
|
+ sqlite3ExprDelete(db, (Expr*)p4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
#endif
|
|
|
- case P4_MPRINTF: {
|
|
|
- if( db->pnBytesFreed==0 ) sqlite3_free(p4);
|
|
|
- break;
|
|
|
- }
|
|
|
- case P4_FUNCDEF: {
|
|
|
- freeEphemeralFunction(db, (FuncDef*)p4);
|
|
|
- break;
|
|
|
- }
|
|
|
- case P4_MEM: {
|
|
|
- if( db->pnBytesFreed==0 ){
|
|
|
- sqlite3ValueFree((sqlite3_value*)p4);
|
|
|
- }else{
|
|
|
- Mem *p = (Mem*)p4;
|
|
|
- if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc);
|
|
|
- sqlite3DbFree(db, p);
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- case P4_VTAB : {
|
|
|
- if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4);
|
|
|
- break;
|
|
|
+ case P4_MPRINTF: {
|
|
|
+ if( db->pnBytesFreed==0 ) sqlite3_free(p4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case P4_FUNCDEF: {
|
|
|
+ freeEphemeralFunction(db, (FuncDef*)p4);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case P4_MEM: {
|
|
|
+ if( db->pnBytesFreed==0 ){
|
|
|
+ sqlite3ValueFree((sqlite3_value*)p4);
|
|
|
+ }else{
|
|
|
+ Mem *p = (Mem*)p4;
|
|
|
+ if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc);
|
|
|
+ sqlite3DbFree(db, p);
|
|
|
}
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case P4_VTAB : {
|
|
|
+ if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -79690,7 +79698,9 @@ case OP_MakeRecord: {
|
|
|
testcase( u.at.serial_type==127 );
|
|
|
testcase( u.at.serial_type==128 );
|
|
|
u.at.nHdr += u.at.serial_type<=127 ? 1 : sqlite3VarintLen(u.at.serial_type);
|
|
|
- }while( (--u.at.pRec)>=u.at.pData0 );
|
|
|
+ if( u.at.pRec==u.at.pData0 ) break;
|
|
|
+ u.at.pRec--;
|
|
|
+ }while(1);
|
|
|
|
|
|
/* EVIDENCE-OF: R-22564-11647 The header begins with a single varint
|
|
|
** which determines the total number of bytes in the header. The varint
|
|
|
@@ -87345,6 +87355,7 @@ static int memjrnlRead(
|
|
|
#endif
|
|
|
|
|
|
assert( (iAmt+iOfst)<=p->endpoint.iOffset );
|
|
|
+ assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 );
|
|
|
if( p->readpoint.iOffset!=iOfst || iOfst==0 ){
|
|
|
sqlite3_int64 iOff = 0;
|
|
|
for(pChunk=p->pFirst;
|
|
|
@@ -87355,6 +87366,7 @@ static int memjrnlRead(
|
|
|
}
|
|
|
}else{
|
|
|
pChunk = p->readpoint.pChunk;
|
|
|
+ assert( pChunk!=0 );
|
|
|
}
|
|
|
|
|
|
iChunkOffset = (int)(iOfst%p->nChunkSize);
|
|
|
@@ -87366,7 +87378,7 @@ static int memjrnlRead(
|
|
|
nRead -= iSpace;
|
|
|
iChunkOffset = 0;
|
|
|
} while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 );
|
|
|
- p->readpoint.iOffset = iOfst+iAmt;
|
|
|
+ p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0;
|
|
|
p->readpoint.pChunk = pChunk;
|
|
|
|
|
|
return SQLITE_OK;
|
|
|
@@ -124143,7 +124155,13 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
|
|
|
+ /* These registers need to be preserved in case there is an IN operator
|
|
|
+ ** loop. So we could deallocate the registers here (and potentially
|
|
|
+ ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems
|
|
|
+ ** simpler and safer to simply not reuse the registers.
|
|
|
+ **
|
|
|
+ ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2);
|
|
|
+ */
|
|
|
sqlite3ExprCachePop(pParse);
|
|
|
}else
|
|
|
#endif /* SQLITE_OMIT_VIRTUALTABLE */
|
|
|
@@ -127985,11 +128003,12 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){
|
|
|
*/
|
|
|
static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){
|
|
|
WhereInfo *pWInfo = pWC->pWInfo;
|
|
|
- int nb = 1+(pWInfo->pTabList->nSrc+7)/8;
|
|
|
+ int nb = 1+(pWInfo->pTabList->nSrc+3)/4;
|
|
|
struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab;
|
|
|
Table *pTab = pItem->pTab;
|
|
|
+ Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1;
|
|
|
sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId,
|
|
|
- p->iTab, nb, p->maskSelf, nb, p->prereq);
|
|
|
+ p->iTab, nb, p->maskSelf, nb, p->prereq & mAll);
|
|
|
sqlite3DebugPrintf(" %12s",
|
|
|
pItem->zAlias ? pItem->zAlias : pTab->zName);
|
|
|
if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){
|