mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
MFB: Upgraded bundled sqlite3 to 3.6.10
This commit is contained in:
parent
4786d297ad
commit
784801cdbd
2 changed files with 137 additions and 23 deletions
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
** This file is an amalgamation of many separate C source files from SQLite
|
** This file is an amalgamation of many separate C source files from SQLite
|
||||||
** version 3.6.8. By combining all the individual C code files into this
|
** version 3.6.10. By combining all the individual C code files into this
|
||||||
** single large file, the entire code can be compiled as a one translation
|
** single large file, the entire code can be compiled as a one translation
|
||||||
** unit. This allows many compilers to do optimizations that would not be
|
** unit. This allows many compilers to do optimizations that would not be
|
||||||
** possible if the files were compiled separately. Performance improvements
|
** possible if the files were compiled separately. Performance improvements
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
** is also in a separate file. This file contains only code for the core
|
** is also in a separate file. This file contains only code for the core
|
||||||
** SQLite library.
|
** SQLite library.
|
||||||
**
|
**
|
||||||
** This amalgamation was generated on 2009-01-12 15:45:58 UTC.
|
** This amalgamation was generated on 2009-01-15 16:03:22 UTC.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_CORE 1
|
#define SQLITE_CORE 1
|
||||||
#define SQLITE_AMALGAMATION 1
|
#define SQLITE_AMALGAMATION 1
|
||||||
|
@ -424,16 +424,22 @@
|
||||||
** where multiple cases go to the same block of code, testcase()
|
** where multiple cases go to the same block of code, testcase()
|
||||||
** can insure that all cases are evaluated.
|
** can insure that all cases are evaluated.
|
||||||
**
|
**
|
||||||
** The TESTONLY macro is used to enclose variable declarations or
|
|
||||||
** other bits of code that are needed to support the arguments
|
|
||||||
** within testcase() macros.
|
|
||||||
*/
|
*/
|
||||||
#ifdef SQLITE_COVERAGE_TEST
|
#ifdef SQLITE_COVERAGE_TEST
|
||||||
SQLITE_PRIVATE void sqlite3Coverage(int);
|
SQLITE_PRIVATE void sqlite3Coverage(int);
|
||||||
# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
|
# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); }
|
||||||
# define TESTONLY(X) X
|
|
||||||
#else
|
#else
|
||||||
# define testcase(X)
|
# define testcase(X)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The TESTONLY macro is used to enclose variable declarations or
|
||||||
|
** other bits of code that are needed to support the arguments
|
||||||
|
** within testcase() and assert() macros.
|
||||||
|
*/
|
||||||
|
#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST)
|
||||||
|
# define TESTONLY(X) X
|
||||||
|
#else
|
||||||
# define TESTONLY(X)
|
# define TESTONLY(X)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -603,8 +609,8 @@ extern "C" {
|
||||||
** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z
|
** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z
|
||||||
** are the major version, minor version, and release number.
|
** are the major version, minor version, and release number.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.6.8"
|
#define SQLITE_VERSION "3.6.10"
|
||||||
#define SQLITE_VERSION_NUMBER 3006008
|
#define SQLITE_VERSION_NUMBER 3006010
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
|
** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
|
||||||
|
@ -8976,6 +8982,7 @@ SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int);
|
||||||
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
|
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int);
|
||||||
SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
|
SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut);
|
||||||
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
|
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*);
|
||||||
|
#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0
|
||||||
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
|
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id);
|
||||||
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
|
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id);
|
||||||
|
|
||||||
|
@ -21727,6 +21734,18 @@ struct unixFile {
|
||||||
int isDelete; /* Delete on close if true */
|
int isDelete; /* Delete on close if true */
|
||||||
struct vxworksFileId *pId; /* Unique file ID */
|
struct vxworksFileId *pId; /* Unique file ID */
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/* The next group of variables are used to track whether or not the
|
||||||
|
** transaction counter in bytes 24-27 of database files are updated
|
||||||
|
** whenever any part of the database changes. An assertion fault will
|
||||||
|
** occur if a file is updated without also updating the transaction
|
||||||
|
** counter. This test is made to avoid new problems similar to the
|
||||||
|
** one described by ticket #3584.
|
||||||
|
*/
|
||||||
|
unsigned char transCntrChng; /* True if the transaction counter changed */
|
||||||
|
unsigned char dbUpdate; /* True if any part of database file changed */
|
||||||
|
unsigned char inNormalWrite; /* True if in a normal write operation */
|
||||||
|
#endif
|
||||||
#ifdef SQLITE_TEST
|
#ifdef SQLITE_TEST
|
||||||
/* In test mode, increase the size of this structure a bit so that
|
/* In test mode, increase the size of this structure a bit so that
|
||||||
** it is larger than the struct CrashFile defined in test6.c.
|
** it is larger than the struct CrashFile defined in test6.c.
|
||||||
|
@ -23086,6 +23105,24 @@ static int unixLock(sqlite3_file *id, int locktype){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/* Set up the transaction-counter change checking flags when
|
||||||
|
** transitioning from a SHARED to a RESERVED lock. The change
|
||||||
|
** from SHARED to RESERVED marks the beginning of a normal
|
||||||
|
** write operation (not a hot journal rollback).
|
||||||
|
*/
|
||||||
|
if( rc==SQLITE_OK
|
||||||
|
&& pFile->locktype<=SHARED_LOCK
|
||||||
|
&& locktype==RESERVED_LOCK
|
||||||
|
){
|
||||||
|
pFile->transCntrChng = 0;
|
||||||
|
pFile->dbUpdate = 0;
|
||||||
|
pFile->inNormalWrite = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
pFile->locktype = locktype;
|
pFile->locktype = locktype;
|
||||||
pLock->locktype = locktype;
|
pLock->locktype = locktype;
|
||||||
|
@ -23135,6 +23172,23 @@ static int unixUnlock(sqlite3_file *id, int locktype){
|
||||||
SimulateIOErrorBenign(1);
|
SimulateIOErrorBenign(1);
|
||||||
SimulateIOError( h=(-1) )
|
SimulateIOError( h=(-1) )
|
||||||
SimulateIOErrorBenign(0);
|
SimulateIOErrorBenign(0);
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/* When reducing a lock such that other processes can start
|
||||||
|
** reading the database file again, make sure that the
|
||||||
|
** transaction counter was updated if any part of the database
|
||||||
|
** file changed. If the transaction counter is not updated,
|
||||||
|
** other connections to the same file might not realize that
|
||||||
|
** the file has changed and hence might not know to flush their
|
||||||
|
** cache. The use of a stale cache can lead to database corruption.
|
||||||
|
*/
|
||||||
|
assert( pFile->inNormalWrite==0
|
||||||
|
|| pFile->dbUpdate==0
|
||||||
|
|| pFile->transCntrChng==1 );
|
||||||
|
pFile->inNormalWrite = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if( locktype==SHARED_LOCK ){
|
if( locktype==SHARED_LOCK ){
|
||||||
lock.l_type = F_RDLCK;
|
lock.l_type = F_RDLCK;
|
||||||
lock.l_whence = SEEK_SET;
|
lock.l_whence = SEEK_SET;
|
||||||
|
@ -24467,6 +24521,29 @@ static int unixWrite(
|
||||||
int wrote = 0;
|
int wrote = 0;
|
||||||
assert( id );
|
assert( id );
|
||||||
assert( amt>0 );
|
assert( amt>0 );
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/* If we are doing a normal write to a database file (as opposed to
|
||||||
|
** doing a hot-journal rollback or a write to some file other than a
|
||||||
|
** normal database file) then record the fact that the database
|
||||||
|
** has changed. If the transaction counter is modified, record that
|
||||||
|
** fact too.
|
||||||
|
*/
|
||||||
|
if( ((unixFile*)id)->inNormalWrite ){
|
||||||
|
unixFile *pFile = (unixFile*)id;
|
||||||
|
pFile->dbUpdate = 1; /* The database has been modified */
|
||||||
|
if( offset<=24 && offset+amt>=27 ){
|
||||||
|
char oldCntr[4];
|
||||||
|
SimulateIOErrorBenign(1);
|
||||||
|
seekAndRead(pFile, 24, oldCntr, 4);
|
||||||
|
SimulateIOErrorBenign(0);
|
||||||
|
if( memcmp(oldCntr, &((char*)pBuf)[24-offset], 4)!=0 ){
|
||||||
|
pFile->transCntrChng = 1; /* The transaction counter has changed */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){
|
while( amt>0 && (wrote = seekAndWrite((unixFile*)id, offset, pBuf, amt))>0 ){
|
||||||
amt -= wrote;
|
amt -= wrote;
|
||||||
offset += wrote;
|
offset += wrote;
|
||||||
|
@ -24576,9 +24653,11 @@ static int full_fsync(int fd, int fullSync, int dataOnly){
|
||||||
#else
|
#else
|
||||||
if( dataOnly ){
|
if( dataOnly ){
|
||||||
rc = fdatasync(fd);
|
rc = fdatasync(fd);
|
||||||
if( OS_VXWORKS && rc==-1 && errno==ENOTSUP ){
|
#if OS_VXWORKS
|
||||||
|
if( rc==-1 && errno==ENOTSUP ){
|
||||||
rc = fsync(fd);
|
rc = fsync(fd);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}else{
|
}else{
|
||||||
rc = fsync(fd);
|
rc = fsync(fd);
|
||||||
}
|
}
|
||||||
|
@ -24726,6 +24805,17 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){
|
||||||
*(int*)pArg = ((unixFile*)id)->lastErrno;
|
*(int*)pArg = ((unixFile*)id)->lastErrno;
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
#ifndef NDEBUG
|
||||||
|
/* The pager calls this method to signal that it has done
|
||||||
|
** a rollback and that the database is therefore unchanged and
|
||||||
|
** it hence it is OK for the transaction change counter to be
|
||||||
|
** unchanged.
|
||||||
|
*/
|
||||||
|
case SQLITE_FCNTL_DB_UNCHANGED: {
|
||||||
|
((unixFile*)id)->dbUpdate = 0;
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
|
#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
|
||||||
case SQLITE_SET_LOCKPROXYFILE:
|
case SQLITE_SET_LOCKPROXYFILE:
|
||||||
case SQLITE_GET_LOCKPROXYFILE: {
|
case SQLITE_GET_LOCKPROXYFILE: {
|
||||||
|
@ -30447,6 +30537,8 @@ SQLITE_PRIVATE void sqlite3PcacheStats(
|
||||||
**
|
**
|
||||||
** Big chunks of rowid/next-ptr pairs are allocated at a time, to
|
** Big chunks of rowid/next-ptr pairs are allocated at a time, to
|
||||||
** reduce the malloc overhead.
|
** reduce the malloc overhead.
|
||||||
|
**
|
||||||
|
** $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -31645,10 +31737,7 @@ static int addToSavepointBitvecs(Pager *pPager, Pgno pgno){
|
||||||
*/
|
*/
|
||||||
static void pager_unlock(Pager *pPager){
|
static void pager_unlock(Pager *pPager){
|
||||||
if( !pPager->exclusiveMode ){
|
if( !pPager->exclusiveMode ){
|
||||||
int rc = osUnlock(pPager->fd, NO_LOCK);
|
int rc;
|
||||||
if( rc ) pPager->errCode = rc;
|
|
||||||
pPager->dbSizeValid = 0;
|
|
||||||
IOTRACE(("UNLOCK %p\n", pPager))
|
|
||||||
|
|
||||||
/* Always close the journal file when dropping the database lock.
|
/* Always close the journal file when dropping the database lock.
|
||||||
** Otherwise, another connection with journal_mode=delete might
|
** Otherwise, another connection with journal_mode=delete might
|
||||||
|
@ -31663,6 +31752,11 @@ static void pager_unlock(Pager *pPager){
|
||||||
pPager->pAlwaysRollback = 0;
|
pPager->pAlwaysRollback = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = osUnlock(pPager->fd, NO_LOCK);
|
||||||
|
if( rc ) pPager->errCode = rc;
|
||||||
|
pPager->dbSizeValid = 0;
|
||||||
|
IOTRACE(("UNLOCK %p\n", pPager))
|
||||||
|
|
||||||
/* If Pager.errCode is set, the contents of the pager cache cannot be
|
/* If Pager.errCode is set, the contents of the pager cache cannot be
|
||||||
** trusted. Now that the pager file is unlocked, the contents of the
|
** trusted. Now that the pager file is unlocked, the contents of the
|
||||||
** cache can be discarded and the error code safely cleared.
|
** cache can be discarded and the error code safely cleared.
|
||||||
|
@ -31763,6 +31857,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster){
|
||||||
if( !pPager->exclusiveMode ){
|
if( !pPager->exclusiveMode ){
|
||||||
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
|
rc2 = osUnlock(pPager->fd, SHARED_LOCK);
|
||||||
pPager->state = PAGER_SHARED;
|
pPager->state = PAGER_SHARED;
|
||||||
|
pPager->changeCountDone = 0;
|
||||||
}else if( pPager->state==PAGER_SYNCED ){
|
}else if( pPager->state==PAGER_SYNCED ){
|
||||||
pPager->state = PAGER_EXCLUSIVE;
|
pPager->state = PAGER_EXCLUSIVE;
|
||||||
}
|
}
|
||||||
|
@ -32380,6 +32475,16 @@ static int pager_playback(Pager *pPager, int isHot){
|
||||||
assert( 0 );
|
assert( 0 );
|
||||||
|
|
||||||
end_playback:
|
end_playback:
|
||||||
|
/* Following a rollback, the database file should be back in its original
|
||||||
|
** state prior to the start of the transaction, so invoke the
|
||||||
|
** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the
|
||||||
|
** assertion that the transaction counter was modified.
|
||||||
|
*/
|
||||||
|
assert(
|
||||||
|
pPager->fd->pMethods==0 ||
|
||||||
|
sqlite3OsFileControl(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0)>=SQLITE_OK
|
||||||
|
);
|
||||||
|
|
||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
zMaster = pPager->pTmpSpace;
|
zMaster = pPager->pTmpSpace;
|
||||||
rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
|
rc = readMasterJournal(pPager->jfd, zMaster, pPager->pVfs->mxPathname+1);
|
||||||
|
@ -52572,6 +52677,7 @@ case OP_Last: { /* jump */
|
||||||
rc = sqlite3BtreeLast(pCrsr, &res);
|
rc = sqlite3BtreeLast(pCrsr, &res);
|
||||||
pC->nullRow = (u8)res;
|
pC->nullRow = (u8)res;
|
||||||
pC->deferredMoveto = 0;
|
pC->deferredMoveto = 0;
|
||||||
|
pC->rowidIsValid = 0;
|
||||||
pC->cacheStatus = CACHE_STALE;
|
pC->cacheStatus = CACHE_STALE;
|
||||||
if( res && pOp->p2>0 ){
|
if( res && pOp->p2>0 ){
|
||||||
pc = pOp->p2 - 1;
|
pc = pOp->p2 - 1;
|
||||||
|
@ -52622,6 +52728,7 @@ case OP_Rewind: { /* jump */
|
||||||
pC->atFirst = res==0 ?1:0;
|
pC->atFirst = res==0 ?1:0;
|
||||||
pC->deferredMoveto = 0;
|
pC->deferredMoveto = 0;
|
||||||
pC->cacheStatus = CACHE_STALE;
|
pC->cacheStatus = CACHE_STALE;
|
||||||
|
pC->rowidIsValid = 0;
|
||||||
}else{
|
}else{
|
||||||
res = 1;
|
res = 1;
|
||||||
}
|
}
|
||||||
|
@ -70552,7 +70659,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
||||||
** PRAGMA [database.]journal_size_limit
|
** PRAGMA [database.]journal_size_limit
|
||||||
** PRAGMA [database.]journal_size_limit=N
|
** PRAGMA [database.]journal_size_limit=N
|
||||||
**
|
**
|
||||||
** Get or set the (boolean) value of the database 'auto-vacuum' parameter.
|
** Get or set the size limit on rollback journal files.
|
||||||
*/
|
*/
|
||||||
if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){
|
if( sqlite3StrICmp(zLeft,"journal_size_limit")==0 ){
|
||||||
Pager *pPager = sqlite3BtreePager(pDb->pBt);
|
Pager *pPager = sqlite3BtreePager(pDb->pBt);
|
||||||
|
@ -70574,7 +70681,8 @@ SQLITE_PRIVATE void sqlite3Pragma(
|
||||||
** PRAGMA [database.]auto_vacuum
|
** PRAGMA [database.]auto_vacuum
|
||||||
** PRAGMA [database.]auto_vacuum=N
|
** PRAGMA [database.]auto_vacuum=N
|
||||||
**
|
**
|
||||||
** Get or set the (boolean) value of the database 'auto-vacuum' parameter.
|
** Get or set the value of the database 'auto-vacuum' parameter.
|
||||||
|
** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL
|
||||||
*/
|
*/
|
||||||
#ifndef SQLITE_OMIT_AUTOVACUUM
|
#ifndef SQLITE_OMIT_AUTOVACUUM
|
||||||
if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){
|
if( sqlite3StrICmp(zLeft,"auto_vacuum")==0 ){
|
||||||
|
@ -81197,6 +81305,7 @@ static void bestIndex(
|
||||||
WhereClause *pOrWC = &pTerm->u.pOrInfo->wc;
|
WhereClause *pOrWC = &pTerm->u.pOrInfo->wc;
|
||||||
WhereTerm *pOrTerm;
|
WhereTerm *pOrTerm;
|
||||||
int j;
|
int j;
|
||||||
|
int sortable = 0;
|
||||||
double rTotal = 0;
|
double rTotal = 0;
|
||||||
nRow = 0;
|
nRow = 0;
|
||||||
for(j=0, pOrTerm=pOrWC->a; j<pOrWC->nTerm; j++, pOrTerm++){
|
for(j=0, pOrTerm=pOrWC->a; j<pOrWC->nTerm; j++, pOrTerm++){
|
||||||
|
@ -81216,6 +81325,14 @@ static void bestIndex(
|
||||||
nRow += sTermCost.nRow;
|
nRow += sTermCost.nRow;
|
||||||
if( rTotal>=pCost->rCost ) break;
|
if( rTotal>=pCost->rCost ) break;
|
||||||
}
|
}
|
||||||
|
if( pOrderBy!=0 ){
|
||||||
|
if( sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev) && !rev ){
|
||||||
|
sortable = 1;
|
||||||
|
}else{
|
||||||
|
rTotal += nRow*estLog(nRow);
|
||||||
|
WHERETRACE(("... sorting increases OR cost to %.9g\n", rTotal));
|
||||||
|
}
|
||||||
|
}
|
||||||
WHERETRACE(("... multi-index OR cost=%.9g nrow=%.9g\n",
|
WHERETRACE(("... multi-index OR cost=%.9g nrow=%.9g\n",
|
||||||
rTotal, nRow));
|
rTotal, nRow));
|
||||||
if( rTotal<pCost->rCost ){
|
if( rTotal<pCost->rCost ){
|
||||||
|
@ -81223,10 +81340,7 @@ static void bestIndex(
|
||||||
pCost->nRow = nRow;
|
pCost->nRow = nRow;
|
||||||
pCost->plan.wsFlags = WHERE_MULTI_OR;
|
pCost->plan.wsFlags = WHERE_MULTI_OR;
|
||||||
pCost->plan.u.pTerm = pTerm;
|
pCost->plan.u.pTerm = pTerm;
|
||||||
if( pOrderBy!=0
|
if( sortable ){
|
||||||
&& sortableByRowid(iCur, pOrderBy, pWC->pMaskSet, &rev)
|
|
||||||
&& !rev
|
|
||||||
){
|
|
||||||
pCost->plan.wsFlags = WHERE_ORDERBY|WHERE_MULTI_OR;
|
pCost->plan.wsFlags = WHERE_ORDERBY|WHERE_MULTI_OR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89498,8 +89612,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){
|
||||||
**
|
**
|
||||||
**
|
**
|
||||||
**** Segment merging ****
|
**** Segment merging ****
|
||||||
** To amortize update costs, segments are groups into levels and
|
** To amortize update costs, segments are grouped into levels and
|
||||||
** merged in matches. Each increase in level represents exponentially
|
** merged in batches. Each increase in level represents exponentially
|
||||||
** more documents.
|
** more documents.
|
||||||
**
|
**
|
||||||
** New documents (actually, document updates) are tokenized and
|
** New documents (actually, document updates) are tokenized and
|
||||||
|
|
|
@ -107,8 +107,8 @@ extern "C" {
|
||||||
** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z
|
** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z
|
||||||
** are the major version, minor version, and release number.
|
** are the major version, minor version, and release number.
|
||||||
*/
|
*/
|
||||||
#define SQLITE_VERSION "3.6.8"
|
#define SQLITE_VERSION "3.6.10"
|
||||||
#define SQLITE_VERSION_NUMBER 3006008
|
#define SQLITE_VERSION_NUMBER 3006010
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
|
** CAPI3REF: Run-Time Library Version Numbers {H10020} <S60100>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue