]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the xPhraseFirstColumn() and xPhraseNextColumn() API functions to fts5. For itera...
authordan <dan@noemail.net>
Tue, 29 Dec 2015 19:35:03 +0000 (19:35 +0000)
committerdan <dan@noemail.net>
Tue, 29 Dec 2015 19:35:03 +0000 (19:35 +0000)
FossilOrigin-Name: 8c30605bcd0a78a5015948171145bc6f640b8358

ext/fts5/fts5.h
ext/fts5/fts5Int.h
ext/fts5/fts5_expr.c
ext/fts5/fts5_index.c
ext/fts5/fts5_main.c
ext/fts5/fts5_tcl.c
ext/fts5/test/fts5_common.tcl
ext/fts5/test/fts5ac.test
manifest
manifest.uuid

index 400b7c7885927e10ac634b1ebe50142a6998b2d7..990c3f2f0dfeca7a094d6c3e47bc12fe3bbd5743 100644 (file)
@@ -216,7 +216,7 @@ struct Fts5PhraseIter {
 **   See xPhraseFirst above.
 */
 struct Fts5ExtensionApi {
-  int iVersion;                   /* Currently always set to 2 */
+  int iVersion;                   /* Currently always set to 3 */
 
   void *(*xUserData)(Fts5Context*);
 
@@ -246,8 +246,11 @@ struct Fts5ExtensionApi {
   int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*));
   void *(*xGetAuxdata)(Fts5Context*, int bClear);
 
-  void (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*);
+  int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*);
   void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff);
+
+  int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*);
+  void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol);
 };
 
 /* 
index a0f69bee2133ad7c76f4dc367d9422309dfb85c3..4ef99ebae1d5bb5a4156173f5ea64ea025859ea2 100644 (file)
@@ -447,6 +447,8 @@ int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge);
 
 int sqlite3Fts5IndexLoadConfig(Fts5Index *p);
 
+int sqlite3Fts5IterCollist(Fts5IndexIter*, const u8 **, int*);
+
 /*
 ** End of interface to code in fts5_index.c.
 **************************************************************************/
