| 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 | 
|  |