]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Changes fts2 to use only sqlite3_malloc() and not system malloc.
authorshess <shess@noemail.net>
Tue, 22 Jul 2008 22:57:54 +0000 (22:57 +0000)
committershess <shess@noemail.net>
Tue, 22 Jul 2008 22:57:54 +0000 (22:57 +0000)
Backports (4554) and (4555) from fts3. (CVS 5454)

FossilOrigin-Name: ecf2dec66cb979cb7d8db3b7ce5c64cab57fe2bb

ext/fts2/fts2.c
ext/fts2/fts2_hash.c
ext/fts2/fts2_porter.c
ext/fts2/fts2_tokenizer1.c
manifest
manifest.uuid
test/fts2.test [new file with mode: 0644]

index a806719611c05d647fb84090af1806733add5b96..2a995b0214124efb1d738bb5c2a766fcee7da58b 100644 (file)
@@ -470,13 +470,13 @@ static void dataBufferInit(DataBuffer *pBuffer, int nCapacity){
   assert( nCapacity>=0 );
   pBuffer->nData = 0;
   pBuffer->nCapacity = nCapacity;
-  pBuffer->pData = nCapacity==0 ? NULL : malloc(nCapacity);
+  pBuffer->pData = nCapacity==0 ? NULL : sqlite3_malloc(nCapacity);
 }
 static void dataBufferReset(DataBuffer *pBuffer){
   pBuffer->nData = 0;
 }
 static void dataBufferDestroy(DataBuffer *pBuffer){
-  if( pBuffer->pData!=NULL ) free(pBuffer->pData);
+  if( pBuffer->pData!=NULL ) sqlite3_free(pBuffer->pData);
   SCRAMBLE(pBuffer);
 }
 static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){
@@ -487,7 +487,7 @@ static void dataBufferExpand(DataBuffer *pBuffer, int nAddCapacity){
   */
   if( pBuffer->nData+nAddCapacity>pBuffer->nCapacity ){
     pBuffer->nCapacity = pBuffer->nData+nAddCapacity;
-    pBuffer->pData = realloc(pBuffer->pData, pBuffer->nCapacity);
+    pBuffer->pData = sqlite3_realloc(pBuffer->pData, pBuffer->nCapacity);
   }
 }
 static void dataBufferAppend(DataBuffer *pBuffer,
@@ -1082,7 +1082,7 @@ static void dlcAddPos(DLCollector *pCollector, int iColumn, int iPos,
 }
 
 static DLCollector *dlcNew(sqlite_int64 iDocid, DocListType iType){
-  DLCollector *pCollector = malloc(sizeof(DLCollector));
+  DLCollector *pCollector = sqlite3_malloc(sizeof(DLCollector));
   dataBufferInit(&pCollector->b, 0);
   dlwInit(&pCollector->dlw, iType, &pCollector->b);
   plwInit(&pCollector->plw, &pCollector->dlw, iDocid);
@@ -1093,7 +1093,7 @@ static void dlcDelete(DLCollector *pCollector){
   dlwDestroy(&pCollector->dlw);
   dataBufferDestroy(&pCollector->b);
   SCRAMBLE(pCollector);
-  free(pCollector);
+  sqlite3_free(pCollector);
 }
 
 
@@ -1608,7 +1608,7 @@ static void docListExceptMerge(
 }
 
 static char *string_dup_n(const char *s, int n){
-  char *str = malloc(n + 1);
+  char *str = sqlite3_malloc(n + 1);
   memcpy(str, s, n);
   str[n] = '\0';
   return str;
@@ -1641,7 +1641,7 @@ static char *string_format(const char *zFormat,
   }
   len += 1;  /* for null terminator */
 
-  r = result = malloc(len);
+  r = result = sqlite3_malloc(len);
   for(p = zFormat; *p; ++p){
     if( *p=='%' ){
       memcpy(r, zDb, nDb);
@@ -1664,7 +1664,7 @@ static int sql_exec(sqlite3 *db, const char *zDb, const char *zName,
   int rc;
   TRACE(("FTS2 sql: %s\n", zCommand));
   rc = sqlite3_exec(db, zCommand, NULL, 0, NULL);
-  free(zCommand);
+  sqlite3_free(zCommand);
   return rc;
 }
 
@@ -1674,7 +1674,7 @@ static int sql_prepare(sqlite3 *db, const char *zDb, const char *zName,
   int rc;
   TRACE(("FTS2 prepare: %s\n", zCommand));
   rc = sqlite3_prepare_v2(db, zCommand, -1, ppStmt, NULL);
-  free(zCommand);
+  sqlite3_free(zCommand);
   return rc;
 }
 
@@ -1938,7 +1938,7 @@ static int sql_get_statement(fulltext_vtab *v, fulltext_statement iStmt,
     }
     rc = sql_prepare(v->db, v->zDb, v->zName, &v->pFulltextStatements[iStmt],
                          zStmt);
-    if( zStmt != fulltext_zStatement[iStmt]) free((void *) zStmt);
+    if( zStmt != fulltext_zStatement[iStmt]) sqlite3_free((void *) zStmt);
     if( rc!=SQLITE_OK ) return rc;
   } else {
     int rc = sqlite3_reset(v->pFulltextStatements[iStmt]);
@@ -2023,9 +2023,9 @@ static void freeStringArray(int nString, const char **pString){
   int i;
 
   for (i=0 ; i < nString ; ++i) {
-    if( pString[i]!=NULL ) free((void *) pString[i]);
+    if( pString[i]!=NULL ) sqlite3_free((void *) pString[i]);
   }
-  free((void *) pString);
+  sqlite3_free((void *) pString);
 }
 
 /* select * from %_content where rowid = [iRow]
@@ -2052,7 +2052,7 @@ static int content_select(fulltext_vtab *v, sqlite_int64 iRow,
   rc = sqlite3_step(s);
   if( rc!=SQLITE_ROW ) return rc;
 
-  values = (const char **) malloc(v->nColumn * sizeof(const char *));
+  values = (const char **) sqlite3_malloc(v->nColumn * sizeof(const char *));
   for(i=0; i<v->nColumn; ++i){
     if( sqlite3_column_type(s, i)==SQLITE_NULL ){
       values[i] = NULL;
@@ -2294,12 +2294,12 @@ static void fulltext_vtab_destroy(fulltext_vtab *v){
 
   clearPendingTerms(v);
 
-  free(v->azColumn);
+  sqlite3_free(v->azColumn);
   for(i = 0; i < v->nColumn; ++i) {
     sqlite3_free(v->azContentColumn[i]);
   }
-  free(v->azContentColumn);
-  free(v);
+  sqlite3_free(v->azContentColumn);
+  sqlite3_free(v);
 }
 
 /*
@@ -2410,7 +2410,7 @@ typedef struct Token {
 */
 static char **tokenizeString(const char *z, int *pnToken){
   int nToken = 0;
-  Token *aToken = malloc( strlen(z) * sizeof(aToken[0]) );
+  Token *aToken = sqlite3_malloc( strlen(z) * sizeof(aToken[0]) );
   int n = 1;
   int e, i;
   int totalSize = 0;
@@ -2426,7 +2426,7 @@ static char **tokenizeString(const char *z, int *pnToken){
     }
     z += n;
   }
-  azToken = (char**)malloc( nToken*sizeof(char*) + totalSize );
+  azToken = (char**)sqlite3_malloc( nToken*sizeof(char*) + totalSize );
   zCopy = (char*)&azToken[nToken];
   nToken--;
   for(i=0; i<nToken; i++){
@@ -2437,7 +2437,7 @@ static char **tokenizeString(const char *z, int *pnToken){
     zCopy += n+1;
   }
   azToken[nToken] = 0;
-  free(aToken);
+  sqlite3_free(aToken);
   *pnToken = nToken;
   return azToken;
 }
@@ -2575,9 +2575,9 @@ typedef struct TableSpec {
 ** Reclaim all of the memory used by a TableSpec
 */
 static void clearTableSpec(TableSpec *p) {
-  free(p->azColumn);
-  free(p->azContentColumn);
-  free(p->azTokenizer);
+  sqlite3_free(p->azColumn);
+  sqlite3_free(p->azContentColumn);
+  sqlite3_free(p->azTokenizer);
 }
 
 /* Parse a CREATE VIRTUAL TABLE statement, which looks like this:
@@ -2612,7 +2612,7 @@ static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv,
   for(i=n=0; i<argc; i++){
     n += strlen(argv[i]) + 1;
   }
-  azArg = malloc( sizeof(char*)*argc + n );
+  azArg = sqlite3_malloc( sizeof(char*)*argc + n );
   if( azArg==0 ){
     return SQLITE_NOMEM;
   }
@@ -2657,7 +2657,7 @@ static int parseSpec(TableSpec *pSpec, int argc, const char *const*argv,
   ** for the convenience of people who might examine the generated
   ** %_content table and wonder what the columns are used for.
   */
-  pSpec->azContentColumn = malloc( pSpec->nColumn * sizeof(char *) );
+  pSpec->azContentColumn = sqlite3_malloc( pSpec->nColumn * sizeof(char *) );
   if( pSpec->azContentColumn==0 ){
     clearTableSpec(pSpec);
     return SQLITE_NOMEM;
@@ -2726,7 +2726,7 @@ static int constructVtab(
   char const *zTok;         /* Name of tokenizer to use for this fts table */
   int nTok;                 /* Length of zTok, including nul terminator */
 
-  v = (fulltext_vtab *) malloc(sizeof(fulltext_vtab));
+  v = (fulltext_vtab *) sqlite3_malloc(sizeof(fulltext_vtab));
   if( v==0 ) return SQLITE_NOMEM;
   CLEAR(v);
   /* sqlite will initialize v->base */
@@ -2913,12 +2913,16 @@ static int fulltextDestroy(sqlite3_vtab *pVTab){
 static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
   fulltext_cursor *c;
 
-  c = (fulltext_cursor *) calloc(sizeof(fulltext_cursor), 1);
-  /* sqlite will initialize c->base */
-  *ppCursor = &c->base;
-  TRACE(("FTS2 Open %p: %p\n", pVTab, c));
-
-  return SQLITE_OK;
+  c = (fulltext_cursor *) sqlite3_malloc(sizeof(fulltext_cursor));
+  if( c ){
+    memset(c, 0, sizeof(fulltext_cursor));
+    /* sqlite will initialize c->base */
+    *ppCursor = &c->base;
+    TRACE(("FTS2 Open %p: %p\n", pVTab, c));
+    return SQLITE_OK;
+  }else{
+    return SQLITE_NOMEM;
+  }
 }
 
 
@@ -2927,9 +2931,9 @@ static int fulltextOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){
 static void queryClear(Query *q){
   int i;
   for(i = 0; i < q->nTerms; ++i){
-    free(q->pTerms[i].pTerm);
+    sqlite3_free(q->pTerms[i].pTerm);
   }
-  free(q->pTerms);
+  sqlite3_free(q->pTerms);
   CLEAR(q);
 }
 
@@ -2937,9 +2941,9 @@ static void queryClear(Query *q){
 ** Snippet
 */
 static void snippetClear(Snippet *p){
-  free(p->aMatch);
-  free(p->zOffset);
-  free(p->zSnippet);
+  sqlite3_free(p->aMatch);
+  sqlite3_free(p->zOffset);
+  sqlite3_free(p->zSnippet);
   CLEAR(p);
 }
 /*
@@ -2954,7 +2958,7 @@ static void snippetAppendMatch(
   struct snippetMatch *pMatch;
   if( p->nMatch+1>=p->nAlloc ){
     p->nAlloc = p->nAlloc*2 + 10;
-    p->aMatch = realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) );
+    p->aMatch = sqlite3_realloc(p->aMatch, p->nAlloc*sizeof(p->aMatch[0]) );
     if( p->aMatch==0 ){
       p->nMatch = 0;
       p->nAlloc = 0;
@@ -3181,7 +3185,7 @@ static void snippetText(
   int iMatch;
   
 
-  free(pCursor->snippet.zSnippet);
+  sqlite3_free(pCursor->snippet.zSnippet);
   pCursor->snippet.zSnippet = 0;
   aMatch = pCursor->snippet.aMatch;
   nMatch = pCursor->snippet.nMatch;
@@ -3283,7 +3287,7 @@ static int fulltextClose(sqlite3_vtab_cursor *pCursor){
   snippetClear(&c->snippet);
   if( c->result.nData!=0 ) dlrDestroy(&c->reader);
   dataBufferDestroy(&c->result);
-  free(c);
+  sqlite3_free(c);
   return SQLITE_OK;
 }
 
@@ -3388,14 +3392,14 @@ static int docListOfTerm(
 static void queryAdd(Query *q, const char *pTerm, int nTerm){
   QueryTerm *t;
   ++q->nTerms;
-  q->pTerms = realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0]));
+  q->pTerms = sqlite3_realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0]));
   if( q->pTerms==0 ){
     q->nTerms = 0;
     return;
   }
   t = &q->pTerms[q->nTerms - 1];
   CLEAR(t);
-  t->pTerm = malloc(nTerm+1);
+  t->pTerm = sqlite3_malloc(nTerm+1);
   memcpy(t->pTerm, pTerm, nTerm);
   t->pTerm[nTerm] = 0;
   t->nTerm = nTerm;
@@ -3959,18 +3963,20 @@ typedef struct InteriorBlock {
 
 static InteriorBlock *interiorBlockNew(int iHeight, sqlite_int64 iChildBlock,
                                        const char *pTerm, int nTerm){
-  InteriorBlock *block = calloc(1, sizeof(InteriorBlock));
+  InteriorBlock *block = sqlite3_malloc(sizeof(InteriorBlock));
   char c[VARINT_MAX+VARINT_MAX];
   int n;
 
-  dataBufferInit(&block->term, 0);
-  dataBufferReplace(&block->term, pTerm, nTerm);
-
-  n = putVarint(c, iHeight);
-  n += putVarint(c+n, iChildBlock);
-  dataBufferInit(&block->data, INTERIOR_MAX);
-  dataBufferReplace(&block->data, c, n);
+  if( block ){
+    memset(block, 0, sizeof(*block));
+    dataBufferInit(&block->term, 0);
+    dataBufferReplace(&block->term, pTerm, nTerm);
 
+    n = putVarint(c, iHeight);
+    n += putVarint(c+n, iChildBlock);
+    dataBufferInit(&block->data, INTERIOR_MAX);
+    dataBufferReplace(&block->data, c, n);
+  }
   return block;
 }
 
@@ -4135,11 +4141,11 @@ static int interiorWriterDestroy(InteriorWriter *pWriter){
     block = block->next;
     dataBufferDestroy(&b->term);
     dataBufferDestroy(&b->data);
-    free(b);
+    sqlite3_free(b);
   }
   if( pWriter->parentWriter!=NULL ){
     interiorWriterDestroy(pWriter->parentWriter);
-    free(pWriter->parentWriter);
+    sqlite3_free(pWriter->parentWriter);
   }
   dataBufferDestroy(&pWriter->term);
   SCRAMBLE(pWriter);
@@ -4173,7 +4179,7 @@ static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter,
   if( rc!=SQLITE_OK ) return rc;
   *piEndBlockid = iBlockid;
 
-  pWriter->parentWriter = malloc(sizeof(*pWriter->parentWriter));
+  pWriter->parentWriter = sqlite3_malloc(sizeof(*pWriter->parentWriter));
   interiorWriterInit(pWriter->iHeight+1,
                      block->term.pData, block->term.nData,
                      iBlockid, pWriter->parentWriter);
@@ -5563,7 +5569,7 @@ static int writeZeroSegment(fulltext_vtab *v, fts2Hash *pTerms){
   if( rc!=SQLITE_OK ) return rc;
 
   n = fts2HashCount(pTerms);
-  pData = malloc(n*sizeof(TermData));
+  pData = sqlite3_malloc(n*sizeof(TermData));
 
   for(i = 0, e = fts2HashFirst(pTerms); e; i++, e = fts2HashNext(e)){
     assert( i<n );
@@ -5594,7 +5600,7 @@ static int writeZeroSegment(fulltext_vtab *v, fts2Hash *pTerms){
 
  err:
   dataBufferDestroy(&dl);
-  free(pData);
+  sqlite3_free(pData);
   leafWriterDestroy(&writer);
   return rc;
 }
index 7fcafcf3e4e7d8ee0ba83498056a0e4ad549c4e4..f22fcc91dfa2e942fa47a2dec01358e7cf83810a 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include "sqlite3.h"
 #include "fts2_hash.h"
 
 /*
index dab184953139d8a68725618df9318ca56ff669ca..97a95c872d318ccaa26bbee2ddbaa8696c059573 100644 (file)
@@ -66,9 +66,9 @@ static int porterCreate(
   sqlite3_tokenizer **ppTokenizer
 ){
   porter_tokenizer *t;
-  t = (porter_tokenizer *) calloc(sizeof(*t), 1);
+  t = (porter_tokenizer *) sqlite3_malloc(sizeof(*t));
   if( t==NULL ) return SQLITE_NOMEM;
-
+  memset(t, 0, sizeof(*t));
   *ppTokenizer = &t->base;
   return SQLITE_OK;
 }
@@ -77,7 +77,7 @@ static int porterCreate(
 ** Destroy a tokenizer
 */
 static int porterDestroy(sqlite3_tokenizer *pTokenizer){
-  free(pTokenizer);
+  sqlite3_free(pTokenizer);
   return SQLITE_OK;
 }
 
@@ -94,7 +94,7 @@ static int porterOpen(
 ){
   porter_tokenizer_cursor *c;
 
-  c = (porter_tokenizer_cursor *) malloc(sizeof(*c));
+  c = (porter_tokenizer_cursor *) sqlite3_malloc(sizeof(*c));
   if( c==NULL ) return SQLITE_NOMEM;
 
   c->zInput = zInput;
@@ -120,8 +120,8 @@ static int porterOpen(
 */
 static int porterClose(sqlite3_tokenizer_cursor *pCursor){
   porter_tokenizer_cursor *c = (porter_tokenizer_cursor *) pCursor;
-  free(c->zToken);
-  free(c);
+  sqlite3_free(c->zToken);
+  sqlite3_free(c);
   return SQLITE_OK;
 }
 /*
@@ -603,7 +603,7 @@ static int porterNext(
       int n = c->iOffset-iStartOffset;
       if( n>c->nAllocated ){
         c->nAllocated = n+20;
-        c->zToken = realloc(c->zToken, c->nAllocated);
+        c->zToken = sqlite3_realloc(c->zToken, c->nAllocated);
         if( c->zToken==NULL ) return SQLITE_NOMEM;
       }
       porter_stemmer(&z[iStartOffset], n, c->zToken, pnBytes);
index 540ba27def9380b012088ff271e59f57bdf65ceb..f2ba49e5734a33de0f1922eaf458439e4a1b0793 100644 (file)
@@ -65,8 +65,9 @@ static int simpleCreate(
 ){
   simple_tokenizer *t;
 
-  t = (simple_tokenizer *) calloc(sizeof(*t), 1);
+  t = (simple_tokenizer *) sqlite3_malloc(sizeof(*t));
   if( t==NULL ) return SQLITE_NOMEM;
+  memset(t, 0, sizeof(*t));
 
   /* TODO(shess) Delimiters need to remain the same from run to run,
   ** else we need to reindex.  One solution would be a meta-table to
@@ -79,7 +80,7 @@ static int simpleCreate(
       unsigned char ch = argv[1][i];
       /* We explicitly don't support UTF-8 delimiters for now. */
       if( ch>=0x80 ){
-        free(t);
+        sqlite3_free(t);
         return SQLITE_ERROR;
       }
       t->delim[ch] = 1;
@@ -100,7 +101,7 @@ static int simpleCreate(
 ** Destroy a tokenizer
 */
 static int simpleDestroy(sqlite3_tokenizer *pTokenizer){
-  free(pTokenizer);
+  sqlite3_free(pTokenizer);
   return SQLITE_OK;
 }
 
@@ -117,7 +118,7 @@ static int simpleOpen(
 ){
   simple_tokenizer_cursor *c;
 
-  c = (simple_tokenizer_cursor *) malloc(sizeof(*c));
+  c = (simple_tokenizer_cursor *) sqlite3_malloc(sizeof(*c));
   if( c==NULL ) return SQLITE_NOMEM;
 
   c->pInput = pInput;
@@ -143,8 +144,8 @@ static int simpleOpen(
 */
 static int simpleClose(sqlite3_tokenizer_cursor *pCursor){
   simple_tokenizer_cursor *c = (simple_tokenizer_cursor *) pCursor;
-  free(c->pToken);
-  free(c);
+  sqlite3_free(c->pToken);
+  sqlite3_free(c);
   return SQLITE_OK;
 }
 
@@ -182,7 +183,7 @@ static int simpleNext(
       int i, n = c->iOffset-iStartOffset;
       if( n>c->nTokenAllocated ){
         c->nTokenAllocated = n+20;
-        c->pToken = realloc(c->pToken, c->nTokenAllocated);
+        c->pToken = sqlite3_realloc(c->pToken, c->nTokenAllocated);
         if( c->pToken==NULL ) return SQLITE_NOMEM;
       }
       for(i=0; i<n; i++){
index b681a4e61ee962e08317befba9f62216ed52cd99..795744b12808f0ab11b9120ee72f2b6fdb73bbc0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C fts2.c\sbuildTerms()\spasses\s-1\sfor\snInput.\r\nBackports\s(4511)\sfrom\sfts3.\s(CVS\s5453)
-D 2008-07-22T22:20:50
+C Changes\sfts2\sto\suse\sonly\ssqlite3_malloc()\sand\snot\ssystem\smalloc.\r\nBackports\s(4554)\sand\s(4555)\sfrom\sfts3.\s(CVS\s5454)
+D 2008-07-22T22:57:54
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 77ff156061bb870aa0a8b3d545c670d08070f7e6
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -39,15 +39,15 @@ F ext/fts1/simple_tokenizer.c 1844d72f7194c3fd3d7e4173053911bf0661b70d
 F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9
 F ext/fts2/README.tokenizers 21e3684ea5a095b55d70f6878b4ce6af5932dfb7
 F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts2/fts2.c 015d44a43d2a3586cd31b29f7fc1c60f21628dc3
+F ext/fts2/fts2.c f50c7faca742f40b14a2b279d652594c532e6523
 F ext/fts2/fts2.h da5f76c65163301d1068a971fd32f4119e3c95fa
-F ext/fts2/fts2_hash.c 25ad8043ce2e708840a8fb179b8ed04325f860eb
+F ext/fts2/fts2_hash.c 2689e42e1107ea67207f725cf69cf8972d00cf93
 F ext/fts2/fts2_hash.h 9a5b1be94664139f93217a0770d7144425cffb3a
 F ext/fts2/fts2_icu.c 53162e0dbe6d27a0cc24ad2c10cea8c48b7c839b
-F ext/fts2/fts2_porter.c 98c9dbd1eed20032c03ce05877164e262567443e
+F ext/fts2/fts2_porter.c 8a6369b0fae98c04db95e4fa95fac7c03d7182ec
 F ext/fts2/fts2_tokenizer.c 5cec41326fabe65323945a46fa9495ee85c3d5fd
 F ext/fts2/fts2_tokenizer.h a7e46462d935a314b2682287f12f27530a3ee08e
-F ext/fts2/fts2_tokenizer1.c 8a545c232bdffafd117c4eeaf59789691909f26a
+F ext/fts2/fts2_tokenizer1.c 8545ce12b41922004da46e91a7b023b92b76f94e
 F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0
 F ext/fts3/README.tokenizers 226644a0eab97724e8de83061912e8bb248461b6
 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
@@ -299,6 +299,7 @@ F test/fts1m.test 2d9ca67b095d49f037a914087cc0a61e89da4f0c
 F test/fts1n.test a2317dcd27b1d087ee3878b30e0a59c593c98b7a
 F test/fts1o.test 382b8b07a2d6de5610814d9477117c4430464b9c
 F test/fts1porter.test d86e9c3e0c7f8ff95add6582b4b585fb4e02b96d
+F test/fts2.test 83704ba4d7956f6646c0c5192a0b16df61e4b2af
 F test/fts2a.test 473a5c8b473a4e21a8e3fddaed1e59666e0c6ab7
 F test/fts2b.test 964abc0236c849c07ca1ae496bb25c268ae94816
 F test/fts2c.test ffb5a35230ac72c4354535c547965ce6824537c0
@@ -608,7 +609,7 @@ F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81
 F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 1dbced29de5f59ba2ebf877edcadf171540374d1
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
-P e31d2f875c13ee41742c9aaee6291662cdbbf863
-R 6376acd2dc63d085f9c9b21e576d7486
+P d562515e1cdd05212674516033c64b5f5668b799
+R 2682d383bee51312a260e3583fb091fa
 U shess
-Z 32663cd2dfd230cb3d5b37a9b5daa7ee
+Z 7b59d5a322f77dacbe20c5139c2b6d35
index a966200bf6f8fe5ae02a76f27913756509306c28..5f5c013d3fa3dcd4867c8fdedc19ca74c45da6ec 100644 (file)
@@ -1 +1 @@
-d562515e1cdd05212674516033c64b5f5668b799
\ No newline at end of file
+ecf2dec66cb979cb7d8db3b7ce5c64cab57fe2bb
\ No newline at end of file
diff --git a/test/fts2.test b/test/fts2.test
new file mode 100644 (file)
index 0000000..4487317
--- /dev/null
@@ -0,0 +1,68 @@
+#
+#    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 runs all tests.
+#
+# $Id: fts2.test,v 1.1 2008/07/22 22:57:54 shess Exp $
+
+proc lshift {lvar} {
+  upvar $lvar l
+  set ret [lindex $l 0]
+  set l [lrange $l 1 end]
+  return $ret
+}
+while {[set arg [lshift argv]] != ""} {
+  switch -- $arg {
+    -sharedpagercache {
+      sqlite3_enable_shared_cache 1
+    }
+    -soak {
+       set SOAKTEST 1
+    }
+    default {
+      set argv [linsert $argv 0 $arg]
+      break
+    }
+  }
+}
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+# If SQLITE_ENABLE_FTS2 is defined, omit this file.
+ifcapable !fts2 {
+  puts stderr "this build does not include FTS2 capability"
+  exit 1
+}
+rename finish_test really_finish_test
+proc finish_test {} {}
+set ISQUICK 1
+
+set EXCLUDE {
+  fts2.test
+}
+
+# Files to include in the test.  If this list is empty then everything
+# that is not in the EXCLUDE list is run.
+#
+set INCLUDE {
+}
+
+foreach testfile [lsort -dictionary [glob $testdir/fts2*.test]] {
+  set tail [file tail $testfile]
+  if {[lsearch -exact $EXCLUDE $tail]>=0} continue
+  if {[llength $INCLUDE]>0 && [lsearch -exact $INCLUDE $tail]<0} continue
+  source $testfile
+  catch {db close}
+  if {$sqlite_open_file_count>0} {
+    puts "$tail did not close all files: $sqlite_open_file_count"
+    incr nErr
+    lappend ::failList $tail
+    set sqlite_open_file_count 0
+  }
+}
+
+set sqlite_open_file_count 0
+really_finish_test