@@ -647,6 +649,8 @@ int sqlite3Fts5ExprPopulatePoslists(
 
 int sqlite3Fts5ExprClonePhrase(Fts5Config*, Fts5Expr*, int, Fts5Expr**);
 
+int sqlite3Fts5ExprPhraseCollist(Fts5Expr *, int, const u8 **, int *);
+
 /*******************************************
 ** The fts5_expr.c API above this point is used by the other hand-written
 ** C code in this module. The interfaces below this point are called by
index 5a5a0652ee100f1c03ec321983b5972f4e55356d..ebd767a617c27359fa29f6ae669abfe945b03242 100644 (file)
@@ -2327,3 +2327,25 @@ int sqlite3Fts5ExprPopulatePoslists(
   );
 }
 
+/*
+** This function is only called for detail=columns tables. 
+*/
+int sqlite3Fts5ExprPhraseCollist(
+  Fts5Expr *pExpr, 
+  int iPhrase, 
+  const u8 **ppCollist, 
+  int *pnCollist
+){
+  Fts5ExprPhrase *pPhrase = pExpr->apExprPhrase[iPhrase];
+  Fts5ExprNode *pNode = pPhrase->pNode;
+  assert( iPhrase>=0 && iPhrase<pExpr->nPhrase );
+
+  if( pNode->bEof==0 && pNode->iRowid==pExpr->pRoot->iRowid ){
+    sqlite3Fts5IterCollist(pPhrase->aTerm[0].pIter, ppCollist, pnCollist);
+  }else{
+    *ppCollist = 0;
+    *pnCollist = 0;
+  }
+  return SQLITE_OK;
+}
+
index 836a6d2c996f484ca2bde6c0c5664adf967764d9..34caa4507230038d77ecb3230a61fdbf6b504e8c 100644 (file)
@@ -4881,6 +4881,17 @@ int sqlite3Fts5IterPoslist(
   return fts5IndexReturn(pIter->pIndex);
 }
 
+int sqlite3Fts5IterCollist(
+  Fts5IndexIter *pIter, 
+  const u8 **pp,                  /* OUT: Pointer to position-list data */
+  int *pn                         /* OUT: Size of position-list in bytes */
+){
+  assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_COLUMNS );
+  *pp = pIter->poslist.p;
+  *pn = pIter->poslist.n;
+  return SQLITE_OK;
+}
+
 /*
 ** This function is similar to sqlite3Fts5IterPoslist(), except that it
 ** copies the position list into the buffer supplied as the second 
index 51c3f57cff23d6289f01c56745c6fe60c258f4cf..cd43308513d9bd708b613598cecbc71e78957dfe 100644 (file)
@@ -1955,13 +1955,6 @@ static void fts5ApiPhraseNext(
   if( pIter->a>=pIter->b ){
     *piCol = -1;
     *piOff = -1;
-#if 0
-  }else if( fts5IsOffsetless((Fts5Table*)(((Fts5Cursor*)pCtx)->base.pVtab)) ){
-    int iVal;
-    pIter->a += fts5GetVarint32(pIter->a, iVal);
-    *piCol += (iVal-2);
-    *piOff = -1;
-#endif
   }else{
     int iVal;
     pIter->a += fts5GetVarint32(pIter->a, iVal);
@@ -1975,7 +1968,7 @@ static void fts5ApiPhraseNext(
   }
 }
 
-static void fts5ApiPhraseFirst(
+static int fts5ApiPhraseFirst(
   Fts5Context *pCtx, 
   int iPhrase, 
   Fts5PhraseIter *pIter, 
@@ -1989,6 +1982,70 @@ static void fts5ApiPhraseFirst(
   fts5ApiPhraseNext(pCtx, pIter, piCol, piOff);
 }
 
+static void fts5ApiPhraseNextColumn(
+  Fts5Context *pCtx, 
+  Fts5PhraseIter *pIter, 
+  int *piCol
+){
+  Fts5Cursor *pCsr = (Fts5Cursor*)pCtx;
+  Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig;
+
+  if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){
+    if( pIter->a>=pIter->b ){
+      *piCol = -1;
+    }else{
+      int iIncr;
+      pIter->a += fts5GetVarint32(&pIter->a[0], iIncr);
+      *piCol += (iIncr-2);
+    }
+  }else{
+    while( 1 ){
+      int dummy;
+      if( pIter->a>=pIter->b ){
+        *piCol = -1;
+        return;
+      }
+      if( pIter->a[0]==0x01 ) break;
+      pIter->a += fts5GetVarint32(pIter->a, dummy);
+    }
+    pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol);
+  }
+}
+
+static int fts5ApiPhraseFirstColumn(
+  Fts5Context *pCtx, 
+  int iPhrase, 
+  Fts5PhraseIter *pIter, 
+  int *piCol
+){
+  int rc = SQLITE_OK;
+  Fts5Cursor *pCsr = (Fts5Cursor*)pCtx;
+  Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig;
+
+  if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){
+    int n;
+    rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n);
+    if( rc==SQLITE_OK ){
+      pIter->b = &pIter->a[n];
+      *piCol = 0;
+      fts5ApiPhraseNextColumn(pCtx, pIter, piCol);
+    }
+  }else{
+    int n = fts5CsrPoslist(pCsr, iPhrase, &pIter->a);
+    pIter->b = &pIter->a[n];
+    if( n<=0 ){
+      *piCol = -1;
+    }else if( pIter->a[0]==0x01 ){
+      pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol);
+    }else{
+      *piCol = 0;
+    }
+  }
+
+  return rc;
+}
+
+
 static int fts5ApiQueryPhrase(Fts5Context*, int, void*, 
     int(*)(const Fts5ExtensionApi*, Fts5Context*, void*)
 );
@@ -2012,6 +2069,8 @@ static const Fts5ExtensionApi sFts5Api = {
   fts5ApiGetAuxdata,
   fts5ApiPhraseFirst,
   fts5ApiPhraseNext,
+  fts5ApiPhraseFirstColumn,
+  fts5ApiPhraseNextColumn,
 };
 
 /*
index bf815eab8176a86229cf329615e2111e7aeb613d..4a331a59f483ffca6107fa60ef88ba2ca30f7626 100644 (file)
@@ -236,6 +236,7 @@ static int xF5tApi(
     { "xSetAuxdataInt",    1, "INTEGER" },            /* 14 */
     { "xGetAuxdataInt",    1, "CLEAR" },              /* 15 */
     { "xPhraseForeach",    4, "IPHRASE COLVAR OFFVAR SCRIPT" }, /* 16 */
