]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add further tests for fts5 prefix queries.
authordan <dan@noemail.net>
Wed, 7 Oct 2015 09:02:50 +0000 (09:02 +0000)
committerdan <dan@noemail.net>
Wed, 7 Oct 2015 09:02:50 +0000 (09:02 +0000)
FossilOrigin-Name: accdc98b1291f07b802fd23f3ebc7dbc02ba09d3

ext/fts5/fts5Int.h
ext/fts5/fts5_expr.c
ext/fts5/fts5_index.c
ext/fts5/fts5parse.y
ext/fts5/test/fts5prefix.test
manifest
manifest.uuid

index 3ab8dcdc93973cfe4ab58bd9e918740e48bddc16..53df5dbf5ab8bb7065477ffbc9dbd8fae03f53e5 100644 (file)
@@ -81,7 +81,7 @@ extern int sqlite3_fts5_may_be_corrupt;
 #endif
 
 typedef struct Fts5Global Fts5Global;
-typedef struct Fts5ExprColset Fts5ExprColset;
+typedef struct Fts5Colset Fts5Colset;
 
 /* If a NEAR() clump or phrase may only match a specific set of columns, 
 ** then an object of the following type is used to record the set of columns.
@@ -89,7 +89,7 @@ typedef struct Fts5ExprColset Fts5ExprColset;
 **
 ** This object is used by fts5_expr.c and fts5_index.c.
 */
-struct Fts5ExprColset {
+struct Fts5Colset {
   int nCol;
   int aiCol[1];
 };
@@ -335,7 +335,7 @@ int sqlite3Fts5IndexQuery(
   Fts5Index *p,                   /* FTS index to query */
   const char *pToken, int nToken, /* Token (or prefix) to query for */
   int flags,                      /* Mask of FTS5INDEX_QUERY_X flags */
-  Fts5ExprColset *pColset,        /* Match these columns only */
+  Fts5Colset *pColset,            /* Match these columns only */
   Fts5IndexIter **ppIter          /* OUT: New iterator object */
 );
 
@@ -649,9 +649,9 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset(
   Fts5ExprPhrase* 
 );
 
-Fts5ExprColset *sqlite3Fts5ParseColset(
+Fts5Colset *sqlite3Fts5ParseColset(
   Fts5Parse*, 
-  Fts5ExprColset*, 
+  Fts5Colset*, 
   Fts5Token *
 );
 
@@ -660,7 +660,7 @@ void sqlite3Fts5ParseNearsetFree(Fts5ExprNearset*);
 void sqlite3Fts5ParseNodeFree(Fts5ExprNode*);
 
 void sqlite3Fts5ParseSetDistance(Fts5Parse*, Fts5ExprNearset*, Fts5Token*);
-void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNearset*, Fts5ExprColset*);
+void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNearset*, Fts5Colset*);
 void sqlite3Fts5ParseFinished(Fts5Parse *pParse, Fts5ExprNode *p);
 void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token*);
 
index 9b0c262301315754abc4917cdb7255c22c771c40..c90a2e4708dfdfd03f5e9eab874b869807982546 100644 (file)
@@ -95,7 +95,7 @@ struct Fts5ExprPhrase {
 */
 struct Fts5ExprNearset {
   int nNear;                      /* NEAR parameter */
-  Fts5ExprColset *pColset;        /* Columns to search (NULL -> all columns) */
+  Fts5Colset *pColset;            /* Columns to search (NULL -> all columns) */
   int nPhrase;                    /* Number of entries in aPhrase[] array */
   Fts5ExprPhrase *apPhrase[1];    /* Array of phrase pointers */
 };
@@ -266,7 +266,7 @@ void sqlite3Fts5ExprFree(Fts5Expr *p){
   }
 }
 
