const u8 *pList = 0;
const char *zTerm = 0;
int nList = 0;
+ assert( (pIter->flags & FTS5_SEGITER_ONETERM) || pbNewTerm );
if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){
sqlite3Fts5HashScanNext(p->pHash);
sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList);
sqlite3Fts5BufferSet(&p->rc, &pIter->term, (int)strlen(zTerm),
(u8*)zTerm);
pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid);
- if( pbNewTerm ) *pbNewTerm = 1;
+ *pbNewTerm = 1;
}
}else{
iOff = 0;
PoslistCallbackCtx sCtx;
sCtx.pBuf = pBuf;
sCtx.pColset = pColset;
- sCtx.eState = pColset ? fts5IndexColsetTest(pColset, 0) : 1;
+ sCtx.eState = fts5IndexColsetTest(pColset, 0);
assert( sCtx.eState==0 || sCtx.eState==1 );
fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback);
}
fts5DataRelease(pLeaf);
if( p->rc ) break;
-
/* Now check that the iter.nEmpty leaves following the current leaf
** (a) exist and (b) contain no terms. */
fts5IndexIntegrityCheckEmpty(
*/
static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){
#if SQLITE_VERSION_NUMBER>=3008012
- if( sqlite3_libversion_number()>=3008012 ){
+#ifndef SQLITE_CORE
+ if( sqlite3_libversion_number()>=3008012 )
+#endif
+ {
pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE;
}
#endif
}else{
sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */
int i; /* Counter variable */
-#if 0
- if( eConflict==SQLITE_REPLACE ){
- eStmt = FTS5_STMT_REPLACE_CONTENT;
- rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1]));
- }else{
- eStmt = FTS5_STMT_INSERT_CONTENT;
- }
-#endif
- if( rc==SQLITE_OK ){
- rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0);
- }
+ rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0);
for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){
rc = sqlite3_bind_value(pInsert, i, apVal[i]);
}
}
do_execsql_test 6.4 {
+ REPLACE INTO t1(x, y) VALUES('x y z', 'x y z');
+}
+
+do_execsql_test 6.5 {
INSERT INTO t1(t1) VALUES('integrity-check')
}
+do_execsql_test 6.6 {
+ SELECT rowid, * FROM t1;
+} {
+ 22 {l l l} {l l l}
+ 23 {x y z} {x y z}
+}
+
#-------------------------------------------------------------------------
#
reset_db
}
}
-}
-
#------------------------------------------------------------------------
#
reset_db
INSERT INTO t1(t1) VALUES('integrity-check');
} {1 {database disk image is malformed}}
+
+}
+
+#------------------------------------------------------------------------
+#
+reset_db
+reset_db
+proc rnddoc {n} {
+ set map [list a b c d]
+ set doc [list]
+ for {set i 0} {$i < $n} {incr i} {
+ lappend doc "x[lindex $map [expr int(rand()*4)]]"
+ }
+ set doc
+}
+
+db func rnddoc rnddoc
+do_test 7.0 {
+ execsql {
+ CREATE VIRTUAL TABLE t5 USING fts5(x);
+ INSERT INTO t5 VALUES( rnddoc(10000) );
+ INSERT INTO t5 VALUES( rnddoc(10000) );
+ INSERT INTO t5 VALUES( rnddoc(10000) );
+ INSERT INTO t5 VALUES( rnddoc(10000) );
+ INSERT INTO t5(t5) VALUES('optimize');
+ }
+} {}
+
+do_test 7.1 {
+ foreach i [db eval { SELECT rowid FROM t5_data WHERE rowid>100 }] {
+ db eval BEGIN
+ db eval {DELETE FROM t5_data WHERE rowid = $i}
+ set r [catchsql { INSERT INTO t5(t5) VALUES('integrity-check')} ]
+ if {$r != "1 {database disk image is malformed}"} { error $r }
+ db eval ROLLBACK
+ }
+} {}
+
sqlite3_fts5_may_be_corrupt 0
finish_test
faultsim_test_result {0 {}}
}
+#-------------------------------------------------------------------------
+# Test fault-injection when a segment is promoted.
+#
+reset_db
+do_execsql_test 2.0 {
+ CREATE VIRTUAL TABLE xy USING fts5(x);
+ INSERT INTO xy(rowid, x) VALUES(1, '1 2 3');
+ INSERT INTO xy(rowid, x) VALUES(2, '2 3 4');
+ INSERT INTO xy(rowid, x) VALUES(3, '3 4 5');
+}
+faultsim_save_and_close
+
+do_faultsim_test 2 -faults oom-* -prep {
+ faultsim_restore_and_reopen
+} -body {
+ db eval { UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2 }
+} -test {
+ faultsim_test_result {0 {}}
+}
+
+
finish_test
do_execsql_test 1.1 {
CREATE VIRTUAL TABLE vocab USING fts5vocab(eee, 'row');
BEGIN;
- WITH ii(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM ii WHERE i<100)
- INSERT INTO eee SELECT r($vocab, 5), r($vocab, 7) FROM ii;
- INSERT INTO eee(eee) VALUES('integrity-check');
}
-
+do_test 1.2 {
+ for {set i 1} {$i <= 100} {incr i} {
+ execsql { INSERT INTO eee VALUES( r($vocab, 5), r($vocab, 7) ) }
+ }
+} {}
+
do_test 1.2 {
db eval { SELECT term, doc FROM vocab } {
set nRow [db one {SELECT count(*) FROM eee WHERE eee MATCH $term}]
execsql { INSERT INTO t3(t3) VALUES('integrity-check') }
}
+#-------------------------------------------------------------------------
+#
+reset_db
+do_execsql_test 4.0 {
+ CREATE VIRTUAL TABLE t2 USING fts5(c1, c2);
+ INSERT INTO t2 VALUES('xa xb', 'xb xa');
+
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 2
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 4
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 8
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 16
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 32
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 64
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 128
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 256
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 512
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 1024
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 2048
+ INSERT INTO t2 SELECT c1||' '||c1, c2||' '||c2 FROM t2; -- 4096
+
+ SELECT count(*) FROM t2('x*');
+} {4096}
+
+do_execsql_test 4.1 {
+ UPDATE t2 SET c2 = 'ya yb';
+ SELECT count(*) FROM t2('c1:x*');
+ SELECT count(*) FROM t2('c2:x*');
+} {4096 0}
+
+do_execsql_test 4.2 {
+ UPDATE t2 SET c2 = 'xa';
+ SELECT count(*) FROM t2('c1:x*');
+ SELECT count(*) FROM t2('c2:x*');
+} {4096 4096}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+proc rnddoc {n} {
+ set map [list a b c d]
+ set doc [list]
+ for {set i 0} {$i < $n} {incr i} {
+ lappend doc "x[lindex $map [expr int(rand()*4)]]"
+ }
+ set doc
+}
+set cols [list]
+for {set i 1} {$i<250} {incr i} {
+ lappend cols "c$i"
+ lappend vals "'[rnddoc 10]'"
+}
+
+do_test 5.0 {
+ execsql "CREATE VIRTUAL TABLE t4 USING fts5([join $cols ,])"
+ execsql {INSERT INTO t4(t4, rank) VALUES('pgsz', 32)}
+ execsql "INSERT INTO t4 VALUES([join $vals ,])"
+ execsql "INSERT INTO t4 VALUES([join $vals ,])"
+ execsql "INSERT INTO t4 VALUES([join $vals ,])"
+ execsql "INSERT INTO t4 VALUES([join $vals ,])"
+} {}
+
+proc gmatch {col pattern} {
+ expr {[lsearch -glob $col $pattern]>=0}
+}
+db func gmatch gmatch
+foreach {tn col pattern} {
+ 1 c100 {xa*}
+ 2 c200 {xb*}
+} {
+ set res [db eval "SELECT rowid FROM t4 WHERE gmatch($col, \$pattern)"]
+ set query "$col : $pattern"
+ do_execsql_test 5.$tn { SELECT rowid FROM t4($query) } $res
+}
+
+reset_db
+db func fts5_rnddoc fts5_rnddoc
+do_test 6.0 {
+ execsql {
+ CREATE VIRTUAL TABLE t5 USING fts5(x, y);
+ INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
+ INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
+ INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
+ INSERT INTO t5 VALUES( fts5_rnddoc(10000), fts5_rnddoc(10000) );
+ }
+} {}
+
+proc gmatch {col pattern} {
+ expr {[lsearch -glob $col $pattern]>=0}
+}
+db func gmatch gmatch
+foreach {tn col pattern} {
+ 1 y {xa*}
+ 2 y {xb*}
+ 3 y {xc*}
+ 4 x {xa*}
+ 5 x {xb*}
+ 6 x {xc*}
+} {
+ set res [db eval "SELECT rowid FROM t5 WHERE gmatch($col, \$pattern)"]
+ set query "$col : $pattern"
+ do_execsql_test 6.$tn { SELECT rowid FROM t5($query) } $res
+}
finish_test
COMMIT;
} {}
+#-------------------------------------------------------------------------
+# Try an UPDATE OR REPLACE query.
+#
+do_execsql_test 13.1 {
+ CREATE VIRTUAL TABLE xy USING fts5(x);
+ INSERT INTO xy(rowid, x) VALUES(1, '1 2 3');
+ INSERT INTO xy(rowid, x) VALUES(2, '2 3 4');
+ INSERT INTO xy(rowid, x) VALUES(3, '3 4 5');
+}
+
+do_execsql_test 13.2 {
+ UPDATE OR REPLACE xy SET rowid=3 WHERE rowid = 2;
+ SELECT rowid, x FROM xy;
+} {
+ 1 {1 2 3}
+ 3 {2 3 4}
+}
+
+do_execsql_test 13.3 {
+ INSERT INTO xy(xy) VALUES('integrity-check');
+}
+
finish_test
-C Fix\sharmless\scompiler\swarnings.
-D 2015-10-14T20:34:57.289
+C Tests\sand\sminor\sfixes\sto\simprove\scoverage\sof\sFTS5\scode.
+D 2015-10-14T21:08:48.055
F Makefile.in 2ea961bc09e441874eb3d1bf7398e04feb24f3ee
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 9660c072f65b2742595687b30f6d9ae55001ae06
F ext/fts5/fts5_config.c 88a77f5d5e4dfbb2355b8f6cc9969b7f02d94685
F ext/fts5/fts5_expr.c 28b15c9ae296204bc0a2e5cf7a667d840a9d2900
F ext/fts5/fts5_hash.c a9d4c1efebc2a91d26ad7ebdfcbf2678ceac405f
-F ext/fts5/fts5_index.c 3e5582dbe95aeefbb07ff6db1589024bc3f229fd
-F ext/fts5/fts5_main.c bf43550b8e9a68514abd179500f1917a2256cd7a
-F ext/fts5/fts5_storage.c c0232c81def24af1c98aee3c3f2a44f07bd90323
+F ext/fts5/fts5_index.c c76d636d6cd22e3b82b1dbf3a3993447091c3bed
+F ext/fts5/fts5_main.c d3fde32e1fdd7962dc7062400d1d8c7ec2297acf
+F ext/fts5/fts5_storage.c 9b30115742b758706de70595a8d1d084e940c978
F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd
F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf
F ext/fts5/fts5_tokenize.c 12c5d925286491a71bb3dad7c8924ce9cfd18320
F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35
F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba
F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d
-F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611
+F ext/fts5/test/fts5aa.test 34ad813e9e958115d388658b2c4a8dde6b1474a5
F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad
F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c
F ext/fts5/test/fts5ad.test e3dfb150fce971b4fd832498c29f56924d451b63
F ext/fts5/test/fts5content.test 9a952c95518a14182dc3b59e3c8fa71cda82a4e1
F ext/fts5/test/fts5corrupt.test c2ad090192708150d50d961278df10ae7a4b8b62
F ext/fts5/test/fts5corrupt2.test 26c0a39dd9ff73207e6229f83b50b21d37c7658c
-F ext/fts5/test/fts5corrupt3.test a1429635c30f922079189e35b2b631eb7463a2fb
+F ext/fts5/test/fts5corrupt3.test a2b537c120bdd43c79c42fe2438d7b8c81fe5599
F ext/fts5/test/fts5dlidx.test ecba5e62ea8b26c33829961602069c546228046d
F ext/fts5/test/fts5doclist.test 8edb5b57e5f144030ed74ec00ef6fa4294fed79b
F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0
F ext/fts5/test/fts5fault4.test 762991d526ee67c2b374351a17248097ea38bee7
F ext/fts5/test/fts5fault5.test 54da9fd4c3434a1d4f6abdcb6469299d91cf5875
F ext/fts5/test/fts5fault6.test 9682664d679643ac6736e90c225526cc84073cda
-F ext/fts5/test/fts5fault7.test f62ed4d98f137eb03f1db94d1fa41b17a771d971
+F ext/fts5/test/fts5fault7.test 01be274bfc8d9bf22451a3bf5892e9399d044f1b
F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741
-F ext/fts5/test/fts5hash.test 42eb066f667e9a389a63437cb7038c51974d4fc6
+F ext/fts5/test/fts5hash.test 7cf4607b8657c383f0b520668a99971e95d8b139
F ext/fts5/test/fts5integrity.test 29f41d2c7126c6122fbb5d54e556506456876145
F ext/fts5/test/fts5matchinfo.test 2163b0013e824bba65499da9e34ea4da41349cc2
F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367
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 ad3069f099ff593a2196422244fa218f8942dfb9
+F ext/fts5/test/fts5prefix.test 7ccbdf180ed561a912acef520519e85af8642239
F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1
F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b
F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17
F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821
-F ext/fts5/test/fts5simple.test f8463172dc2d4bf9f74c78e9df9c83e942c63a94
+F ext/fts5/test/fts5simple.test 41333e267c6145efc3620342af53dfe65d5676b7
F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671
F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89
F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 4bd0d43db7c1877f2d8a8d2f2a48f24a10f0c3b8
-R d4ec8270410c5a4320d23970a4de5d91
-U mistachkin
-Z 7c225cbfe0b31b98e32aa62f3770d8ae
+P 1c46c194a2da24fe613d77b5a8d727cc2fc9faa4
+R c2db5d42842de245a7c44c778b4b2af1
+U dan
+Z da86e8fefa3739a4535495784fceb3bf
-1c46c194a2da24fe613d77b5a8d727cc2fc9faa4
\ No newline at end of file
+f4de6d450e143cb1dd5447800d4b178e3db114c8
\ No newline at end of file