+    { "xPhraseColumnForeach", 3, "IPHRASE COLVAR SCRIPT" }, /* 17 */
     { 0, 0, 0}
   };
 
@@ -462,6 +463,32 @@ static int xF5tApi(
       break;
     }
 
+    CASE(17, "xPhraseColumnForeach") {
+      int iPhrase;
+      int iCol;
+      const char *zColvar;
+      Tcl_Obj *pScript = objv[4];
+      Fts5PhraseIter iter;
+
+      if( Tcl_GetIntFromObj(interp, objv[2], &iPhrase) ) return TCL_ERROR;
+      zColvar = Tcl_GetString(objv[3]);
+
+      for(p->pApi->xPhraseFirstColumn(p->pFts, iPhrase, &iter, &iCol);
+          iCol>=0;
+          p->pApi->xPhraseNextColumn(p->pFts, &iter, &iCol)
+      ){
+        Tcl_SetVar2Ex(interp, zColvar, 0, Tcl_NewIntObj(iCol), 0);
+        rc = Tcl_EvalObjEx(interp, pScript, 0);
+        if( rc==TCL_CONTINUE ) rc = TCL_OK;
+        if( rc!=TCL_OK ){
+          if( rc==TCL_BREAK ) rc = TCL_OK;
+          break;
+        }
+      }
+
+      break;
+    }
+
     default: 
       assert( 0 );
       break;
index 30b191e2991a2fae38fea1a9af66f21645afb620..64af5c59b37d9642a3e56c73d4e0c76b87345004 100644 (file)
@@ -40,6 +40,16 @@ proc fts5_test_poslist2 {cmd} {
   set res
 }
 
