if( pTab->eType==FTS5_VOCAB_COL ){
for(pCsr->iCol++; pCsr->iCol<nCol; pCsr->iCol++){
- if( pCsr->aCnt[pCsr->iCol] ) break;
+ if( pCsr->aDoc[pCsr->iCol] ) break;
}
}
i64 iPos = 0; /* 64-bit position read from poslist */
int iOff = 0; /* Current offset within position list */
- rc = sqlite3Fts5IterPoslist(pCsr->pIter, 0, &pPos, &nPos, &dummy);
- if( rc==SQLITE_OK ){
- if( pTab->eType==FTS5_VOCAB_ROW ){
- while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){
- pCsr->aCnt[0]++;
+ switch( pCsr->pConfig->eDetail ){
+ case FTS5_DETAIL_FULL:
+ rc = sqlite3Fts5IterPoslist(pCsr->pIter, 0, &pPos, &nPos, &dummy);
+ if( rc==SQLITE_OK ){
+ if( pTab->eType==FTS5_VOCAB_ROW ){
+ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){
+ pCsr->aCnt[0]++;
+ }
+ pCsr->aDoc[0]++;
+ }else{
+ int iCol = -1;
+ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){
+ int ii = FTS5_POS2COLUMN(iPos);
+ pCsr->aCnt[ii]++;
+ if( iCol!=ii ){
+ pCsr->aDoc[ii]++;
+ iCol = ii;
+ }
+ }
+ }
}
- pCsr->aDoc[0]++;
- }else{
- int iCol = -1;
- while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){
- int ii = FTS5_POS2COLUMN(iPos);
- pCsr->aCnt[ii]++;
- if( iCol!=ii ){
- pCsr->aDoc[ii]++;
- iCol = ii;
+ break;
+
+ case FTS5_DETAIL_COLUMNS:
+ if( pTab->eType==FTS5_VOCAB_ROW ){
+ pCsr->aDoc[0]++;
+ }else{
+ Fts5Buffer buf = {0, 0, 0};
+ rc = sqlite3Fts5IterPoslistBuffer(pCsr->pIter, &buf);
+ if( rc==SQLITE_OK ){
+ while( 0==sqlite3Fts5PoslistNext64(buf.p, buf.n, &iOff,&iPos) ){
+ assert_nc( iPos>=0 && iPos<nCol );
+ if( iPos<nCol ) pCsr->aDoc[iPos]++;
+ }
}
+ sqlite3Fts5BufferFree(&buf);
}
- }
+ break;
+
+ default:
+ assert( pCsr->pConfig->eDetail==FTS5_DETAIL_NONE );
+ pCsr->aDoc[0]++;
+ break;
+ }
+
+ if( rc==SQLITE_OK ){
rc = sqlite3Fts5IterNextScan(pCsr->pIter);
}
}
if( pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){
- while( pCsr->aCnt[pCsr->iCol]==0 ) pCsr->iCol++;
+ while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++;
assert( pCsr->iCol<pCsr->pConfig->nCol );
}
return rc;
int iCol /* Index of column to read value from */
){
Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor;
+ int eDetail = pCsr->pConfig->eDetail;
+ int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType;
+ i64 iVal = 0;
if( iCol==0 ){
sqlite3_result_text(
pCtx, (const char*)pCsr->term.p, pCsr->term.n, SQLITE_TRANSIENT
);
- }
- else if( ((Fts5VocabTable*)(pCursor->pVtab))->eType==FTS5_VOCAB_COL ){
+ }else if( eType==FTS5_VOCAB_COL ){
assert( iCol==1 || iCol==2 || iCol==3 );
if( iCol==1 ){
- const char *z = pCsr->pConfig->azCol[pCsr->iCol];
- sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC);
+ if( eDetail!=FTS5_DETAIL_NONE ){
+ const char *z = pCsr->pConfig->azCol[pCsr->iCol];
+ sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC);
+ }
}else if( iCol==2 ){
- sqlite3_result_int64(pCtx, pCsr->aDoc[pCsr->iCol]);
+ iVal = pCsr->aDoc[pCsr->iCol];
}else{
- sqlite3_result_int64(pCtx, pCsr->aCnt[pCsr->iCol]);
+ iVal = pCsr->aCnt[pCsr->iCol];
}
}else{
assert( iCol==1 || iCol==2 );
if( iCol==1 ){
- sqlite3_result_int64(pCtx, pCsr->aDoc[0]);
+ iVal = pCsr->aDoc[0];
}else{
- sqlite3_result_int64(pCtx, pCsr->aCnt[0]);
+ iVal = pCsr->aCnt[0];
}
}
+
+ if( iVal>0 ) sqlite3_result_int64(pCtx, iVal);
return SQLITE_OK;
}
return
}
+foreach_detail_mode $testprefix {
+
+if {[detail_is_none]} continue
+
+proc null_list_entries {iFirst nInterval L} {
+ for {set i $iFirst} {$i < [llength $L]} {incr i $nInterval} {
+ lset L $i {}
+ }
+ return $L
+}
+
+proc null_insert {iFirst nInterval L} {
+ for {set i $iFirst} {$i < [llength $L]} {incr i $nInterval} {
+ lset L $i {}
+ }
+ return $L
+}
+
+proc star_from_row {L} {
+ if {[detail_is_full]==0} {
+ set L [null_list_entries 2 3 $L]
+ }
+ return $L
+}
+
+proc star_from_col {L} {
+ if {[detail_is_col]} {
+ set L [null_list_entries 3 4 $L]
+ }
+ if {[detail_is_none]} {
+ set L [null_list_entries 1 4 $L]
+ set L [null_list_entries 3 4 $L]
+ }
+ return $L
+}
do_execsql_test 1.1.1 {
- CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1);
+ CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1, detail=%DETAIL%);
CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, 'row');
PRAGMA table_info = v1;
} {
do_execsql_test 1.4.1 {
SELECT * FROM v1;
-} {x 2 4 y 1 1 z 1 1}
+} [star_from_row {x 2 4 y 1 1 z 1 1}]
do_execsql_test 1.4.2 {
SELECT * FROM v2;
-} {x one 2 4 y one 1 1 z one 1 1}
+} [star_from_col {x one 2 4 y one 1 1 z one 1 1}]
do_execsql_test 1.5.1 {
BEGIN;
INSERT INTO t1 VALUES('a b c');
SELECT * FROM v1 WHERE term<'d';
-} {a 1 1 b 1 1 c 1 1}
+} [star_from_row {a 1 1 b 1 1 c 1 1}]
do_execsql_test 1.5.2 {
SELECT * FROM v2 WHERE term<'d';
COMMIT;
-} {a one 1 1 b one 1 1 c one 1 1}
+} [star_from_col {a one 1 1 b one 1 1 c one 1 1}]
do_execsql_test 1.6 {
DELETE FROM t1 WHERE one = 'a b c';
SELECT * FROM v1;
-} {x 2 4 y 1 1 z 1 1}
+} [star_from_row {x 2 4 y 1 1 z 1 1}]
#-------------------------------------------------------------------------
#
do_execsql_test 2.0 {
- CREATE VIRTUAL TABLE tt USING fts5(a, b);
+ CREATE VIRTUAL TABLE tt USING fts5(a, b, detail=%DETAIL%);
INSERT INTO tt VALUES('d g b f d f', 'f c e c d a');
INSERT INTO tt VALUES('f a e a a b', 'e d c f d d');
INSERT INTO tt VALUES('b c a a a b', 'f f c c b c');
INSERT INTO tt VALUES('c c a a c f', 'd g a e b g');
}
-set res_col {
+set res_row [star_from_row {
+ a 10 20 b 9 14 c 9 20 d 9 19
+ e 8 13 f 10 20 g 7 14 x 1 1
+ y 1 1
+}]
+set res_col [star_from_col {
a a 6 11 a b 7 9
b a 6 7 b b 7 7
c a 6 12 c b 5 8
f a 9 10 f b 7 10
g a 5 7 g b 5 7
x a 1 1 y b 1 1
-}
-set res_row {
- a 10 20 b 9 14 c 9 20 d 9 19
- e 8 13 f 10 20 g 7 14 x 1 1
- y 1 1
-}
+}]
foreach {tn tbl resname} {
1 "fts5vocab(tt, 'col')" res_col
forcedelete test.db2
do_execsql_test 5.0 {
ATTACH 'test.db2' AS aux;
- CREATE VIRTUAL TABLE t1 USING fts5(x);
- CREATE VIRTUAL TABLE temp.t1 USING fts5(x);
- CREATE VIRTUAL TABLE aux.t1 USING fts5(x);
+ CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
+ CREATE VIRTUAL TABLE temp.t1 USING fts5(x, detail=%DETAIL%);
+ CREATE VIRTUAL TABLE aux.t1 USING fts5(x, detail=%DETAIL%);
INSERT INTO main.t1 VALUES('a b c');
INSERT INTO main.t1 VALUES('d e f');
CREATE VIRTUAL TABLE temp.va USING fts5vocab(aux, t1, row);
}
-do_execsql_test 5.2 { SELECT * FROM vm } {
+do_execsql_test 5.2 { SELECT * FROM vm } [star_from_row {
a 2 2 b 1 1 c 2 2 d 1 1 e 2 2 f 1 1
-}
-do_execsql_test 5.3 { SELECT * FROM vt1 } {
+}]
+do_execsql_test 5.3 { SELECT * FROM vt1 } [star_from_row {
1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1
-}
-do_execsql_test 5.4 { SELECT * FROM vt2 } {
+}]
+do_execsql_test 5.4 { SELECT * FROM vt2 } [star_from_row {
1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1
-}
-do_execsql_test 5.5 { SELECT * FROM va } {
+}]
+do_execsql_test 5.5 { SELECT * FROM va } [star_from_row {
m 1 1 n 2 2 o 1 1 x 2 2 y 1 1 z 2 2
-}
+}]
#-------------------------------------------------------------------------
#
# constraints in the WHERE clause).
#
do_execsql_test 7.0 {
- CREATE VIRTUAL TABLE tx USING fts5(one, two);
+ CREATE VIRTUAL TABLE tx USING fts5(one, two, detail=%DETAIL%);
INSERT INTO tx VALUES('g a ggg g a b eee', 'cc d aa ff g ee');
INSERT INTO tx VALUES('dd fff i a i jjj', 'f fff hh jj e f');
INSERT INTO tx VALUES('ggg a f f fff dd aa', 'd ggg f f j gg ddd');
if {[lindex $r2 2]==0} {set r2 [list]}
set resc [concat $r1 $r2]
+
+ set resc [star_from_col $resc]
+ set resr [star_from_row $resr]
do_execsql_test 7.$term.1 {SELECT * FROM txc WHERE term=$term} $resc
do_execsql_test 7.$term.2 {SELECT * FROM txr WHERE term=$term} $resr
}
WHERE txc.term = txc_c.term AND txc.col=txc_c.col;
} {57}
+}
+
finish_test
-C Fix\sa\stest\sscript\sproblem\scaused\sby\sa\schange\sin\sconstraint\shandling\swithin\sthe\score.
-D 2016-01-06T19:43:26.257
+C Update\sthe\sfts5vocab\smodule\sto\swork\swith\sdetail=col\sand\sdetail=none\stables.
+D 2016-01-07T20:07:41.638
F Makefile.in 7c8cc4c2f0179efc6fa9492141d1fb65f4807054
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc e45d8b9b56dfa3f2cd860b2c28bd9d304513b042
F ext/fts5/fts5_tokenize.c 504984ac6993323247221eebe3cd55bead01b5f8
F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c
F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1
-F ext/fts5/fts5_vocab.c 3742d0abfe8aa8c3cb4a7df56aa38f2e3c3fb1c2
+F ext/fts5/fts5_vocab.c da64ecbd217625980a1721fbd588a1e4118a51b6
F ext/fts5/fts5parse.y 1647eba089b9b3fc058b4dc989d9da87d15b9580
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
F ext/fts5/test/fts5_common.tcl c9169fe40bf751e1b311271df31aec15732b26c0
F ext/fts5/test/fts5unicode3.test 35c3d02aa7acf7d43d8de3bfe32c15ba96e8928e
F ext/fts5/test/fts5unindexed.test e9539d5b78c677315e7ed8ea911d4fd25437c680
F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e
-F ext/fts5/test/fts5vocab.test c88a5554d0409494da95ba647bbdb4879b2624b0
+F ext/fts5/test/fts5vocab.test f4ff3ba4036a83678f2a8ba8b89eb303bebc122e
F ext/fts5/tool/fts5txt2db.tcl c374c4c4797e8cdfadabdfaeeb5412dcd6686e84
F ext/fts5/tool/loadfts5.tcl 4cc2d6af43b58d4fac05bc4fdabd0e5862c3b2c1
F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P e7dcd013516723941c2fb78ecdc96806d49d310b
-R dce0c272fbae692a97296955b7b2c775
+P 625695b3d7d4eae7536b5f761b96cd7519ac6ada
+R 276342437a8f737c3f32b7f1a4e61d27
U dan
-Z 318fda862dd5c3483c784e4e425f0506
+Z 8c87f6adf59add172dd12da497a3ce1f
-625695b3d7d4eae7536b5f761b96cd7519ac6ada
\ No newline at end of file
+eedd095dc1c81ce45df00093ba237dd7b3cdff3d
\ No newline at end of file