]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add a cookie mechanism to ensure that the %_config table is re-read as required.
authordan <dan@noemail.net>
Fri, 28 Nov 2014 20:01:13 +0000 (20:01 +0000)
committerdan <dan@noemail.net>
Fri, 28 Nov 2014 20:01:13 +0000 (20:01 +0000)
FossilOrigin-Name: bb4a37b53de60da9ec8b9317eec14afa99690828

15 files changed:
ext/fts5/fts5.c
ext/fts5/fts5Int.h
ext/fts5/fts5_buffer.c
ext/fts5/fts5_config.c
ext/fts5/fts5_index.c
ext/fts5/fts5_storage.c
manifest
manifest.uuid
test/fts5aa.test
test/fts5ab.test
test/fts5ac.test
test/fts5ad.test
test/fts5ae.test
test/fts5ah.test
test/fts5aj.test

index b47b37aba1596e3d39da1add4ab7da6acb2c7314..83428bc1c3adfb6a6a4c79736b63356b8b8e723c 100644 (file)
@@ -340,11 +340,6 @@ static int fts5InitVtab(
     rc = sqlite3Fts5ConfigDeclareVtab(pConfig);
   }
 
-  /* Load the contents of %_config */
-  if( rc==SQLITE_OK ){
-    rc = sqlite3Fts5ConfigLoad(pConfig);
-  }
-
   if( rc!=SQLITE_OK ){
     fts5FreeVtab(pTab, 0);
     pTab = 0;
index a29eb3f5dc3fbdb74b5aae9ac525d6d2b8b5af29..d2abadc36df9e2794456ae40c865abf37a452eba 100644 (file)
@@ -60,6 +60,11 @@ typedef struct Fts5Config Fts5Config;
 ** be gleaned from the CREATE VIRTUAL TABLE statement.
 **
 ** And all information loaded from the %_config table.
+**
+** nAutomerge:
+**   The minimum number of segments that an auto-merge operation should
+**   attempt to merge together. A value of 1 sets the object to use the 
+**   compile time default. Zero disables auto-merge altogether.
 */
 struct Fts5Config {
   sqlite3 *db;                    /* Database handle */
@@ -75,6 +80,7 @@ struct Fts5Config {
   /* Values loaded from the %_config table */
   int iCookie;                    /* Incremented when %_config is modified */
   int pgsz;                       /* Approximate page size used in %_data */
+  int nAutomerge;                 /* 'automerge' setting */
 };
 
 int sqlite3Fts5ConfigParse(
@@ -94,7 +100,7 @@ int sqlite3Fts5Tokenize(
 void sqlite3Fts5Dequote(char *z);
 
 /* Load the contents of the %_config table */
-int sqlite3Fts5ConfigLoad(Fts5Config*);
+int sqlite3Fts5ConfigLoad(Fts5Config*, int);
 
 /* Set the value of a single config attribute */
 int sqlite3Fts5ConfigSetValue(Fts5Config*, const char*, sqlite3_value*, int*);
@@ -126,6 +132,7 @@ void sqlite3Fts5BufferZero(Fts5Buffer*);
 void sqlite3Fts5BufferSet(int*, Fts5Buffer*, int, const u8*);
 void sqlite3Fts5BufferAppendPrintf(int *, Fts5Buffer*, char *zFmt, ...);
 void sqlite3Fts5BufferAppendListElem(int*, Fts5Buffer*, const char*, int);
+void sqlite3Fts5BufferAppend32(int*, Fts5Buffer*, int);
 
 #define fts5BufferZero(x)             sqlite3Fts5BufferZero(x)
 #define fts5BufferGrow(a,b,c)         sqlite3Fts5BufferGrow(a,b,c)
@@ -133,6 +140,11 @@ void sqlite3Fts5BufferAppendListElem(int*, Fts5Buffer*, const char*, int);
 #define fts5BufferFree(a)             sqlite3Fts5BufferFree(a)
 #define fts5BufferAppendBlob(a,b,c,d) sqlite3Fts5BufferAppendBlob(a,b,c,d)
 #define fts5BufferSet(a,b,c,d)        sqlite3Fts5BufferSet(a,b,c,d)
+#define fts5BufferAppend32(a,b,c)     sqlite3Fts5BufferAppend32(a,b,c)
+
+/* Write and decode big-endian 32-bit integer values */
+void sqlite3Fts5Put32(u8*, int);
+int sqlite3Fts5Get32(const u8*);
 
 typedef struct Fts5PoslistReader Fts5PoslistReader;
 struct Fts5PoslistReader {
@@ -298,7 +310,7 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index*, u64 cksum);
 */
 int sqlite3Fts5IndexInit(sqlite3*);
 
-void sqlite3Fts5IndexAutomerge(Fts5Index *p, int nMerge);
+int sqlite3Fts5IndexSetCookie(Fts5Index*, int);
 
 /*
 ** Return the total number of entries read from the %_data table by 
index bea316eda488f51c7da2ca811b407e146fab7a15..478b903614ca5c781f19ad43aecc257f4cbb48c9 100644 (file)
@@ -46,6 +46,24 @@ void sqlite3Fts5BufferAppendVarint(int *pRc, Fts5Buffer *pBuf, i64 iVal){
   pBuf->n += sqlite3PutVarint(&pBuf->p[pBuf->n], iVal);
 }
 
+void sqlite3Fts5Put32(u8 *aBuf, int iVal){
+  aBuf[0] = (iVal>>24) & 0x00FF;
+  aBuf[1] = (iVal>>16) & 0x00FF;
+  aBuf[2] = (iVal>> 8) & 0x00FF;
+  aBuf[3] = (iVal>> 0) & 0x00FF;
+}
+
+int sqlite3Fts5Get32(const u8 *aBuf){
+  return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3];
+}
+
+void sqlite3Fts5BufferAppend32(int *pRc, Fts5Buffer *pBuf, int iVal){
+  char *a;
+  if( sqlite3Fts5BufferGrow(pRc, pBuf, 4) ) return;
+  sqlite3Fts5Put32(&pBuf->p[pBuf->n], iVal);
+  pBuf->n += 4;
+}
+
 /*
 ** Append buffer nData/pData to buffer pBuf. If an OOM error occurs, set 
 ** the error code in p. If an error has already occurred when this function
index 98a6fe1afef03a451c1f10201d839bbe6e84f72f..c7e729276bd8822b3a34b7e1c737fcf9888748f9 100644 (file)
 #include "fts5Int.h"
 
 #define FTS5_DEFAULT_PAGE_SIZE   1000
+#define FTS5_DEFAULT_AUTOMERGE      4
+
+/* Maximum allowed page size */
+#define FTS5_MAX_PAGE_SIZE (128*1024)
 
 /*
 ** Convert an SQL-style quoted string into a normal string by removing
@@ -153,6 +157,7 @@ int sqlite3Fts5ConfigParse(
   if( pRet==0 ) return SQLITE_NOMEM;
   memset(pRet, 0, sizeof(Fts5Config));
   pRet->db = db;
+  pRet->iCookie = -1;
 
   pRet->azCol = (char**)sqlite3_malloc(sizeof(char*) * nArg);
   pRet->zDb = fts5Strdup(azArg[1]);
@@ -307,16 +312,32 @@ int sqlite3Fts5ConfigSetValue(
   if(      0==sqlite3_stricmp(zKey, "cookie") ){
     pConfig->iCookie = sqlite3_value_int(pVal);
   }
+
   else if( 0==sqlite3_stricmp(zKey, "pgsz") ){
+    int pgsz = 0;
     if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){
-      pConfig->pgsz = sqlite3_value_int(pVal);
-    }else{
+      pgsz = sqlite3_value_int(pVal);
+    }
+    if( pgsz<=0 || pgsz>FTS5_MAX_PAGE_SIZE ){
       if( pbBadkey ) *pbBadkey = 1;
+    }else{
+      pConfig->pgsz = pgsz;
     }
   }
+
   else if( 0==sqlite3_stricmp(zKey, "automerge") ){
-    // todo
+    int nAutomerge = -1;
+    if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){
+      nAutomerge = sqlite3_value_int(pVal);
+    }
+    if( nAutomerge<0 || nAutomerge>64 ){
+      if( pbBadkey ) *pbBadkey = 1;
+    }else{
+      if( nAutomerge==1 ) nAutomerge = FTS5_DEFAULT_AUTOMERGE;
+      pConfig->nAutomerge = nAutomerge;
+    }
   }
+
   else if( 0==sqlite3_stricmp(zKey, "rank") ){
     // todo
   }else{
@@ -328,7 +349,7 @@ int sqlite3Fts5ConfigSetValue(
 /*
 ** Load the contents of the %_config table into memory.
 */
-int sqlite3Fts5ConfigLoad(Fts5Config *pConfig){
+int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){
   const char *zSelect = "SELECT k, v FROM %Q.'%q_config'";
   char *zSql;
   sqlite3_stmt *p = 0;
@@ -336,7 +357,7 @@ int sqlite3Fts5ConfigLoad(Fts5Config *pConfig){
 
   /* Set default values */
   pConfig->pgsz = FTS5_DEFAULT_PAGE_SIZE;
-  pConfig->iCookie = 0;
+  pConfig->nAutomerge = FTS5_DEFAULT_AUTOMERGE;
 
   zSql = sqlite3_mprintf(zSelect, pConfig->zDb, pConfig->zName);
   if( zSql==0 ){
@@ -356,6 +377,9 @@ int sqlite3Fts5ConfigLoad(Fts5Config *pConfig){
     rc = sqlite3_finalize(p);
   }
 
+  if( rc==SQLITE_OK ){
+    pConfig->iCookie = iCookie;
+  }
   return rc;
 }
 
index 262d5db97c60e7231dd0a587323dd513b0bf6e12..b51e7bad119a4a57c146807b0a1b0cd3751c9374 100644 (file)
@@ -42,7 +42,6 @@
 */
 
 #define FTS5_WORK_UNIT      64    /* Number of leaf pages in unit of work */
-#define FTS5_MIN_MERGE       4    /* Minimum number of segments to merge */
 #define FTS5_CRISIS_MERGE   16    /* Maximum number of segments to merge */
 
 #define FTS5_MIN_DLIDX_SIZE  4    /* Add dlidx if this many empty pages */
 ** 1. Structure Records:
 **
 **   The set of segments that make up an index - the index structure - are
-**   recorded in a single record within the %_data table. The record is a list
-**   of SQLite varints. 
+**   recorded in a single record within the %_data table. The record consists
+**   of a single 32-bit configuration cookie value followed by a list of 
+**   SQLite varints. If the FTS table features more than one index (because
+**   there are one or more prefix indexes), it is guaranteed that all share
+**   the same cookie value.
 **
-**   The record begins with three varints:
+**   Immediately following the configuration cookie, the record begins with
+**   three varints:
 **
 **     + number of levels,
 **     + total number of segments on all levels,
@@ -288,7 +291,6 @@ typedef struct Fts5StructureSegment Fts5StructureSegment;
 struct Fts5Index {
   Fts5Config *pConfig;            /* Virtual table configuration */
   char *zDataTbl;                 /* Name of %_data table */
-  int nMinMerge;                  /* Minimum input segments in a merge */
   int nCrisisMerge;               /* Maximum allowed segments per level */
   int nWorkUnit;                  /* Leaf pages in a "unit" of work */
 
@@ -960,6 +962,7 @@ static void fts5DataRemoveSegment(Fts5Index *p, int iIdx, int iSegid){
 static int fts5StructureDecode(
   const u8 *pData,                /* Buffer containing serialized structure */
   int nData,                      /* Size of buffer pData in bytes */
+  int *piCookie,                  /* Configuration cookie value */
   Fts5Structure **ppOut           /* OUT: Deserialized object */
 ){
   int rc = SQLITE_OK;
@@ -970,9 +973,13 @@ static int fts5StructureDecode(
   int nByte;                      /* Bytes of space to allocate at pRet */
   Fts5Structure *pRet = 0;        /* Structure object to return */
 
+  /* Grab the cookie value */
+  if( piCookie ) *piCookie = sqlite3Fts5Get32(pData);
+  i = 4;
+
   /* Read the total number of levels and segments from the start of the
   ** structure record.  */
-  i = getVarint32(&pData[i], nLevel);
+  i += getVarint32(&pData[i], nLevel);
   i += getVarint32(&pData[i], nSegment);
   nByte = (
       sizeof(Fts5Structure) +                    /* Main structure */
@@ -1083,11 +1090,16 @@ static Fts5Structure *fts5StructureRead(Fts5Index *p, int iIdx){
   Fts5Config *pConfig = p->pConfig;
   Fts5Structure *pRet = 0;        /* Object to return */
   Fts5Data *pData;                /* %_data entry containing structure record */
+  int iCookie;                    /* Configuration cookie */
 
   assert( iIdx<=pConfig->nPrefix );
   pData = fts5DataRead(p, FTS5_STRUCTURE_ROWID(iIdx));
   if( !pData ) return 0;
-  p->rc = fts5StructureDecode(pData->p, pData->n, &pRet);
+  p->rc = fts5StructureDecode(pData->p, pData->n, &iCookie, &pRet);
+
+  if( p->rc==SQLITE_OK && p->pConfig->iCookie!=iCookie ){
+    p->rc = sqlite3Fts5ConfigLoad(p->pConfig, iCookie);
+  }
 
   fts5DataRelease(pData);
   return pRet;
@@ -1129,9 +1141,16 @@ static void fts5StructureWrite(Fts5Index *p, int iIdx, Fts5Structure *pStruct){
   int nSegment;                   /* Total number of segments */
   Fts5Buffer buf;                 /* Buffer to serialize record into */
   int iLvl;                       /* Used to iterate through levels */
+  int iCookie;                    /* Cookie value to store */
 
   nSegment = fts5StructureCountSegments(pStruct);
   memset(&buf, 0, sizeof(Fts5Buffer));
+
+  /* Append the current configuration cookie */
+  iCookie = p->pConfig->iCookie;
+  if( iCookie<0 ) iCookie = 0;
+  fts5BufferAppend32(&p->rc, &buf, iCookie);
+
   fts5BufferAppendVarint(&p->rc, &buf, pStruct->nLevel);
   fts5BufferAppendVarint(&p->rc, &buf, nSegment);
   fts5BufferAppendVarint(&p->rc, &buf, (i64)pStruct->nWriteCounter);
@@ -2825,6 +2844,7 @@ static void fts5WriteAppendPoslistData(
   const u8 *a = aData;
   int n = nData;
   
+  assert( p->pConfig->pgsz>0 );
   while( p->rc==SQLITE_OK && (pPage->buf.n + n)>=p->pConfig->pgsz ){
     int nReq = p->pConfig->pgsz - pPage->buf.n;
     int nCopy = 0;
@@ -3179,7 +3199,11 @@ static void fts5IndexWork(
     }
 #endif
 
-    if( nBest<p->nMinMerge && pStruct->aLevel[iBestLvl].nMerge==0 ) break;
+    if( nBest<p->pConfig->nAutomerge 
+     && pStruct->aLevel[iBestLvl].nMerge==0 
+    ){
+      break;
+    }
     fts5IndexMergeLevel(p, iIdx, &pStruct, iBestLvl, &nRem);
     fts5StructurePromote(p, iBestLvl+1, pStruct);
     assert( nRem==0 || p->rc==SQLITE_OK );
@@ -3293,7 +3317,7 @@ static void fts5FlushOneHash(Fts5Index *p, int iHash, int *pnLeaf){
     }
   }
 
-  if( p->nMinMerge>0 ) fts5IndexWork(p, iHash, &pStruct, pgnoLast);
+  if( p->pConfig->nAutomerge>0 ) fts5IndexWork(p, iHash, &pStruct, pgnoLast);
   fts5IndexCrisisMerge(p, iHash, &pStruct);
   fts5StructureWrite(p, iHash, pStruct);
   fts5StructureRelease(pStruct);
@@ -3371,7 +3395,6 @@ int sqlite3Fts5IndexOpen(
 
   memset(p, 0, sizeof(Fts5Index));
   p->pConfig = pConfig;
-  p->nMinMerge = FTS5_MIN_MERGE;
   p->nCrisisMerge = FTS5_CRISIS_MERGE;
   p->nWorkUnit = FTS5_WORK_UNIT;
   p->nMaxPendingData = 1024*1024;
@@ -3781,6 +3804,11 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){
 }
 
 /*
+** This is part of the fts5_decode() debugging aid.
+**
+** Arguments pBlob/nBlob contain a serialized Fts5Structure object. This
+** function appends a human-readable representation of the same object
+** to the buffer passed as the second argument. 
 */
 static void fts5DecodeStructure(
   int *pRc,                       /* IN/OUT: error code */
@@ -3790,7 +3818,7 @@ static void fts5DecodeStructure(
   int rc;                         /* Return code */
   Fts5Structure *p = 0;           /* Decoded structure object */
 
-  rc = fts5StructureDecode(pBlob, nBlob, &p);
+  rc = fts5StructureDecode(pBlob, nBlob, 0, &p);
   if( rc!=SQLITE_OK ){
     *pRc = rc;
     return;
@@ -3985,19 +4013,6 @@ int sqlite3Fts5IndexInit(sqlite3 *db){
   return rc;
 }
 
-/*
-** Set the minimum number of segments that an auto-merge operation should
-** attempt to merge together. A value of 1 sets the object to use the 
-** compile time default. Zero or less disables auto-merge altogether.
-*/
-void sqlite3Fts5IndexAutomerge(Fts5Index *p, int nMinMerge){
-  if( nMinMerge==1 ){
-    p->nMinMerge = FTS5_MIN_MERGE;
-  }else{
-    p->nMinMerge = nMinMerge;
-  }
-}
-
 /*
 ** Iterator pMulti currently points to a valid entry (not EOF). This
 ** function appends a copy of the position-list of the entry pMulti 
@@ -4408,3 +4423,32 @@ int sqlite3Fts5IndexReads(Fts5Index *p){
   return p->nRead;
 }
 
+/*
+** Set the 32-bit cookie value at the start of all structure records to
+** the value passed as the second argument.
+**
+** Return SQLITE_OK if successful, or an SQLite error code if an error
+** occurs.
+*/
+int sqlite3Fts5IndexSetCookie(Fts5Index *p, int iNew){
+  int rc = SQLITE_OK;
+  Fts5Config *pConfig = p->pConfig;
+  u8 aCookie[4];
+  int i;
+
+  sqlite3Fts5Put32(aCookie, iNew);
+  for(i=0; rc==SQLITE_OK && i<=pConfig->nPrefix; i++){
+    sqlite3_blob *pBlob = 0;
+    i64 iRowid = FTS5_STRUCTURE_ROWID(i);
+    rc = sqlite3_blob_open(
+        pConfig->db, pConfig->zDb, p->zDataTbl, "block", iRowid, 1, &pBlob
+    );
+    if( rc==SQLITE_OK ){
+      sqlite3_blob_write(pBlob, aCookie, 4, 0);
+      rc = sqlite3_blob_close(pBlob);
+    }
+  }
+
+  return rc;
+}
+
index bbe09874ce86fcfec37a9cbff42b69957a1deed6..0ce4e50e7aac3db9e513cea688ceae171ea9cf86 100644 (file)
@@ -769,6 +769,13 @@ int sqlite3Fts5StorageConfigValue(
     sqlite3_step(pReplace);
     rc = sqlite3_reset(pReplace);
   }
+  if( rc==SQLITE_OK ){
+    int iNew = p->pConfig->iCookie + 1;
+    rc = sqlite3Fts5IndexSetCookie(p->pIndex, iNew);
+    if( rc==SQLITE_OK ){
+      p->pConfig->iCookie = iNew;
+    }
+  }
   return rc;
 }
 
index 2a109507b349892335894c8bdc52e5f48b322f78..91938fa8ea94e9f2b7cd352227fd53cbd32ba048 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sa\s%_config\stable\sto\sfts5.
-D 2014-11-27T20:03:45.010
+C Add\sa\scookie\smechanism\sto\sensure\sthat\sthe\s%_config\stable\sis\sre-read\sas\srequired.
+D 2014-11-28T20:01:13.778
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -104,16 +104,16 @@ F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c
 F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
 F ext/fts3/unicode/mkunicode.tcl dc6f268eb526710e2c6e496c372471d773d0c368
 F ext/fts5/extract_api_docs.tcl 6320db4a1d0722a4e2069e661381ad75e9889786
-F ext/fts5/fts5.c 3c920d090b1cdbc69ba03acf7c9302a19be55cee
+F ext/fts5/fts5.c b3a2574be6921512133d228a922bc0bfb221c569
 F ext/fts5/fts5.h 72fc1e9995b1ddc254a487b9528614a83bd3dfb6
-F ext/fts5/fts5Int.h 63daceb6e421b9066e05c4e89651f27fa675be93
+F ext/fts5/fts5Int.h a466dd67c909ac05ce8330acf13c7c5bfd244e15
 F ext/fts5/fts5_aux.c 0e3e5fea6bf5772805afe14c95cb5f16e03e4b3f
-F ext/fts5/fts5_buffer.c 248c61ac9fec001602efc72a45704f3b8d367c00
-F ext/fts5/fts5_config.c aae1470ca0e2125e758df5b612f26082a1dc254a
+F ext/fts5/fts5_buffer.c c79d67a5a611521f1f3b9d495981f22c02ef4bdb
+F ext/fts5/fts5_config.c c95d89bd3ee119681f0aeff0fa34ee9cd18fc430
 F ext/fts5/fts5_expr.c d317be07d70223a6865444f17982570260b690a5
 F ext/fts5/fts5_hash.c 63fa8379c5f2ac107d47c2b7d9ac04c95ef8a279
-F ext/fts5/fts5_index.c 5cb71b3922e50a23752fd6c11028acfe2f367850
-F ext/fts5/fts5_storage.c c28d1a88f45f83980eb32631c7421d7f5dd336fa
+F ext/fts5/fts5_index.c 7e7023f3a29f104b44df2ca2474b296b8dfe447c
+F ext/fts5/fts5_storage.c 0198c5976cefa5e8d3f1cfffa3587d0dd594fb2a
 F ext/fts5/fts5_tokenize.c 8360c0d1ae0d4696f3cc13f7c67a2db6011cdc5b
 F ext/fts5/fts5parse.y 777da8e5819f75c217982c79c29d014c293acac9
 F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43
@@ -598,16 +598,16 @@ F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7
 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b
 F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849
 F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36
-F test/fts5aa.test fb49e2db450f9bec900b05b6a85141695d6c2255
-F test/fts5ab.test 32ad48ca5317548dc6934585f6071b5e7ff03e61
-F test/fts5ac.test 3982268756a543cbf3ae508b6336f623136b754a
-F test/fts5ad.test 4e2e6a71fc7465eaaa32fd6ec318e657c6e7baa9
-F test/fts5ae.test 0c0712b1430158f976fce3564adf3e3713a4a93d
+F test/fts5aa.test 27c7d3c865e144a0501dcbfbd6d2ae87f77602ea
+F test/fts5ab.test 52f6b9223372ff70b0edb5a3054fbd7bc7fcfefc
+F test/fts5ac.test 60302196b7711176ce872fe2e4c73c75ac2c4038
+F test/fts5ad.test ed60fdafc73d879b42573abcfa6ede7e02e07c19
+F test/fts5ae.test 6decf7634acd161af9583ce32ab7197b0113c5cd
 F test/fts5af.test d24e3b0f879998ef5f60087272f8ab7b3a8fd4dc
 F test/fts5ag.test 1c6c188d1bdc41b2277db3f4ddfea7d90bf44ceb
-F test/fts5ah.test c79b5107c2a47096f0e3473a4806ebc17f006cf4
+F test/fts5ah.test 788e923e60b5e7a559f672cfbf262b8b260ea176
 F test/fts5ai.test aa2b5fd0f8d2cf59ac0211111e63cbca3b40ed7d
-F test/fts5aj.test 947c957cdcfc8af7d428f8b82e82926b3b45a504
+F test/fts5aj.test bc3d91bd012c7ca175cdf266c2074920bb5fa5ba
 F test/fts5ak.test e55bb0f3fac1291d32bc9485a3ee55a7d76f4d5f
 F test/fts5al.test 455b2bdc9f6ffb965a38a970a60c5075ee1e23bb
 F test/fts5ea.test afaf3497b43add578384dc1fd26b0342738abe87
@@ -1206,7 +1206,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 059092379f981eb919b500ce447006f9e645fc5a
-R 4ec91e9a7d6238c87465b8e2b7986d2c
+P 83491c56661ca78f96020ba68184bb3fb19e674f
+R 14f6d2fef178e1939a8a8ad40901ad6e
 U dan
-Z 1dea62df28b08fe11d603550a65329e7
+Z bcf001d05010ed5ade28bb9d53b64e80
index 54ffb909221bab717faf2a82538069d8c364d2f3..2e718d56bfb7b9f944cb6a8766b01685c4a848ed 100644 (file)
@@ -1 +1 @@
-83491c56661ca78f96020ba68184bb3fb19e674f
\ No newline at end of file
+bb4a37b53de60da9ec8b9317eec14afa99690828
\ No newline at end of file
index 9c715bfd4060b8fdad08731b213afe738cf00c4c..b9440c5c902b21a6c9c6eef39baea2cad25b195d 100644 (file)
@@ -85,7 +85,7 @@ foreach {i x y} {
 reset_db
 do_execsql_test 4.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x,y);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 foreach {i x y} {
    1  {g f d b f} {h h e i a}
@@ -109,7 +109,7 @@ foreach {i x y} {
 reset_db
 do_execsql_test 5.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x,y);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 foreach {i x y} {
    1  {dd abc abc abc abcde} {aaa dd ddd ddd aab}
@@ -134,7 +134,7 @@ breakpoint
 reset_db
 do_execsql_test 6.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x,y);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 do_execsql_test 6.1 {
@@ -152,7 +152,7 @@ reset_db
 expr srand(0)
 do_execsql_test 7.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x,y,z);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 proc doc {} {
@@ -191,7 +191,7 @@ for {set i 1} {$i <= 10} {incr i} {
 reset_db
 do_execsql_test 8.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x, prefix="1,2,3");
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 do_execsql_test 8.1 {
@@ -208,7 +208,7 @@ expr srand(0)
 
 do_execsql_test 9.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x,y,z, prefix="1,2,3");
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 proc doc {} {
index 2fd3c047ccb9df8d0b49a3d8da7c2c4b3224fa98..88b869278789f00a94685101bf78877fa44c8221 100644 (file)
@@ -59,7 +59,7 @@ do_execsql_test 1.6 {
 reset_db
 do_execsql_test 2.1 {
   CREATE VIRTUAL TABLE t1 USING fts5(x);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
   INSERT INTO t1 VALUES('one');
   INSERT INTO t1 VALUES('two');
   INSERT INTO t1 VALUES('three');
@@ -99,7 +99,7 @@ foreach {tn expr res} {
 reset_db
 do_execsql_test 3.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(a,b);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 foreach {tn a b} {
index f3efa141073d64bcc3af257a76aceae2e2a0059f..1b56c8b0e356db76c42be9541c893fe16dceb35b 100644 (file)
@@ -25,7 +25,7 @@ ifcapable !fts5 {
 
 do_execsql_test 1.0 {
   CREATE VIRTUAL TABLE xx USING fts5(x,y);
-  INSERT INTO xx(xx, rowid) VALUES('pgsz', 32);
+  INSERT INTO xx(xx, rank) VALUES('pgsz', 32);
 }
 
 set data {
index 8eabb7b978569c5fa015e06e55bc09e510557256..9514e996c506fef2cbb224401d0d9749a53ac47d 100644 (file)
@@ -55,12 +55,12 @@ foreach {tn match res} {
 foreach {T create} {
   2 {
     CREATE VIRTUAL TABLE t1 USING fts5(a, b);
-    INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
   }
   
   3 {
     CREATE VIRTUAL TABLE t1 USING fts5(a, b, prefix=1,2,3,4,5);
-    INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+    INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
   }
 
 } {
index c29ec499ed556c5182d26010f479ce3c35fd5050..57b91452ad705f237dc7f44bf6663fe537a1d4e5 100644 (file)
@@ -25,7 +25,7 @@ ifcapable !fts5 {
 
 do_execsql_test 1.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(a, b);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 32);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 32);
 }
 
 do_execsql_test 1.1 {
index 7ee6de9731123b3cb3bb3e7ddfede738839d61a4..b1dffc78faa83e3226c57370b4c9a0ce36cf2ca1 100644 (file)
@@ -28,7 +28,7 @@ ifcapable !fts5 {
 
 do_test 1.0 {
   execsql { CREATE VIRTUAL TABLE t1 USING fts5(a) }
-  execsql { INSERT INTO t1(t1, rowid) VALUES('pgsz', 128) }
+  execsql { INSERT INTO t1(t1, rank) VALUES('pgsz', 128) }
   for {set i 1} {$i <= 10000} {incr i} {
     set v {x x x x x x x x x x x x x x x x x x x x}
     if {($i % 2139)==0} {lset v 3 Y ; lappend Y $i}
@@ -71,7 +71,7 @@ do_test 1.5 {
   set bwd [execsql_reads {
     SELECT rowid FROM t1 WHERE t1 MATCH 'x' ORDER BY 1 ASC 
   }]
-  expr {$bwd < $fwd + 10}
+  expr {$bwd < $fwd + 12}
 } {1}
 
 foreach {tn q res} "
index 6c8cd1827b5ed21cbd98d756f13281431494c821..49386f57bccb7b101b0fd124e094aff49e429b61 100644 (file)
@@ -46,7 +46,7 @@ proc structure {} {
 expr srand(0)
 do_execsql_test 1.0 {
   CREATE VIRTUAL TABLE t1 USING fts5(x);
-  INSERT INTO t1(t1, rowid) VALUES('pgsz', 64);
+  INSERT INTO t1(t1, rank) VALUES('pgsz', 64);
 }
 
 for {set iTest 0} {$iTest < 50000} {incr iTest} {