From 4c600ac389f2f46f05e8ef88a8d5073b326b6743 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 4 Feb 2011 18:56:25 +0000 Subject: [PATCH] Change fts4aux to (additionally) report on term frequency in individual columns of an fts table. FossilOrigin-Name: 3996f92a9aca9ac2628be003eca83c8f954c71de --- ext/fts3/fts3_aux.c | 122 +++++++++++++++++++++++++++++++++--------- ext/fts3/fts3_write.c | 3 +- manifest | 30 ++++------- manifest.uuid | 2 +- test/fts3aux1.test | 109 +++++++++++++++++++------------------ test/fts3comp1.test | 4 +- 6 files changed, 167 insertions(+), 103 deletions(-) diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index f9d801580c..be1cbff1e8 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -31,17 +31,22 @@ struct Fts3auxCursor { Fts3SegReaderCursor csr; /* Must be right after "base" */ Fts3SegFilter filter; char *zStop; - int nStop; - int isEof; - sqlite3_int64 iRowid; - sqlite3_int64 nDoc; - sqlite3_int64 nOcc; + int nStop; /* Byte-length of string zStop */ + int isEof; /* True if cursor is at EOF */ + sqlite3_int64 iRowid; /* Current rowid */ + + int iCol; /* Current value of 'col' column */ + int nStat; /* Size of aStat[] array */ + struct Fts3auxColstats { + sqlite3_int64 nDoc; /* 'documents' values for current csr row */ + sqlite3_int64 nOcc; /* 'occurrences' values for current csr row */ + } *aStat; }; /* ** Schema of the terms table. */ -#define FTS3_TERMS_SCHEMA "CREATE TABLE x(term, documents, occurrences)" +#define FTS3_TERMS_SCHEMA "CREATE TABLE x(term, col, documents, occurrences)" /* ** This function does all the work for both the xConnect and xCreate methods. @@ -199,10 +204,27 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ sqlite3Fts3SegReaderFinish(&pCsr->csr); sqlite3_free((void *)pCsr->filter.zTerm); sqlite3_free(pCsr->zStop); + sqlite3_free(pCsr->aStat); sqlite3_free(pCsr); return SQLITE_OK; } +static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ + if( nSize>pCsr->nStat ){ + struct Fts3auxColstats *aNew; + aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + sizeof(struct Fts3auxColstats) * nSize + ); + if( aNew==0 ) return SQLITE_NOMEM; + memset(&aNew[pCsr->nStat], 0, + sizeof(struct Fts3auxColstats) * (nSize - pCsr->nStat) + ); + pCsr->aStat = aNew; + pCsr->nStat = nSize; + } + return SQLITE_OK; +} + /* ** xNext - Advance the cursor to the next row, if any. */ @@ -211,12 +233,21 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ Fts3Table *pFts3 = ((Fts3auxTable *)pCursor->pVtab)->pFts3Tab; int rc; + /* Increment our pretend rowid value. */ + pCsr->iRowid++; + + for(pCsr->iCol++; pCsr->iColnStat; pCsr->iCol++){ + if( pCsr->aStat[pCsr->iCol].nDoc>0 ) return SQLITE_OK; + } + rc = sqlite3Fts3SegReaderStep(pFts3, &pCsr->csr); if( rc==SQLITE_ROW ){ - int i; - int isIgnore = 1; + int i = 0; int nDoclist = pCsr->csr.nDoclist; char *aDoclist = pCsr->csr.aDoclist; + int iCol; + + int eState = 0; if( pCsr->zStop ){ int n = (pCsr->nStopcsr.nTerm) ? pCsr->nStop : pCsr->csr.nTerm; @@ -227,27 +258,61 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){ } } - /* Now count the number of documents and positions in the doclist - ** in pCsr->csr.aDoclist[]. Store the number of documents in pCsr->nDoc - ** and the number of occurrences in pCsr->nOcc. */ - pCsr->nDoc = 0; - pCsr->nOcc = 0; - i = 0; + if( fts3auxGrowStatArray(pCsr, 2) ) return SQLITE_NOMEM; + memset(pCsr->aStat, 0, sizeof(struct Fts3auxColstats) * pCsr->nStat); + iCol = 0; + while( i1 ){ - pCsr->nOcc++; - }else{ - if( v==0 ) pCsr->nDoc++; - isIgnore = 1; + switch( eState ){ + /* State 0. In this state the integer just read was a docid. */ + case 0: + pCsr->aStat[0].nDoc++; + eState = 1; + iCol = 0; + break; + + /* State 1. In this state we are expecting either a 1, indicating + ** that the following integer will be a column number, or the + ** start of a position list for column 0. + ** + ** The only difference between state 1 and state 2 is that if the + ** integer encountered in state 1 is not 0 or 1, then we need to + ** increment the column 0 "nDoc" count for this term. + */ + case 1: + assert( iCol==0 ); + if( v>1 ){ + pCsr->aStat[1].nDoc++; + } + eState = 2; + /* fall through */ + + case 2: + if( v==0 ){ /* 0x00. Next integer will be a docid. */ + eState = 0; + }else if( v==1 ){ /* 0x01. Next integer will be a column number. */ + eState = 3; + }else{ /* 2 or greater. A position. */ + pCsr->aStat[iCol+1].nOcc++; + pCsr->aStat[0].nOcc++; + } + break; + + /* State 3. The integer just read is a column number. */ + case 3: + iCol = (int)v; + if( fts3auxGrowStatArray(pCsr, iCol+2) ) return SQLITE_NOMEM; + pCsr->aStat[iCol+1].nDoc++; + eState = 2; + break; } } + pCsr->iCol = 0; rc = SQLITE_OK; - pCsr->iRowid++; }else{ pCsr->isEof = 1; } @@ -280,6 +345,7 @@ static int fts3auxFilterMethod( testcase(pCsr->filter.zTerm); sqlite3Fts3SegReaderFinish(&pCsr->csr); sqlite3_free((void *)pCsr->filter.zTerm); + sqlite3_free(pCsr->aStat); memset(&pCsr->csr, 0, ((u8*)&pCsr[1]) - (u8*)&pCsr->csr); pCsr->filter.flags = FTS3_SEGMENT_REQUIRE_POS|FTS3_SEGMENT_IGNORE_EMPTY; @@ -332,10 +398,16 @@ static int fts3auxColumnMethod( assert( p->isEof==0 ); if( iCol==0 ){ /* Column "term" */ sqlite3_result_text(pContext, p->csr.zTerm, p->csr.nTerm, SQLITE_TRANSIENT); - }else if( iCol==1 ){ /* Column "documents" */ - sqlite3_result_int64(pContext, p->nDoc); + }else if( iCol==1 ){ /* Column "col" */ + if( p->iCol ){ + sqlite3_result_int(pContext, p->iCol-1); + }else{ + sqlite3_result_text(pContext, "*", -1, SQLITE_STATIC); + } + }else if( iCol==2 ){ /* Column "documents" */ + sqlite3_result_int64(pContext, p->aStat[p->iCol].nDoc); }else{ /* Column "occurrences" */ - sqlite3_result_int64(pContext, p->nOcc); + sqlite3_result_int64(pContext, p->aStat[p->iCol].nOcc); } return SQLITE_OK; diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 7c440cf97d..1e71874384 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2223,7 +2223,7 @@ void sqlite3Fts3SegReaderFinish( */ static int fts3SegmentMerge(Fts3Table *p, int iLevel){ int rc; /* Return code */ - int iIdx; /* Index of new segment */ + int iIdx = 0; /* Index of new segment */ int iNewLevel = 0; /* Level to create new segment at */ SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */ Fts3SegFilter filter; /* Segment term filter condition */ @@ -2242,7 +2242,6 @@ static int fts3SegmentMerge(Fts3Table *p, int iLevel){ rc = SQLITE_DONE; goto finished; } - iIdx = 0; rc = fts3SegmentCountMax(p, &nDummy, &iNewLevel); }else{ /* This call is to merge all segments at level iLevel. Find the next diff --git a/manifest b/manifest index 25cdeecbea..1811bd1743 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,5 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - -C Significant\schanges\shave\soccurred\ssince\sthe\s3.7.5\srelease\sso\sgo\sahead\sand\nincrease\sthe\sversion\snumber\sto\s3.7.6. -D 2011-02-04T14:28:34.714 +C Change\sfts4aux\sto\s(additionally)\sreport\son\sterm\sfrequency\sin\sindividual\scolumns\sof\san\sfts\stable. +D 2011-02-04T18:56:25.115 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in de6498556d536ae60bb8bb10e8c1ba011448658c F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -67,7 +64,7 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d F ext/fts3/fts3.c 5653c5654ac9b65bf3646af7e1d695c7e9b991a0 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 945926ea4b6a686c3e9834640a252d9870b7191e -F ext/fts3/fts3_aux.c 233a9f0bd8fa336d78f5905b2c94c8860d237dd9 +F ext/fts3/fts3_aux.c 60563fe93307dbca20bafeabb28dac829bdf1520 F ext/fts3/fts3_expr.c 5f49e0deaf723724b08100bb3ff40aab02ad0c93 F ext/fts3/fts3_hash.c 3c8f6387a4a7f5305588b203fa7c887d753e1f1c F ext/fts3/fts3_hash.h 8331fb2206c609f9fc4c4735b9ab5ad6137c88ec @@ -77,7 +74,7 @@ F ext/fts3/fts3_snippet.c bfefb42b5debf8725a30fd5122572aaeedc99397 F ext/fts3/fts3_tokenizer.c 055f3dc7369585350b28db1ee0f3b214dca6724d F ext/fts3/fts3_tokenizer.h 13ffd9fcb397fec32a05ef5cd9e0fa659bf3dbd3 F ext/fts3/fts3_tokenizer1.c 6e5cbaa588924ac578263a598e4fb9f5c9bb179d -F ext/fts3/fts3_write.c 8cf14b0e1eee656cda0197e99754f980c216dd9a +F ext/fts3/fts3_write.c 813495ed106eb9461044e3c0374f4db69b37eb09 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9 @@ -443,10 +440,10 @@ F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test b83f99f70e9eec85f27d75801a974b3f820e01f9 F test/fts3atoken.test 25c2070e1e8755d414bf9c8200427b277a9f99fa -F test/fts3aux1.test 6145608289e8a6337acb3432d592e57b8e46ad35 +F test/fts3aux1.test 0ec0280f21987e8772948986cd631a1b47a14dd8 F test/fts3b.test e93bbb653e52afde110ad53bbd793f14fe7a8984 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 -F test/fts3comp1.test dab659038f2e0e2f5807d51da4dde38e213e28da +F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c F test/fts3corrupt.test 7890cc202406858386ddf390a879dcf80bc10abf F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 @@ -909,14 +906,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 499edcbc8ab70fcf35431d4e672c68dbcb6c5aad -R cc7b57ce81720a94448946b660037826 -U drh -Z 8745751948dcdf83f4b3e0ca2b57d0f3 ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.6 (GNU/Linux) - -iD8DBQFNTA0XoxKgR168RlERAlrcAJ9SvZzElf1pzDXd0qVTSBS7d+6W0gCghh6x -w2v+KG+1xh3gtALTpGEpSA8= -=zWr7 ------END PGP SIGNATURE----- +P 999c915a4a075a4d1736ae786cbe7d1587809fee +R 21ef4f44397ebadeb7dd1b381e1ac485 +U dan +Z 2b26bcdfd659b090671de58b945f2afb diff --git a/manifest.uuid b/manifest.uuid index e988a07e81..4f6badec03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -999c915a4a075a4d1736ae786cbe7d1587809fee \ No newline at end of file +3996f92a9aca9ac2628be003eca83c8f954c71de \ No newline at end of file diff --git a/test/fts3aux1.test b/test/fts3aux1.test index 68b1103082..d021e9d19d 100644 --- a/test/fts3aux1.test +++ b/test/fts3aux1.test @@ -24,7 +24,7 @@ do_execsql_test 1.1 { INSERT INTO t1 VALUES('one three five seven'); CREATE VIRTUAL TABLE terms USING fts4aux(t1); - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } { five 2 2 four 2 2 one 2 2 seven 1 1 six 1 1 three 3 3 two 1 1 @@ -32,7 +32,7 @@ do_execsql_test 1.1 { do_execsql_test 1.2 { INSERT INTO t1 VALUES('one one one three three three'); - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } { five 2 2 four 2 2 one 3 5 seven 1 1 six 1 1 three 4 6 two 1 1 @@ -40,7 +40,7 @@ do_execsql_test 1.2 { do_execsql_test 1.3 { DELETE FROM t1; - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } {} do_execsql_test 1.4 { @@ -53,7 +53,7 @@ do_execsql_test 1.4 { INSERT INTO t1 SELECT * FROM t1; INSERT INTO t1 SELECT * FROM t1; INSERT INTO t1 SELECT * FROM t1; - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } {a 256 1024 b 256 768} #------------------------------------------------------------------------- @@ -84,6 +84,9 @@ do_execsql_test 2.0 { INSERT INTO x1(x1) VALUES('nodesize=24'); CREATE VIRTUAL TABLE terms USING fts4aux(x1); + CREATE VIEW terms_v AS + SELECT term, documents, occurrences FROM terms WHERE col = '*'; + INSERT INTO x1 VALUES('braes brag bragged bragger bragging'); INSERT INTO x1 VALUES('brags braid braided braiding braids'); INSERT INTO x1 VALUES('brain brainchild brained braining brains'); @@ -112,38 +115,38 @@ do_execsql_test 2.1.1.2 { # do_test 2.1.2.1 { set cnt 0 - execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term='braid' } + execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND term='braid' } set cnt -} {1} +} {2} do_test 2.1.2.2 { set cnt 0 - execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term='braid' } + execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND +term='braid' } set cnt -} {19} +} {38} # Similar to the test immediately above, but using a term ("breakfast") that # is not featured in the dataset. # do_test 2.1.3.1 { set cnt 0 - execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term='breakfast' } + execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND term='breakfast' } set cnt } {0} do_test 2.1.3.2 { set cnt 0 - execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term='breakfast' } + execsql { SELECT * FROM terms_v WHERE rec('cnt', term) AND +term='breakfast' } set cnt -} {19} +} {38} -do_execsql_test 2.1.4.1 { SELECT * FROM terms WHERE term='braid' } {braid 1 1} -do_execsql_test 2.1.4.2 { SELECT * FROM terms WHERE +term='braid' } {braid 1 1} -do_execsql_test 2.1.4.3 { SELECT * FROM terms WHERE term='breakfast' } {} -do_execsql_test 2.1.4.4 { SELECT * FROM terms WHERE +term='breakfast' } {} +do_execsql_test 2.1.4.1 { SELECT * FROM terms_v WHERE term='braid' } {braid 1 1} +do_execsql_test 2.1.4.2 { SELECT * FROM terms_v WHERE +term='braid'} {braid 1 1} +do_execsql_test 2.1.4.3 { SELECT * FROM terms_v WHERE term='breakfast' } {} +do_execsql_test 2.1.4.4 { SELECT * FROM terms_v WHERE +term='breakfast' } {} -do_execsql_test 2.1.4.5 { SELECT * FROM terms WHERE term='cba' } {} -do_execsql_test 2.1.4.6 { SELECT * FROM terms WHERE +term='cba' } {} -do_execsql_test 2.1.4.7 { SELECT * FROM terms WHERE term='abc' } {} -do_execsql_test 2.1.4.8 { SELECT * FROM terms WHERE +term='abc' } {} +do_execsql_test 2.1.4.5 { SELECT * FROM terms_v WHERE term='cba' } {} +do_execsql_test 2.1.4.6 { SELECT * FROM terms_v WHERE +term='cba' } {} +do_execsql_test 2.1.4.7 { SELECT * FROM terms_v WHERE term='abc' } {} +do_execsql_test 2.1.4.8 { SELECT * FROM terms_v WHERE +term='abc' } {} # Special case: term=NULL # @@ -174,33 +177,33 @@ do_test 2.2.2.1 { set cnt 0 execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term>'brain' } set cnt -} {9} +} {18} do_test 2.2.2.2 { set cnt 0 execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term>'brain' } set cnt -} {19} +} {38} do_execsql_test 2.2.2.3 { - SELECT * FROM terms WHERE rec('cnt', term) AND term>'brain' + SELECT term, documents, occurrences FROM terms_v WHERE term>'brain' } { brainchild 1 1 brained 1 1 braining 1 1 brains 1 1 brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1 } do_execsql_test 2.2.2.4 { - SELECT * FROM terms WHERE rec('cnt', term) AND +term>'brain' + SELECT term, documents, occurrences FROM terms_v WHERE +term>'brain' } { brainchild 1 1 brained 1 1 braining 1 1 brains 1 1 brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1 } do_execsql_test 2.2.2.5 { - SELECT * FROM terms WHERE rec('cnt', term) AND term>='brain' + SELECT term, documents, occurrences FROM terms_v WHERE term>='brain' } { brain 1 1 brainchild 1 1 brained 1 1 braining 1 1 brains 1 1 brainstem 1 1 brainstems 1 1 brainstorm 1 1 brainstorms 1 1 } do_execsql_test 2.2.2.6 { - SELECT * FROM terms WHERE rec('cnt', term) AND +term>='brain' + SELECT term, documents, occurrences FROM terms_v WHERE +term>='brain' } { brain 1 1 brainchild 1 1 brained 1 1 braining 1 1 brains 1 1 @@ -208,7 +211,7 @@ do_execsql_test 2.2.2.6 { } do_execsql_test 2.2.2.7 { - SELECT * FROM terms WHERE term>='abc' + SELECT term, documents, occurrences FROM terms_v WHERE term>='abc' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 @@ -217,7 +220,7 @@ do_execsql_test 2.2.2.7 { brainstems 1 1 brainstorm 1 1 brainstorms 1 1 } do_execsql_test 2.2.2.8 { - SELECT * FROM terms WHERE +term>='abc' + SELECT term, documents, occurrences FROM terms_v WHERE +term>='abc' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 @@ -227,48 +230,48 @@ do_execsql_test 2.2.2.8 { } do_execsql_test 2.2.2.9 { - SELECT * FROM terms WHERE term>='brainstorms' + SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms' } {brainstorms 1 1} do_execsql_test 2.2.2.10 { - SELECT * FROM terms WHERE term>='brainstorms' + SELECT term, documents, occurrences FROM terms_v WHERE term>='brainstorms' } {brainstorms 1 1} -do_execsql_test 2.2.2.11 { SELECT * FROM terms WHERE term>'brainstorms' } {} -do_execsql_test 2.2.2.12 { SELECT * FROM terms WHERE term>'brainstorms' } {} +do_execsql_test 2.2.2.11 { SELECT * FROM terms_v WHERE term>'brainstorms' } {} +do_execsql_test 2.2.2.12 { SELECT * FROM terms_v WHERE term>'brainstorms' } {} -do_execsql_test 2.2.2.13 { SELECT * FROM terms WHERE term>'cba' } {} -do_execsql_test 2.2.2.14 { SELECT * FROM terms WHERE term>'cba' } {} +do_execsql_test 2.2.2.13 { SELECT * FROM terms_v WHERE term>'cba' } {} +do_execsql_test 2.2.2.14 { SELECT * FROM terms_v WHERE term>'cba' } {} do_test 2.2.3.1 { set cnt 0 execsql { SELECT * FROM terms WHERE rec('cnt', term) AND term<'brain' } set cnt -} {11} +} {22} do_test 2.2.3.2 { set cnt 0 execsql { SELECT * FROM terms WHERE rec('cnt', term) AND +term<'brain' } set cnt -} {19} +} {38} do_execsql_test 2.2.3.3 { - SELECT * FROM terms WHERE rec('cnt', term) AND term<'brain' + SELECT term, documents, occurrences FROM terms_v WHERE term<'brain' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 } do_execsql_test 2.2.3.4 { - SELECT * FROM terms WHERE rec('cnt', term) AND +term<'brain' + SELECT term, documents, occurrences FROM terms_v WHERE +term<'brain' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 } do_execsql_test 2.2.3.5 { - SELECT * FROM terms WHERE rec('cnt', term) AND term<='brain' + SELECT term, documents, occurrences FROM terms_v WHERE term<='brain' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 brain 1 1 } do_execsql_test 2.2.3.6 { - SELECT * FROM terms WHERE rec('cnt', term) AND +term<='brain' + SELECT term, documents, occurrences FROM terms_v WHERE +term<='brain' } { braes 1 1 brag 1 1 bragged 1 1 bragger 1 1 bragging 1 1 brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 @@ -278,39 +281,39 @@ do_execsql_test 2.2.3.6 { do_test 2.2.4.1 { set cnt 0 execsql { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms WHERE rec('cnt', term) AND term BETWEEN 'brags' AND 'brain' } set cnt -} {6} +} {12} do_test 2.2.4.2 { set cnt 0 execsql { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms WHERE rec('cnt', term) AND +term BETWEEN 'brags' AND 'brain' } set cnt -} {19} +} {38} do_execsql_test 2.2.4.3 { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms_v WHERE rec('cnt', term) AND term BETWEEN 'brags' AND 'brain' } { brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 brain 1 1 } do_execsql_test 2.2.4.4 { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms_v WHERE rec('cnt', term) AND +term BETWEEN 'brags' AND 'brain' } { brags 1 1 braid 1 1 braided 1 1 braiding 1 1 braids 1 1 brain 1 1 } do_execsql_test 2.2.4.5 { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms_v WHERE rec('cnt', term) AND term > 'brags' AND term < 'brain' } { braid 1 1 braided 1 1 braiding 1 1 braids 1 1 } do_execsql_test 2.2.4.6 { - SELECT * FROM terms + SELECT term, documents, occurrences FROM terms_v WHERE rec('cnt', term) AND +term > 'brags' AND +term < 'brain' } { braid 1 1 braided 1 1 braiding 1 1 braids 1 1 @@ -393,8 +396,8 @@ do_execsql_test 4.1 { INSERT INTO x1 VALUES('f g h i j'); INSERT INTO x1 VALUES('k k l l a'); - INSERT INTO x2 SELECT term FROM terms; - INSERT INTO x3 SELECT term FROM terms; + INSERT INTO x2 SELECT term FROM terms WHERE col = '*'; + INSERT INTO x3 SELECT term FROM terms WHERE col = '*'; } proc do_plansql_test {tn sql r} { @@ -403,7 +406,7 @@ proc do_plansql_test {tn sql r} { do_plansql_test 4.2 { - SELECT y FROM x2, terms WHERE y = term + SELECT y FROM x2, terms WHERE y = term AND col = '*' } { 0 0 0 {SCAN TABLE x2 (~1000000 rows)} 0 1 1 {SCAN TABLE terms VIRTUAL TABLE INDEX 1: (~0 rows)} @@ -411,7 +414,7 @@ do_plansql_test 4.2 { } do_plansql_test 4.3 { - SELECT y FROM terms, x2 WHERE y = term + SELECT y FROM terms, x2 WHERE y = term AND col = '*' } { 0 0 1 {SCAN TABLE x2 (~1000000 rows)} 0 1 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 1: (~0 rows)} @@ -419,7 +422,7 @@ do_plansql_test 4.3 { } do_plansql_test 4.4 { - SELECT y FROM x3, terms WHERE y = term + SELECT y FROM x3, terms WHERE y = term AND col = '*' } { 0 0 1 {SCAN TABLE terms VIRTUAL TABLE INDEX 0: (~0 rows)} 0 1 0 {SEARCH TABLE x3 USING COVERING INDEX i1 (y=?) (~10 rows)} @@ -427,7 +430,7 @@ do_plansql_test 4.4 { } do_plansql_test 4.5 { - SELECT y FROM terms, x3 WHERE y = term AND occurrences>1 + SELECT y FROM terms, x3 WHERE y = term AND occurrences>1 AND col = '*' } { 0 0 0 {SCAN TABLE terms VIRTUAL TABLE INDEX 0: (~0 rows)} 0 1 1 {SEARCH TABLE x3 USING COVERING INDEX i1 (y=?) (~10 rows)} diff --git a/test/fts3comp1.test b/test/fts3comp1.test index 7c506f4f02..9f13aaa64e 100644 --- a/test/fts3comp1.test +++ b/test/fts3comp1.test @@ -88,14 +88,14 @@ foreach {tn zip unzip} { # do_execsql_test 1.$tn.7 { CREATE VIRTUAL TABLE terms USING fts4aux(t1); - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } { eight 1 1 four 2 2 nine 1 1 one 1 1 six 2 2 three 2 2 twelve 1 1 two 1 2 } do_execsql_test 1.$tn.8 { DELETE FROM t1 WHERE docid = 1; - SELECT * FROM terms; + SELECT term, documents, occurrences FROM terms WHERE col = '*'; } { eight 1 1 four 1 1 nine 1 1 six 1 1 three 1 1 twelve 1 1 -- 2.47.2