From: dan Date: Wed, 7 Oct 2015 09:02:50 +0000 (+0000) Subject: Add further tests for fts5 prefix queries. X-Git-Tag: version-3.9.0~28 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=92099b07538056868a65f5c13ea87e4795c7d769;p=thirdparty%2Fsqlite.git Add further tests for fts5 prefix queries. FossilOrigin-Name: accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 --- diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 3ab8dcdc93..53df5dbf5a 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -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*); diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 9b0c262301..c90a2e4708 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -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; inCol; 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 && iColpConfig->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; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 46aff77728..d06a069f8a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -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; inCol; 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; diff --git a/ext/fts5/fts5parse.y b/ext/fts5/fts5parse.y index c880dc92cb..e872908229 100644 --- a/ext/fts5/fts5parse.y +++ b/ext/fts5/fts5parse.y @@ -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; } diff --git a/ext/fts5/test/fts5prefix.test b/ext/fts5/test/fts5prefix.test index f4fcc4bfa3..9da7821a54 100644 --- a/ext/fts5/test/fts5prefix.test +++ b/ext/fts5/test/fts5prefix.test @@ -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') } diff --git a/manifest b/manifest index 6c17fe9621..88bb54c2ce 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index ae04b786ae..903a16db23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80027709c3ba2a8c9bda4d37779f65104be1045c \ No newline at end of file +accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 \ No newline at end of file