+proc fts5_test_collist {cmd} {
+  set res [list]
+
+  for {set i 0} {$i < [$cmd xPhraseCount]} {incr i} {
+    $cmd xPhraseColumnForeach $i c { lappend res $i.$c }
+  }
+
+  set res
+}
+
 proc fts5_test_columnsize {cmd} {
   set res [list]
   for {set i 0} {$i < [$cmd xColumnCount]} {incr i} {
@@ -126,6 +136,7 @@ proc fts5_aux_test_functions {db} {
     fts5_test_columntotalsize
     fts5_test_poslist
     fts5_test_poslist2
+    fts5_test_collist
     fts5_test_tokenize
     fts5_test_rowcount
     fts5_test_all
index cc10cece09e7561b32029b095041ffb0ff484282..ff2affcce135e405de83063485b8d55c25ec4bcd 100644 (file)
@@ -131,16 +131,17 @@ set data {
 #   CREATE VIRTUAL TABLE xy USING fts5(x, y);
 #
 # Assuming the table contains the same records as stored in the global 
-# $::data array (see above), this function returns a list containing one
-# element for each match in the dataset. The elements are themselves lists
-# formatted as follows:
+# $::data array (see above), this function returns a list containing two
+# elements for each matching row in the dataset. The first element of each
+# pair is the rowid. The second is a list of phrase matches, where each 
+# phrase match is of the form:
 #
-#   <rowid> {<phrase 0 matches> <phrase 1 matches>...}
+#   <phrase-number>.<column-number>.<offset>
 #
-# where each <phrase X matches> element is a list of phrase matches in the
-# same form as returned by auxiliary scalar function fts5_test().
+# The list of phrase matches is in the same format as that returned by the
+# fts5_test_poslist() auxiliary scalara function.
 #
-proc matchdata {bPos expr {bAsc 1}} {
+proc poslist_data {bPos expr {bAsc 1}} {
 
   set tclexpr [db one {
     SELECT fts5_expr_tcl($expr, 'nearset $cols -pc ::pc', 'x', 'y')
@@ -168,13 +169,43 @@ proc matchdata {bPos expr {bAsc 1}} {
     set res [lsort -integer -decreasing -index 0 $res]
   }
 
-  return [concat {*}$res]
+  set res [concat {*}$res]
+  return $res
+}
+
+proc collist_elem_compare {a b} {
+  foreach {a1 a2} [split $a .] {}
+  foreach {b1 b2} [split $b .] {}
+
+  if {$a1==$b1} {
+    return [expr $a2 - $b2]
+  }
+  return [expr $a1 - $b1]
+}
+
+proc poslist2collist {poslist} {
+  set res [list]
+  foreach h $poslist {
+    regexp {(.*)\.[1234567890]+} $h -> cand
+    lappend res $cand
+  }
+  set res [lsort -command collist_elem_compare -unique $res]
+  return $res
+}
+
+proc collist_data {expr} {
+  set res [list]
+  foreach {rowid poslist} [poslist_data 1 $expr] {
+    lappend res $rowid [poslist2collist $poslist]
+  }
+  set res
 }
 
 #
 # End of test code
 #-------------------------------------------------------------------------
 
+if 0 {
 
 foreach {tn2 sql} {
   1  {}
@@ -214,11 +245,16 @@ foreach {tn2 sql} {
     10 "L O O L V V K"
   } {
     set expr "\"$phrase\""
-    set res [matchdata 1 $expr]
+    set res [poslist_data 1 $expr]
 
-    do_execsql_test 1.$tn2.1.2.$tn.[llength $res] { 
+    do_execsql_test 1.$tn2.1.2.$tn.p.[llength $res] { 
       SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr
     } $res
+
+    set res [collist_data $expr]
+    do_execsql_test 1.$tn2.1.2.$tn.c.[llength $res] { 
+      SELECT rowid, fts5_test_collist(xx) FROM xx WHERE xx match $expr
+    } $res
   }
 
   #-------------------------------------------------------------------------
@@ -237,10 +273,15 @@ foreach {tn2 sql} {
 
     3.1 { a AND b AND c }
   } {
-    set res [matchdata 1 $expr]
-    do_execsql_test 1.$tn2.2.$tn.[llength $res] { 
+    set res [poslist_data 1 $expr]
+    do_execsql_test 1.$tn2.2.$tn.c.[llength $res] { 
       SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr
     } $res
+
+    set res [collist_data $expr]
+    do_execsql_test 1.$tn2.2.$tn.c.[llength $res] { 
+      SELECT rowid, fts5_test_collist(xx) FROM xx WHERE xx match $expr
+    } $res
   }
 
   #-------------------------------------------------------------------------
@@ -266,10 +307,15 @@ foreach {tn2 sql} {
     4.3 {{x "x"}:b}
     4.4 {{"y" y}:b}
   } {
-    set res [matchdata 1 $expr]
-    do_execsql_test 1.$tn2.3.$tn.[llength $res] { 
+    set res [poslist_data 1 $expr]
+    do_execsql_test 1.$tn2.3.$tn.p.[llength $res] { 
       SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr
     } $res
+
+    set res [collist_data $expr]
+    do_execsql_test 1.$tn2.3.$tn.c.[llength $res] { 
+      SELECT rowid, fts5_test_collist(xx) FROM xx WHERE xx match $expr
+    } $res
   }
 
   #-------------------------------------------------------------------------
@@ -287,10 +333,15 @@ foreach {tn2 sql} {
     8  { x : NEAR(r c) }
     9  { y : NEAR(r c) }
   } {
-    set res [matchdata 1 $expr]
-    do_execsql_test 1.$tn2.4.1.$tn.[llength $res] { 
+    set res [poslist_data 1 $expr]
+    do_execsql_test 1.$tn2.4.1.$tn.p.[llength $res] { 
       SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr
     } $res
+
+    set res [collist_data $expr]
+    do_execsql_test 1.$tn2.4.1.$tn.c.[llength $res] { 
+      SELECT rowid, fts5_test_collist(xx) FROM xx WHERE xx match $expr
+    } $res
   }
 
   do_test $tn2.4.1  { nearset {{a b c}} -- a } {0.0.0}
@@ -337,7 +388,7 @@ foreach {tn2 sql} {
       18 { c NOT (b OR a) }
       19 { c NOT b OR a AND d }
     } {
-      set res [matchdata 0 $expr $bAsc]
+      set res [poslist_data 0 $expr $bAsc]
       do_execsql_test 1.$tn2.6.$bAsc.$tn.[llength $res] $sql $res
     }
   }
@@ -347,6 +398,9 @@ do_execsql_test 2.1 {
   SELECT fts5_expr_tcl('a AND b');
 } {{AND [nearset -- {a}] [nearset -- {b}]}}
 
+}
+#set data [lrange $data 0 5]
+
 # Some tests for detail=col tables and detail=none.
 #
 foreach {tn2 sql} {
@@ -374,7 +428,6 @@ foreach {tn2 sql} {
     INSERT INTO xx(xx, rank) VALUES('pgsz', 32);
   }
 
-
   do_test 3.$tn2.1.1 {
     foreach {id x y} $data {
       execsql { INSERT INTO xx(rowid, x, y) VALUES($id, $x, $y) }
@@ -384,13 +437,17 @@ foreach {tn2 sql} {
 
   foreach {tn q} {
     1 "o" 2 "b" 3 "e" 4 "m" 5 "l" 6 "a" 7 "b" 8 "c" 9 "no" 10 "L"
-    11 "o a" 12 "c AND d" 13 "o OR a" 12 "c OR d"
+    11 "o a" 12 "c AND d" 13 "o OR a" 14 "c OR d"
   } {
-    set res [matchdata 1 $q]
-
-    do_execsql_test 3.$tn2.1.2.$tn.[llength $res] { 
+    set res [poslist_data 1 $q]
+    do_execsql_test 3.$tn2.1.2.$tn.p.[llength $res] { 
       SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $q
     } $res
+
+    set res [collist_data $q]
+    do_execsql_test 3.$tn2.1.2.$tn.c.[llength $res] { 
+      SELECT rowid, fts5_test_collist(xx) FROM xx WHERE xx match $q
+    } $res
   }
 
 }
index 050615992a6d15d77c1e13cdda42b74d8e058432..8b22a0fdc2404524588e4ae3ee67eaf4730f0f4d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\sthe\sname\sof\sthe\soffsets=0\soption\sto\s"detail=column".\sHave\sthe\sxInst,\sxPhraseFirst\sand\sother\sAPI\sfunctions\swork\sby\sparsing\sthe\soriginal\stext\sfor\sdetail=column\stables.
-D 2015-12-28T19:55:00.739
+C Add\sthe\sxPhraseFirstColumn()\sand\sxPhraseNextColumn()\sAPI\sfunctions\sto\sfts5.\sFor\siterating\sthrough\sthe\sset\sof\scolumns\sthat\scontain\sintances\sof\sa\sphrase.
+D 2015-12-29T19:35:03.765
 F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 5fff077fcc46de7714ed6eebb6159a4c00eab751
@@ -96,17 +96,17 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7
 F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252
 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95
 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0
-F ext/fts5/fts5.h 7d6785c75afe23239dad9cbaffc6fc55803feb4b
-F ext/fts5/fts5Int.h 7328cfa7b0151e34bb3715d404d732c6d49d5361
+F ext/fts5/fts5.h 88fec577a2148f34df75930dc2b0c45b0bad72c3
+F ext/fts5/fts5Int.h ab5f6f1f65652310a644d97d12aeabf8ab5ed17e
 F ext/fts5/fts5_aux.c 1f384972d606375b8fa078319f25ab4b5feb1b35
 F ext/fts5/fts5_buffer.c 87204c8b3b8bc62b27376eab09b74d6d5acc41f1
 F ext/fts5/fts5_config.c b0ed7b0ddd785fb4d4e6f9037d357f8aa95918e6
-F ext/fts5/fts5_expr.c c9522ae99f862ddb318ea69998a02147d2a00c8d
+F ext/fts5/fts5_expr.c 08ee4f342a2b1fd82a5dccd0b9b3cde4921a8be5
 F ext/fts5/fts5_hash.c 8b510868502ec31119409fc7022edc37c27b5c40
-F ext/fts5/fts5_index.c 24e81d8f2ce92f50eb19c15bffd5ada4ec91d8de
-F ext/fts5/fts5_main.c a71db65929e150031c5a195e3c782e773deb55a6
+F ext/fts5/fts5_index.c ca8310eaa286e6c1e4c4581a420b7c3a1ec6302c
+F ext/fts5/fts5_main.c 23f3912ff44172859c771eb55cb57778fd662e89
 F ext/fts5/fts5_storage.c 076a3356536a8831eb6e554195171d5c249cd179
-F ext/fts5/fts5_tcl.c c3cfff5f727b3d02f73c5717413d637b18b960f2
+F ext/fts5/fts5_tcl.c 18e9382d8cdad4c05b49559c68494968b9b4a4fb
 F ext/fts5/fts5_test_mi.c c9c8cf455c49ded156a234e0de1c8ba9be85e5c3
 F ext/fts5/fts5_tokenize.c 618efe033bceb80c521b1e9ddfd9fee85fb5946e
 F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c
@@ -114,10 +114,10 @@ F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1
 F ext/fts5/fts5_vocab.c 3742d0abfe8aa8c3cb4a7df56aa38f2e3c3fb1c2
 F ext/fts5/fts5parse.y 1647eba089b9b3fc058b4dc989d9da87d15b9580
 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
-F ext/fts5/test/fts5_common.tcl 27f941596e241e25b4bd64c2446ae91dd4cb138c
+F ext/fts5/test/fts5_common.tcl f923471d572d1e283b7d6985ce3cda62dae6fd45
 F ext/fts5/test/fts5aa.test 2c553eea4dab4bc5a75928f56729277c7bc1d206
 F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
-F ext/fts5/test/fts5ac.test 5dea9e119ed39e0923b423dc2b3eaaef2ec3abd3
+F ext/fts5/test/fts5ac.test 1d2a10d4c13dcfd326287f51df3b7d90761c212c
 F ext/fts5/test/fts5ad.test 0fd1a5bcb5dcc76a639bd26f27e2641034a508a3
 F ext/fts5/test/fts5ae.test 0a9984fc3479f89f8c63d9848d6ed0c465dfcebe
 F ext/fts5/test/fts5af.test c2501ec2b61d6b179c305f5d2b8782ab3d4f832a
@@ -139,7 +139,7 @@ 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 a2b537c120bdd43c79c42fe2438d7b8c81fe5599
-F ext/fts5/test/fts5detail.test 71babe633c68c6c5153b2fe1be81a97e953ca485 w ext/fts5/test/fts5offsets.test
+F ext/fts5/test/fts5detail.test 71babe633c68c6c5153b2fe1be81a97e953ca485
 F ext/fts5/test/fts5dlidx.test ecba5e62ea8b26c33829961602069c546228046d
 F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
 F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
@@ -1406,7 +1406,7 @@ F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 69bffc1632c8a8f3bfe5bf92607e64fed982e48c
-R bce3f221a6a9e036b503a3a5522049ea
+P 228b4d10e38f7d70e1b008c3c9b4a1ae3e32e30d
+R 9b7a210ea600814406fb8e0040363d54
 U dan
-Z 73bb0a8c75a5e4585189e64532bdf9a9
+Z 50bb7fa01e78a4726d7b3d5426b2a1ed
index a1ac4a70e8d571a6ea6905238c7d32f317fe041f..f3ee4608cf925386f37c0bc1041cc669e572f88d 100644 (file)
@@ -1 +1 @@
-228b4d10e38f7d70e1b008c3c9b4a1ae3e32e30d
\ No newline at end of file
+8c30605bcd0a78a5015948171145bc6f640b8358
\ No newline at end of file