Index: third_party/sqlite/fts3.patch |
=================================================================== |
--- third_party/sqlite/fts3.patch (revision 49777) |
+++ third_party/sqlite/fts3.patch (working copy) |
@@ -1,18 +1,6 @@ |
-Index: ext/fts3/fts3_tokenizer.c |
-=================================================================== |
---- ext/fts3/fts3_tokenizer.c (revision 48758) |
-+++ ext/fts3/fts3_tokenizer.c (working copy) |
-@@ -33,6 +33,7 @@ |
- #include "fts3_hash.h" |
- #include "fts3_tokenizer.h" |
- #include <assert.h> |
-+#include <stddef.h> |
- |
- /* |
- ** Implementation of the SQL scalar function for accessing the underlying |
Index: ext/fts3/fts3.c |
=================================================================== |
---- ext/fts3/fts3.c (revision 48758) |
+--- ext/fts3/fts3.c (revision 48811) |
+++ ext/fts3/fts3.c (working copy) |
@@ -271,6 +271,7 @@ |
** deletions and duplications. This would basically be a forced merge |
@@ -1245,7 +1233,7 @@ |
} |
/* strcmp-style comparison of pReader's current term against pTerm. |
-@@ -5222,32 +5423,65 @@ |
+@@ -5222,32 +5423,67 @@ |
dataBufferInit(&pReader->rootData, 0); |
if( iStartBlockid==0 ){ |
@@ -1288,10 +1276,6 @@ |
} |
- if( rc!=SQLITE_ROW ) return rc; |
-- pReader->pStmt = s; |
-- leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), |
-- sqlite3_column_bytes(pReader->pStmt, 0), |
-- &pReader->leafReader); |
+ if( rc!=SQLITE_ROW ) goto err; |
+ rc = SQLITE_OK; |
+ |
@@ -1319,10 +1303,15 @@ |
+ } |
+ return rc; |
+ } |
++ |
+ pReader->pStmt = s; |
+- leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0), |
+- sqlite3_column_bytes(pReader->pStmt, 0), |
+- &pReader->leafReader); |
} |
return SQLITE_OK; |
} |
-@@ -5256,11 +5490,12 @@ |
+@@ -5256,11 +5492,12 @@ |
** end of the current leaf, step forward to the next leaf block. |
*/ |
static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){ |
@@ -1337,7 +1326,7 @@ |
if( pReader->rootData.pData ){ |
pReader->eof = 1; |
return SQLITE_OK; |
-@@ -5270,10 +5505,25 @@ |
+@@ -5270,10 +5507,25 @@ |
pReader->eof = 1; |
return rc==SQLITE_DONE ? SQLITE_OK : rc; |
} |
@@ -1367,7 +1356,7 @@ |
} |
return SQLITE_OK; |
} |
-@@ -5334,8 +5584,19 @@ |
+@@ -5334,8 +5586,19 @@ |
sqlite_int64 iEnd = sqlite3_column_int64(s, 1); |
const char *pRootData = sqlite3_column_blob(s, 2); |
int nRootData = sqlite3_column_bytes(s, 2); |
@@ -1388,7 +1377,7 @@ |
rc = leavesReaderInit(v, i, iStart, iEnd, pRootData, nRootData, |
&pReaders[i]); |
if( rc!=SQLITE_OK ) break; |
-@@ -5346,6 +5607,7 @@ |
+@@ -5346,6 +5609,7 @@ |
while( i-->0 ){ |
leavesReaderDestroy(&pReaders[i]); |
} |
@@ -1396,7 +1385,7 @@ |
return rc; |
} |
-@@ -5369,14 +5631,27 @@ |
+@@ -5369,14 +5633,27 @@ |
DLReader dlReaders[MERGE_COUNT]; |
const char *pTerm = leavesReaderTerm(pReaders); |
int i, nTerm = leavesReaderTermBytes(pReaders); |
@@ -1427,7 +1416,7 @@ |
return leafWriterStepMerge(v, pWriter, pTerm, nTerm, dlReaders, nReaders); |
} |
-@@ -5429,10 +5704,14 @@ |
+@@ -5429,10 +5706,14 @@ |
memset(&lrs, '\0', sizeof(lrs)); |
rc = leavesReadersInit(v, iLevel, lrs, &i); |
if( rc!=SQLITE_OK ) return rc; |
@@ -1443,7 +1432,7 @@ |
/* Since leavesReaderReorder() pushes readers at eof to the end, |
** when the first reader is empty, all will be empty. |
*/ |
-@@ -5475,12 +5754,14 @@ |
+@@ -5475,12 +5756,14 @@ |
} |
/* Accumulate the union of *acc and *pData into *acc. */ |
@@ -1461,7 +1450,7 @@ |
} |
/* TODO(shess) It might be interesting to explore different merge |
-@@ -5522,8 +5803,13 @@ |
+@@ -5522,8 +5805,13 @@ |
int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix); |
if( c>0 ) break; /* Past any possible matches. */ |
if( c==0 ){ |
@@ -1476,7 +1465,7 @@ |
/* Find the first empty buffer. */ |
for(iBuffer=0; iBuffer<nBuffers; ++iBuffer){ |
-@@ -5569,11 +5855,13 @@ |
+@@ -5569,11 +5857,13 @@ |
** with pData/nData. |
*/ |
dataBufferSwap(p, pAcc); |
@@ -1492,7 +1481,7 @@ |
/* dataBufferReset() could allow a large doclist to blow up |
** our memory requirements. |
-@@ -5598,13 +5886,15 @@ |
+@@ -5598,13 +5888,15 @@ |
if( out->nData==0 ){ |
dataBufferSwap(out, &(pBuffers[iBuffer])); |
}else{ |
@@ -1510,7 +1499,7 @@ |
while( nBuffers-- ){ |
dataBufferDestroy(&(pBuffers[nBuffers])); |
} |
-@@ -5663,20 +5953,26 @@ |
+@@ -5663,20 +5955,26 @@ |
** node. Consider whether breaking symmetry is worthwhile. I suspect |
** it is not worthwhile. |
*/ |
@@ -1543,7 +1532,7 @@ |
} |
*piStartChild = interiorReaderCurrentBlockid(&reader); |
-@@ -5686,7 +5982,11 @@ |
+@@ -5686,7 +5984,11 @@ |
*/ |
while( !interiorReaderAtEnd(&reader) ){ |
if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break; |
@@ -1556,7 +1545,7 @@ |
} |
*piEndChild = interiorReaderCurrentBlockid(&reader); |
-@@ -5695,6 +5995,7 @@ |
+@@ -5695,6 +5997,7 @@ |
/* Children must ascend, and if !prefix, both must be the same. */ |
assert( *piEndChild>=*piStartChild ); |
assert( isPrefix || *piStartChild==*piEndChild ); |
@@ -1564,7 +1553,7 @@ |
} |
/* Read block at iBlockid and pass it with other params to |
-@@ -5722,12 +6023,32 @@ |
+@@ -5722,12 +6025,32 @@ |
if( rc!=SQLITE_OK ) return rc; |
rc = sqlite3_step(s); |
@@ -1600,7 +1589,7 @@ |
/* We expect only one row. We must execute another sqlite3_step() |
* to complete the iteration; otherwise the table will remain |
* locked. */ |
-@@ -5756,8 +6077,9 @@ |
+@@ -5756,8 +6079,9 @@ |
/* Process pData as an interior node, then loop down the tree |
** until we find the set of leaf nodes to scan for the term. |
*/ |
@@ -1612,7 +1601,7 @@ |
while( iStartChild>iLeavesEnd ){ |
sqlite_int64 iNextStart, iNextEnd; |
rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix, |
-@@ -5809,7 +6131,8 @@ |
+@@ -5809,7 +6133,8 @@ |
DataBuffer result; |
int rc; |
@@ -1622,7 +1611,7 @@ |
/* This code should never be called with buffered updates. */ |
assert( v->nPendingData<0 ); |
-@@ -5826,16 +6149,21 @@ |
+@@ -5826,16 +6151,21 @@ |
DataBuffer merged; |
DLReader readers[2]; |
@@ -1652,7 +1641,7 @@ |
dataBufferDestroy(&result); |
return rc; |
} |
-@@ -5869,11 +6197,20 @@ |
+@@ -5869,11 +6199,20 @@ |
const char *pData = sqlite3_column_blob(s, 2); |
const int nData = sqlite3_column_bytes(s, 2); |
const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1); |
@@ -1673,7 +1662,7 @@ |
if( doclist.nData!=0 ){ |
/* TODO(shess) The old term_select_all() code applied the column |
** restrict as we merged segments, leading to smaller buffers. |
-@@ -5881,13 +6218,13 @@ |
+@@ -5881,13 +6220,13 @@ |
** system is checked in. |
*/ |
if( iColumn==v->nColumn) iColumn = -1; |
@@ -1690,7 +1679,7 @@ |
dataBufferDestroy(&doclist); |
return rc; |
} |
-@@ -6250,6 +6587,7 @@ |
+@@ -6250,6 +6589,7 @@ |
LeafWriter *pWriter){ |
int i, rc = SQLITE_OK; |
DataBuffer doclist, merged, tmp; |
@@ -1698,7 +1687,7 @@ |
/* Order the readers. */ |
i = nReaders; |
-@@ -6270,14 +6608,20 @@ |
+@@ -6270,14 +6610,20 @@ |
if( 0!=optLeavesReaderTermCmp(&readers[0], &readers[i]) ) break; |
} |
@@ -1723,7 +1712,7 @@ |
}else{ |
DLReader dlReaders[MERGE_COUNT]; |
int iReader, nReaders; |
-@@ -6285,9 +6629,10 @@ |
+@@ -6285,9 +6631,10 @@ |
/* Prime the pipeline with the first reader's doclist. After |
** one pass index 0 will reference the accumulated doclist. |
*/ |
@@ -1737,7 +1726,7 @@ |
iReader = 1; |
assert( iReader<i ); /* Must execute the loop at least once. */ |
-@@ -6295,24 +6640,34 @@ |
+@@ -6295,24 +6642,34 @@ |
/* Merge 16 inputs per pass. */ |
for( nReaders=1; iReader<i && nReaders<MERGE_COUNT; |
iReader++, nReaders++ ){ |
@@ -1781,7 +1770,7 @@ |
} |
/* Destroy reader that was left in the pipeline. */ |
-@@ -6320,8 +6675,9 @@ |
+@@ -6320,8 +6677,9 @@ |
/* Trim deletions from the doclist. */ |
dataBufferReset(&merged); |
@@ -1793,7 +1782,7 @@ |
} |
/* Only pass doclists with hits (skip if all hits deleted). */ |
-@@ -6401,6 +6757,14 @@ |
+@@ -6401,6 +6759,14 @@ |
const char *pRootData = sqlite3_column_blob(s, 2); |
int nRootData = sqlite3_column_bytes(s, 2); |
@@ -1808,7 +1797,7 @@ |
assert( i<nReaders ); |
rc = leavesReaderInit(v, -1, iStart, iEnd, pRootData, nRootData, |
&readers[i].reader); |
-@@ -6414,6 +6778,8 @@ |
+@@ -6414,6 +6780,8 @@ |
if( rc==SQLITE_DONE ){ |
assert( i==nReaders ); |
rc = optimizeInternal(v, readers, nReaders, &writer); |
@@ -1817,7 +1806,7 @@ |
} |
while( i-- > 0 ){ |
-@@ -6477,9 +6843,18 @@ |
+@@ -6477,9 +6845,18 @@ |
const sqlite_int64 iEndBlockid = sqlite3_column_int64(s, 1); |
const char *pRootData = sqlite3_column_blob(s, 2); |
const int nRootData = sqlite3_column_bytes(s, 2); |
@@ -1838,7 +1827,7 @@ |
if( rc!=SQLITE_OK ) return rc; |
while( rc==SQLITE_OK && !leavesReaderAtEnd(&reader) ){ |
-@@ -6641,16 +7016,19 @@ |
+@@ -6641,16 +7018,19 @@ |
const char *pData, int nData){ |
DataBuffer dump; |
DLReader dlReader; |
@@ -1861,7 +1850,7 @@ |
if( DL_DEFAULT==DL_DOCIDS || plrAtEnd(&plReader) ){ |
sqlite3_snprintf(sizeof(buf), buf, "[%lld] ", dlrDocid(&dlReader)); |
dataBufferAppend(&dump, buf, strlen(buf)); |
-@@ -6661,7 +7039,8 @@ |
+@@ -6661,7 +7041,8 @@ |
dlrDocid(&dlReader), iColumn); |
dataBufferAppend(&dump, buf, strlen(buf)); |
@@ -1871,7 +1860,7 @@ |
if( plrColumn(&plReader)!=iColumn ){ |
iColumn = plrColumn(&plReader); |
sqlite3_snprintf(sizeof(buf), buf, "] %d[", iColumn); |
-@@ -6682,6 +7061,7 @@ |
+@@ -6682,6 +7063,7 @@ |
dataBufferAppend(&dump, buf, strlen(buf)); |
} |
plrDestroy(&plReader); |
@@ -1879,7 +1868,7 @@ |
assert( dump.nData>0 ); |
dump.nData--; /* Overwrite trailing space. */ |
-@@ -6690,6 +7070,10 @@ |
+@@ -6690,6 +7072,10 @@ |
} |
} |
dlrDestroy(&dlReader); |
@@ -1890,7 +1879,7 @@ |
assert( dump.nData>0 ); |
dump.nData--; /* Overwrite trailing space. */ |
-@@ -6701,6 +7085,7 @@ |
+@@ -6701,6 +7087,7 @@ |
sqlite3_result_text(pContext, dump.pData, dump.nData, sqlite3_free); |
dump.pData = NULL; |
dump.nData = dump.nCapacity = 0; |
@@ -1898,7 +1887,7 @@ |
} |
/* Implements dump_doclist() for use in inspecting the fts3 index from |
-@@ -6987,7 +7372,11 @@ |
+@@ -6987,7 +7374,11 @@ |
** module with sqlite. |
*/ |
if( SQLITE_OK==rc |
@@ -1912,7 +1901,7 @@ |
&& SQLITE_OK==(rc = sqlite3_overload_function(db, "optimize", -1)) |
Index: ext/fts3/fts3_icu.c |
=================================================================== |
---- ext/fts3/fts3_icu.c (revision 48758) |
+--- ext/fts3/fts3_icu.c (revision 48811) |
+++ ext/fts3/fts3_icu.c (working copy) |
@@ -198,7 +198,7 @@ |
@@ -1923,3 +1912,15 @@ |
if( u_isspace(c) ){ |
iStart = iWhite; |
}else{ |
+Index: ext/fts3/fts3_tokenizer.c |
+=================================================================== |
+--- ext/fts3/fts3_tokenizer.c (revision 48811) |
++++ ext/fts3/fts3_tokenizer.c (working copy) |
+@@ -33,6 +33,7 @@ |
+ #include "fts3_hash.h" |
+ #include "fts3_tokenizer.h" |
+ #include <assert.h> |
++#include <stddef.h> |
+ |
+ /* |
+ ** Implementation of the SQL scalar function for accessing the underlying |