Index: ext/fts3/fts3_write.c ================================================================== --- ext/fts3/fts3_write.c +++ ext/fts3/fts3_write.c @@ -3227,12 +3227,14 @@ sqlite3_stmt *pStmt = 0; rc = fts3SqlStmt(p, SQL_SELECT_STAT, &pStmt, 0); if( rc==SQLITE_OK ){ sqlite3_bind_int(pStmt, 1, FTS_STAT_AUTOINCRMERGE); rc = sqlite3_step(pStmt); - p->nAutoincrmerge = (rc==SQLITE_ROW && sqlite3_column_int(pStmt, 0)); - if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; + if( rc==SQLITE_ROW ){ + p->nAutoincrmerge = sqlite3_column_int(pStmt, 0); + if( p->nAutoincrmerge==1 ) p->nAutoincrmerge = 8; + } rc = sqlite3_reset(pStmt); } } return rc; } Index: test/fts4growth2.test ================================================================== --- test/fts4growth2.test +++ test/fts4growth2.test @@ -13,11 +13,11 @@ # # set testdir [file dirname $argv0] source $testdir/tester.tcl -set testprefix fts4growth +set testprefix fts4growth2 # If SQLITE_ENABLE_FTS3 is defined, omit this file. ifcapable !fts3 { finish_test return @@ -28,43 +28,42 @@ do_execsql_test 1.0 { CREATE TABLE t1(docid, words); } fts_kjv_genesis proc tt {val} { execsql { - BEGIN; - DELETE FROM x1 - WHERE docid IN (SELECT docid FROM t1 WHERE (rowid-1)%4==$val+0); - INSERT INTO x1(docid, content) - SELECT docid, words FROM t1 WHERE (rowid%4)==$val+0; - COMMIT; + DELETE FROM x1 + WHERE docid IN (SELECT docid FROM t1 WHERE (rowid-1)%4==$val+0); + INSERT INTO x1(docid, content) + SELECT docid, words FROM t1 WHERE (rowid%4)==$val+0; } + #puts [db eval {SELECT level, idx, end_block FROM x1_segdir}] } do_execsql_test 1.1 { CREATE VIRTUAL TABLE x1 USING fts4; INSERT INTO x1(x1) VALUES('automerge=2'); } do_test 1.2 { - for {set i 0} {$i < 100} {incr i} { + for {set i 0} {$i < 40} {incr i} { tt 0 ; tt 1 ; tt 2 ; tt 3 } execsql { SELECT max(level) FROM x1_segdir; - SELECT count(*) FROM x1_segdir WHERE level=4; + SELECT count(*) FROM x1_segdir WHERE level=3; } -} {4 1} +} {3 1} do_test 1.3 { - for {set i 0} {$i < 100} {incr i} { + for {set i 0} {$i < 40} {incr i} { tt 0 ; tt 1 ; tt 2 ; tt 3 } execsql { SELECT max(level) FROM x1_segdir; - SELECT count(*) FROM x1_segdir WHERE level=4; + SELECT count(*) FROM x1_segdir WHERE level=2; } -} {4 1} +} {2 1} #------------------------------------------------------------------------- # do_execsql_test 2.1 { DELETE FROM t1 WHERE rowid>16; Index: test/fts4merge4.test ================================================================== --- test/fts4merge4.test +++ test/fts4merge4.test @@ -51,8 +51,52 @@ } {} do_execsql_test 2.2 { SELECT count(*) FROM t1_segdir; } 35 do_execsql_test 2.3 { INSERT INTO t1(t1) VALUES('optimize') } {} do_execsql_test 2.4 { SELECT count(*) FROM t1_segdir; } 1 +#------------------------------------------------------------------------- +# Now test that the automerge=? option appears to work. +# +do_execsql_test 2.1 { CREATE VIRTUAL TABLE t2 USING fts4; } + +set doc "" +foreach c1 "a b c d e f g h i j" { + foreach c2 "a b c d e f g h i j" { + foreach c3 "a b c d e f g h i j" { + lappend doc "$c1$c2$c3" + } + } +} +set doc [string repeat $doc 10] + +foreach {tn am expected} { + 1 {automerge=2} {1 1 2 1 4 1 6 1} + 2 {automerge=4} {1 2 2 1 3 1} + 3 {automerge=8} {0 4 1 3 2 1} + 4 {automerge=1} {0 4 1 3 2 1} +} { + foreach {tn2 openclose} {1 {} 2 { db close ; sqlite3 db test.db }} { + do_test 2.2.$tn.$tn2 { + execsql { DELETE FROM t2 } + execsql { INSERT INTO t2(t2) VALUES($am) }; + + eval $openclose + + for {set i 0} {$i < 100} {incr i} { + execsql { + BEGIN; + INSERT INTO t2 VALUES($doc); + INSERT INTO t2 VALUES($doc); + INSERT INTO t2 VALUES($doc); + INSERT INTO t2 VALUES($doc); + INSERT INTO t2 VALUES($doc); + COMMIT; + } + } + + execsql { SELECT level, count(*) FROM t2_segdir GROUP BY level } + } [list {*}$expected] + } +} sqlite3_enable_shared_cache $::enable_shared_cache finish_test Index: test/permutations.test ================================================================== --- test/permutations.test +++ test/permutations.test @@ -110,11 +110,11 @@ speed4p.test sqllimits1.test tkt2686.test thread001.test thread002.test thread003.test thread004.test thread005.test trans2.test vacuum3.test incrvacuum_ioerr.test autovacuum_crash.test btree8.test shared_err.test vtab_err.test walslow.test walcrash.test walcrash3.test walthread.test rtree3.test indexfault.test securedel2.test - fts3growth2.test + fts4growth.test fts4growth2.test }] if {[info exists ::env(QUICKTEST_INCLUDE)]} { set allquicktests [concat $allquicktests $::env(QUICKTEST_INCLUDE)] }