-static int fts5ExprColsetTest(Fts5ExprColset *pColset, int iCol){
+static int fts5ExprColsetTest(Fts5Colset *pColset, int iCol){
   int i;
   for(i=0; i<pColset->nCol; i++){
     if( pColset->aiCol[i]==iCol ) return 1;
@@ -395,7 +395,7 @@ static int fts5ExprSynonymPoslist(
 */
 static int fts5ExprPhraseIsMatch(
   Fts5ExprNode *pNode,            /* Node pPhrase belongs to */
-  Fts5ExprColset *pColset,        /* Restrict matches to these columns */
+  Fts5Colset *pColset,            /* Restrict matches to these columns */
   Fts5ExprPhrase *pPhrase,        /* Phrase object to initialize */
   int *pbMatch                    /* OUT: Set to true if really a match */
 ){
@@ -795,7 +795,7 @@ static int fts5ExprExtractCol(
 }
 
 static int fts5ExprExtractColset (
-  Fts5ExprColset *pColset,        /* Colset to filter on */
+  Fts5Colset *pColset,            /* Colset to filter on */
   const u8 *pPos, int nPos,       /* Position list */
   Fts5Buffer *pBuf                /* Output buffer */
 ){
@@ -858,7 +858,7 @@ static int fts5ExprTokenTest(
   Fts5ExprNearset *pNear = pNode->pNear;
   Fts5ExprPhrase *pPhrase = pNear->apPhrase[0];
   Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter;
-  Fts5ExprColset *pColset = pNear->pColset;
+  Fts5Colset *pColset = pNear->pColset;
   const u8 *pPos;
   int nPos;
   int rc;
@@ -1745,25 +1745,25 @@ void sqlite3Fts5ParseSetDistance(
 
 /*
 ** The second argument passed to this function may be NULL, or it may be
-** an existing Fts5ExprColset object. This function returns a pointer to
+** an existing Fts5Colset object. This function returns a pointer to
 ** a new colset object containing the contents of (p) with new value column
 ** number iCol appended. 
 **
 ** If an OOM error occurs, store an error code in pParse and return NULL.
 ** The old colset object (if any) is not freed in this case.
 */
-static Fts5ExprColset *fts5ParseColset(
+static Fts5Colset *fts5ParseColset(
   Fts5Parse *pParse,              /* Store SQLITE_NOMEM here if required */
-  Fts5ExprColset *p,              /* Existing colset object */
+  Fts5Colset *p,                  /* Existing colset object */
   int iCol                        /* New column to add to colset object */
 ){
   int nCol = p ? p->nCol : 0;     /* Num. columns already in colset object */
-  Fts5ExprColset *pNew;           /* New colset object to return */
+  Fts5Colset *pNew;               /* New colset object to return */
 
   assert( pParse->rc==SQLITE_OK );
   assert( iCol>=0 && iCol<pParse->pConfig->nCol );
 
-  pNew = sqlite3_realloc(p, sizeof(Fts5ExprColset) + sizeof(int)*nCol);
+  pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol);
   if( pNew==0 ){
     pParse->rc = SQLITE_NOMEM;
   }else{
@@ -1788,12 +1788,12 @@ static Fts5ExprColset *fts5ParseColset(
   return pNew;
 }
 
-Fts5ExprColset *sqlite3Fts5ParseColset(
+Fts5Colset *sqlite3Fts5ParseColset(
   Fts5Parse *pParse,              /* Store SQLITE_NOMEM here if required */
-  Fts5ExprColset *pColset,        /* Existing colset object */
+  Fts5Colset *pColset,            /* Existing colset object */
   Fts5Token *p
 ){
-  Fts5ExprColset *pRet = 0;
+  Fts5Colset *pRet = 0;
   int iCol;
   char *z;                        /* Dequoted copy of token p */
 
@@ -1823,7 +1823,7 @@ Fts5ExprColset *sqlite3Fts5ParseColset(
 void sqlite3Fts5ParseSetColset(
   Fts5Parse *pParse, 
   Fts5ExprNearset *pNear, 
-  Fts5ExprColset *pColset 
+  Fts5Colset *pColset 
 ){
   if( pNear ){
     pNear->pColset = pColset;
index 46aff77728b6fa31039d3ea8d9086218062b3e51..d06a069f8aeeec822cf61031f5e65a79bb09272e 100644 (file)
@@ -3954,14 +3954,14 @@ static void fts5PoslistCallback(
 typedef struct PoslistCallbackCtx PoslistCallbackCtx;
 struct PoslistCallbackCtx {
   Fts5Buffer *pBuf;               /* Append to this buffer */
-  Fts5ExprColset *pColset;        /* Restrict matches to this column */
+  Fts5Colset *pColset;            /* Restrict matches to this column */
   int eState;                     /* See above */
 };
 
 /*
 ** TODO: Make this more efficient!
 */
-static int fts5IndexColsetTest(Fts5ExprColset *pColset, int iCol){
+static int fts5IndexColsetTest(Fts5Colset *pColset, int iCol){
   int i;
   for(i=0; i<pColset->nCol; i++){
     if( pColset->aiCol[i]==iCol ) return 1;
@@ -4029,7 +4029,7 @@ static void fts5PoslistFilterCallback(
 static void fts5SegiterPoslist(
   Fts5Index *p,
   Fts5SegIter *pSeg,
-  Fts5ExprColset *pColset,
+  Fts5Colset *pColset,
   Fts5Buffer *pBuf
 ){
   if( pColset==0 ){
@@ -4055,7 +4055,7 @@ static void fts5SegiterPoslist(
 static int fts5MultiIterPoslist(
   Fts5Index *p,
   Fts5IndexIter *pMulti,
-  Fts5ExprColset *pColset,
+  Fts5Colset *pColset,
   int bSz,                        /* Append a size field before the data */
   Fts5Buffer *pBuf
 ){
@@ -4251,7 +4251,7 @@ static void fts5SetupPrefixIter(
   int bDesc,                      /* True for "ORDER BY rowid DESC" */
   const u8 *pToken,               /* Buffer containing prefix to match */
   int nToken,                     /* Size of buffer pToken in bytes */
-  Fts5ExprColset *pColset,        /* Restrict matches to these columns */
+  Fts5Colset *pColset,            /* Restrict matches to these columns */
   Fts5IndexIter **ppIter          /* OUT: New iterator */
 ){
   Fts5Structure *pStruct;
@@ -4536,7 +4536,7 @@ int sqlite3Fts5IndexQuery(
   Fts5Index *p,                   /* FTS index to query */
   const char *pToken, int nToken, /* Token (or prefix) to query for */
   int flags,                      /* Mask of FTS5INDEX_QUERY_X flags */
-  Fts5ExprColset *pColset,        /* Match these columns only */
+  Fts5Colset *pColset,            /* Match these columns only */
   Fts5IndexIter **ppIter          /* OUT: New iterator object */
 ){
   Fts5Config *pConfig = p->pConfig;
index c880dc92cb390b556cc5421993bf2736303d397f..e872908229b8123456c8099daeb053fc8dafcffe 100644 (file)
@@ -101,9 +101,9 @@ cnearset(A) ::= colset(X) COLON nearset(Y). {
   A = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, Y); 
 }
 
-%type colset {Fts5ExprColset*}
+%type colset {Fts5Colset*}
 %destructor colset { sqlite3_free($$); }
-%type colsetlist {Fts5ExprColset*}
+%type colsetlist {Fts5Colset*}
 %destructor colsetlist { sqlite3_free($$); }
 
 colset(A) ::= LCP colsetlist(X) RCP. { A = X; }
index f4fcc4bfa3b81bd5da2442ba262470e48ada5dbc..9da7821a54fab304e476a1006f0813c60a09ccf4 100644 (file)
@@ -119,6 +119,22 @@ proc gmatch {col pattern} {
 }
 db func gmatch gmatch
 
+proc ghl {col pattern} {
+  foreach t $col {
+    if {[string match $pattern $t]} {
+      lappend res "*$t*"
+    } else {
+      lappend res $t
+    }
+  }
+  set res
+}
+db func ghl ghl
+
+set COLS(a) 0
+set COLS(b) 1
+set COLS(c) 2
+
 for {set x 0} {$x<2} {incr x} {
   foreach {tn pattern} {
     1  {xa*}
@@ -132,12 +148,47 @@ for {set x 0} {$x<2} {incr x} {
     9  {xi*}
     10 {xj*}
   } {
-    foreach col {b} {
+    foreach col {a b c} {
+
+      # Check that the list of returned rowids is correct.
+      #
       set res [db eval "SELECT rowid FROM t3 WHERE gmatch($col, '$pattern')"]
       set query "$col : $pattern"
-      do_execsql_test 3.3.$x.$tn.$col {
+      do_execsql_test 3.3.$x.$tn.$col.rowid {
+        SELECT rowid FROM t3($query);
+      } $res
+
+      # Check that the highlight() function works.
+      #
+      set res [db eval \
+        "SELECT ghl($col, '$pattern') FROM t3 WHERE gmatch($col, '$pattern')"
+      ]
+      set idx $COLS($col)
+      do_execsql_test 3.3.$x.$tn.$col.highlight {
+        SELECT highlight(t3, $idx, '*', '*') FROM t3($query);
+      } $res
+    }
+
+    foreach colset {{a b} {b c} {c a} {a c} {b a}} {
+      # Check that the list of returned rowids is correct.
+      #
+      foreach {col1 col2} $colset {}
+      set expr "gmatch($col1, '$pattern') OR gmatch($col2, '$pattern')"
+      set res [db eval "SELECT rowid FROM t3 WHERE $expr"]
+      set query "{$colset} : $pattern"
+      do_execsql_test 3.3.$x.$tn.{$colset}.rowid {
         SELECT rowid FROM t3($query);
       } $res
+
+      set resq    "SELECT ghl($col1, '$pattern'), ghl($col2, '$pattern')"
+      append resq " FROM t3 WHERE $expr"
+      set res [db eval $resq]
+      set idx1 $COLS($col1)
+      set idx2 $COLS($col2)
+      do_execsql_test 3.3.$x.$tn.{$colset}.highlight {
+        SELECT highlight(t3, $idx1, '*', '*'), highlight(t3, $idx2, '*', '*')
+          FROM t3($query)
+      } $res
     }
   }
   execsql { INSERT INTO t3(t3) VALUES('optimize') }
index 6c17fe96215c9a727780ec703d760317a8429867..88bb54c2ce27e13039fe4fb80e78b96a014bc24d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\stypo\sin\sthe\sprevious\scheck-in.
-D 2015-10-07T04:20:34.157
+C Add\sfurther\stests\sfor\sfts5\sprefix\squeries.
+D 2015-10-07T09:02:50.876
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -106,13 +106,13 @@ 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 98f802fe41481f9d797fce496f0fefcad72c7782
-F ext/fts5/fts5Int.h eba5b20f1049a8908f867ff1b59299f49bb392a4
+F ext/fts5/fts5Int.h 93ff3f2ae0789abc10c6832c32273db30024ead8
 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e
 F ext/fts5/fts5_buffer.c 54b18497395a19dfe1d00f63a3b403e5f93d4fd1
 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695
-F ext/fts5/fts5_expr.c bd2618ceaaadadbc8a4792ba977b393d2d1d3a08
+F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d
 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246
-F ext/fts5/fts5_index.c 11687c48902238e1fedb0bb8e1e8b5b8f6d82e1c
+F ext/fts5/fts5_index.c f1465ed954973390363b1cc22a4644e4630c78a1
 F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8
 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995
 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37
@@ -121,7 +121,7 @@ F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a
 F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c
 F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1
 F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec
-F ext/fts5/fts5parse.y 833db1101b78c0c47686ab1b84918e38c36e9452
+F ext/fts5/fts5parse.y 38ab0ea7280a122f86f53b2264741422dd2424a0
 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
 F ext/fts5/test/fts5_common.tcl b6e6a40ef5d069c8e86ca4fbad491e1195485dbc
 F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611
@@ -169,7 +169,7 @@ F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5
 F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436
 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1
 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487
-F ext/fts5/test/fts5prefix.test 5d4fd42696789843ff98a62f4b84e3f66ecad9d6
+F ext/fts5/test/fts5prefix.test ad3069f099ff593a2196422244fa218f8942dfb9
 F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1
 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
 F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
@@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9
-R 836bac276dc589a367243d9338c8814b
-U mistachkin
-Z 346e5b00d67d042049be71228aef2eb1
+P 80027709c3ba2a8c9bda4d37779f65104be1045c
+R 52e545b8d6eb2ff6aa406abf9ffb76aa
+U dan
+Z 301081fc00e6f67555fe939cedef1345
index ae04b786aedc16aa10048b5050e857d911b94825..903a16db2309a4878872f1309776322d63388070 100644 (file)
@@ -1 +1 @@
-80027709c3ba2a8c9bda4d37779f65104be1045c
\ No newline at end of file
+accdc98b1291f07b802fd23f3ebc7dbc02ba09d3
\ No newline at end of file