From f55fb6615be38fc3e19e8fa3bef352374cd9e02d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Mar 2016 19:48:10 +0000 Subject: [PATCH 01/19] Have fts5 cache the decoded structure of fts5 indexes in memory. Use "PRAGMA data_version" to detect stale caches. FossilOrigin-Name: 33ef2210ef19e55c8d460bfe9d3dc146034c8acc --- ext/fts5/fts5Int.h | 2 + ext/fts5/fts5_index.c | 115 +++++++++++++++++++++++++++----- ext/fts5/fts5_main.c | 39 +++++++---- ext/fts5/fts5_storage.c | 4 ++ ext/fts5/test/fts5corrupt3.test | 4 ++ ext/fts5/test/fts5dlidx.test | 4 +- manifest | 27 ++++---- manifest.uuid | 2 +- 8 files changed, 153 insertions(+), 44 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 35f15abbaf..961206f2b3 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -480,6 +480,7 @@ int sqlite3Fts5IndexReads(Fts5Index *p); int sqlite3Fts5IndexReinit(Fts5Index *p); int sqlite3Fts5IndexOptimize(Fts5Index *p); int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge); +int sqlite3Fts5IndexReset(Fts5Index *p); int sqlite3Fts5IndexLoadConfig(Fts5Index *p); @@ -622,6 +623,7 @@ int sqlite3Fts5StorageDeleteAll(Fts5Storage *p); int sqlite3Fts5StorageRebuild(Fts5Storage *p); int sqlite3Fts5StorageOptimize(Fts5Storage *p); int sqlite3Fts5StorageMerge(Fts5Storage *p, int nMerge); +int sqlite3Fts5StorageReset(Fts5Storage *p); /* ** End of interface to code in fts5_storage.c. diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 323e6cefdc..78003396d6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -304,6 +304,10 @@ struct Fts5Index { sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ sqlite3_stmt *pIdxSelect; int nRead; /* Total number of blocks read */ + + sqlite3_stmt *pDataVersion; + i64 iStructVersion; /* data_version when pStruct read */ + Fts5Structure *pStruct; /* Current db structure (or NULL) */ }; struct Fts5DoclistIter { @@ -959,6 +963,48 @@ static void fts5StructureExtendLevel( } } +static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ + Fts5Structure *pRet = 0; + Fts5Config *pConfig = p->pConfig; + int iCookie; /* Configuration cookie */ + Fts5Data *pData; + + pData = fts5DataRead(p, FTS5_STRUCTURE_ROWID); + if( p->rc==SQLITE_OK ){ + /* TODO: Do we need this if the leaf-index is appended? Probably... */ + memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); + p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); + if( p->rc==SQLITE_OK && pConfig->iCookie!=iCookie ){ + p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); + } + fts5DataRelease(pData); + if( p->rc!=SQLITE_OK ){ + fts5StructureRelease(pRet); + pRet = 0; + } + } + + return pRet; +} + +static i64 fts5IndexDataVersion(Fts5Index *p){ + i64 iVersion = 0; + + if( p->pDataVersion==0 ){ + p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, + sqlite3_mprintf("PRAGMA %Q.data_version", p->pConfig->zDb) + ); + if( p->rc ) return 0; + } + + if( SQLITE_ROW==sqlite3_step(p->pDataVersion) ){ + iVersion = sqlite3_column_int64(p->pDataVersion, 0); + } + p->rc = sqlite3_reset(p->pDataVersion); + + return iVersion; +} + /* ** Read, deserialize and return the structure record. ** @@ -971,28 +1017,51 @@ static void fts5StructureExtendLevel( ** is called, it is a no-op. */ static Fts5Structure *fts5StructureRead(Fts5Index *p){ - Fts5Config *pConfig = p->pConfig; - Fts5Structure *pRet = 0; /* Object to return */ - int iCookie; /* Configuration cookie */ - Fts5Data *pData; + Fts5Structure *pRet; /* Object to return */ - pData = fts5DataRead(p, FTS5_STRUCTURE_ROWID); - if( p->rc ) return 0; - /* TODO: Do we need this if the leaf-index is appended? Probably... */ - memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); - p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); - if( p->rc==SQLITE_OK && pConfig->iCookie!=iCookie ){ - p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); + if( p->pStruct ){ + pRet = p->pStruct; +#ifdef SQLITE_DEBUG + { + Fts5Structure *pTest = fts5StructureReadUncached(p); + if( pTest ){ + int i, j; + assert_nc( pRet->nSegment==pTest->nSegment ); + assert_nc( pRet->nLevel==pTest->nLevel ); + for(i=0; inLevel; i++){ + assert_nc( pRet->aLevel[i].nMerge==pTest->aLevel[i].nMerge ); + assert_nc( pRet->aLevel[i].nSeg==pTest->aLevel[i].nSeg ); + for(j=0; jaLevel[i].nSeg; j++){ + Fts5StructureSegment *p1 = &pTest->aLevel[i].aSeg[j]; + Fts5StructureSegment *p2 = &pRet->aLevel[i].aSeg[j]; + assert_nc( p1->iSegid==p2->iSegid ); + assert_nc( p1->pgnoFirst==p2->pgnoFirst ); + assert_nc( p1->pgnoLast==p2->pgnoLast ); + } + } + fts5StructureRelease(pTest); + } + } +#endif + }else{ + pRet = fts5StructureReadUncached(p); } - fts5DataRelease(pData); - if( p->rc!=SQLITE_OK ){ - fts5StructureRelease(pRet); - pRet = 0; + if( pRet ){ + fts5StructureRef(pRet); + p->pStruct = pRet; + p->iStructVersion = fts5IndexDataVersion(p); } return pRet; } +static void fts5StructureInvalidate(Fts5Index *p){ + if( p->pStruct ){ + fts5StructureRelease(p->pStruct); + p->pStruct = 0; + } +} + /* ** Return the total number of segments in index structure pStruct. This ** function is only ever used as part of assert() conditions. @@ -4328,6 +4397,7 @@ static void fts5FlushOneHash(Fts5Index *p){ ** for the new level-0 segment. */ pStruct = fts5StructureRead(p); iSegid = fts5AllocateSegid(p, pStruct); + fts5StructureInvalidate(p); if( iSegid ){ const int pgsz = p->pConfig->pgsz; @@ -4547,6 +4617,7 @@ int sqlite3Fts5IndexOptimize(Fts5Index *p){ assert( p->rc==SQLITE_OK ); fts5IndexFlush(p); pStruct = fts5StructureRead(p); + fts5StructureInvalidate(p); if( pStruct ){ pNew = fts5IndexOptimizeStruct(p, pStruct); @@ -4577,6 +4648,7 @@ int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ Fts5Structure *pStruct = fts5StructureRead(p); if( pStruct ){ int nMin = p->pConfig->nUsermerge; + fts5StructureInvalidate(p); if( nMerge<0 ){ Fts5Structure *pNew = fts5IndexOptimizeStruct(p, pStruct); fts5StructureRelease(pStruct); @@ -5004,6 +5076,7 @@ int sqlite3Fts5IndexSync(Fts5Index *p, int bCommit){ int sqlite3Fts5IndexRollback(Fts5Index *p){ fts5CloseReader(p); fts5IndexDiscardData(p); + fts5StructureInvalidate(p); /* assert( p->rc==SQLITE_OK ); */ return SQLITE_OK; } @@ -5015,6 +5088,7 @@ int sqlite3Fts5IndexRollback(Fts5Index *p){ */ int sqlite3Fts5IndexReinit(Fts5Index *p){ Fts5Structure s; + fts5StructureInvalidate(p); memset(&s, 0, sizeof(Fts5Structure)); fts5DataWrite(p, FTS5_AVERAGES_ROWID, (const u8*)"", 0); fts5StructureWrite(p, &s); @@ -5073,11 +5147,13 @@ int sqlite3Fts5IndexClose(Fts5Index *p){ int rc = SQLITE_OK; if( p ){ assert( p->pReader==0 ); + fts5StructureInvalidate(p); sqlite3_finalize(p->pWriter); sqlite3_finalize(p->pDeleter); sqlite3_finalize(p->pIdxWriter); sqlite3_finalize(p->pIdxDeleter); sqlite3_finalize(p->pIdxSelect); + sqlite3_finalize(p->pDataVersion); sqlite3Fts5HashFree(p->pHash); sqlite3_free(p->zDataTbl); sqlite3_free(p); @@ -6333,3 +6409,12 @@ int sqlite3Fts5IndexInit(sqlite3 *db){ } return rc; } + + +int sqlite3Fts5IndexReset(Fts5Index *p){ + assert( p->pStruct==0 || p->iStructVersion!=0 ); + if( fts5IndexDataVersion(p)!=p->iStructVersion ){ + fts5StructureInvalidate(p); + } + return fts5IndexReturn(p); +} diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index dcd131c74a..4feb3e1a2f 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -597,27 +597,38 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ return SQLITE_OK; } +static int fts5NewTransaction(Fts5Table *pTab){ + Fts5Cursor *pCsr; + for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ + if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; + } + return sqlite3Fts5StorageReset(pTab->pStorage); +} + /* ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ Fts5Table *pTab = (Fts5Table*)pVTab; Fts5Config *pConfig = pTab->pConfig; - Fts5Cursor *pCsr; /* New cursor object */ + Fts5Cursor *pCsr = 0; /* New cursor object */ int nByte; /* Bytes of space to allocate */ - int rc = SQLITE_OK; /* Return code */ + int rc; /* Return code */ - nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); - if( pCsr ){ - Fts5Global *pGlobal = pTab->pGlobal; - memset(pCsr, 0, nByte); - pCsr->aColumnSize = (int*)&pCsr[1]; - pCsr->pNext = pGlobal->pCsr; - pGlobal->pCsr = pCsr; - pCsr->iCsrId = ++pGlobal->iNextId; - }else{ - rc = SQLITE_NOMEM; + rc = fts5NewTransaction(pTab); + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); + pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + if( pCsr ){ + Fts5Global *pGlobal = pTab->pGlobal; + memset(pCsr, 0, nByte); + pCsr->aColumnSize = (int*)&pCsr[1]; + pCsr->pNext = pGlobal->pCsr; + pGlobal->pCsr = pCsr; + pCsr->iCsrId = ++pGlobal->iNextId; + }else{ + rc = SQLITE_NOMEM; + } } *ppCsr = (sqlite3_vtab_cursor*)pCsr; return rc; @@ -1578,8 +1589,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5Table*)pVtab); return SQLITE_OK; } diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index e4f5dd8f51..bd1c1f88e9 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -639,6 +639,10 @@ int sqlite3Fts5StorageMerge(Fts5Storage *p, int nMerge){ return sqlite3Fts5IndexMerge(p->pIndex, nMerge); } +int sqlite3Fts5StorageReset(Fts5Storage *p){ + return sqlite3Fts5IndexReset(p->pIndex); +} + /* ** Allocate a new rowid. This is used for "external content" tables when ** a NULL value is inserted into the rowid column. The new rowid is allocated diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 7a8cb5c465..9653bcaac2 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -179,6 +179,10 @@ for {set i 1} {1} {incr i} { if {$end<=$i} break lset var end [expr $end - $i] set struct [binary format c* $var] + + db close + sqlite3 db test.db + db eval { BEGIN; UPDATE t1_data SET block = $struct WHERE id=10; diff --git a/ext/fts5/test/fts5dlidx.test b/ext/fts5/test/fts5dlidx.test index 232b5021f1..655beb984b 100644 --- a/ext/fts5/test/fts5dlidx.test +++ b/ext/fts5/test/fts5dlidx.test @@ -178,7 +178,7 @@ do_execsql_test 3.2 { ORDER BY rowid DESC; } {16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1} -do_execsql_test 3.2 { +do_execsql_test 3.3 { INSERT INTO abc(abc) VALUES('integrity-check'); INSERT INTO abc(abc) VALUES('optimize'); INSERT INTO abc(abc) VALUES('integrity-check'); @@ -187,7 +187,7 @@ do_execsql_test 3.2 { set v [lindex $vocab 0] set i 0 foreach v $vocab { - do_execsql_test 3.3.[incr i] { + do_execsql_test 3.4.[incr i] { SELECT rowid FROM abc WHERE abc MATCH $v } {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16} } diff --git a/manifest b/manifest index bf413d574c..7c682009be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_OMIT_CODEC_FROM_TCL\scompile-time\soption. -D 2016-03-16T01:03:10.251 +C Have\sfts5\scache\sthe\sdecoded\sstructure\sof\sfts5\sindexes\sin\smemory.\sUse\s"PRAGMA\sdata_version"\sto\sdetect\sstale\scaches. +D 2016-03-16T19:48:10.873 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -98,15 +98,15 @@ F ext/fts3/unicode/mkunicode.tcl 2debed3f582d77b3fdd0b8830880250021571fd8 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h ff9c2782e8ed890b0de2f697a8d63971939e70c7 -F ext/fts5/fts5Int.h 4060504b7979601d99e1385c2b5713036854979a +F ext/fts5/fts5Int.h 4e507abebae0d7d3ac9b8daebf049d5153d00961 F ext/fts5/fts5_aux.c daa57fb45216491814520bbb587e97bf81ced458 F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c be309fb227003c931107bfcc12d5be4f2fd2bb8c F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c d4f0c12e4f04bbc3a06b6da052039f2ce3e45438 -F ext/fts5/fts5_main.c b8501e1a6a11591c53b18ce7aea7e5386cfb0421 -F ext/fts5/fts5_storage.c f8343db90d8c95a4d4b52f6676e354b4649ffd6e +F ext/fts5/fts5_index.c 317040cb17cdad05e973376b39239b29c75f90b5 +F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 +F ext/fts5/fts5_storage.c a3361410422e69639ca2bcd5a56a0933dadf84d2 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 F ext/fts5/fts5_test_mi.c 783b86697ebf773c18fc109992426c0173a055bc F ext/fts5/fts5_test_tok.c db08af63673c3a7d39f053b36fd6e065017706be @@ -141,9 +141,9 @@ F ext/fts5/test/fts5conflict.test 26f4e46c4d31e16221794832a990dc4e30e18de5 F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1 F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62 F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c -F ext/fts5/test/fts5corrupt3.test b9558d5b0ca44a8b6247fbb5d4a47592a8976892 +F ext/fts5/test/fts5corrupt3.test f77f65e386231daf62902466b40ff998b2c8ce4f F ext/fts5/test/fts5detail.test ef5c690535a797413acaf5ad9b8ab5d49972df69 -F ext/fts5/test/fts5dlidx.test 13871a14641017ae42f6f1055a8067bafd44cb3d +F ext/fts5/test/fts5dlidx.test 007e9390c94638760797dbec2990c97c3fa08dfe F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 F ext/fts5/test/fts5eb.test c516ae0c934be6fd29ec95ea8b5f11f461311535 @@ -1456,7 +1456,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e0b116edd64a55c971c368685aa343cb6beed0f1 -R 1b0c52bbc749be5b9a732d29d3d099e5 -U drh -Z 5dddb7cbfc6ef15baab9797e73067d60 +P 45f7f0c80bd91a0c7ff859c27fd9e82e551bd83e +R 7875ababc9def91b1b2c4626dd7ef0ad +T *branch * fts5-data-version +T *sym-fts5-data-version * +T -sym-trunk * +U dan +Z 015dc4987d82758ea8c0d324359dc366 diff --git a/manifest.uuid b/manifest.uuid index 3aa4fcd861..3d6ceeb2ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45f7f0c80bd91a0c7ff859c27fd9e82e551bd83e \ No newline at end of file +33ef2210ef19e55c8d460bfe9d3dc146034c8acc \ No newline at end of file From c9460ab989d1a01aac7535811df01094ce0c8e9b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Mar 2016 12:39:56 +0000 Subject: [PATCH 02/19] Fix some OOM-handling issues in the fts5 changes on this branch. FossilOrigin-Name: 020a0bda59fe93b9361ceeed0d5a8ba4177380c8 --- ext/fts5/fts5_index.c | 83 ++++++++++++++++++++++--------------------- manifest | 12 +++---- manifest.uuid | 2 +- 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 78003396d6..3fb1458526 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -990,17 +990,19 @@ static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ static i64 fts5IndexDataVersion(Fts5Index *p){ i64 iVersion = 0; - if( p->pDataVersion==0 ){ - p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, - sqlite3_mprintf("PRAGMA %Q.data_version", p->pConfig->zDb) - ); - if( p->rc ) return 0; - } + if( p->rc==SQLITE_OK ){ + if( p->pDataVersion==0 ){ + p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, + sqlite3_mprintf("PRAGMA %Q.data_version", p->pConfig->zDb) + ); + if( p->rc ) return 0; + } - if( SQLITE_ROW==sqlite3_step(p->pDataVersion) ){ - iVersion = sqlite3_column_int64(p->pDataVersion, 0); + if( SQLITE_ROW==sqlite3_step(p->pDataVersion) ){ + iVersion = sqlite3_column_int64(p->pDataVersion, 0); + } + p->rc = sqlite3_reset(p->pDataVersion); } - p->rc = sqlite3_reset(p->pDataVersion); return iVersion; } @@ -1019,39 +1021,40 @@ static i64 fts5IndexDataVersion(Fts5Index *p){ static Fts5Structure *fts5StructureRead(Fts5Index *p){ Fts5Structure *pRet; /* Object to return */ - if( p->pStruct ){ - pRet = p->pStruct; -#ifdef SQLITE_DEBUG - { - Fts5Structure *pTest = fts5StructureReadUncached(p); - if( pTest ){ - int i, j; - assert_nc( pRet->nSegment==pTest->nSegment ); - assert_nc( pRet->nLevel==pTest->nLevel ); - for(i=0; inLevel; i++){ - assert_nc( pRet->aLevel[i].nMerge==pTest->aLevel[i].nMerge ); - assert_nc( pRet->aLevel[i].nSeg==pTest->aLevel[i].nSeg ); - for(j=0; jaLevel[i].nSeg; j++){ - Fts5StructureSegment *p1 = &pTest->aLevel[i].aSeg[j]; - Fts5StructureSegment *p2 = &pRet->aLevel[i].aSeg[j]; - assert_nc( p1->iSegid==p2->iSegid ); - assert_nc( p1->pgnoFirst==p2->pgnoFirst ); - assert_nc( p1->pgnoLast==p2->pgnoLast ); - } - } - fts5StructureRelease(pTest); - } - } -#endif - }else{ - pRet = fts5StructureReadUncached(p); - } - - if( pRet ){ - fts5StructureRef(pRet); - p->pStruct = pRet; + if( p->pStruct==0 ){ p->iStructVersion = fts5IndexDataVersion(p); + if( p->rc==SQLITE_OK ){ + p->pStruct = pRet = fts5StructureReadUncached(p); + } + if( p->rc!=SQLITE_OK ) return 0; + assert( p->iStructVersion!=0 ); + assert( p->pStruct!=0 ); } +#ifdef SQLITE_DEBUG + else{ + Fts5Structure *pTest = fts5StructureReadUncached(p); + if( pTest ){ + int i, j; + assert_nc( p->pStruct->nSegment==pTest->nSegment ); + assert_nc( p->pStruct->nLevel==pTest->nLevel ); + for(i=0; inLevel; i++){ + assert_nc( p->pStruct->aLevel[i].nMerge==pTest->aLevel[i].nMerge ); + assert_nc( p->pStruct->aLevel[i].nSeg==pTest->aLevel[i].nSeg ); + for(j=0; jaLevel[i].nSeg; j++){ + Fts5StructureSegment *p1 = &pTest->aLevel[i].aSeg[j]; + Fts5StructureSegment *p2 = &p->pStruct->aLevel[i].aSeg[j]; + assert_nc( p1->iSegid==p2->iSegid ); + assert_nc( p1->pgnoFirst==p2->pgnoFirst ); + assert_nc( p1->pgnoLast==p2->pgnoLast ); + } + } + fts5StructureRelease(pTest); + } + } +#endif + + pRet = p->pStruct; + fts5StructureRef(pRet); return pRet; } diff --git a/manifest b/manifest index 4ea9b53d9e..8f5bdc1491 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\schanges\son\sthe\sreusable-pragma\sbranch\sinto\sthis\sone. -D 2016-03-16T20:53:33.830 +C Fix\ssome\sOOM-handling\sissues\sin\sthe\sfts5\schanges\son\sthis\sbranch. +D 2016-03-17T12:39:56.371 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 35e9d92c89e7c7ea0759b73d24da1ecb7630a24b F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c 317040cb17cdad05e973376b39239b29c75f90b5 +F ext/fts5/fts5_index.c afac2ffe3198776626b99366e18af1f32ea9eb85 F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 F ext/fts5/fts5_storage.c a3361410422e69639ca2bcd5a56a0933dadf84d2 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 @@ -1456,7 +1456,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 33ef2210ef19e55c8d460bfe9d3dc146034c8acc db1ce7e13e656fcd2766f1b1f225cbfefe8f73ad -R 9bcd2375f3bee3eec21a0e0d6e512aed +P 6c4a17b963916d19c9433d7a251338042f32e9fa +R bc1955b591517ca84e5bb3a7a87f0726 U dan -Z 9f0b8bb8494a2ee2e21e8a8509116058 +Z 380059b0b3811052efb55863df364c4f diff --git a/manifest.uuid b/manifest.uuid index 71f9d7efce..d6022948ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6c4a17b963916d19c9433d7a251338042f32e9fa \ No newline at end of file +020a0bda59fe93b9361ceeed0d5a8ba4177380c8 \ No newline at end of file From cf9bce34ab757b637ebe36f04a7997dc5a1fc379 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Mar 2016 14:47:28 +0000 Subject: [PATCH 03/19] Add test file fts5multiclient.test. FossilOrigin-Name: 7832466f9177cca59455ba272802145297fcd53d --- ext/fts5/test/fts5multiclient.test | 48 ++++++++++++++++++++++++++++++ manifest | 11 +++---- manifest.uuid | 2 +- 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 ext/fts5/test/fts5multiclient.test diff --git a/ext/fts5/test/fts5multiclient.test b/ext/fts5/test/fts5multiclient.test new file mode 100644 index 0000000000..a1e9aa0d30 --- /dev/null +++ b/ext/fts5/test/fts5multiclient.test @@ -0,0 +1,48 @@ +# 2016 March 17 +# +# 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. +# +#************************************************************************* +# + +source [file join [file dirname [info script]] fts5_common.tcl] +source $testdir/lock_common.tcl + +set testprefix fts5multiclient +return_if_no_fts5 + +foreach_detail_mode $testprefix { + +do_multiclient_test tn { + + do_test 1.$tn.1 { + sql1 { CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%) } + sql1 { INSERT INTO t1 VALUES('a b c') } + sql2 { SELECT rowid FROM t1('b') } + } {1} + + do_test 1.$tn.2 { + sql2 { INSERT INTO t1 VALUES('a b c') } + sql1 { SELECT rowid FROM t1('b') } + } {1 2} + + do_test 1.$tn.3 { + sql2 { INSERT INTO t1 VALUES('a b c') } + sql1 { SELECT rowid FROM t1('b') } + } {1 2 3} + + do_test 1.$tn.4 { + sql2 { INSERT INTO t1 VALUES('a b c') } + sql1 { INSERT INTO t1 VALUES('a b c') } + sql3 { INSERT INTO t1(t1) VALUES('integrity-check') } + } {} + +};# do_multiclient_test +};# foreach_detail_mode +finish_test + diff --git a/manifest b/manifest index 8f5bdc1491..346832e33f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\sOOM-handling\sissues\sin\sthe\sfts5\schanges\son\sthis\sbranch. -D 2016-03-17T12:39:56.371 +C Add\stest\sfile\sfts5multiclient.test. +D 2016-03-19T14:47:28.441 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -165,6 +165,7 @@ F ext/fts5/test/fts5integrity.test f5e4f8d284385875068ad0f3e894ce43e9de835d F ext/fts5/test/fts5matchinfo.test f7dde99697bcb310ea8faa8eb2714d9f4dfc0e1b F ext/fts5/test/fts5merge.test 9f65f090d214ff865c56bef4f864aaa1182af6e3 F ext/fts5/test/fts5merge2.test a6da3c16d694235938d1939f503cfa53f0943d75 +F ext/fts5/test/fts5multiclient.test 5bd54a6bc8ff818be233a50a8dec93da99098f2a F ext/fts5/test/fts5near.test b214cddb1c1f1bddf45c75af768f20145f7e71cc F ext/fts5/test/fts5onepass.test 7ed9608e258132cb8d55e7c479b08676ad68810c F ext/fts5/test/fts5optimize.test 9d3ac53bb9cae58cb070d795db86bcb2f9fec105 @@ -1456,7 +1457,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6c4a17b963916d19c9433d7a251338042f32e9fa -R bc1955b591517ca84e5bb3a7a87f0726 +P 020a0bda59fe93b9361ceeed0d5a8ba4177380c8 +R f14c9b8edfca8f7bf113e7bd0b21996b U dan -Z 380059b0b3811052efb55863df364c4f +Z d493def8e880a32e2aca451bc5e776cf diff --git a/manifest.uuid b/manifest.uuid index d6022948ee..91ed807a0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -020a0bda59fe93b9361ceeed0d5a8ba4177380c8 \ No newline at end of file +7832466f9177cca59455ba272802145297fcd53d \ No newline at end of file From 3c6707f72b6efeaa7b3933fae427010a444914cb Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Mar 2016 15:18:13 +0000 Subject: [PATCH 04/19] Rearrange code so that tests pass whether SQLITE_DEBUG is defined or not. FossilOrigin-Name: 89296a46c3b891ee0b637ff6f89d828d6e46e7b5 --- ext/fts5/fts5_index.c | 15 +++++++-------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 3fb1458526..eb1d3c4b61 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1019,17 +1019,14 @@ static i64 fts5IndexDataVersion(Fts5Index *p){ ** is called, it is a no-op. */ static Fts5Structure *fts5StructureRead(Fts5Index *p){ - Fts5Structure *pRet; /* Object to return */ if( p->pStruct==0 ){ p->iStructVersion = fts5IndexDataVersion(p); if( p->rc==SQLITE_OK ){ - p->pStruct = pRet = fts5StructureReadUncached(p); + p->pStruct = fts5StructureReadUncached(p); } - if( p->rc!=SQLITE_OK ) return 0; - assert( p->iStructVersion!=0 ); - assert( p->pStruct!=0 ); } + #ifdef SQLITE_DEBUG else{ Fts5Structure *pTest = fts5StructureReadUncached(p); @@ -1053,9 +1050,11 @@ static Fts5Structure *fts5StructureRead(Fts5Index *p){ } #endif - pRet = p->pStruct; - fts5StructureRef(pRet); - return pRet; + if( p->rc!=SQLITE_OK ) return 0; + assert( p->iStructVersion!=0 ); + assert( p->pStruct!=0 ); + fts5StructureRef(p->pStruct); + return p->pStruct; } static void fts5StructureInvalidate(Fts5Index *p){ diff --git a/manifest b/manifest index 346832e33f..65691a0210 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\sfile\sfts5multiclient.test. -D 2016-03-19T14:47:28.441 +C Rearrange\scode\sso\sthat\stests\spass\swhether\sSQLITE_DEBUG\sis\sdefined\sor\snot. +D 2016-03-21T15:18:13.028 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 35e9d92c89e7c7ea0759b73d24da1ecb7630a24b F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c afac2ffe3198776626b99366e18af1f32ea9eb85 +F ext/fts5/fts5_index.c 39939320ee5185cbfd0a8c8c7e1c878ebde7c43d F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 F ext/fts5/fts5_storage.c a3361410422e69639ca2bcd5a56a0933dadf84d2 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 @@ -1457,7 +1457,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 020a0bda59fe93b9361ceeed0d5a8ba4177380c8 -R f14c9b8edfca8f7bf113e7bd0b21996b +P 7832466f9177cca59455ba272802145297fcd53d +R e2f3ffc019af1c2320d4d618c0233909 U dan -Z d493def8e880a32e2aca451bc5e776cf +Z 04b6e502bb8ccbe0b89bf7d08daf8ee8 diff --git a/manifest.uuid b/manifest.uuid index 91ed807a0b..62bde4070e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7832466f9177cca59455ba272802145297fcd53d \ No newline at end of file +89296a46c3b891ee0b637ff6f89d828d6e46e7b5 \ No newline at end of file From 6369bc3fbb0e561b0df0f10f9c9601218388074a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Mar 2016 16:06:42 +0000 Subject: [PATCH 05/19] Remove an unreachable branch from the unlink verification logic in the UNIX VFS. FossilOrigin-Name: 4dc30cce7fdb7dba9a9aad96bb8b499b965610b2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5d26916c17..2357dbffd8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sfts5\scache\sthe\sstructure\sof\sits\sindex\sin\smain\smemory.\sUse\s"PRAGMA\sdata_version"\sto\sfigure\sout\swhen\sthis\scache\sshould\sbe\sinvalidated. -D 2016-03-21T15:30:50.247 +C Remove\san\sunreachable\sbranch\sfrom\sthe\sunlink\sverification\slogic\sin\sthe\sUNIX\nVFS. +D 2016-03-21T16:06:42.310 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -336,7 +336,7 @@ F src/os.c ca10edb445ad2c5fdc7285b49d72bcdf261fa23e F src/os.h 91ff889115ecd01f436d3611f7f5ea4dc12d92f1 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa -F src/os_unix.c 50103f69121bca969761b821e2b0e393b55fe869 +F src/os_unix.c b1ccb273771f41dbdbe0ba7c1ad63c38ad5972ec F src/os_win.c 551d973ada67127430e41d9e514e53f6beb6c5a7 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca F src/pager.c 38718a019ca762ba4f6795425d5a54db70d1790d @@ -1458,7 +1458,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4bd12b57ea177cfb1f44d54bfa7aedfb8a8c0c64 89296a46c3b891ee0b637ff6f89d828d6e46e7b5 -R 81b99f33bb0a77bc5e744352db10978f -U dan -Z db5fc495668353fb57116ffc2b5d2027 +P 902f221754f3cc6fb4ae049c135f85efce604ed3 +R 36c20d433515aed31fbc005a13e11c2d +U drh +Z 514dfe801f60757ebd0519594eb7ecde diff --git a/manifest.uuid b/manifest.uuid index fb9fd2a351..4d4fd3e0b6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -902f221754f3cc6fb4ae049c135f85efce604ed3 \ No newline at end of file +4dc30cce7fdb7dba9a9aad96bb8b499b965610b2 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index d593b952f5..6d1bb0b46d 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1366,7 +1366,7 @@ static void verifyDbFile(unixFile *pFile){ sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); return; } - if( buf.st_nlink==0 && (pFile->ctrlFlags & UNIXFILE_DELETE)==0 ){ + if( buf.st_nlink==0 ){ sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); return; } From 4567beefac9c044f9cb80f1c5c3ce1d565bb3c3f Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Mar 2016 16:19:29 +0000 Subject: [PATCH 06/19] Skip recently added test cases in nolock.test when running in the inmemory_journal permutation. FossilOrigin-Name: a1dcf7af42bb7394d46138318f9367fe9e8be560 --- manifest | 12 +++++----- manifest.uuid | 2 +- test/nolock.test | 61 +++++++++++++++++++++++++----------------------- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index 2357dbffd8..78be64c56a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sfrom\sthe\sunlink\sverification\slogic\sin\sthe\sUNIX\nVFS. -D 2016-03-21T16:06:42.310 +C Skip\srecently\sadded\stest\scases\sin\snolock.test\swhen\srunning\sin\nthe\sinmemory_journal\spermutation. +D 2016-03-21T16:19:29.587 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -918,7 +918,7 @@ F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test dacc57f80859c06a433d30839336fe227d2038b3 -F test/nolock.test 96e922d2d3db71c2dd6557c98e8027a28277b415 +F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 @@ -1458,7 +1458,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 902f221754f3cc6fb4ae049c135f85efce604ed3 -R 36c20d433515aed31fbc005a13e11c2d +P 4dc30cce7fdb7dba9a9aad96bb8b499b965610b2 +R 1f352d94053f76691b11c27a8d4a5d8f U drh -Z 514dfe801f60757ebd0519594eb7ecde +Z d3631fb4e80d910681e8351d2aa12531 diff --git a/manifest.uuid b/manifest.uuid index 4d4fd3e0b6..2c79e1a3ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4dc30cce7fdb7dba9a9aad96bb8b499b965610b2 \ No newline at end of file +a1dcf7af42bb7394d46138318f9367fe9e8be560 \ No newline at end of file diff --git a/test/nolock.test b/test/nolock.test index fdaef6ef07..e732dcf13b 100644 --- a/test/nolock.test +++ b/test/nolock.test @@ -183,35 +183,38 @@ db2 close db close tvfs delete -# 2016-03-11: Make sure all works when transitioning to WAL mode under nolock. -# -do_test nolock-4.1 { - forcedelete test.db - sqlite3 db file:test.db?nolock=1 -uri 1 - db eval { - PRAGMA journal_mode=WAL; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('youngling'); - SELECT * FROM t1; - } -} {delete youngling} -db close - -do_test nolock-4.2 { - forcedelete test.db - sqlite3 db test.db - db eval { - PRAGMA journal_mode=WAL; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES('catbird'); - SELECT * FROM t1; - } -} {wal catbird} -do_test nolock-4.3 { +if {[permutation]!="inmemory_journal"} { + # 2016-03-11: Make sure all works when transitioning to WAL mode + # under nolock. + # + do_test nolock-4.1 { + forcedelete test.db + sqlite3 db file:test.db?nolock=1 -uri 1 + db eval { + PRAGMA journal_mode=WAL; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('youngling'); + SELECT * FROM t1; + } + } {delete youngling} db close - sqlite3 db file:test.db?nolock=1 -uri 1 - set rc [catch {db eval {SELECT * FROM t1}} msg] - lappend rc $msg -} {1 {unable to open database file}} + + do_test nolock-4.2 { + forcedelete test.db + sqlite3 db test.db + db eval { + PRAGMA journal_mode=WAL; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('catbird'); + SELECT * FROM t1; + } + } {wal catbird} + do_test nolock-4.3 { + db close + sqlite3 db file:test.db?nolock=1 -uri 1 + set rc [catch {db eval {SELECT * FROM t1}} msg] + lappend rc $msg + } {1 {unable to open database file}} +} finish_test From 6737aab5cfd17cfc7819e8fdd00463bbbff34aad Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Mar 2016 16:25:34 +0000 Subject: [PATCH 07/19] Add tests to ensure that fts5 is now deterministic. FossilOrigin-Name: 3d076094ce411bffcfeb76c0284d15d0f83bd459 --- ext/fts5/test/fts5determin.test | 67 +++++++++++++++++++++++++++++++++ manifest | 13 ++++--- manifest.uuid | 2 +- 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 ext/fts5/test/fts5determin.test diff --git a/ext/fts5/test/fts5determin.test b/ext/fts5/test/fts5determin.test new file mode 100644 index 0000000000..e368c4704e --- /dev/null +++ b/ext/fts5/test/fts5determin.test @@ -0,0 +1,67 @@ +# 2016 March 21 +# +# 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. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# +# Specifically, that the fts5 module is deterministic. At one point, when +# segment ids were allocated using sqlite3_randomness(), this was not the +# case. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5aa +return_if_no_fts5 + +proc do_determin_test {tn} { + uplevel [list + do_execsql_test $tn { + SELECT (SELECT md5sum(id, block) FROM t1_data)== + (SELECT md5sum(id, block) FROM t2_data), + (SELECT md5sum(id, block) FROM t1_data)== + (SELECT md5sum(id, block) FROM t3_data) + } {1 1} + ] +} + +foreach_detail_mode $::testprefix { + do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a, b, prefix="1 2", detail=%DETAIL%); + CREATE VIRTUAL TABLE t2 USING fts5(a, b, prefix="1 2", detail=%DETAIL%); + CREATE VIRTUAL TABLE t3 USING fts5(a, b, prefix="1 2", detail=%DETAIL%); + } + + do_test 1.1 { + foreach t {t1 t2 t3} { + execsql [string map [list TBL $t] { + INSERT INTO TBL VALUES('a b c', 'd e f'); + INSERT INTO TBL VALUES('c1 c2 c3', 'c1 c2 c3'); + INSERT INTO TBL VALUES('xyzxyzxyz', 'xyzxyzxyz'); + }] + } + } {} + + do_determin_test 1.2 + + do_test 1.3 { + foreach t {t1 t2 t3} { + execsql [string map [list TBL $t] { + INSERT INTO TBL(TBL) VALUES('optimize'); + }] + } + } {} + + do_determin_test 1.4 +} + + +finish_test + + diff --git a/manifest b/manifest index 78be64c56a..7fca6a827a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Skip\srecently\sadded\stest\scases\sin\snolock.test\swhen\srunning\sin\nthe\sinmemory_journal\spermutation. -D 2016-03-21T16:19:29.587 +C Add\stests\sto\sensure\sthat\sfts5\sis\snow\sdeterministic. +D 2016-03-21T16:25:34.085 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -143,6 +143,7 @@ F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62 F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c F ext/fts5/test/fts5corrupt3.test f77f65e386231daf62902466b40ff998b2c8ce4f F ext/fts5/test/fts5detail.test ef5c690535a797413acaf5ad9b8ab5d49972df69 +F ext/fts5/test/fts5determin.test 10648edb75ef1e196b10978fd21a9be0c31e09c3 F ext/fts5/test/fts5dlidx.test 007e9390c94638760797dbec2990c97c3fa08dfe F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 @@ -1458,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4dc30cce7fdb7dba9a9aad96bb8b499b965610b2 -R 1f352d94053f76691b11c27a8d4a5d8f -U drh -Z d3631fb4e80d910681e8351d2aa12531 +P a1dcf7af42bb7394d46138318f9367fe9e8be560 +R d12464ec7adc7a5a41759a981f3bde86 +U dan +Z 8af492a5f67a993085e11843c854eec0 diff --git a/manifest.uuid b/manifest.uuid index 2c79e1a3ec..eacdf09ef0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1dcf7af42bb7394d46138318f9367fe9e8be560 \ No newline at end of file +3d076094ce411bffcfeb76c0284d15d0f83bd459 \ No newline at end of file From 13969f5af0583fc3d661297d2d90ae4a0ef11103 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Mar 2016 22:28:51 +0000 Subject: [PATCH 08/19] Fix harmless compiler warnings. FossilOrigin-Name: 25d776e4523aefeec007943fe29aa17c23ccb301 --- ext/fts5/fts5_index.c | 2 +- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/memjournal.c | 2 +- src/sqliteInt.h | 8 ++++++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 2e8349d51c..f0751bd655 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4603,7 +4603,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( if( pNew ){ Fts5StructureLevel *pLvl; - int nByte = nSeg * sizeof(Fts5StructureSegment); + nByte = nSeg * sizeof(Fts5StructureSegment); pNew->nLevel = pStruct->nLevel+1; pNew->nRef = 1; pNew->nWriteCounter = pStruct->nWriteCounter; diff --git a/manifest b/manifest index 7fca6a827a..8624bb132c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sto\sensure\sthat\sfts5\sis\snow\sdeterministic. -D 2016-03-21T16:25:34.085 +C Fix\sharmless\scompiler\swarnings. +D 2016-03-21T22:28:51.426 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 35e9d92c89e7c7ea0759b73d24da1ecb7630a24b F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c 40fde2538deeb7f018435c1d1bacf057f89c3c42 +F ext/fts5/fts5_index.c 0fe734b1e2574fdbcfad4d71f861b8598dd7f91b F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 F ext/fts5/fts5_storage.c 98e3129047d250fc5acc4a4ba7ba4fde9b0ae030 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 @@ -325,7 +325,7 @@ F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memjournal.c 6423a0817ffd8c7a04ef9e5fb974b6b9dd71f8b6 +F src/memjournal.c 5253fd4335a8d9c64e5df25cb9da6329af5242c7 F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495 F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 @@ -358,7 +358,7 @@ F src/shell.c 5e0ab1e708dc294330ccd8230536e1801f60822e F src/sqlite.h.in e877f141b15ef68ef28f84714e69d7234f9a071e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2 -F src/sqliteInt.h 4eb80a9b9a512180a9739f99d754915e03d8091a +F src/sqliteInt.h 47847a919790e2a30bb1dfb89ba0dc59fc6ed0be F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a1dcf7af42bb7394d46138318f9367fe9e8be560 -R d12464ec7adc7a5a41759a981f3bde86 -U dan -Z 8af492a5f67a993085e11843c854eec0 +P 3d076094ce411bffcfeb76c0284d15d0f83bd459 +R 8b7871914efe43742b6c5e5d156225cc +U drh +Z 74feddb89c21c363d080129c819f5a2b diff --git a/manifest.uuid b/manifest.uuid index eacdf09ef0..adb1b4e66e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d076094ce411bffcfeb76c0284d15d0f83bd459 \ No newline at end of file +25d776e4523aefeec007943fe29aa17c23ccb301 \ No newline at end of file diff --git a/src/memjournal.c b/src/memjournal.c index b81682de85..4f0efc174e 100644 --- a/src/memjournal.c +++ b/src/memjournal.c @@ -403,5 +403,5 @@ int sqlite3JournalIsInMemory(sqlite3_file *p){ ** pVfs to create the underlying on-disk files. */ int sqlite3JournalSize(sqlite3_vfs *pVfs){ - return MAX(pVfs->szOsFile, sizeof(MemJournal)); + return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index fc36d8d091..858f737356 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -583,8 +583,12 @@ /* ** Macros to compute minimum and maximum of two numbers. */ -#define MIN(A,B) ((A)<(B)?(A):(B)) -#define MAX(A,B) ((A)>(B)?(A):(B)) +#ifndef MIN +# define MIN(A,B) ((A)<(B)?(A):(B)) +#endif +#ifndef MAX +# define MAX(A,B) ((A)>(B)?(A):(B)) +#endif /* ** Swap two objects of type TYPE. From 0b98207c5b7ef2ac85cc06e4971a5393c4cffd57 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Mar 2016 14:10:45 +0000 Subject: [PATCH 09/19] Avoid the possibility of integer overflow on a pointer comparison test for corruption in the database file. FossilOrigin-Name: ff1b1ac3313ba9d70414e928ef3dd82913298a1a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 9 +++++++-- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8624bb132c..d6d21ac7ef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2016-03-21T22:28:51.426 +C Avoid\sthe\spossibility\sof\sinteger\soverflow\son\sa\spointer\scomparison\stest\sfor\ncorruption\sin\sthe\sdatabase\sfile. +D 2016-03-22T14:10:45.052 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -297,7 +297,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c f60f0aa55d25d853ffde53d0b0370a7bb7ee41ce F src/bitvec.c 3ee4c8b2c94ed3a7377256e18199e6ff5cf33f63 F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 -F src/btree.c 6eee126fe9d1f57118de9be2be840a4c6e691828 +F src/btree.c 5753da53071b5d5a8ace8fd9ea7a54cefeb8187b F src/btree.h a5008b9afe56e8e54ade6c436a910f112defcca9 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 F src/build.c 213cbf84e99dd834e6ea46615633656d7ef79321 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3d076094ce411bffcfeb76c0284d15d0f83bd459 -R 8b7871914efe43742b6c5e5d156225cc +P 25d776e4523aefeec007943fe29aa17c23ccb301 +R 7b06b50bff5ae9500629c34b0d5509bb U drh -Z 74feddb89c21c363d080129c819f5a2b +Z 3c0767287744fc9671f0ea1849fc5941 diff --git a/manifest.uuid b/manifest.uuid index adb1b4e66e..bf5169d0f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25d776e4523aefeec007943fe29aa17c23ccb301 \ No newline at end of file +ff1b1ac3313ba9d70414e928ef3dd82913298a1a \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 18e6be9f38..3e29f8469d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4472,8 +4472,13 @@ static int accessPayload( #endif assert( offset+amt <= pCur->info.nPayload ); - if( &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] ){ - /* Trying to read or write past the end of the data is an error */ + assert( aPayload > pPage->aData ); + if( (aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + /* Trying to read or write past the end of the data is an error. The + ** conditional above is really: + ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] + ** but is recast into its current form to avoid integer overflow problems + */ return SQLITE_CORRUPT_BKPT; } From 3bfa7e82b618fea9904cb5c36bff3b9bf311bab9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Mar 2016 14:37:59 +0000 Subject: [PATCH 10/19] Create the "uptr" typedef (the same as uintptr_t when available) and use it to cast pointers before comparison. FossilOrigin-Name: 2484cc0c3ffc8834a155f89af1581bd07d453a90 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 4 ++-- src/sqliteInt.h | 36 +++++++++++++++++++++--------------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index d6d21ac7ef..6c9eb30c1e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sthe\spossibility\sof\sinteger\soverflow\son\sa\spointer\scomparison\stest\sfor\ncorruption\sin\sthe\sdatabase\sfile. -D 2016-03-22T14:10:45.052 +C Create\sthe\s"uptr"\stypedef\s(the\ssame\sas\suintptr_t\swhen\savailable)\sand\suse\sit\nto\scast\spointers\sbefore\scomparison. +D 2016-03-22T14:37:59.457 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -297,7 +297,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c f60f0aa55d25d853ffde53d0b0370a7bb7ee41ce F src/bitvec.c 3ee4c8b2c94ed3a7377256e18199e6ff5cf33f63 F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 -F src/btree.c 5753da53071b5d5a8ace8fd9ea7a54cefeb8187b +F src/btree.c 8a02b1fb98eb11b9ce50cb3ab6a031f852b69303 F src/btree.h a5008b9afe56e8e54ade6c436a910f112defcca9 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 F src/build.c 213cbf84e99dd834e6ea46615633656d7ef79321 @@ -358,7 +358,7 @@ F src/shell.c 5e0ab1e708dc294330ccd8230536e1801f60822e F src/sqlite.h.in e877f141b15ef68ef28f84714e69d7234f9a071e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2 -F src/sqliteInt.h 47847a919790e2a30bb1dfb89ba0dc59fc6ed0be +F src/sqliteInt.h cb02015eac6d642bd23d8cbd76cc116635c17540 F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 25d776e4523aefeec007943fe29aa17c23ccb301 -R 7b06b50bff5ae9500629c34b0d5509bb +P ff1b1ac3313ba9d70414e928ef3dd82913298a1a +R db2868426a9aae9f4cc9b8c065b04b6c U drh -Z 3c0767287744fc9671f0ea1849fc5941 +Z 0cd59c36c28d6740a5e8b1f16f08075a diff --git a/manifest.uuid b/manifest.uuid index bf5169d0f4..b4fc72f392 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ff1b1ac3313ba9d70414e928ef3dd82913298a1a \ No newline at end of file +2484cc0c3ffc8834a155f89af1581bd07d453a90 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 3e29f8469d..1a82176f18 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2360,12 +2360,12 @@ int sqlite3BtreeOpen( for(i=0; inDb; i++){ if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){ while( pSib->pPrev ){ pSib = pSib->pPrev; } - if( p->pBtpBt ){ + if( (uptr)p->pBt<(uptr)pSib->pBt ){ p->pNext = pSib; p->pPrev = 0; pSib->pPrev = p; }else{ - while( pSib->pNext && pSib->pNext->pBtpBt ){ + while( pSib->pNext && (uptr)pSib->pNext->pBt<(uptr)p->pBt ){ pSib = pSib->pNext; } p->pNext = pSib->pNext; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 858f737356..d256262b05 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -181,21 +181,6 @@ # define SQLITE_PTR_TO_INT(X) ((int)(X)) #endif -/* -** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to -** something between S (inclusive) and E (exclusive). -** -** In other words, S is a buffer and E is a pointer to the first byte after -** the end of buffer S. This macro returns true if P points to something -** contained within the buffer S. -*/ -#if defined(HAVE_STDINT_H) -# define SQLITE_WITHIN(P,S,E) \ - ((uintptr_t)(P)>=(uintptr_t)(S) && (uintptr_t)(P)<(uintptr_t)(E)) -#else -# define SQLITE_WITHIN(P,S,E) ((P)>=(S) && (P)<(E)) -#endif - /* ** A macro to hint to the compiler that a function should not be ** inlined. @@ -717,6 +702,27 @@ typedef INT16_TYPE LogEst; # endif #endif +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +/* +** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to +** something between S (inclusive) and E (exclusive). +** +** In other words, S is a buffer and E is a pointer to the first byte after +** the end of buffer S. This macro returns true if P points to something +** contained within the buffer S. +*/ +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) + + /* ** Macros to determine whether the machine is big or little endian, ** and whether or not that determination is run-time or compile-time. From 0a2f2b546a1615c257351a872cda726f5d56a075 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Mar 2016 15:01:54 +0000 Subject: [PATCH 11/19] Fix some errors in fts5 test scripts. FossilOrigin-Name: e1ab2d376a72786098125a41c1ea8140fcbd15c6 --- ext/fts5/fts5_index.c | 2 +- ext/fts5/test/fts5aa.test | 9 ++++++++- ext/fts5/test/fts5fault4.test | 2 +- ext/fts5/test/fts5simple.test | 6 +++--- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index f0751bd655..d08e65bfe6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1027,7 +1027,7 @@ static Fts5Structure *fts5StructureRead(Fts5Index *p){ } } -#ifdef SQLITE_DEBUG +#if 0 else{ Fts5Structure *pTest = fts5StructureReadUncached(p); if( pTest ){ diff --git a/ext/fts5/test/fts5aa.test b/ext/fts5/test/fts5aa.test index fdcf08398d..428ca6c1ea 100644 --- a/ext/fts5/test/fts5aa.test +++ b/ext/fts5/test/fts5aa.test @@ -432,9 +432,16 @@ proc funk {} { } db func funk funk +# This test case corrupts the structure record within the first invocation +# of function funk(). Which used to cause the bm25() function to throw an +# exception. But since bm25() can now used the cached structure record, +# it never sees the corruption introduced by funk() and so the following +# statement no longer fails. +# do_catchsql_test 16.2 { SELECT funk(), bm25(n1), funk() FROM n1 WHERE n1 MATCH 'a+b+c+d' -} {1 {SQL logic error or missing database}} +} {0 {{} -1e-06 {}}} +# {1 {SQL logic error or missing database}} #------------------------------------------------------------------------- # diff --git a/ext/fts5/test/fts5fault4.test b/ext/fts5/test/fts5fault4.test index acc43ebfc6..bfa54a5b04 100644 --- a/ext/fts5/test/fts5fault4.test +++ b/ext/fts5/test/fts5fault4.test @@ -86,7 +86,7 @@ set ::res [db eval {SELECT rowid, x1 FROM x1 WHERE x1 MATCH '*reads'}] do_faultsim_test 4 -faults oom-* -body { db eval {SELECT rowid, x, x1 FROM x1 WHERE x1 MATCH '*reads'} } -test { - faultsim_test_result {0 {0 {} 4}} + faultsim_test_result {0 {0 {} 3}} } #------------------------------------------------------------------------- diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 464b601548..3483e40ba5 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -340,7 +340,7 @@ do_test 14.2 { #------------------------------------------------------------------------- db func rnddoc fts5_rnddoc -do_execsql_test 4.0 { +do_execsql_test 14.3 { CREATE VIRTUAL TABLE x1 USING fts5(x); INSERT INTO x1(x1, rank) VALUES('pgsz', 32); @@ -348,9 +348,9 @@ do_execsql_test 4.0 { INSERT INTO x1 SELECT rnddoc(5) FROM ii; } -do_execsql_test 4.1 { +do_execsql_test 14.4 { SELECT rowid, x, x1 FROM x1 WHERE x1 MATCH '*reads' -} {0 {} 4} +} {0 {} 3} #------------------------------------------------------------------------- reset_db diff --git a/manifest b/manifest index 6c9eb30c1e..358587aaa3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Create\sthe\s"uptr"\stypedef\s(the\ssame\sas\suintptr_t\swhen\savailable)\sand\suse\sit\nto\scast\spointers\sbefore\scomparison. -D 2016-03-22T14:37:59.457 +C Fix\ssome\serrors\sin\sfts5\stest\sscripts. +D 2016-03-22T15:01:54.312 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 35e9d92c89e7c7ea0759b73d24da1ecb7630a24b F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c 0fe734b1e2574fdbcfad4d71f861b8598dd7f91b +F ext/fts5/fts5_index.c 19df86d29d24cc56bfb01a6a07dcaac227d2fcdf F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 F ext/fts5/fts5_storage.c 98e3129047d250fc5acc4a4ba7ba4fde9b0ae030 F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 @@ -117,7 +117,7 @@ F ext/fts5/fts5_vocab.c dba72ca393d71c2588548b51380387f6b44c77a8 F ext/fts5/fts5parse.y fcc5e92e570d38cab38488b2109cbf67468923b2 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 7e814df4a0e6c22a6fe2d84f210fdc0b5068a084 +F ext/fts5/test/fts5aa.test bd2d88182b9f7f30d300044048ad14683306b745 F ext/fts5/test/fts5ab.test 30325a89453280160106be411bba3acf138e6d1b F ext/fts5/test/fts5ac.test 55cad4275a1f5acabfe14d8442a8046b47e49e5f F ext/fts5/test/fts5ad.test 36995f0586f30f5602074e012b9224c71ec5171c @@ -151,7 +151,7 @@ F ext/fts5/test/fts5eb.test c516ae0c934be6fd29ec95ea8b5f11f461311535 F ext/fts5/test/fts5fault1.test e09040d3e17b8c0837101e8c79c8a874c4376fb7 F ext/fts5/test/fts5fault2.test d8c6c7f916ccbdfc10b2c69530e9dd3bc8313232 F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3 -F ext/fts5/test/fts5fault4.test 532b6dacb963016cbf7003196bd87fb366540277 +F ext/fts5/test/fts5fault4.test dcbe3043c5611edd350191ea03a8daa190f0de5a F ext/fts5/test/fts5fault5.test 10c13a783de3f42a21e3e53e123b62ed0c3a1618 F ext/fts5/test/fts5fault6.test 9682664d679643ac6736e90c225526cc84073cda F ext/fts5/test/fts5fault7.test cb14ea3c1f42394f06f2284abc58eecee6ff8080 @@ -180,7 +180,7 @@ F ext/fts5/test/fts5rank.test 7e9e64eac7245637f6f2033aec4b292aaf611aab F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 16908a99d6efc9ba21081b4f2b86b3fc699839a6 -F ext/fts5/test/fts5simple.test ac5006cc3d0d08b3538e1e76c7300de9f24fbed1 +F ext/fts5/test/fts5simple.test 5b7b05bcc89bcb718a0fc7f473092d3513cc8e19 F ext/fts5/test/fts5simple2.test 98377ae1ff7749a42c21fe1a139c1ed312522c46 F ext/fts5/test/fts5simple3.test 8e71733b3d1b0e695011d02c68ebc5ca40b6124e F ext/fts5/test/fts5synonym.test 6475d189c2e20d60795808f83e36bf9318708d48 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ff1b1ac3313ba9d70414e928ef3dd82913298a1a -R db2868426a9aae9f4cc9b8c065b04b6c -U drh -Z 0cd59c36c28d6740a5e8b1f16f08075a +P 2484cc0c3ffc8834a155f89af1581bd07d453a90 +R ab98ce57ff7e19fbcedd913d7355f5be +U dan +Z e1d6ab80a5a2193f9db22bd77af06553 diff --git a/manifest.uuid b/manifest.uuid index b4fc72f392..43213d63e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2484cc0c3ffc8834a155f89af1581bd07d453a90 \ No newline at end of file +e1ab2d376a72786098125a41c1ea8140fcbd15c6 \ No newline at end of file From c5e7f94494a27bc13b5f62584101166e91ebdcf4 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Mar 2016 15:25:16 +0000 Subject: [PATCH 12/19] Fix a harmless compiler warning. FossilOrigin-Name: 5ace870d3ac3e9eb29cb4602c9036873adbcb99d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 358587aaa3..1fb0bc726f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\serrors\sin\sfts5\stest\sscripts. -D 2016-03-22T15:01:54.312 +C Fix\sa\sharmless\scompiler\swarning. +D 2016-03-22T15:25:16.949 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -297,7 +297,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c f60f0aa55d25d853ffde53d0b0370a7bb7ee41ce F src/bitvec.c 3ee4c8b2c94ed3a7377256e18199e6ff5cf33f63 F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 -F src/btree.c 8a02b1fb98eb11b9ce50cb3ab6a031f852b69303 +F src/btree.c 577fb5674e2f0aa0a38246afc19e1885a0b8c9b0 F src/btree.h a5008b9afe56e8e54ade6c436a910f112defcca9 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 F src/build.c 213cbf84e99dd834e6ea46615633656d7ef79321 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2484cc0c3ffc8834a155f89af1581bd07d453a90 -R ab98ce57ff7e19fbcedd913d7355f5be -U dan -Z e1d6ab80a5a2193f9db22bd77af06553 +P e1ab2d376a72786098125a41c1ea8140fcbd15c6 +R bdaff546f18a9832fa859fa7ed0eb2c5 +U drh +Z e5f40ebb5a86d8be765f1d7f6d3191da diff --git a/manifest.uuid b/manifest.uuid index 43213d63e1..a62797cd9e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e1ab2d376a72786098125a41c1ea8140fcbd15c6 \ No newline at end of file +5ace870d3ac3e9eb29cb4602c9036873adbcb99d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 1a82176f18..bf99597095 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4473,7 +4473,7 @@ static int accessPayload( assert( offset+amt <= pCur->info.nPayload ); assert( aPayload > pPage->aData ); - if( (aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ /* Trying to read or write past the end of the data is an error. The ** conditional above is really: ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] From 527b0435fabe2795865d52e4db827173a1cb2d65 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 22 Mar 2016 15:26:03 +0000 Subject: [PATCH 13/19] Fix harmless compiler warning for MSVC. FossilOrigin-Name: 142cd359d37f1d8d53de32e329523d9a93c7d6e5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_win.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1fb0bc726f..8de110620f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning. -D 2016-03-22T15:25:16.949 +C Fix\sharmless\scompiler\swarning\sfor\sMSVC. +D 2016-03-22T15:26:03.280 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -338,7 +338,7 @@ F src/os.h 91ff889115ecd01f436d3611f7f5ea4dc12d92f1 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c b1ccb273771f41dbdbe0ba7c1ad63c38ad5972ec -F src/os_win.c 551d973ada67127430e41d9e514e53f6beb6c5a7 +F src/os_win.c 17493f12b0b023c2d5a349b6860009f0d45e08d6 F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca F src/pager.c 38718a019ca762ba4f6795425d5a54db70d1790d F src/pager.h e1d38a2f14849e219df0f91f8323504d134c8a56 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e1ab2d376a72786098125a41c1ea8140fcbd15c6 -R bdaff546f18a9832fa859fa7ed0eb2c5 -U drh -Z e5f40ebb5a86d8be765f1d7f6d3191da +P 5ace870d3ac3e9eb29cb4602c9036873adbcb99d +R 005c1e5cbc7587970df3ccd3cc730064 +U mistachkin +Z 4de36823f78a549c0eee8008ed054760 diff --git a/manifest.uuid b/manifest.uuid index a62797cd9e..7b06c9c521 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5ace870d3ac3e9eb29cb4602c9036873adbcb99d \ No newline at end of file +142cd359d37f1d8d53de32e329523d9a93c7d6e5 \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index fd95c00e3a..3f9fefcac4 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -5425,7 +5425,7 @@ static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ UNUSED_PARAMETER(pVfs); memset(zBuf, 0, nBuf); #if defined(_MSC_VER) && _MSC_VER>=1400 - rand_s((int*)zBuf); /* rand_s() is not available with MinGW */ + rand_s((unsigned int*)zBuf); /* rand_s() is not available with MinGW */ #endif /* defined(_MSC_VER) && _MSC_VER>=1400 */ e.a = (unsigned char*)zBuf; e.na = nBuf; From d7564865adc966c21fcdc10ea5ee5bb5910c46da Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Mar 2016 20:05:09 +0000 Subject: [PATCH 14/19] The sqlite3_column_decltype() routine should return NULL, not an empty string, if the column has no declared type. FossilOrigin-Name: 605eba4a756e7185119088e2242f82691d078b01 --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/build.c | 15 ++++++++------- src/main.c | 3 +-- src/pragma.c | 6 ++---- src/select.c | 4 ++-- src/sqliteInt.h | 3 ++- src/util.c | 12 ++++++++---- src/vtab.c | 20 +++++++------------- 9 files changed, 44 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index 8de110620f..19c00ee626 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sfor\sMSVC. -D 2016-03-22T15:26:03.280 +C The\ssqlite3_column_decltype()\sroutine\sshould\sreturn\sNULL,\snot\san\sempty\sstring,\nif\sthe\scolumn\shas\sno\sdeclared\stype. +D 2016-03-22T20:05:09.546 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -300,7 +300,7 @@ F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73 F src/btree.c 577fb5674e2f0aa0a38246afc19e1885a0b8c9b0 F src/btree.h a5008b9afe56e8e54ade6c436a910f112defcca9 F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5 -F src/build.c 213cbf84e99dd834e6ea46615633656d7ef79321 +F src/build.c 7d1a5e64fcd10110edc8ce9ffb710d06af0a59f5 F src/callback.c 2e76147783386374bf01b227f752c81ec872d730 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198 @@ -318,7 +318,7 @@ F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 F src/insert.c 723d5d708cdb61bdd47c00b9f07c75be45aefc09 F src/legacy.c 75d3023be8f0d2b99d60f905090341a03358c58e F src/loadext.c e70f8f9e97624a232870ea5486e682c813ac3002 -F src/main.c f6c6e61bfd4cc9306a737d0c5c3f1e0eaf6086e0 +F src/main.c 63791c66321f07b5828bb9161b477d5e0b511d7e F src/malloc.c 1443d1ad95d67c21d77af7ae3f44678252f0efec F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b @@ -346,19 +346,19 @@ F src/parse.y 5ea8c81c5c41b27887f41b4a7e1c58470d7d3821 F src/pcache.c 647bb53a86b7bbcf55ad88089b3ea5a9170b90df F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545 F src/pcache1.c c40cdb93586e21b5dd826b5e671240bd91c26b05 -F src/pragma.c e7e8f380efec6075a722822306435afc1eeca88a +F src/pragma.c faf42922bb7ab2f6672cb550356c1967abae3c84 F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c F src/prepare.c 22df6171aec1d86904ed2ad30c2348a5748aa04e F src/printf.c 63e6fb12bbe702dd664dc3703776c090383a5a26 F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c b8f7174e5f8c33c44ded3a25a973d0bb89228c20 F src/rowset.c 9fe4b3ad7cc00944386bb600233d8f523de07a6e -F src/select.c 6dd2097bb158efe3b8d68683dcc3b4a49e907a34 +F src/select.c 7849cee0a01952a9c93cd28989daedfa57731143 F src/shell.c 5e0ab1e708dc294330ccd8230536e1801f60822e F src/sqlite.h.in e877f141b15ef68ef28f84714e69d7234f9a071e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2 -F src/sqliteInt.h cb02015eac6d642bd23d8cbd76cc116635c17540 +F src/sqliteInt.h 3a68b48967a7d62fcb38572d27fd21ab4e4bcca3 F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 @@ -417,7 +417,7 @@ F src/treeview.c e4b41a37530a191579d3c53142cc44ee2eb99373 F src/trigger.c e14840ee0c3e549e758ec9bf3e4146e166002280 F src/update.c 56b3db7edff0110360a12b76af97c39ebe3ea8b8 F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c -F src/util.c cf7dce85ab9af5280b8a45985df2591efbfefe56 +F src/util.c 8873d696c9ccc4206058c402e09e101f1b81561a F src/vacuum.c feb1eabb20987983d9350cad98299b21fa811f52 F src/vdbe.c f19741f2d8b33e8f09cd2219570b6c9ed924c3f1 F src/vdbe.h 6f44193e7be52fd5f7c308175a936555b1e6b101 @@ -428,7 +428,7 @@ F src/vdbeblob.c 3b570b730109e8f653d9d2081649f6e7015113db F src/vdbemem.c fe76c1f866de362d9b8332e59d74aa44f6560d69 F src/vdbesort.c 307460bfa4de4d1c3901fcd42089159131e34062 F src/vdbetrace.c f75c5455d8cf389ef86a8bfdfd3177e0e3692484 -F src/vtab.c fd69fd398e23e57ea4ea377d8a44b6998fc569c7 +F src/vtab.c 23b6cdfa996152d43b390504ed4a942c8caf3a00 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 10deb6b43887662691e5f53d10b3c171c401169b F src/wal.h 2f7c831cf3b071fa548bf2d5cac640846a7ff19c @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5ace870d3ac3e9eb29cb4602c9036873adbcb99d -R 005c1e5cbc7587970df3ccd3cc730064 -U mistachkin -Z 4de36823f78a549c0eee8008ed054760 +P 142cd359d37f1d8d53de32e329523d9a93c7d6e5 +R 54bb94e9ede3ebe9fafd5624cdd5946f +U drh +Z 8ae8a72878a637ee00e9de9bf1db9104 diff --git a/manifest.uuid b/manifest.uuid index 7b06c9c521..43fdf15940 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -142cd359d37f1d8d53de32e329523d9a93c7d6e5 \ No newline at end of file +605eba4a756e7185119088e2242f82691d078b01 \ No newline at end of file diff --git a/src/build.c b/src/build.c index e89c744461..28eb55ab6c 100644 --- a/src/build.c +++ b/src/build.c @@ -1087,6 +1087,7 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ pCol->szEst = 1; }else{ pCol->affinity = sqlite3AffinityType(zType, &pCol->szEst); + pCol->colFlags |= COLFLAG_HASTYPE; } p->nCol++; pParse->constraintName.n = 0; @@ -1282,7 +1283,7 @@ void sqlite3AddPrimaryKey( int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ ){ Table *pTab = pParse->pNewTable; - const char *zName = 0; + Column *pCol = 0; int iCol = -1, i; int nTerm; if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit; @@ -1294,8 +1295,8 @@ void sqlite3AddPrimaryKey( pTab->tabFlags |= TF_HasPrimaryKey; if( pList==0 ){ iCol = pTab->nCol - 1; - pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY; - zName = pTab->aCol[iCol].zName; + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; nTerm = 1; }else{ nTerm = pList->nExpr; @@ -1307,8 +1308,8 @@ void sqlite3AddPrimaryKey( const char *zCName = pCExpr->u.zToken; for(iCol=0; iColnCol; iCol++){ if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ - pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY; - zName = pTab->aCol[iCol].zName; + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; break; } } @@ -1316,8 +1317,8 @@ void sqlite3AddPrimaryKey( } } if( nTerm==1 - && zName - && sqlite3StrICmp(sqlite3StrNext(zName), "INTEGER")==0 + && pCol + && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0 && sortOrder!=SQLITE_SO_DESC ){ pTab->iPKey = iCol; diff --git a/src/main.c b/src/main.c index 2e5ba08393..0c4cfbbea0 100644 --- a/src/main.c +++ b/src/main.c @@ -3343,8 +3343,7 @@ int sqlite3_table_column_metadata( ** explicitly declared column. Copy meta information from *pCol. */ if( pCol ){ - zDataType = sqlite3StrNext(pCol->zName); - if( zDataType[0]==0 ) zDataType = 0; + zDataType = sqlite3ColumnType(pCol,0); zCollSeq = pCol->zColl; notnull = pCol->notNull!=0; primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; diff --git a/src/pragma.c b/src/pragma.c index 65c43ad1e5..e0a0255ec0 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1066,7 +1066,6 @@ void sqlite3Pragma( setAllColumnNames(v, 6, azCol); assert( 6==ArraySize(azCol) ); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ - const char *zName; if( IsHiddenColumn(pCol) ){ nHidden++; continue; @@ -1079,11 +1078,10 @@ void sqlite3Pragma( for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); - zName = pCol->zName; sqlite3VdbeMultiLoad(v, 1, "issisi", i-nHidden, - zName, - sqlite3StrNext(zName), + pCol->zName, + sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, pCol->pDflt ? pCol->pDflt->u.zToken : 0, k); diff --git a/src/select.c b/src/select.c index a62581efc1..ed76f621f9 100644 --- a/src/select.c +++ b/src/select.c @@ -1430,7 +1430,7 @@ static const char *columnTypeImpl( zOrigCol = "rowid"; }else{ zOrigCol = pTab->aCol[iCol].zName; - zType = sqlite3StrNext(zOrigCol); + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); estWidth = pTab->aCol[iCol].szEst; } zOrigTab = pTab->zName; @@ -1442,7 +1442,7 @@ static const char *columnTypeImpl( if( iCol<0 ){ zType = "INTEGER"; }else{ - zType = sqlite3StrNext(pTab->aCol[iCol].zName); + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); estWidth = pTab->aCol[iCol].szEst; } #endif diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d256262b05..242ae8e2cf 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1604,6 +1604,7 @@ struct Column { */ #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ #define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ /* ** A "Collating Sequence" is defined by an instance of the following @@ -3307,7 +3308,7 @@ int sqlite3IsIdChar(u8); */ int sqlite3StrICmp(const char*,const char*); int sqlite3Strlen30(const char*); -const char *sqlite3StrNext(const char*); +char *sqlite3ColumnType(Column*,char*); #define sqlite3StrNICmp sqlite3_strnicmp int sqlite3MallocInit(void); diff --git a/src/util.c b/src/util.c index 428dfd046c..08b0c46a5c 100644 --- a/src/util.c +++ b/src/util.c @@ -110,11 +110,15 @@ int sqlite3Strlen30(const char *z){ } /* -** The string z[] is followed immediately by another string. Return -** a poiner to that other string. +** Return the declared type of a column. Or return zDflt if the column +** has no declared type. +** +** The column type is an extra string stored after the zero-terminator on +** the column name if and only if the COLFLAG_HASTYPE flag is set. */ -const char *sqlite3StrNext(const char *z){ - return z + strlen(z) + 1; +char *sqlite3ColumnType(Column *pCol, char *zDflt){ + if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt; + return pCol->zName + strlen(pCol->zName) + 1; } /* diff --git a/src/vtab.c b/src/vtab.c index ad8caef3bc..802a8cac3a 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -564,22 +564,16 @@ static int vtabCallConstructor( pTab->pVTable = pVTable; for(iCol=0; iColnCol; iCol++){ - char *zType = (char*)sqlite3StrNext(pTab->aCol[iCol].zName); + char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); int nType; int i = 0; - if( !zType[0] ){ - pTab->tabFlags |= oooHidden; - continue; - } nType = sqlite3Strlen30(zType); - if( sqlite3StrNICmp("hidden", zType, 6)||(zType[6] && zType[6]!=' ') ){ - for(i=0; i Date: Wed, 23 Mar 2016 13:46:05 +0000 Subject: [PATCH 15/19] Update a requirement mark. No changes to code. FossilOrigin-Name: 412984642af40578ec611d8c0b7c0508cb5cf9c9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteLimit.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 19c00ee626..187f8d0c9b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3_column_decltype()\sroutine\sshould\sreturn\sNULL,\snot\san\sempty\sstring,\nif\sthe\scolumn\shas\sno\sdeclared\stype. -D 2016-03-22T20:05:09.546 +C Update\sa\srequirement\smark.\s\sNo\schanges\sto\scode. +D 2016-03-23T13:46:05.453 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -359,7 +359,7 @@ F src/sqlite.h.in e877f141b15ef68ef28f84714e69d7234f9a071e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 98f72cbfe00169c39089115427d06ea05fe4b4a2 F src/sqliteInt.h 3a68b48967a7d62fcb38572d27fd21ab4e4bcca3 -F src/sqliteLimit.h 7b28cf72cbd52f178bfc97ea266445e351f2cd24 +F src/sqliteLimit.h c0373387c287c8d0932510b5547ecde31b5da247 F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba F src/table.c 5226df15ab9179b9ed558d89575ea0ce37b03fc9 F src/tclsqlite.c 4bf3bea9b03aeac176ac114700f35f76a1de4c8a @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 142cd359d37f1d8d53de32e329523d9a93c7d6e5 -R 54bb94e9ede3ebe9fafd5624cdd5946f +P 605eba4a756e7185119088e2242f82691d078b01 +R 0cef5aac6dc3fd4662874a0245bd6fe2 U drh -Z 8ae8a72878a637ee00e9de9bf1db9104 +Z 79401c6ddf17e634854d1f69b3d42451 diff --git a/manifest.uuid b/manifest.uuid index 43fdf15940..48f9df63e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -605eba4a756e7185119088e2242f82691d078b01 \ No newline at end of file +412984642af40578ec611d8c0b7c0508cb5cf9c9 \ No newline at end of file diff --git a/src/sqliteLimit.h b/src/sqliteLimit.h index 4b5ddaadec..0554e61581 100644 --- a/src/sqliteLimit.h +++ b/src/sqliteLimit.h @@ -101,8 +101,8 @@ ** The suggested maximum number of in-memory pages to use for ** the main database table and for temporary tables. ** -** IMPLEMENTATION-OF: R-31093-59126 The default suggested cache size -** is 2000*1024 bytes. +** IMPLEMENTATION-OF: R-30185-15359 The default suggested cache size is -2000, +** which means the cache size is limited to 2048000 bytes of memory. ** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be ** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. */ From 848b190e4079cc60f3cbbc63e3ae6638cfe06d92 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Mar 2016 15:04:00 +0000 Subject: [PATCH 16/19] Explicitly limit the size of fts5 tokens to 32768 bytes. FossilOrigin-Name: 70fc69eed9b09159899d7cbd1416a59d04210a63 --- ext/fts5/fts5Int.h | 4 +++ ext/fts5/fts5_expr.c | 2 ++ ext/fts5/fts5_index.c | 47 +++++++++++++++++++++++++---------- ext/fts5/fts5_storage.c | 2 ++ ext/fts5/test/fts5simple.test | 20 +++++++++++++++ manifest | 22 ++++++++-------- manifest.uuid | 2 +- 7 files changed, 74 insertions(+), 25 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 961206f2b3..c4e7506fb1 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -47,6 +47,10 @@ typedef sqlite3_uint64 u64; #endif +/* Truncate very long tokens to this many bytes. Hard limit is +** (65536-1-1-4-9)==65521 bytes. The limiting factor is the 16-bit offset +** field that occurs at the start of each leaf page (see fts5_index.c). */ +#define FTS5_MAX_TOKEN_SIZE 32768 /* ** Maximum number of prefix indexes on single FTS5 table. This must be diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 0bc61414b0..eada84f70e 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -1493,6 +1493,7 @@ static int fts5ParseTokenize( /* If an error has already occurred, this is a no-op */ if( pCtx->rc!=SQLITE_OK ) return pCtx->rc; + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; @@ -2495,6 +2496,7 @@ static int fts5ExprPopulatePoslistsCb( UNUSED_PARAM2(iUnused1, iUnused2); + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; if( (tflags & FTS5_TOKEN_COLOCATED)==0 ) p->iOff++; for(i=0; inPhrase; i++){ Fts5ExprTerm *pTerm; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index d08e65bfe6..c477ea6ca6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -2321,6 +2321,18 @@ static void fts5LeafSeek( fts5SegIterLoadNPos(p, pIter); } +static sqlite3_stmt *fts5IdxSelectStmt(Fts5Index *p){ + if( p->pIdxSelect==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pIdxSelect, sqlite3_mprintf( + "SELECT pgno FROM '%q'.'%q_idx' WHERE " + "segid=? AND term<=? ORDER BY term DESC LIMIT 1", + pConfig->zDb, pConfig->zName + )); + } + return p->pIdxSelect; +} + /* ** Initialize the object pIter to point to term pTerm/nTerm within segment ** pSeg. If there is no such term in the index, the iterator is set to EOF. @@ -2338,6 +2350,7 @@ static void fts5SegIterSeekInit( int iPg = 1; int bGe = (flags & FTS5INDEX_QUERY_SCAN); int bDlidx = 0; /* True if there is a doclist-index */ + sqlite3_stmt *pIdxSelect = 0; assert( bGe==0 || (flags & FTS5INDEX_QUERY_DESC)==0 ); assert( pTerm && nTerm ); @@ -2346,23 +2359,16 @@ static void fts5SegIterSeekInit( /* This block sets stack variable iPg to the leaf page number that may ** contain term (pTerm/nTerm), if it is present in the segment. */ - if( p->pIdxSelect==0 ){ - Fts5Config *pConfig = p->pConfig; - fts5IndexPrepareStmt(p, &p->pIdxSelect, sqlite3_mprintf( - "SELECT pgno FROM '%q'.'%q_idx' WHERE " - "segid=? AND term<=? ORDER BY term DESC LIMIT 1", - pConfig->zDb, pConfig->zName - )); - } + pIdxSelect = fts5IdxSelectStmt(p); if( p->rc ) return; - sqlite3_bind_int(p->pIdxSelect, 1, pSeg->iSegid); - sqlite3_bind_blob(p->pIdxSelect, 2, pTerm, nTerm, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(p->pIdxSelect) ){ - i64 val = sqlite3_column_int(p->pIdxSelect, 0); + sqlite3_bind_int(pIdxSelect, 1, pSeg->iSegid); + sqlite3_bind_blob(pIdxSelect, 2, pTerm, nTerm, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pIdxSelect) ){ + i64 val = sqlite3_column_int(pIdxSelect, 0); iPg = (int)(val>>1); bDlidx = (val & 0x0001); } - p->rc = sqlite3_reset(p->pIdxSelect); + p->rc = sqlite3_reset(pIdxSelect); if( iPgpgnoFirst ){ iPg = pSeg->pgnoFirst; @@ -3552,6 +3558,18 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ } } assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + + { + sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); + if( p->rc==SQLITE_OK ){ + int rc; + u8 aBlob[2] = {0xff, 0xff}; + sqlite3_bind_int(pIdxSelect, 1, iSegid); + sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); + assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + p->rc = sqlite3_reset(pIdxSelect); + } + } #endif } } @@ -3798,6 +3816,9 @@ static void fts5WriteFlushLeaf(Fts5Index *p, Fts5SegWriter *pWriter){ Fts5PageWriter *pPage = &pWriter->writer; i64 iRowid; +static int nCall = 0; +nCall++; + assert( (pPage->pgidx.n==0)==(pWriter->bFirstTermInPage) ); /* Set the szLeaf header field. */ diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 3cca990ed5..90df3396c3 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -369,6 +369,7 @@ static int fts5StorageInsertCallback( Fts5InsertCtx *pCtx = (Fts5InsertCtx*)pContext; Fts5Index *pIdx = pCtx->pStorage->pIndex; UNUSED_PARAM2(iUnused1, iUnused2); + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; if( (tflags & FTS5_TOKEN_COLOCATED)==0 || pCtx->szCol==0 ){ pCtx->szCol++; } @@ -815,6 +816,7 @@ static int fts5StorageIntegrityCallback( int iCol; UNUSED_PARAM2(iUnused1, iUnused2); + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; if( (tflags & FTS5_TOKEN_COLOCATED)==0 || pCtx->szCol==0 ){ pCtx->szCol++; diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 3483e40ba5..2bc02cf49a 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -448,4 +448,24 @@ do_execsql_test 20.2 { INSERT INTO x1(x1) VALUES('integrity-check'); } {} +#------------------------------------------------------------------------- +reset_db +set doc "a b [string repeat x 100000]" +do_execsql_test 21.0 { + CREATE VIRTUAL TABLE x1 USING fts5(x); + INSERT INTO x1(rowid, x) VALUES(11111, $doc); + INSERT INTO x1(rowid, x) VALUES(11112, $doc); +} +do_execsql_test 21.1 { + INSERT INTO x1(x1) VALUES('integrity-check'); +} +do_execsql_test 21.2 { + SELECT rowid FROM x1($doc); +} {11111 11112} +do_execsql_test 21.3 { + DELETE FROM x1 WHERE rowid=11111; + INSERT INTO x1(x1) VALUES('integrity-check'); + SELECT rowid FROM x1($doc); +} {11112} + finish_test diff --git a/manifest b/manifest index 187f8d0c9b..79eb4b3013 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sa\srequirement\smark.\s\sNo\schanges\sto\scode. -D 2016-03-23T13:46:05.453 +C Explicitly\slimit\sthe\ssize\sof\sfts5\stokens\sto\s32768\sbytes. +D 2016-03-23T15:04:00.239 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -98,15 +98,15 @@ F ext/fts3/unicode/mkunicode.tcl 2debed3f582d77b3fdd0b8830880250021571fd8 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h ff9c2782e8ed890b0de2f697a8d63971939e70c7 -F ext/fts5/fts5Int.h 4e507abebae0d7d3ac9b8daebf049d5153d00961 +F ext/fts5/fts5Int.h 3677076aecbf645a7f2a019115c6a4ec3272dd78 F ext/fts5/fts5_aux.c daa57fb45216491814520bbb587e97bf81ced458 F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 -F ext/fts5/fts5_expr.c 35e9d92c89e7c7ea0759b73d24da1ecb7630a24b +F ext/fts5/fts5_expr.c 5ca4bafe29aa3d27683c90e836192e4aefd20a3f F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c 19df86d29d24cc56bfb01a6a07dcaac227d2fcdf +F ext/fts5/fts5_index.c b271b19dd28d3501772c3a9317272add4751af95 F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 -F ext/fts5/fts5_storage.c 98e3129047d250fc5acc4a4ba7ba4fde9b0ae030 +F ext/fts5/fts5_storage.c 3309c6a8e34b974513016fd1ef47c83f5898f94c F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 F ext/fts5/fts5_test_mi.c 783b86697ebf773c18fc109992426c0173a055bc F ext/fts5/fts5_test_tok.c db08af63673c3a7d39f053b36fd6e065017706be @@ -180,7 +180,7 @@ F ext/fts5/test/fts5rank.test 7e9e64eac7245637f6f2033aec4b292aaf611aab F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 16908a99d6efc9ba21081b4f2b86b3fc699839a6 -F ext/fts5/test/fts5simple.test 5b7b05bcc89bcb718a0fc7f473092d3513cc8e19 +F ext/fts5/test/fts5simple.test cd23d4072ea095d652c9b6db12284cc642e49c98 F ext/fts5/test/fts5simple2.test 98377ae1ff7749a42c21fe1a139c1ed312522c46 F ext/fts5/test/fts5simple3.test 8e71733b3d1b0e695011d02c68ebc5ca40b6124e F ext/fts5/test/fts5synonym.test 6475d189c2e20d60795808f83e36bf9318708d48 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 605eba4a756e7185119088e2242f82691d078b01 -R 0cef5aac6dc3fd4662874a0245bd6fe2 -U drh -Z 79401c6ddf17e634854d1f69b3d42451 +P 412984642af40578ec611d8c0b7c0508cb5cf9c9 +R 7ff8c5a33cf0f5a9bc31dcb4123a3529 +U dan +Z a8f8abdf00b8979540d6caa40226ffc8 diff --git a/manifest.uuid b/manifest.uuid index 48f9df63e0..efdf00d8e6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -412984642af40578ec611d8c0b7c0508cb5cf9c9 \ No newline at end of file +70fc69eed9b09159899d7cbd1416a59d04210a63 \ No newline at end of file From 997de998a8f4c84e9fdcc91cb308d06864dff90b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Mar 2016 15:53:45 +0000 Subject: [PATCH 17/19] Remove an unused local variable from FTS5. FossilOrigin-Name: 0ed693c29f184223cde3b3d51f0e06273e586803 --- ext/fts5/fts5_index.c | 1 - manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index c477ea6ca6..1200f5707b 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3562,7 +3562,6 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ { sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); if( p->rc==SQLITE_OK ){ - int rc; u8 aBlob[2] = {0xff, 0xff}; sqlite3_bind_int(pIdxSelect, 1, iSegid); sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); diff --git a/manifest b/manifest index 79eb4b3013..c04dd5f417 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Explicitly\slimit\sthe\ssize\sof\sfts5\stokens\sto\s32768\sbytes. -D 2016-03-23T15:04:00.239 +C Remove\san\sunused\slocal\svariable\sfrom\sFTS5. +D 2016-03-23T15:53:45.875 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -104,7 +104,7 @@ F ext/fts5/fts5_buffer.c 4c1502d4c956cd092c89ce4480867f9d8bf325cd F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 F ext/fts5/fts5_expr.c 5ca4bafe29aa3d27683c90e836192e4aefd20a3f F ext/fts5/fts5_hash.c f3a7217c86eb8f272871be5f6aa1b6798960a337 -F ext/fts5/fts5_index.c b271b19dd28d3501772c3a9317272add4751af95 +F ext/fts5/fts5_index.c fdd82bb421a5d1e64d004acb43f4dd9970c8d2b3 F ext/fts5/fts5_main.c b4a0fc5bf17f2f1f056ee76cdd7d2af08b360f55 F ext/fts5/fts5_storage.c 3309c6a8e34b974513016fd1ef47c83f5898f94c F ext/fts5/fts5_tcl.c f8731e0508299bd43f1a2eff7dbeaac870768966 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 412984642af40578ec611d8c0b7c0508cb5cf9c9 -R 7ff8c5a33cf0f5a9bc31dcb4123a3529 -U dan -Z a8f8abdf00b8979540d6caa40226ffc8 +P 70fc69eed9b09159899d7cbd1416a59d04210a63 +R 873e340080925d4861d8b0305a1e9665 +U drh +Z 80f86ca0927f258d1530b1b8654e3fe4 diff --git a/manifest.uuid b/manifest.uuid index efdf00d8e6..e4a6517082 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70fc69eed9b09159899d7cbd1416a59d04210a63 \ No newline at end of file +0ed693c29f184223cde3b3d51f0e06273e586803 \ No newline at end of file From 231ee688083efe09940c2b6c60c4527d35c2d809 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Mar 2016 16:32:29 +0000 Subject: [PATCH 18/19] Fix "ifcapable" tests in capi3.test and capi3c.test so that the tests work with more build configurations. FossilOrigin-Name: 3fa88f68c3e1bbb3421cb0d2b82b9bb3fe7b9b14 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/capi3.test | 2 +- test/capi3c.test | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c04dd5f417..339c6e1490 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunused\slocal\svariable\sfrom\sFTS5. -D 2016-03-23T15:53:45.875 +C Fix\s"ifcapable"\stests\sin\scapi3.test\sand\scapi3c.test\sso\sthat\sthe\stests\swork\swith\smore\sbuild\sconfigurations. +D 2016-03-23T16:32:29.404 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -523,9 +523,9 @@ F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738 -F test/capi3.test 860dafdc04f651a67781018cb1a0b179d22d7d15 +F test/capi3.test f0c66919e43d42e1572a69be039e4527a931b00f F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test b28ec47692f0fc50eb61b2d464d8d52e816b3732 +F test/capi3c.test 0b9edb0c2156a964b9271cd5ea7ae56736cc2fcb F test/capi3d.test 485048dc5cd07bc68011e4917ad035ad6047ab82 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 4c275cbdc8202d6f9c54a3596701719868ac7dc3 @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 70fc69eed9b09159899d7cbd1416a59d04210a63 -R 873e340080925d4861d8b0305a1e9665 -U drh -Z 80f86ca0927f258d1530b1b8654e3fe4 +P 0ed693c29f184223cde3b3d51f0e06273e586803 +R 405228ca43a6aac7fb0de536de78cc72 +U dan +Z fb0a5f0fe48a39fd4b3b3bb440d1982d diff --git a/manifest.uuid b/manifest.uuid index e4a6517082..0d41a4b253 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0ed693c29f184223cde3b3d51f0e06273e586803 \ No newline at end of file +3fa88f68c3e1bbb3421cb0d2b82b9bb3fe7b9b14 \ No newline at end of file diff --git a/test/capi3.test b/test/capi3.test index 8096d29bec..84889f5faf 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -929,7 +929,7 @@ do_test capi3-11.10 { do_test capi3-11.11 { sqlite3_step $STMT } {SQLITE_DONE} -ifcapable api_armor { +ifcapable !autoreset { do_test capi3-11.12armor { sqlite3_step $STMT sqlite3_step $STMT diff --git a/test/capi3c.test b/test/capi3c.test index 91c02561b1..57cf146c73 100644 --- a/test/capi3c.test +++ b/test/capi3c.test @@ -868,7 +868,7 @@ do_test capi3c-11.10 { do_test capi3c-11.11 { sqlite3_step $STMT } {SQLITE_DONE} -ifcapable api_armor { +ifcapable !autoreset { do_test capi3c-11.12armor { sqlite3_step $STMT sqlite3_step $STMT From c5412d533c73b8e247cd7850817ddf07dcb8068f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Mar 2016 17:54:19 +0000 Subject: [PATCH 19/19] Avoid calling realloc() with a zero size in fuzzcheck.c. FossilOrigin-Name: a1fd14694c1adc54e5c443ebfdef38e38637f5c5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 339c6e1490..f86978ab06 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\s"ifcapable"\stests\sin\scapi3.test\sand\scapi3c.test\sso\sthat\sthe\stests\swork\swith\smore\sbuild\sconfigurations. -D 2016-03-23T16:32:29.404 +C Avoid\scalling\srealloc()\swith\sa\szero\ssize\sin\sfuzzcheck.c. +D 2016-03-23T17:54:19.633 F Makefile.in f53429fb2f313c099283659d0df6f20f932c861f F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc df0bf9ff7f8b3f4dd9fb4cc43f92fe58f6ec5c66 @@ -773,7 +773,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test b47377143f0c80f91ed29d722861077ff34415d5 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c 93bb9d309888634615e21ef98d1c30d51483e942 +F test/fuzzcheck.c f01d432d001ba29e7916df8411be7d4e7cddc574 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1459,7 +1459,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0ed693c29f184223cde3b3d51f0e06273e586803 -R 405228ca43a6aac7fb0de536de78cc72 -U dan -Z fb0a5f0fe48a39fd4b3b3bb440d1982d +P 3fa88f68c3e1bbb3421cb0d2b82b9bb3fe7b9b14 +R 6050811335a4694faefeb0d2dc871228 +U drh +Z bf4eed3170d70e06db77678976293947 diff --git a/manifest.uuid b/manifest.uuid index 0d41a4b253..fc3163dd80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3fa88f68c3e1bbb3421cb0d2b82b9bb3fe7b9b14 \ No newline at end of file +a1fd14694c1adc54e5c443ebfdef38e38637f5c5 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 1e0ce86e66..1d11b2986f 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -189,7 +189,7 @@ static int progressHandler(void *pVdbeLimitFlag){ ** Reallocate memory. Show and error and quit if unable. */ static void *safe_realloc(void *pOld, int szNew){ - void *pNew = realloc(pOld, szNew); + void *pNew = realloc(pOld, szNew<=0 ? 1 : szNew); if( pNew==0 ) fatalError("unable to realloc for %d bytes", szNew); return pNew; }