#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.
**
** This object is used by fts5_expr.c and fts5_index.c.
*/
-struct Fts5ExprColset {
+struct Fts5Colset {
int nCol;
int aiCol[1];
};
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 */
);
Fts5ExprPhrase*
);
-Fts5ExprColset *sqlite3Fts5ParseColset(
+Fts5Colset *sqlite3Fts5ParseColset(
Fts5Parse*,
- Fts5ExprColset*,
+ Fts5Colset*,
Fts5Token *
);
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*);
*/
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 */
};
}
}
-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;
*/
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 */
){
}
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 */
){
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;
/*
** 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{
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 */
void sqlite3Fts5ParseSetColset(
Fts5Parse *pParse,
Fts5ExprNearset *pNear,
- Fts5ExprColset *pColset
+ Fts5Colset *pColset
){
if( pNear ){
pNear->pColset = pColset;
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;
static void fts5SegiterPoslist(
Fts5Index *p,
Fts5SegIter *pSeg,
- Fts5ExprColset *pColset,
+ Fts5Colset *pColset,
Fts5Buffer *pBuf
){
if( pColset==0 ){
static int fts5MultiIterPoslist(
Fts5Index *p,
Fts5IndexIter *pMulti,
- Fts5ExprColset *pColset,
+ Fts5Colset *pColset,
int bSz, /* Append a size field before the data */
Fts5Buffer *pBuf
){
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;
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;
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; }
}
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*}
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') }
-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
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
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
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
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
-80027709c3ba2a8c9bda4d37779f65104be1045c
\ No newline at end of file
+accdc98b1291f07b802fd23f3ebc7dbc02ba09d3
\ No newline at end of file