|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
source [file join [file dirname [info script]] rbu_common.tcl] |
|
|
if_no_rbu_support { finish_test ; return } |
|
|
set ::testprefix rbumulti |
|
|
|
|
|
db close |
|
|
|
|
|
autoinstall_test_functions |
|
|
|
|
|
proc build_db {db} { |
|
|
$db eval { |
|
|
CREATE TABLE t1(a PRIMARY KEY, b, c); |
|
|
CREATE INDEX i1 ON t1(b); |
|
|
CREATE INDEX i2 ON t1(c); |
|
|
|
|
|
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<500 ) |
|
|
INSERT INTO t1 |
|
|
SELECT randomblob(10), randomblob(100), randomblob(100) FROM s; |
|
|
} |
|
|
} |
|
|
|
|
|
proc build_rbu {db} { |
|
|
$db eval { |
|
|
CREATE TABLE data_t1(a, b, c, rbu_control); |
|
|
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) |
|
|
INSERT INTO data_t1 |
|
|
SELECT randomblob(10), randomblob(100), randomblob(100), 0 FROM s; |
|
|
} |
|
|
} |
|
|
|
|
|
proc step_rbu2 {bOpenClose openr1 openr2} { |
|
|
|
|
|
forcedelete teststate.db1 |
|
|
forcedelete teststate.db2 |
|
|
|
|
|
if {$bOpenClose!=0 && $bOpenClose!=1} { error $bOpenClose } |
|
|
if {$bOpenClose==0} { |
|
|
eval $openr1 |
|
|
eval $openr2 |
|
|
} |
|
|
|
|
|
set b1 0 |
|
|
set b2 0 |
|
|
|
|
|
while {$b1==0 || $b2==0} { |
|
|
if {$bOpenClose==1} { |
|
|
if {$b1==0} { eval $openr1 teststate.db1 } |
|
|
if {$b2==0} { eval $openr2 teststate.db2 } |
|
|
} |
|
|
if {$b1==0} { |
|
|
set rc1 [r1 step] |
|
|
if {$rc1 != "SQLITE_OK"} { set b1 1 } |
|
|
} |
|
|
if {$b2==0} { |
|
|
set rc2 [r2 step] |
|
|
if {$rc2 != "SQLITE_OK"} { set b2 1 } |
|
|
} |
|
|
if {$bOpenClose==1} { |
|
|
if {$b1==0} { r1 close } |
|
|
if {$b2==0} { r2 close } |
|
|
} |
|
|
} |
|
|
|
|
|
set rc1 [r1 close] |
|
|
set rc2 [r2 close] |
|
|
|
|
|
list $rc1 $rc2 |
|
|
} |
|
|
|
|
|
|
|
|
for {set i 0} {$i<=3} {incr i} { |
|
|
|
|
|
if {$i & 0x01} { |
|
|
sqlite3rbu_create_vfs -default myrbu "" |
|
|
} |
|
|
set bOpenClose [expr $i>>1] |
|
|
|
|
|
forcedelete test.db |
|
|
forcedelete test.db2 |
|
|
forcedelete rbu.db |
|
|
forcedelete rbu.db2 |
|
|
|
|
|
do_test 1.$i.0 { |
|
|
sqlite3 db test.db |
|
|
sqlite3 db2 test.db2 |
|
|
build_db db |
|
|
build_db db2 |
|
|
|
|
|
sqlite3 rbu1 rbu.db |
|
|
sqlite3 rbu2 rbu.db2 |
|
|
|
|
|
build_rbu rbu1 |
|
|
build_rbu rbu2 |
|
|
|
|
|
rbu1 close |
|
|
rbu2 close |
|
|
} {} |
|
|
|
|
|
set m1 [db eval {SELECT md5sum(a, b, c) FROM t1}] |
|
|
set m2 [db2 eval {SELECT md5sum(a, b, c) FROM t1}] |
|
|
|
|
|
do_test 1.$i.1 { |
|
|
step_rbu2 $bOpenClose { |
|
|
sqlite3rbu r1 test.db rbu.db |
|
|
} { |
|
|
sqlite3rbu r2 test.db2 rbu.db2 |
|
|
} |
|
|
} {SQLITE_DONE SQLITE_DONE} |
|
|
|
|
|
do_execsql_test -db db 1.$i.2.1 { PRAGMA integrity_check } ok |
|
|
do_execsql_test -db db2 1.$i.2.2 { PRAGMA integrity_check } ok |
|
|
|
|
|
do_execsql_test -db db 1.$i.3.1 { SELECT md5sum(a, b, c)==$m1 FROM t1 } 0 |
|
|
do_execsql_test -db db2 1.$i.3.2 { SELECT md5sum(a, b, c)==$m2 FROM t1 } 0 |
|
|
|
|
|
catch { db close } |
|
|
catch { db2 close } |
|
|
#----------------------------------------------------------------------- |
|
|
forcedelete test.db2 |
|
|
forcedelete test.db |
|
|
forcedelete rbu.db2 |
|
|
|
|
|
do_test 1.$i.4 { |
|
|
sqlite3 db test.db |
|
|
sqlite3 db2 test.db2 |
|
|
build_db db |
|
|
build_db db2 |
|
|
sqlite3 rbu2 rbu.db2 |
|
|
build_rbu rbu2 |
|
|
rbu2 close |
|
|
} {} |
|
|
|
|
|
set m1 [db eval {SELECT md5sum(a, b, c) FROM t1}] |
|
|
set m2 [db2 eval {SELECT md5sum(a, b, c) FROM t1}] |
|
|
|
|
|
do_test 1.$i.5 { |
|
|
step_rbu2 $bOpenClose { |
|
|
sqlite3rbu_vacuum r1 test.db |
|
|
} { |
|
|
sqlite3rbu r2 test.db2 rbu.db2 |
|
|
} |
|
|
} {SQLITE_DONE SQLITE_DONE} |
|
|
|
|
|
do_execsql_test -db db 1.$i.6.1 { SELECT md5sum(a, b, c)==$m1 FROM t1 } 1 |
|
|
do_execsql_test -db db2 1.$i.6.2 { SELECT md5sum(a, b, c)==$m2 FROM t1 } 0 |
|
|
|
|
|
do_execsql_test -db db 1.$i.7.1 { PRAGMA integrity_check } ok |
|
|
do_execsql_test -db db2 1.$i.7.2 { PRAGMA integrity_check } ok |
|
|
|
|
|
catch { db close } |
|
|
catch { db2 close } |
|
|
if {$i & 0x01} { |
|
|
sqlite3rbu_destroy_vfs myrbu |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
finish_test |
|
|
|